Thursday, November 6, 2008

I'm Moving to danigunawan.com

Halo.. i'm moving to http://danigunawan.com

Wednesday, December 19, 2007

Mencegah Direct Download

Contoh kasus:
Kita ingin menyediakan file pdf untuk di-download oleh user dan lokasi file tidak boleh diketahui oleh user. User hanya bisa men-download file dengan cara mengklik link. Bahasa yang digunakan adalah PHP.

Analisa:
Kita bisa membuat link yang ditujukan ke file yang akan di-download. Contoh kode seperti di bawah ini:

Code:
<a href="myebook.pdf">Download MyEbook</a>

Apa yang terjadi kalau link seperti ini diklik? Hasilnya tergantung dengan browser yang bersangkutan. Bila plug-in untuk pdf reader terinstal, maka browser akan berbaik hati membuka file tersebut. Bagaimana bila tidak ada plug-in pdf reader? Maka akan muncul kotak dialog untuk men-download file tersebut.

Satu masalah selesai bila user tidak memiliki plug-in pdf reader. Tetapi bagaimana dengan user yang punya? Tentu masalahnya tidak terselesaikan. Masalah lain muncul yaitu user mengetahui lokasi file tersebut, sehingga memungkinkan user melakukan direct download (men-download file langsung, dengan mengetikkan lokasinya di browser, tanpa melalui halaman download yang kita sediakan).

Penyelesaian:
Dibutuhkan sedikit programming (PHP) untuk menyelesaikan masalah ini.

Berikut ini kode untuk mencegah direct download:

<?php

$task = $_REQUEST['task'];

switch($task) {
case 'download':
// lokasi file
$file_path = 'dl/myebook.pdf';

// fungsi untuk mengambil nama file tanpa path
$file_name = basename($file_path);

// ambil ukuran file
$fsize = filesize($file_path);

// set headers
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Type: application/pdf");
header('Content-Disposition: attachment; filename="' . $file_name . '"');
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . $fsize);

// mulai men-download dari sini
$file = @fopen($file_path,"rb");
if ($file) {
while(!feof($file)) {
print(fread($file, 1024*8));
flush();
if (connection_status()!=0) {
@fclose($file);
die();
}
}
@fclose($file);
}

break;
default:
echo '<a href="donlot.php?task=download">Download MyEbook</a>';
break;
}

?>


Yang perlu diperhatikan disini adalah pada baris:
header('Content-Disposition: attachment; filename="myebook.pdf"');

Baris inilah yang memerintahkan browser untuk memunculkan kotak dialog download file myebook.pdf walaupun sudah terdapat plug-in pdf reader pada browser.

Untuk mengganti jenis file (exe atau zip), kita hanya perlu mengubah Content-Type.
Berikut adalah daftarnya:

// archives
application/zip

// documents
application/pdf
application/msword
application/vnd.ms-excel
application/vnd.ms-powerpoint

// executables
application/octet-stream

// images
image/gif
image/png
image/jpeg
image/jpeg

// audio
audio/mpeg
audio/x-wav

// video
video/mpeg
video/mpeg
video/mpeg
video/quicktime
video/x-msvideo

Untuk fungsi mendownload bisa dilihat dari komentar pada kode diatas (setelah baris //mulai men-download dari sini).

Sebenarnya, apa sih tujuan mencegah direct download? Tujuannya adalah untuk mengecek berapa kali sebuah file di-download.

Bila user diperbolehkan men-download langsung, tentu akan sulit melacak berapa kali file tersebut di-download.


Semoga bermanfaat... :)

Saturday, November 24, 2007

Koneksi Java & MySQL

Agar aplikasi Java bisa terkoneksi dengan MySQL diperlukan driver sebagai perantara Java dan MySQL. Driver tersebut bisa di-download di situs resminya MySQL.

[ Download MySQL Connector ]

Ekstrak file hasil download (tipe file: *.jar). Salin file tersebut ke direktori [instalasi jre]/lib/ext/. Ok, aplikasi Java anda siap untuk dikoneksikan dengan MySQL.

Uji Coba
Kode di bawah ini digunakan untuk menghubungkan Java dengan MySQL.
/*
* DBConnection.java
*
* Created on 29 September 2007, 11:41
*
*/

import java.sql.*;

/**
*
* @author Dani Gunawan
*/
public class DBConnection {

/** Creates a new instance of DBConnection */
public DBConnection() {
}

public Connection connect() {
Connection conn = null;

try
{
String userName = "root";
String password = "";
String url = "jdbc:mysql://localhost/test";
Class.forName ("com.mysql.jdbc.Driver").newInstance ();
conn = DriverManager.getConnection (url, userName, password);
} catch (Exception e) {
e.printStackTrace();
conn = null;
} finally {
if (conn != null)
{
try
{
conn.close ();
}
catch (Exception ex) {
ex.printStackTrace();
}
}
}

return conn;
}
}

Sedangkan kode di bawah ini untuk pengetesan koneksi.

