15 Mei 2009

Oh switch!

switch adalah perintah yang sangat primitif. Untuk programmer pemula pada setiap case diwajibkan menuliskan breakA demi keselamatan dan kemudahan analogi penulisan sintaks dengan deretan if-then-else.

Namun di dunia nyata, programmer yang sebenarnya akan menggunakan switch pada kemampuan aslinya. Perhatikan kode berikut, dimana break tidak digunakan:

int main(int argc, char** args){
  int a=atoi(args[1]);
  printf("%s",args[1]);
  switch(a){
   case 0:
     printf("0");
   case 1:
     printf("1");
   case 2:
     printf("2");
   default:
     printf("def");
  }
  return 0;
}


Untuk mengerti hal ini sedikit diperlukan sedikit "sejarah".
Pada pemograman assembly atau bahasa buruk lainnya(fortran, basic, c juga) ada perintah goto ke suatu label. Inilah sebenarnya yang terjadi terhadap switch dan case. switch adalah goto dan case adalah label. Oleh karena semantik switch yang mirip goto itulah maka semantik ini jarang/tidak diajarkan buat programmer pemula.

Jadi sekali switch menemukan case yang sesuai, kode-kode case dibawahnya akan dieksekusi seperti biasa. Dalam kata lain case yang cocok adalah awal eksekusi program. Karena itu diperlukan break agar setelah satu case selesai dieksekusi program langsung keluar dari switch.

06 September 2008

prioritas operator

Ketika menggunakan array dinamik sebagai parameter output seringkali programmer lupa dengan prioritas operator.
void fill(int**a){
...
*a[i]=X
...
}
Prioritas [] lebih tinggi dibandingkan *, sehingga kode yg dihasilkan sebenarnya adalah *(a[i]). Tentulah ini jadi masalah, padahal yang dimaksudkan adalah (*a)[i]=X.

Solusinya tuliskan saja secara eksplisit untuk mengikat operator * pada variable a

void fill(int**a){
...
(*a)[i]=X
...
}

24 September 2007

Mencetak kode program


Lihat gambar diatas. Kode program ini dihasilkan oleh lgrind dan latex. lgrind digunakan untuk menghasilkan kode latex dari program, selanjutnya dijadikan pdf oleh latex. selanjutnya siap di print.

Dimungkinkan pengaturan penomoran baris, pemunculan nama fungsi/prosedur, dan jenis font. Sangat menarik dan lebih enak dibaca.

Konfigurasi Dev C++

Seperti halnya IUDE lainnya DevC++ bisa disetting environmentnya. Untuk menentukan folder librari dan include disetting melalui projectoption->directories.



Untuk menentukan file librari yang diinclude disetting melalui projectoption->param

17 September 2007

Setting Visual C+

Ada dua hal penting dalam proses kompilasi dan linking, yaitu lokasi include files dan library files. Pada Visual C++ lokasi tersebut ditentukan pada option.

Selanjutnya file yang diinclude bisa diakses dengan #include, dan file yang diperlukan untuk library bisa diakses dengan menambahkan file library yang diperlukan pada setting project.



Nb: IUDE=Integrated/Unintegrated Development Environment

pointer apa array, array apa pointer, apa bedanya

Apa perbedaan 2 kode berikut?
code 1:
char* str1 = "hello, world";
code 2:
char str2[60] = "hello, world";

Kernighan Ritchie di bab 5.3 Pointers and Arrays, C Ansi Programming Languange menyatakan bahwa Pointer adalah variabel, tapi nama array BUKAN.

Sehingga ekspresi str1++ legal, tapi str2++ ILLEGAL. Selanjutnya str1=str2 legal, tapi str2=str1 ILLEGAL.

Kesimpulannya kedua kode tersebut BERBEDA.

Namun demikian :
char x[];
dan
char* x;
adalah kode yang benar-benar sama. Meskipun sama, sebaiknya digunakan char* x untuk menyatakan pointer, ya supaya pembaca tidak berspekulasi bahwa kode char x[] adalah array khusus.

[WARNING!!]
Keterangan diatas belum selesai. Kalau diinisialisasi langsung pada saat deklarasi maka aturan awal char* str1 dan char str2[60] berlaku kembali!
code 4:
char* str1 = "hello, world";
code 5:
char str2[] = "hello, world";

kode nomor 4 adalah pointer, kode nomor 5 adalah array.

Waspadalah.. waspadalah...
Kesalahan bukan pada bahasa C, tapi pada kemalasan anda membaca manualnya.

06 September 2007

cron daemon script untuk membackup basis data

Basis data sebagai jantung aplikasi merupakan bagian yang sangat rawan, mulai dari kesalahan admin, kerusakan piranti keras sampai dengan tindak vandalisme. Dalam lingkungan jaringan hampir dapat dikatakan bahwa tidak ada hal yang aman, kecuali jika data dienkripsi. Membuat suatu server mempunyai fasilitas enkripsi bukanlah hal yang gampang, sehingga seringkali tidak dilakukan.
Meskipun sudah dienkripsi, hal itu juga bukanlah suatu jaminan keamanan, jika anda ceroboh langsung meng-OK certificate warning ya sama aja boong.
Pada akhirnya kalau hanya sekedar menjaga agar tidak hilang, backup adalah solusinya, tapi ketika kerahasiaan/secrecy menjadi masalah, ya enkripsi dan kehati-hatian solusinya.

Berikut ini sebuah script untuk membackup data yang dapat dipanggil dari cron.

1 curdate=`date +%Y%m%d%H%M%S`
2 curdate="/var/backup_mysql/"$curdate
3 mkdir $curdate
4 cp -r /var/lib/mysql/db_pemrograman $curdate
penjelasan:
1. mengambil waktu sekarang untuk id
2. membuat nama folder yang bersesuaian dengan waktu
3. membuat folder
4. meng-copy folder basis data ke folder yang telah dibuat

hati-hati:
script shell hanya menangani string, jangan main-main dengan angka! [ada caranya sih tapi saya belum pernah]

configurasi cron daemon baris pada file /etc/crontab

0 0 * * * root /var/backup_mysql/backup.sh
penjelasan:
tiap hari pada pukul 0:0 script ini dijalankan oleh cron.

silahkan drop basis data saya . . . semuanya masih tersimpan baik, kecuali hari ini :(