MySQL (and SQLite) sucks: primary key boleh null

July 12th, 2008 by steven

Satu hal yang sejak dulu bikin saya sedikit terganggu (karena harus ekstra mengetik) adalah: MySQL membolehkan primary key yang null. Jika menginginkan PK yang tidak null (which is practically all the time), kita harus menuiskan INT PRIMARY KEY NOT NULL, tidak hanya INT PRIMARY KEY. Ngeselin kan? Padahal per definisi, PK itu tidak boleh null (PK = unique + not null). Dan rupanya gak cuma MySQL yang sucks di sini, SQLite juga. Untunglah Postgres gak ikut2an gila.

MySQL sucks: whitespace-sensitive?

July 12th, 2008 by steven
SELECT SUM(foo) FROM bar; -- ok
SELECT SUM (foo) FROM bar; -- ERROR 1305 (42000): FUNCTION db.sum does not exist
SELECT version(); -- 5.0.32-Debian_7etch5-log

MySQL sucks: query “top N per group”

July 5th, 2008 by steven

Hari ini terbentur lagi dengan salah satu keterbatasan MySQL: klausa LIMIT gak bisa ditaruh di dalam subquery yg disebutkan dalam IN/ALL/ANY/SOME. Ini mempersulit query macam “mencari 4 harga terakhir untuk setiap produk”, “mencari 3 komentar terbaru untuk setiap posting”, dsb (”top N per group” query). Ada sih workaround-nya, mulai dari pake variabel counter, SP, inner join (yg lebih lelet). But still, … rese ah. :p

Database laen bisa, termasuk PostgreSQL sampe yg “ece-ece” kayak SQLite. Di SQL Server malah ada klausa khusus yg bikin gampang.

Manual produk China yang sucks

June 12th, 2008 by steven

Rasanya semua dari kita udah pernah mengalami pengalaman buruk dengan barang2x China yang memang murah tapi kualitasnya… ehem, cape deh. Setelah didera deretan produk elektronik/komputer/gadget China yang konyol dan mengecewakan, seperti mobile rack dan yang terakhir NOKLA (sic) E90, minggu kemaren saya membeli setrika Denpoo. Saya mencoba membaca manual cara mengisi air dan mengeluarkan uap dari setrikaan, tapi nyerah. Bagan petunjuknya salah, kata2xnya doesn’t make sense, berantakan abis, bahkan gak terlihat seperti bahasa Indonesia. Lihat cuplikan manualnya di bawah, saya gak mengada2x (saya salin sampe titik koma dan salah ketiknya, tapi komentar atau emphasis warna merah tambahan saya).  Siapa sih yang bikin, tukang potong daging yang lagi mabok? Shame on you, Denpoo. 不要脸…

BAGAIMANA CARA MENGGUNAKAN:
UAPAIR SETRIKAAN:
Mengisi dengan air:
* Silakan baca buku “PETUNJUK UNTUK DICATAT” (tentu saja, yang namanya buku ini tidak ada sama sekali).
Dorong pengendali Uap air dengan sepenuhnya mengarah   ke bawah
* Pegangang setrika itu, tegak lurus sehingga dapat disi tambahkan air dalam posisi horisontal. Isi dengan air sampai max. mengisi air sampai kedalam permukaan air.

Memilihan suhu setrikaan:
* Atur nomor pengendali suhu menurut perlindungan tekstil internasional symbols(temperature yang dial/washing label) (just WTF is he talking about here…) atau jenis pabrik.
* Buatan   (suhu rendah)
* sutera, wol   (suhu setengah)
* cotton, linen (si translatornya give up di sini) macam-macam materi untuk disetrika, jika perlu

