Archive for May, 2007

SQLite, mesin SQL yang kecil dan cepat

Tuesday, May 29th, 2007 by Agro Rachmatullah

Waktu dulu aku mengambil mata kuliah basis data, aku menginstall server SQL kelas berat yaitu MySQL. Padahal, yang dulu ingin kulakukan hanyalah mengenal dan bermain-main dengan perintah SQL.

Berkas zip MySQL 3 yang waktu itu kusalin dari teman ukurannya sekitar 12 MB. Installer Windows MySQL 5 “Essential” ukurannya sekitar 22 MB. Adakah alternatifnya?

Mari berkenalan dengan SQLite, sebuah mesin SQL yang kecil dan cepat. Program dengan lisensi public domain ini sudah mencapai versi 3 saat artikel ini ditulis. Pada dasarnya, SQLite adalah pustaka bahasa C untuk dilink oleh program yang membutuhkannya (sqlite3.dll untuk Windows dan sqlite-3.x.x.so untuk Linux). Tersedia juga binding untuk banyak bahasa lain (misalnya System.Data.SQLite.dll untuk .NET). Contoh program yang menggunakan SQLite adalah Firefox 3 untuk basis data bookmarknya dan Banshee (pemutar musik C#) untuk basis data lagunya. Jadi dia bukanlah program server yang berjalan sendiri dan menunggu koneksi dari program lain sebagaimana MySQL.

Seluruh database (definisi, tabel, indeks, dan data) pada SQLite disimpan dalam satu berkas. Berkas ini cross platform.

Tapi kembali ke permasalahan semula. Kita ingin bermain-main dengan perintah SQL, bukannya membuat program yang menggunakan basis data. Untuk keperluan ini, di halaman download SQLite disediakan program konsol yang bisa membuat dan membaca berkas basis data SQLite. Program konsol itu sendiri merupakan contoh program yang memanfaatkan pustaka SQLite (tapi pada program ini SQLitenya dicompile bersama, tidak berada di file pustaka terpisah). Ukurannya sangat kecil, misalnya sqlite3-3.3.17.bin.gz untuk Linux berukuran 173.46 KiB dan sqlite-3_3_17.zip berukuran 174.64 KiB!

Tutorial Program Konsol SQLite

PS: Diasumsikan pembaca sudah mengerti perintah-perintah SQL dasar sehingga tidak ada penjelasan panjang lebar tentangnya. Walaupun begitu, mungkin artikel ini juga bisa dimanfaatkan sebagai tutorial kotor tentang perintah SQL.

Programnya dijalankan dengan memberikan satu argumen berupa nama berkas basis data yang diinginkan. Jika berkasnya tidak ada, maka berkas baru akan dibuat. Ekstensi berkasnya bisa sembarang. Kita akan menggunakan db3 untuk menandakan bahwa itu adalah berkas database yang dibuat SQLite versi 3. Contohnya adalah:

$ sqlite3 test.db3

(Untuk pengguna Linux, ganti nama sqlite3-3.3.17.bin atau buat symbolic link seperlunya)

Setelah mengetikkan perintah tersebut kita akan dibawa ke konsol SQL!

SQLite version 3.3.17
Enter ".help" for instructions
sqlite>

Untuk melihat tabel-tabel yang ada pada basis data yang sedang digunakan, masukkan perintah .table:

sqlite> .table
sqlite>

Perintah yang diawali titik (seperti .table) adalah perintah khusus program konsol ini. Tentu saja, kalau basis datanya baru dibuat tidak akan ada tabel apa-apa.

Kita bisa membuat tabel baru dengan perintah SQL CREATE, misalnya:

sqlite> CREATE TABLE mahasiswa(
   ...> nim INTEGER PRIMARY KEY,
   ...> nama TEXT,
   ...> prodi CHAR(2));
sqlite> .table
mahasiswa
sqlite>

Perintah untuk membuatnya adalah “CREATE TABLE mahasiswa(nim INTEGER PRIMARY KEY, nama TEXT, prodi CHAR(2));“. Walaupun begitu, pada contoh penulisan perintahnya dipecah menjadi 3 baris. Perintah SQL diakhiri dengan titik koma, jadi selama kita belum menuliskan titik koma program tersebut masih menunggu input di baris berikutnya (ditandai dengan prompt...>“). Dengan perintah .table, bisa dilihat bahwa tabelnya memang sudah tercipta.

Berikutnya adalah memasukkan data pada tabel tersebut dengan perintah SQL INSERT dan menampilkan isi tabel dengan perintah SQL SELECT:

sqlite> INSERT INTO mahasiswa(nama, prodi) VALUES('Linus Torvalds', 'IK');
sqlite> INSERT INTO mahasiswa(nama, prodi) VALUES('Richard Stallman', 'FI');
sqlite> INSERT INTO mahasiswa VALUES(9374, 'Agro', 'IK');
sqlite> INSERT INTO mahasiswa VALUES(9374, 'Wijaya', 'IK');
SQL error: PRIMARY KEY must be unique
sqlite> INSERT INTO mahasiswa(nama, prodi) VALUES('Ace Ventura', 'KH');
sqlite> SELECT * FROM mahasiswa;
1|Linus Torvalds|IK
2|Richard Stallman|FI
9374|Agro|IK
9375|Ace Ventura|KH
sqlite>

Bisa dilihat bahwa kalau kunci primer nim tidak ditentukan, maka nilainya akan ditentukan secara otomatis dimulai dari 1. Terlihat jelas juga bahwa tidak mungkin memasukkan dua baris dengan kunci primer yang sama.

Contoh perintah SELECT lain yang hanya menampilkan mahasiswa ilmu komputer (IK):

sqlite> SELECT nama,nim FROM mahasiswa WHERE prodi='IK';
Linus Torvalds|1
Agro|9374
sqlite>

Karena Richard Stallman ingin pindah dari prodi filsafat (FI) ke ilmu komputer, mari kita bantu dia dengan perintah SQL UPDATE:

sqlite> UPDATE mahasiswa SET prodi='IK' WHERE nim=2;
sqlite> SELECT * FROM mahasiswa;
1|Linus Torvalds|IK
2|Richard Stallman|IK
9374|Agro|IK
9375|Ace Ventura|KH
sqlite>

Sayangnya di ilmu komputer ada aturan bahwa rambut tidak boleh gondrong. Richard Stallman, orang yang keras kepala, lebih memilih dikeluarkan daripada harus mencukur rambutnya. Terpaksa perintah SQL DELETE dipakai:

sqlite> DELETE FROM mahasiswa WHERE nim=2;
sqlite> SELECT * FROM mahasiswa;
1|Linus Torvalds|IK
9374|Agro|IK
9375|Ace Ventura|KH
sqlite>

PS: Rambut Agro belum cukup gondrong untuk ditindak.

Dan terakhir, karena mahasiswanya tidak ada yang mampu membayar kuliah (terlalu mahal!), jadinya tidak ada yang membayar kuliah. Universitasnya pun bangkrut sehingga tabel mahasiswa tidak ada gunanya lagi. Perintah SQL DROP digunakan untuk menghapus tabel:

sqlite> DROP TABLE mahasiswa;
sqlite> .table
sqlite>

Untuk keluar dari program, gunakan perintah .q, .quit, atau .exit. Bisa dicek bahwa berkas test.db3 (atau nama lain yang dipilih) telah tercipta.

Bagaimana, keren kan? Setelah mengetahui tentang SQLite, kamu bisa merekomendasikan program ini pada teman-temanmu yang mengambil basis data.

Untuk tutorial mengenai hal-hal yang lebih kompleks (misal trigger), kunjungi tutorial di freshmeat. Untuk daftar perintah-perintah SQL yang didukung SQLite, kunjungi halaman di situs resminya. Ada benchmark (agak kuno) untuk melihat bahwa SQLite tidaklah lambat. Untuk penggunaan SQLite pada .NET (C#), mungkin kapan-kapan aku bakal bikin tutorialnya :)…

I knew it! Files are living things! They have genes!!!

Saturday, May 26th, 2007 by Agro Rachmatullah

The problematic file is freetest.htm. I have identified that it has an NS_ERROR_XPC_NOT_ENOUGH_ARGS gene. With that gene, you cannot do any AJAX from the file on certain environments…

No, I’m not on a crack… Listen to my detailed account, all you Javascript developers… That defective gene might be on YOUR file.

After learning how to use AJAX on a dummy page, I coded the real thing on freetest.htm, the real page. Like most Javascript programming, sure enough it only works on one browser. The lucky one is Opera 9 this time. The suckers are Firefox 2 and IE 6.

Browser programmers are ultra-smart guys, I assume the mistake is on my part. OK, so I copied the AJAX code to a dummy, clean, HTML page to find the bug. However it works!

Ah, so it must be some arcane interaction between the previously-existing Javascript code and the newly-added AJAX code. But my AJAX code is pretty complicated. Therefore I tried adding the simplest possible AJAX action in my real page, trying to see whether a simple AJAX works at all. The simple AJAX creates an XMLHttpRequest, sends a request, and retrieves the response. This time it works in Opera 9 and IE 5. Firefox (using Firebug debugger) gives this error:

uncaught exception: [Exception... "Not enough arguments"
nsresult: "0x80570001 (NS_ERROR_XPC_NOT_ENOUGH_ARGS)"
location: "JS frame :: http://localhost/aspx/freetest.htm ::
doAjax :: line 26" data: no]

It’s time to hunt which other js file conflicts with this one. I deleted the reference to other js files one by one, until there is no Javascript code other then the AJAX itself! But still AJAX doesn’t work!

Lol now that’s funny. OK, so I tried modifying my real file further (I’ve backed it up), deleting more useless things like CSS and title, until it matched another dummy file (freetest-simpleajax.htm) with the same AJAX code down to every character. Browsers are weird, so there is still the slight possibility that the TITLE tag messes things up. However it still doesn’t work while AJAX works on the other dummy file!

Obligatory md5 result:

1ab3bdf1ab23aabd6cfa4b1210bc7ee2 *freetest.htm
1ab3bdf1ab23aabd6cfa4b1210bc7ee2 *freetest-simpleajax.htm

(since the content of the files are identical, the genes must be stored somewhere else such as in the NTFS Master File Table)

Lol… I tried using the save as command to save freetest.htm into freetestxxx.htm. That’s probably the equivalent of reproduction. Amusingly, freetestxxx.htm works fine. Did the defective gene not get passed?

Ah, I forgot a very basic thing! Phenotype (visible traits, like the body height of an ape and an HTML page throwing exception) comes from the intricate interaction between genotype and the environment! Basic Biology… Let’s try opening freetest.htm on another tab of the still-running firefox.exe instance…

Result…

It works!

So, it must be the environment. The other tab must be too humid or something for freetest.htm to do AJAX. It’s not a problem of cache (the tab loading an old, nonworking version of the file). I tried modifying freetest.htm by adding visible text and reloading it on both tabs. The text appears on both, signifying that both tabs opened the most recent version of the file. However AJAX still doesn’t work on that cursed tab…

Whatever… I still haven’t achieved what I wanted, making the real AJAX code work on the real page… Back to work…

Edit: The culprit is the function named parent. Renamed it to domParent. What’s weird is that after the exception occurs, the tab will be unable to do AJAX on that page even after the problem has been corrected (hence the story above).

Edit 2: It doesn’t work in IE! The ringleader is different this time… In IE 6, there is no XMLHttpRequest required for AJAX, but we can achieve the same thing by creating an ActiveXObject as shown:

var foo = new ActiveXObject('Msxml2.XMLHTTP');

However, it turns out that the variable foo won’t behave completely like a real Javascript object! It fails when we try to dynamically add a property, such as:

foo.bar = 'This thing normally works';

My code adds an id for every XMLHttpRequest object created, so it fails miserably in IE 6… Geesh, I now have to code a different way of tracking those requests…

Indosiar melakukannya lagi: Virus SCA

Tuesday, May 15th, 2007 by Agro Rachmatullah

virus

14 Mei 2007. Aku lapar, jadinya kumasak sebungkus mi instan rasa ayam bawang. Nyetel TV, eh… Kebeneran ada Ichi Rittoru no Namida di Indosiar.

Di episode ini, keluarga Aya berdoa di kuil. Di doa tahun baru itu, adik perempuan Aya yang terkecil memohon agar kakaknya cepat sembuh. Kali ini Aya sudah harus menggunakan kursi roda.

Walaupun menemui kesalahan penerjemahan di episode perdana, kali ini aku sama sekali nggak berniat mencari-cari kesalahan. Pokoknya ngisi perut, abis itu balik ke komputer lagi. Tapi…

Penyakit yang diderita Aya, Spinocerebellar ataxia (SCA), adalah penyakit genetik yang mempengaruhi cerebellum (bagian otak yang mengendalikan aktivitas otot). Kata kuncinya adalah ‘penyakit genetik‘, yang berarti bahwa ini penyakit keturunan.

Di episode ini, ada adegan seminar para dokter dan peneliti. Di versi Indosiar, sang pembicara mengatakan yang kurang lebihnya adalah ‘…penelitian lebih lanjut diharapkan dapat mencegah menyebarnya virus penyakit ini’. Aduh! (Penyakit genetik disebabkan oleh (satu atau lebih) gen tertentu, bukannya virus)

Ah, masalah penerjemahan payah memang tidak ada habis-habisnya, mulai dari anak kuliahan yang ogah-ogahan nulis tugas sampai stasiun televisi besar seperti Indosiar… Aku kemarin nyoba ngirim e-mail ke Indosiar tentang kesalahan di episode pertama. Akankah direspon?

PS: Di One Liter of Tears dikatakan bahwa Aya mengidap Spinocerebellar degeneration (SCD). SCD adalah sebutan lama untuk SCA yang disebabkan gen autosom dominan. (kalau nyari ‘Spinocerebellar degeneration‘ di Wikipedia bahasa Inggris, kamu akan dibawa ke artikelnya ‘Spinocerebellar ataxia‘)

Using the prefix -an to make an informal verb from a noun

Saturday, May 12th, 2007 by Agro Rachmatullah

In Bahasa Indonesia, the prefix -an is a very powerful grammatical construct. Here I will discuss one of its uses, to make an informal verb from a noun.

Given a noun, by attaching -an to its end we can create a verb which means “to do something with the noun”. An example noun is Internet. Using the -an prefix, we can make internetan which means “to access the Internet”:

Aku mau internetan di perpus.
I’m going to access the Internet in the library.

Note that it is colloquial, so you shouldn’t use it in formal writing. Here are more examples:

sepeda (bicycle) -> sepedaan (to ride bicycle)
Dia lagi sepedaan di lapangan.
He’s riding bike at the field.

pacar (girlfriend/boyfriend) -> pacaran (to date someone)
Anto lagi pacaran.
Anto is out on a date.

PS (Playstation) -> PS-an (to play the Playstation)
Belajar! Jangan PS-an terus!
Study! Don’t play Playstation all the time!

Sikat ((tooth)brush) -> sikatan (to brush the teeth)
Udah sikatan?
Have you brushed your teeth?

The hard part is that you can’t just slap it to any noun. It might be correct gramatically but nobody use it so it will sound weird. For example, TV-an (supposedly “to watch TV”) is never used. So are “rokokan” (supposedly “to smoke”), “kursian” (supposedly “to sit”), and “sapuan” (supposedly “to sweep”). I don’t think there is an easy rule to sort the nouns. You just have to figure it out by immersing yourself in the language.

Kenapa aku (dulu) tidak mau jadi dokter

Saturday, May 5th, 2007 by Agro Rachmatullah

Cerebellum highlighted in blue

Aku barusan ngeliat (sebagian) One Litre of Tears episode 1 yang ditayangin Indosiar. Tahu kan? Ini drama menyentuh yang diangkat dari buku harian Kitou Aya, pasien Spinocerebellar ataxia (SCA). Pernah dijiplak Indonesia jadi Buku Harian Nayla (jiplak, bukan adaptasi, wong sama sekali tidak mengakui sumber cerita aslinya).

Aku sebelumnya udah pernah namatin drama yang dibintangi Sawajiri Erika ini. Minjem CD-nya adikku, suara asli Jepang dengan fansub Inggris. Tadi nonton soalnya penasaran aja, seperti apa versi dubbing-nya. (nggak berencana nonton lanjutannya, harus ngerjain TA dan nggak mau numpahin liter ke-2)

Secara umum dub-nya OK lah. Tapi aku cukup kaget dengan penyebaran informasi yang salah di beberapa menit pertama. Versi Indosiar menyebutkan bahwa pengidap penyakit ini akan “susah menggerakkan anggota tubuh, susah berbicara, dan mengalami gangguan berpikir” (kira-kira, nggak kurekam soalnya). Lalu belakangan disebutkan bahwa perlahan-lahan pengidap juga akan mengalami “…hilang ingatan” (kira-kira juga).

Aku bukan dokter, tapi dari yang kubaca di Wikipedia:

Generally, a sufferer retains full mental capacity but may progressively lose physical control.

Kata Wikipedia, mental (termasuk kemampuan bepikir dan ingatan) tidak terganggu, hanya saja perlahan-lahan kendali fisik bisa hilang (kesulitan berbicara, menggerakkan tangan, dll). Jadi, skor akurasi teknis -1 buat Indosiar. Seingatku, terjemahan fansub yang kutonton juga tidak menyinggung-nyinggung tentang gangguan pada fungsi mental. Pingin denger dialog Jepang aslinya tapi CD-nya lagi nggak di sini.

SCA adalah penyakit yang belum bisa disembuhkan. Selain 1 Litre of Tears, aku juga pernah nonton/baca beberapa cerita lain tentang penyakit-penyakit yang tak bisa disembuhkan. Film A Beautiful Mind diangkat dari kisah nyata John Nash, matematikawan penerima Nobel Ekonomi yang terkena Schizophrenia (ada adegan Igo-nya!!!). Film The Notebook merupakan adopsi dari novel dengan judul yang sama, kali ini tentang Alzheimer. Ada juga game novel interaktif yang mengangkat gagal ginjal kronis.

Di cerita-cerita tersebut, kita diajak menangis melihat betapa tidak berdayanya manusia. Ini abad 21 dengan segala kejayaannya seperti pembuktian Teorema Terakhir Fermat, disket holografik 3.9 TB, dan teleportasi kuantum. Tapi kita masih hidup dihantui berbagai penyakit yang belum ada obatnya. Di manakah sirup sakti Doraemon yang sekali teguk bisa menyembuhkan semua macam penyakit?

OK, kembali ke… uhm… inti dari postingan ini. (aku nggak punya laptop)

Apa cita-cita pertamaku? Jadi dokter kandungan. Ya, benar. Kok bisa? Karena saat ibuku bertanya “Agro besar mau jadi apa?”, aku diajarkan jawaban “dokter kandungan”. Omonganku waktu itu masih belum sempurna, jadi mungkin yang kuucapkan semacam “o-te… andunan”.

OK, mungkin itu bukan cita-cita. Aku hanyalah bagai pensistesis suara seperti Festival. Waktu itu aku masih terlalu kecil untuk tahu apa itu “cita-cita” dan “dokter kandungan”.

Setelah aku cukup besar untuk membayangkan berbagai cita-cita, anehnya “dokter” sama sekali tidak pernah kuminati. Orang-orang banyak yang mengatakan hal-hal seperti “jadi dokter nanti kaya…”, “jadi dokter banyak duitnya…”. Mungkin itu yang membuatku anti. Bukan anti duitnya, tapi karena orang-orang HANYA menekankan duitnya, jadi seakan-akan dokter hanyalah mesin pencetak duit yang membosankan. Pasien bertanya, kita mendiagnosis dan memberi obat, orang sembuh, dan kita dapat duit. Aku milih yang lebih menyenangkan aja misalnya bikin komik (salah satu cita-citaku zaman SD dulu).

Tapi, cerita-cerita tentang penyakit yang tak bisa disembuhkan tersebut merubah sudut pandangku tentang pekerjaan di dunia kedokteran. Sebetulnya sejak sebelumya aku tahu bahwa ada penyakit yang belum bisa disembuhkan (contoh populernya AIDS), tapi itu hanyalah pengetahuan semata yang tidak menyentuh. Di lain pihak, dengan mengenal sosok seperti Aya hati ini benar-benar sakit karena aku tidak bisa berbuat apa-apa melihat dia menderita. Ingin rasanya bisa membantu dia. Ya, aku menjadi terbuka pada alternatif di dunia kedokteran selain menjadi buruh pencetak duit yang hidup bahagia ever after. Alternatifnya adalah meneliti penyakit-penyakit ganas tersebut, mencari obat yang menjawab rintihan orang-orang yang masih menyimpan sebenih harapan. Sama-sama bertujuan menyembuhkan layaknya dokter pada umumnya, tapi yang ini jauh lebih menantang dan menarik buatku.

Ah, tapi manusia itu terbatas. Kalau kita mencoba menjadi segalanya, kita malah tidak akan jadi apa-apa. Aku nggak berencana pindah ke kedokteran, tapi paling tidak aku sekarang lebih mengapresiasi dunia tersebut. Toh perkembangan di satu bidang ilmu akan mempengaruhi bidang lainnya kan? Laser, mainan para fisikawan, kini jadi alat penting di dunia kedokteran. Proyek komputasi terdistribusi Folding@home membantu usaha pencarian obat kanker. Jadi aku bisa sedikit puas, karena berada di dunia MIPA yang cukup dekat dengan bidang kedokteran.

強く前へ。。。