/**
* TesConnection.java
*/
import java.sql.*;

public class TesConnection {


public static void main(String args[]) {

Connection dbcon = new DBConnection().connect();

if (dbcon != null) {
System.out.println("Database connection is successfully created");
} else {
System.out.println("Database connection isn't successfully created");
}
}

}

How to Use Them?
Letakkan kedua source pada folder yang sama. Kompile DBConnection.java, kemudian TesConnection.java.

javac DBConnection.java

javac TesConnection.java

Atau kalo mo praktis, gunakan wildcard asterisk (*).

javac *.java

Jalankan TesConnection:

java TesConnection

Bila hasilnya:

Database connection is successfully created

artinya database telah terkoneksi, tetapi bila:

Database connection isn't successfully created

artinya database anda belum terkoneksi.
Kemungkinan:
- MySQL belum diinstal
- Nama database tidak ditemukan
- User atau password salah

Kedua source di atas dapat di-download melalui link di bawah:

[ Download file contoh ]

NB:
Percobaan dilakukan di sistem operasi Windows XP Sp 2, belum pernah dilakukan di sistem operasi lain.


Semoga bermanfaat... :)

Thursday, November 15, 2007

Method Overloading

Method overloading digunakan untuk membuat beberapa fungsi (method) dengan nama yang SAMA dan mengerjakan tugas yang MIRIP. Tujuannya, agar programmer tidak kesulitan dalam mengingat sebuah fungsi yang tugasnya mirip. Misalnya untuk membuat fungsi perkalian. Ada perkalian yang membutuhkan dua argumen dan ada perkalian yang membutuhkan tiga argumen (tugasnya mirip, yaitu sama-sama mengalikan argumen, hanya jumlah argumen yang berbeda). Kalau dibuat fungsi dengan nama yang berbeda, kemungkinan programmer akan repot. Contoh, untuk fungsi perkalian dengan dua argumen, namanya adalah kali1(bil1, bil2). Sedangkan untuk perkalian dengan tiga argumen namanya adalah kali2(bil1, bil2, bil3). Repot kan? Gimana kalo ada sepuluh perkalian? Bandingkan bila namanya kali(bil1, bil2) dan kali(bil1, bil2, bil3). Kita cuma perlu mengingat jumlah argumen dari fungsi kali.

So, gimana cara compiler C++ membedakan method tersebut, padahal namanya sama? Compiler C++ memilih fungsi dengan mengamati jumlah, tipe data dan urutan argumen. Nah, dari sini jelas bahwa compiler menggunakan daftar parameter untuk membedakan fungsi dengan nama yang sama. Bukan membedakan dengan return type-nya (nilai balik).

Sehingga, untuk membuat method overloading diperlukan setidaknya satu dari tiga syarat di bawah ini:
  • mempunyai jumlah argumen berbeda.
  • mempunyai tipe data argumen yang berbeda.
  • mempunyai urutan argumen yang berbeda.

Contoh #1 (jumlah argumen berbeda):

// method kali dengan dua argumen (bil1 dan bil2)
int kali(int bil1, int bil2) {
return bil1*bil2
}

// method kali dengan tiga argumen (bil1, bil2 dan bil3)
int kali(int bil1, int bil2, int bil3) {

return bil1*bil2*bil3;
}

Method kali pada contoh di atas VALID karena mempunyai jumlah argumen yang berbeda.


Contoh #2 (mempunyai tipe data argumen yang berbeda):

// method tampilkanNilai mempunyai argumen bertipe char
void tampilkanNilai(char nilai) {
cout << "Nilai (dalam huruf): " << nilai;
}

// method tampilkanNilai mempunyai argumen bertipe int
void tampilkanNilai(int nilai) {
cout << "Nilai (dalam angka): " << nilai;
}

Contoh method tampilkanNilai diatas VALID karena mempunyai tipe data argumen yang berbeda walaupun memiliki jumlah argumen yang sama.


Contoh #3 (urutan argumen berbeda):

// method kali dengan tipe data bil1 adalah int
// dan bil2 adalah double
double kali(int bil1, double bil2) {
return bil1*bil2;
}

// method kali dengan tipe data bil1 adalah double
// dan bil2 adalah int
double kali(double bil1, int bil2) {
return bil1*bil2;
}

Method kali di atas VALID karena urutan argumen berbeda. Pada method kali yang pertama bil1 bertipe data int kemudian diikuti oleh bil2 dengan tipe data double. Sedangkan pada method kali yang kedua, bil1 bertipe data double diikuti oleh bil2 yang bertipe data int.


PERLU DIINGAT!!!
Seringnya programmer melakukan kesalahan ketika membuat method overloading adalah dengan membuat daftar parameter yang sama dengan return type (nilai balik) yang berbeda. Hal ini menghasilkan SYNTAX ERROR.

Contoh yang salah:

// return type: int
int hitungUmur(int umur)
{
return umur + 2;
}