Uap air yang menyetrika buatan bagus:
Dalam praktek kebanyakan susunan uap air setrika bisa menghalangi uap air untuk menghasilkan antara soleplate dan susunannya.  mengendalikan nomor suhu diawali dengan yang berwarna (3 titik). Ketika lampu pilot di kompor gas (great, tiba2x bicara kompor gas padahal ini manual setrikaan) hilang putar Uap air secara mendatar secara maksimum. Memegang setrika yang secara horisontal dapat memastikan bahwa adanya uap air sebelum mermulai menyetrika ( pertama periksa bagian atas di dalam klem pelipit). (Tentu saja, yang namanya klem pelipit itu gak tau di mana, di bagannya gak ada. Dan bagannya salah total. Bagian depan tempat muncratan air disebut pelindung kabel, yang harusnya soleplate alias pelat panas dilabeli tempat kabel, dst. Dan tentu saja, selesai membaca paragraf ini saya gak ngerti apa2x, karena semuanya nonsensical). sambungkan setrikaan ke aliran listrik:
* Hubungkan setrikaan ke aliran listrik. Cahaya suhu menunjukkan bahwa setrikan sedang panas.
Ketika suhu mati, suhu yang harus susah diatur dan setrika siap digunakan.
* Selama menyetrika suhu menyalah setrika secara otomatis, tombol on/off merupakan alat pengatur panas (setelah diatur boleh melanjutkan setrikaannya)
Tentukan pengendali uap air mendasar itu:
* ingin sekali - Uap air mendasar terkendalikan dan maximal tingkatannya.
siap untuk menyetrika
* Uap air diproduksi secepat setrika dipegang secara horisontal.

MENUJU LAYAR: (ok, kita bicara tv sekarang?)
Generasi Uap air dapat ditekankan oleh:
* berdirikan setrika pada bagian belakangnya
* dorong pengaturan Uap air mendatar mengarah ke bawah sampai berhenti.

(more garbage follows…)

Beijing is supposedly one of world’s centers for foreign language studies, and yet we still have to endure these kinds of linguistic butcheries from mainland China. Sucks, doesn’t it?

Btw, denger2x terjemahan VCD/DVD bajakan juga sama ancurnya ya? (Maklum jarang nonton bajakan ;-)). Ck ck ck…  真的不要脸…

Lirik “Mouse loves rice” yang sucks

June 12th, 2008 by steven

Terjemahan yang terlalu harfiah atau mengikuti aslinya (”too faithful”) biasanya gak cocok untuk lirik lagu. Tapi baru kali ini ngedenger yang separah ini. Versi Inggris dari lagu popular Mandarin “老鼠爱大米” (lao shu ai da mi). Siapa sih yang bikinnya, anak TK? (Videoklipnya rada2x cute, walau tetep garing).

Mouse Loves Rice

when that day i hear your voice
i have some special feeling
let me always think, i don’t wanna forget you
i remember at the day
you are always on my mind
(it fears though?) i just can think about you

if one day in the future, this love will becoming true
i will never change my mind that i will love you forever
i don’t care how far it is, i will let my dream come true
i will tell you something i wanna let you know
i let you know

i love you, loving  you
as the mouse who loves the rice
even everyday has storm
i will always by your side

i miss you, missing you
i don’t care how hard it is
i just want you be happy
everything i do it for you

Eww.

Btw, jadi inget Teungku Malinda yang suka nerjemahin lirik2x lagu Indonesia ke Inggris, biasanya untuk  festival internasional. Contohnya “Kaulah Segalanya”-nya Ruth Sahanaya yang lalu jadi juara di Finlandia. Now that’s good lyrics translation!

Perl 6: sucks or rules?

May 23rd, 2008 by steven

Mari tanya om Gugel: perl6 sucks = 12 ribu result, perl6 rules = 51 ribu result. Jadi: jelas-jelas Perl 6 rules! :-) (Oke, gak objektif karena “rules” sebetulnya adalah bagian dari spesifikasi regexes/grammar Perl 6, jadi tentu akan sering disebutkan bersama2x.)

Tapi still, menurut saya pribadi, Perl6 rules, terutama bagi programer Perl. Perl 6 berjanji akan memperbaiki “semua” kekurangan2x Perl 5, membuatnya jadi tetap (dan lebih) kompetitif dibandingkan bahasa2x lain yang menjadi saingannya, namun sambil membuat Perl 6 tetap berjiwa Perl. Dan melihat spesifikasi yang ada sejauh ini, keliatannya janji tersebut akan cukup terpenuhi. Di posting-posting blog mendatang, kalo ada waktu dan mood, saya akan mencoba posting beberapa fitur baru dari Perl 6 yang cool banget gitu loh.

Ada 2 argumen paling popular seputar mengapa Perl 6 sucks.

Yang pertama adalah: Perl 6 is a mess. Dan biasanya yang menjadi titik sorot adalah dua aspek: sigil (Perl 6 bukannya menyederhanakan atau menghilangkan sigil alias prefiks $, @, % pada variabel, tapi malah menambah kompleks dengan menambahkan twigil seperti $*, $^, %., dll) dan operator (Perl 6 menambah jumlah operator jadi banyak sekali, totalnya di atas 100!). Sehingga berpotensi membuat line noise yang lebih parah lagi.

Yang kedua adalah: Perl 6 is vaporware. 8 tahun berlalu sudah sejak proyek Perl 6 diumumkan 2000 silam. Sampai sekarang, kita belum melihat ada satupun implementasi Perl 6 yang lengkap. Jangankan itu, beberapa aspek bahasa spesifikasinya pun masih belum ada, contohnya spesifikasi utk security, kompilasi, dan command line interface.

Untuk argumen pertama, saya curiga kebanyakan orang  yang meluncurkannya adalah bukan pemakai Perl, atau pemakai Perl yang diam2x berharap bahwa versi berikut Perl akan jadi lebih seperti Python atau Ruby, sehingga mereka kecewa karena kenyataannya tidak sesuai dengan harapan mereka. Di mata mereka, Perl 1 through 5 are a mess anyway.

Sigil & twigil

Sesuai dengan ciri khas Perl, memang Perl 6 mempertahankan keberadaan sigil. Hilangnya sigil sama sekali akan membuat terlalu banyak perubahan visual, sehingga ciri khasnya hilang.

Namun setidaknya Perl 6 membuat sedikit penyederhanaan pada sigil, dengan membuat prefiks sebuah sigil tetap: $ary[0] di Perl 5 kini tetap @ary[0]. $hash{’key’} kini tetap ditulis %hash{’key’}.

Sementara keberadaan twigil sebetulnya amat membantu karena memberi indikasi scope (sigil sendiri memberi indikasi jenis data). Dan karena di Perl 6 ada banyak scope tambahan, keberadaan twigil-twigil ini justru membantu keterbacaan. Contohnya, sekarang kita bisa menandai semua variabel global dengan $*FOO. Sebelumnya, kita harus mengandalkan konvensi huruf besar dan kecil. Lalu untuk membedakan atribut objek, kita dapat menggunakan $.foo (IMHO lebih enak dibaca/diketik ketimbang self.foo). Untuk parameter subrutin, disediakan penanda $^foo dan $:foo. Bahkan untuk POD disediakan variabel-variabel $=foo sehingga kita bisa mengaksesnya dari program.

Tentu saja, twigil tidak harus ditambahkan kecuali jika perlu dan ingin. Jika ada variabel tanpa twigil, scopenya akan dicari sesuai urutan. Keberadaan twigil dapat mengurangi ambiguitas jika diperlukan, dan jika ditambahkan akan meningkatkan keterbacaan.

Operator

Di Perl 6, operator sebetulnya gak lebih dari fungsi yang punya nama aneh (dan biasanya berupa simbol). Jadi, operator adalah shortcut. Untuk membantu programer menjadi lebih produktif, Perl 6 menyediakan banyak shortcut. Shortcut-shortcut ini diciptakan setelah melihat pola pemakaian programer Perl 5 selama bertahun-tahun.

Jumlah operator yang katanya mencapai 100 lebih ini pun sebetulnya merupakan total kombinasi saja. Seperti diketahui, Perl 6 memiliki konsep metaoperator (atau modifier operator), di mana sebuah operator (seperti +, -, *, =, dll) dapat dikombinasikan dengan metaoperator sehingga menghasilkan satu set operator lagi, sehingga total jumlahnya  banyak.

Contohnya, untuk grep dan map yang sering sekali dilakukan (dan reduce, yang sebelumnya gak ada builtinnya di Perl 5), kini ada shortcutnya yaitu hyper (meta)operator dan reduction (meta) operator.