// return type: void
void hitungUmur(int umur)
{
cout<<"umur siswa setelah lulus kuliah= "<<umur+2;
}

SYNTAX ERROR. Method tidak dapat di-overload karena mempunyai jumlah argumen yang sama dengan tipe data yang sama.


Semoga bermanfaat... :)

Wednesday, November 14, 2007

WNI: Windows Negara Indonesia

Di beberapa negara ada M$ Windows yang bahasanya sesuai dengan bahasa negara tersebut. Tetapi di Indonesia merupakan pengecualian. Kita masih menggunakan windows berbahasa Inggris. Pertanyaannya, mengapa? Apakah karena rakyat Indonesia bukanlah lahan yang potensial sebagai pengguna Windows (asli)? Atau memang rakyat lebih senang menggunakan bahasa Inggris?

Dulu isu ini sempat merebak. Hingga dibuatlah Windows Linguist pack bahasa Indonesia sebagai pengganti Windows berbahasa Indonesia. Tetapi ada kenyataannya, tidak banyak pengguna Windows yang memanfaatkan linguist pack ini. Sebagian mencoba meng-install-nya tetapi kemudian meng-uninstall lagi. Banyak istilah-istilah komputer dalam bahasa Indonesia yang malah terdengar "asing".

Siapa yang Salah?
Ga enak rasanya kalo nyalahin orang. Menurut saya ada sekelompok orang yang sedikit banyaknya bertanggung jawab atas minimnya penggunaan istilah-istilah komputer di dalam bahasa Indonesia. Mereka adalah para ahli bahasa. Mengapa? Karena merekalah yang terlambat mengkonversi istilah komputer ke dalam bahasa Indonesia. Ketika orang-orang sudah familiar dengan mouse, baru muncul istilah tetikus. Tidak familiar dan terkesan aneh. Tak heran jarang yang menggunakan tetikus dalam keseharian (atau bahkan tidak ada). Belum pernah saya jumpai orang yang berkata seperti ini, "bang, beli tetikus optik".

Solusinya Gimana?
Ga ada gunanya nyalah-nyalahin orang. Mending kita cari solusi. Bagaimana? Ya sosialisasi la. Yang dilakukan beberapa majalah atau tabloid komputer sudah bagus. Mereka menggunakan istilah-istilah komputer dalam bahasa Indonesia untuk setiap artikel yang diterbitkan. Istilah seperti mengunduh (download), unggah (upload), pindai (scan), laman (homepage), dan lain-lain sudah sering digunakan di beberapa majalah atau tabloid komputer. Guru-guru komputer juga mestinya membiasakan pemakaian istilah-istilah tersebut. Awalnya pasti aneh, tapi kalau sudah terbiasa pasti bisa. Tapi yang paling utama, biasakan dari diri kita sendiri.

The Fact
Ga bisa dipungkiri, istilah-istilah tersebut memang aneh (kurang familiar). Gw aja bisa dikatakan hampir tidak pernah menggunakan istilah-istilah (yang aneh, contoh: tetikus, mengunduh, menguggah) tersebut. Mungkin karena udah kebiasaan menggunakan istilah aslinya. Mungkin gw masih belum bisa bangga ama bahasa Indonesia...

Apa Aja Istilah Komputer yang Baku?
Panduan pembakuan istilah beserta istilah-istilah komputer yang baku bisa anda lihat di http://vlsm.org/etc/baku-0.txt.


Semoga bermanfaat... :)

Tuesday, November 13, 2007

Ngecek Kapasitas Harddisk di Linux

Baru-baru ini sering ngakses server linux. Karena tampilan item putih (eh nggak ding kalo pake vim :D), jadi agak-agak ngeraba. Ada satu masalah yang sering ku alami (dan temenku) karena ga terlalu biasa dengan command di linux. Masalahnya yaitu bagaimana mengecek kapasitas harddisk. Kemaren dulu udah pernah dikasi tau ama temen. Yah karena jarang dipake, jadinya lupa. Supaya ga lupa, aku sharing aja di blog. Ntar kalo lupa tinggal buka blog.. :)

Perintah yang dipake untuk ngecek kapasitas harddisk adalah df. Penjelasan singkatnya: df - report filesystem disk space usage. Kalo mo lebih jelas lagi pake man df.

Contoh penggunaan:
$ df

Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 14877092 9090552 5018636 65% /
/dev/shm 1037556 0 1037556 0% /dev/shm
/dev/sdb1 68890968 24462748 40872236 38% /home
/dev/sda5 14877060 6418492 7690664 46% /var

Walah, ga jelas. Biar jelas, ditambahin parameter -h.

$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 15G 8.7G 4.8G 65% /
/dev/shm 1014M 0 1014M 0% /dev/shm
/dev/sdb1 66G 24G 39G 38% /home
/dev/sda5 15G 6.2G 7.4G 46% /var

Nah, jadi lebih mudah dimengerti kaan...?


Semoga bermanfaat... :)