Jika di Perl 5 kita menulis:

@c = map { $a[$_] + $b[$_] } 0..$#a;

maka di Perl 6 kita bisa menulis:

@c = @a >>+<< @b;

karena hyperoperator >><< otomatis mengaplikasikan operator + bagi semua elemen list. Sementara metaoperator [] merupakan padanan metode inject seperti di Ruby. Sehingga jika di Perl 5 kita menulis:

$r = 0; for (@ary) { $r += $_ }

atau di Ruby:

[1, 2, 3].inject{|x, y| x+y}

di Perl 6 dapat ditulis:

$r = [+] @ary;

Contoh-contoh lain:

P5: $_++ for @ary;
P5: for (@ary) { $_++ }
P6: @ary >>++;

P5: @min = map { $a[$_] < $b[$_] ? $a[$_] : $b[$_] } 0..$#a;
P6: @min = @a >>min<< @b;

# semua Perl 6
$hasil_kali = [*] @a;
$faktorial = [*] 1..$n;
$sorted = [<] @a; # true if @a[0] < @a[1] < @a[2] < …
$min = [min] @a; $min = [min] @a;

Memang efek samping dari banyaknya operator ini adalah, Perl nampak makin tidak terbaca bagi seseorang yang asing dengan Perl. Tapi what’s wrong with that? Seseorang yang tidak pernah belajar huruf Kanji juga tidak bisa membaca teks Jepang atau Mandarin kan?

Vaporware

Memang untuk yang ini sulit dibuat penyanggahnya, karena saat ini Perl 6 *is* a vaporware. Tapi meskipun tidak bisa disanggah, setidaknya kita dapat memaklumi.

Cobalah menempatkan diri pada posisi Larry Wall. Ciptaan Anda, Perl 5, telah begitu sukses dan terus dipakai 13 tahun setelah pertama kali dirilis (dan kemungkinan akan terus dipakai setidaknya 13 tahun lagi). Sekarang, setelah kemajuan zaman dan hadirnya bahasa2x baru, Anda diharapkan membuat generasi berikutnya yang tentunya diharapkan akan bertahan setidaknya 10 tahun ke depan juga. Tidak hanya bertahan, tapi juga harus kompetitif dan mampu membuat para hacker tertarik memainkan bahasa Anda setidaknya selama beberapa tahun. Andaikan Anda hanya membuat just another Ruby clone atau Perl with Ruby & Python features, kebanyakan orang pasti akan berkomentar, “meh,” dan mungkin akan memakai Python & Ruby saja sekalian.

Tidak, pikir Anda, Anda tentu harus berimajinasi dan memikirkan banyak hal baru dan inovatif untuk dimasukkan dalam bahasa baru Anda ini. Dan Larry Wall + komunitas Perl memang telah banyak mencoba mendesain banyak hal ambisius: seperti mencoba mendesain ulang sintaks regex yang telah puluhan tahun stabil (atau stagnan), memasukkan buanyak fitur2x dari bahasa lain (macro a la lisp, block a la ruby), serta merangkum berbagai paradigma (OO/prosedural/fungsional, static/strict/loose typing, you name it, semua bisa) sambil tetap membuatnya opsional karena tak ingin memaksa user memakainya jika tak ingin.

Di sisi implementasi, berkat Perl 6 efforts, muncul pula proyek Parrot yangjuga ambisius, yaitu membuat virtual machine untuk menjalankan semua bahasa dinamik. Perl 6 sendiri dimaksudkan untuk memiliki banyak implementasi.

Saking ambisiusnya, sampai kini belum ada implementasi Perl 6 yang lengkap (walaupun bulan-bulan terakhir Parrot dan Rakudo mengalami percepatan momentum). Tapi gak masalah. Perl 6 adalah, in some respects, sebuah eksperimen. Perl 6 juga tidak diciptakan melulu untuk menyelesaikan masalah2x yang ada sekarang, melainkan juga masalah2x yang akan lebih relevan 5-10 tahun mendatang (seperti konkurensi dan interoperasi antarbahasa skripting). Untuk masalah2x yang harus dipecahkan sekarang, there’s always production-ready Perl 5 yang tetap dimaintain dan dikembangkan.

PHP: restriktif atau tidak restriktif?

May 14th, 2008 by steven

Dari komentar sebuah blog:

i have been saying this for a while now… most of them have never used php. the fact is most of these people are so used to restrictive languages that they do know the freedom of using a language like php and think that you can’t right good programs if you use php.

Menurut pengalaman saya, justru mereka yang berkomentar bahwa PHP sucks adalah yang sudahpernah memakai PHP dan merasakannya lebih restriktif dari bahasa lain yang sudah terlebih dulu mereka ketahui.

Bagi saya pribadi, satu hal yang amat membuat hidup di dunia PHP terasa restriktif/menderita adalah ketiadaan blok atau fungsi anonim. Sesuatu yang seharusnya bisa ringkas seperti:

$sql = “DELETE FROM table WHERE name IN (” . join(”,”, map { $dbh->quote($_) } @params) . “)”;

harus  dengan susah payah ditulis di PHP seperti ini:

$sql = “DELETE FROM table WHERE name IN (”;
for ($i=0; $i<count($params); $i++) {
$sql .= ($i ? “, ” : “”) . “‘” . mysql_escape_string($p) . “‘”;
}
$sql .= “)”;

Mengesalkan sekali memang. Tapi dipikir-pikir, waktu dulu sering koding di Python pun mengalami masalah yang serupa.

Oya, sekalian, fungsi MySQL untuk quote string di PHP ada beberapa, tapi sucks semua, karena tidak otomatis menambahkan kutip, dan tidak bisa menangani null. Fungsi quote macam apa itu? :p

MySQL sucks

May 8th, 2008 by admin

Kadang-kadang suka aneh dengan implementasi SQL yang setengah2x di MySQL. Udah lama gw tau bahwa FULL OUTER JOIN gak didukung, dan gw gak terlalu peduli karena toh ampir gak pernah make juga. Tapi beberapa hari yang lalu nyobain SELECT … INTERSECT SELECT … Dor, ternyata INTERSECT dan EXCEPT juga belon didukung MySQL. Kok nanggung sih? Padahal UNION/UNION ALL udah.

Memang keduanya bisa disimulasi sih, baik FULL OUTER JOIN maupun INTERSECT dengan EXISTS, but still…

Yep, everything sucks

May 8th, 2008 by admin

Blog ini direposisikan ah, untuk menjadi tempat komplain dan ngomel teknis. Target umum adalah tul-tul yang sering saya pakai sehari-hari, seperti Perl, PHP, Ruby, MySQL, Postgres, Apache, Linux. Dan terutamanya tentu PHP, soalnya yang paling sucks sih, jadi paling gampang bikin rants dan cheap shots untuknya hehe.

Boleh kan komplain? Eh ngapain nanya, ya boleh lah. Ini kan blog guwe!

PEAR: librari kode sentral PHP yang masih miskin

May 8th, 2008 by steven

PHP saat ini jadi raja dalam bidang aplikasi web. Dulu 1998-1999 jumlah aplikasi Perl/CGI masih lebih banyak daripada PHP. Satu dua tahun kemudian posisi mulai seimbang. Kini saat saya ngecek hotscripts atau SF, jumlah aplikasi web PHP sudah jauh meninggalkan Perl, Python, Ruby, dll. Ke mana para programer web Perl, punah?

Rupanya banyak aktivitas berfokus di CPAN, librari kode reusable sentral di Perl. Di lain pihak, PEAR sebagai padanan CPAN di PHP masih miskin kode. Terakhir ngecek, jumlah extension PEAR gak nyampe 500 sementara jumlah modul Perl di CPAN dah belasan ribu. Beberapa hari terakhir ini di PEAR nyoba nyari librari DomainKeys/DKIM, lalu sesuatu yang mirip Text::Similar, lalu terbilang untuk Indo & English, kagak ada semua. Sigh. Mungkin di PHP kita mesti mengais-ngais sebagian librari-librari semacam ini berbagai direktori kode yang tersebar di Web, ato dari berbagai aplikasi Web yang ada. Sesuatu yang perlu diakui kurang nyaman.