Learn the Rules, Break The Rules, and Create the New Ones...

Hi... My name is Rizky Prihanto. You can call me RQ, or Rizky either. I am currently living on Bandung, Indonesia. Had a lot of works and research about Enterprise Information Systems (majoring on education and e-governments). I have bunch of interests (some friends call it 'freakz') about MySQL Opensource Database and now I am one of the administrator of MySQL Indonesia User Group - the opensource community initialized by Sun Microsystems Indonesia.

My Company PT Cinox Media Insani, Bandung, Indonesia. I work here since 2008 and I take responsibility as Chief of Software Architect. My job is about planning, imaginating, fantasy-ing, concepting, and build the infrastructure of the new information systems (or app engines) which going to be implemented.

This blog This is my blog that represent my current opinion, research and experiences about anything in Software Engineering. Written since 2007 (actually) and has been vaccum for a lot of while. And now I wanna ressurrect this blog (optimistically) from the long-long-hibernation with something fresh and new ideas -- still about MySQL, software engineering, development, and may be something managerial here.

About the tagline I've learned the statement above from some paper written by Kent Beck about Extreme Programming (XP) methodology -- some sort of practical software development methods which have no boundaries. That's very inspiring me a lot. I have written some article on this blog that tell my interpretation about that statement here.

My Another Blogs I have classifying my blogs into some sort of genre. The blog that you read here right now is my primary blog that tell you (majoring) about IT stuff. But if you wanna look another side of me, you can visit here, here, here,or here. Hope it'll be interesting for some of you.

Credits I would thanks to Blogger for this great blog platform. Skinpress who designed this Wordpress template (which is bloggerized by Free Blogger Templates). My appreciate is also going to you who give your generously time for visiting my blog.

7
Too Many Connections Error

Sejak MySQL 5 mulai diperkenalkan tahun 2005 lalu, masih banyak menyimpan sejarah traumatis bagi server-server yang menggunakan engine tersebut. Spesifikasi yang makin serius mengarah ke real DBMS Engine, berangsur-angsur membawa MySQL lebih ke penggunaan enterprise. Ngga sedikit web-web server yang harus melakukan upgrade perangkat keras utk mengoptimalkan MySQL -- walau masih jauh lebih ekonomis daripada standard minimum system requirements utk server kelas berat macam MS SQL Server ataupun Oracle.

Salah satu issue besar yang acapkali menimpa server yg menggunakan MySQL, adalah berhubungan dengan error Too Many Connections. Setidaknya, apa yg gw omongkan di sini bukan hoax -- tanyakanlah itu pada admin Kaskus.us, admin MWN, admin diskusiweb, admin ekomit (hehehe, sumpah bukan gw) -- error Too Many Connection itu bener-bener menyebalkan. SANGAT-SANGAT-SANGAT-SANGAT-MENYEBALKAN.

Sebenarnya, apa sih error Too Many Connections itu? Dan kenapa bisa (sering bangedd) terjadi. Artikel gw kali ini akan mencoba membahasnya.

Too Many Connections itu terjadi karena beberapa habit, seperti :
  1. terlalu banyak koneksi yang terjadi secara simultan --> cukup sering dijumpai oleh site-site yang emang ramai pengunjung.
  2. terjadi flooding paket cacat ke port yg dipakae MySQL --> ini bisa di-test dengan melakukan telnet ke 3306, coba aja lakukan beberapa kali : insyaAllah MySQL Server langsung down, ato bisa juga karena terjadi kegagalan koneksi berkali2.
  3. terlalu banyak koneksi yang udah obsolete, tapi belum di-release / di-free-kan.
Utk habit pertama, yang terjadi karena emang karena kondisi (atau resiko?) yang memaksa terjadi koneksi simultan. Popularitas emang gag bisa di-hindari. Klo emang 'takdirnya' emang udah saatnya ntu web jadi populer, ya udahlah... -- cara ngatasin Too Many Connections model gini adalah melakukan tweak pada mysql configuration file (my.ini atau my.cnf) dan ningkatin value dari variabel max_connections. Default-nya, ntu variabel nilainya 100. Untuk website yg rame dikunjungin, mungkin kurang settingan segitu. Atau, klo penggunaan MySQL utk keperluan aplikasi desktop, hitung aja jumlah client yg ngakses -- ya minimal kira2 segitu lah.

Utk habit kedua, terdapat banyaknya paket cacat di pool MySQL, cara nanganinnya adalah dengan melakukan flush menggunakan tools mysqladmin. bikin batch-script yang isinya mysqladmin flush-hosts -- trus pasang sebagai handler di Web Server atau di program desktop (sesuaikan dengan environmentnya) kalo2 menemukan error di MySQL engine dengan kode error SQLSTATE = 08S01 (utk server error yg berhubungan dengan bad packet) atau 46000 (utk server error yg berhubungan dengan koneksi), atau ndeteksi dari kode error ODBC -2147467259 (ni value yg gw trap dari error ADODB makae MyODBC).

Utk habit ketiga, terlalu banyak koneksi yg udah obsolete, tapi belum di-release atau di free-kan -- ini adalah masalah budaya coding juga sih. Code yang jorok, akan meninggalkan banyak junk di cache server. Bagi para coder, mestinya *sadar dikit* tentang cara melakukan koneksi ke DBMS, apakah dengan cara persistent-connection atau non-persistent. Klo cara yang dipakae adalah persistent-connection (kelebihan klo makae teknik ini adalah *memungkinkan utk melakukan transaction-safe queries*) -- perhatikan benar di masalah threading (silakan liat artikel ini utk referensi : http://forums.devshed.com/php-development-5/mysql-pconnect-22495.html). 
 
Persistent connection merupakan cara koneksi yang *ngga akan diputus ama server* walaupun kita meng-eksekusi function close macam mysql_close() -- ketika ada koneksi baru terjalin, dia akan nge-cek apakah ada existing persistent connection yg menggunakan parameter koneksi yg sama (sama user, sama pwd, sama host, sama database). Klo ditemukan existing persistent connection, code akan makae koneksi itu. Kelemahannya, ya kembali ke settingan max_connections -- klo udah mencapai limit, koneksi baru dari client baru ngga akan terbentuk.

Utk me-manage dari sisi administrasi server mengenai persistent connection ini, ada 2 variabel server yg perlu diperhatikan.
1. max_connections --> seperti pembahasan pada habit pertama;
2. wait_timeout --> MySQL mengendalikan "umur" sebuah persistent connection melalui variabel ini, dimana nilai default-nya adalah 8 jam. Silakan ubah nilai variabel ini sesuai dengan server-load yg terjadi dalam produksi.

Sedangkan utk handle non-persistent connection, dimana ini adalah teknik umum yg dipakai (klo di PHP, makae mysql_connect() atau liat library yg disediakan oleh connector yg dipakae). Untuk kebersihan code, *always-selalu-musti* lakukan closing terhadap object koneksi klo proses querying selesai. lakukan mysql_close() segera ketika dibutuhkan.

Kekurangan mysql_connect() ini ketimbang mysql_pconnect() dalam persistent connection adalah ngga ada mekanisme utk memakai "existing non-persistent connection" -- jadi, bisa saja dalam satu modul aplikasi yg diakses oleh satu client menjalin 2-3-4-atau lebih koneksi, which is : ini pemborosan jumlah koneksi!

Be aware dengan non-persistent-connection! Kerapian code Anda menentukan kualitas aplikasi Anda sendiri!

Emm...,

Tapi yang namanya programmer itu juga manusia, punya rasa punya hati, -- juga punya khilaf. Kalo *seandainya* koneksi-koneksi non-persistent tersebut di-create asal dan ngga di-close, kan bakal banyak juga tuh koneksi nyangkut. MySQL mengantisipasi masalah ini dengan juga memberikan "umur" koneksi (sama seperti penanganan persistent-connection di atas), hanya saja, variabel server yang dipergunakan adalah interactive_timeout.

Anehnya, settingan default interactive_timeout ini JUGA 8 jam! sama seperti settingan default wait_timeout. Padahal koneksi non-persistent itu ditujukan utk keperluan transaksi query jangka pendek. Sangat-sangat-sangat-pendek, malah. Buka koneksi, kirim query, tunggu bentar, dapat hasil resultset, tutup. Bener-bener singkat, bukan?

Nah, saran gw, ubahlah interactive_timeout ini menjadi 3-5 menit lah (hehehe, jauh banged yak dari settingan standard 8 jam). Ini utk 'an-ti-si-sapi' bro... -- ada banyak sebab kenapa query bisa nyangkut n ngga ketutup walo pakae mysql_close() - terutama pada fase development - misal karena terjadi kegagalan atau kesalahan dalam melakukan query join, ato dapat error "MySQL Server Has Gone Away", atau cursor melakukan infinite loops, atau ... macam-macam dah. Dengan meminimalisasi interactive_timeout ke nilai waktu yang lebih representatif, kemungkinan terjadi error Too Many Connections bisa di-eliminir.

--

Apa yang paling menyebalkan klo kita dapetin error Too Many Connections?

Restart Server!! cuman itu solusinya.

*males bangedd deh...

_______________________


Rizky Prihanto
Software Architect PT Cinox Media Insani

1
Membandingkan Stored Procedure Antar 2 Database di MySQL

Pernah coding secara massive di pemrograman internal DBMS makae stored procedures/functions?
Bekerja dalam tim?
Punya beberapa database yang dipakae dalam setiap fase development? misal :
  • db_ini_dev : dikonsumsi oleh para coder-coder cakep kita
  • db_ini_test : dikonsumsi oleh para tester-tester cantik kita
  • db_ini : dikonsumsi ama client-client baik kita
Atau pernah bekerja dalam tim yang tersebar di beberapa tempat yang terpisah, dimana masing-masing punya local database untuk kegiatan coding masing-masing?
  • db_ini_dev_bandung : dikonsumsi oleh para coder-coder cakep kita di Buah Batu Regency
  • db_ini_dev_solok : dikonsumsi oleh para coder-coder tampan kita di Perumnas Koto Baru Solok
  • db_ini_test : di-host di sebuah server public dengan spesifikasi medium di sebuah gedung di Kuningan, Jakarta
  • db_ini : di host di server public yang sama dengan db_ini_test
Ketika small-release udah digulirkan, mau-ngga-mau setiap perubahan struktur database (tabel/routines/trigger/view) harus di-broadcast ke database-database kita tersebut.
Puyeng meng-analisis diferensial?

Silakan coba trik gw untuk membandingkan stored procedures antara dua database di bawah ini. (Owya, gw pakae MySQL 5 -- dan trik ini hanya bisa jalan di MySQL 5 ke atas)

Ini script gw untuk "mendeteksi" apakah ada SP yang beda definisi (atau SP baru) dari dua database yang identik. Silakan donlot di sini : http://qvezst.googlepages.com/xp_routines_compare.zip

Pertama-tama yang harus dilakukan adalah dengan meng-execute ntu script ke database mysql. Yupe! Database mysql (ini merupakan database yang 'pasti ada' di setiap engine MySQL Server -- yang isinya adalah informasi user, informasi schema, de-el-el). Klo sukses ke-attach, ntar di database mysql loe bakal nambah 2 stored procedure yang namanya xp_execute dan xp_routines_compare.

xp_execute adalah routine yg gw bikin untuk memudahkan pemanggilan PREPARED STATEMENTS di dalam stored routines, daripada tiap kali harus nulis PREPARE ... EXECUTE ... DEALLOCATE -- mending tinggal panggil call xp_execute("select blablabla");

dan xp_routines_compare, adalah inti dari artikel ini -- memiliki dua parameter input yaitu SOURCE DATABASE NAME dan TARGET DATABASE NAME. Untuk meng-compare dua database, loe masukin aja nama-nama database yg mo loe bandingin tersebut dalam format string (alias loe kasi kutip satu ato kutip dua). Kalo bingung, coba loe liat sampel pemanggilan ntu procedure di bawah ini :

mysql>call mysql.xp_routines_compare('ekomit_dbrisma','ekomit_dbrisma_test');
+------------------------------------+--------------------------------------+
| routine_yg_berbeda                 | letak_perbedaan                      |
+------------------------------------+--------------------------------------+
| sf_psb_get_nama_sekolah            | routines baru di db : ekomit_dbrisma |
| sf_report_get_count                | routines baru di db : ekomit_dbrisma |
| sf_statistik_getcount              | routines baru di db : ekomit_dbrisma |
| sp_disdik_kategori_laporan         | routines baru di db : ekomit_dbrisma |
| sp_disdik_lihat_laporan            | routines baru di db : ekomit_dbrisma |
| sp_psb_cluster_daftar_sekolah_save | PARAMETER BODY                       |
| sp_psb_sekolah_luar_cluster_combo  | BODY                                 |
| sp_psb_sekolah_prs_view            | PARAMETER BODY                       |
| sp_psb_sekolah_prs_view1record     | routines baru di db : ekomit_dbrisma |
| sp_stats_agama                     | routines baru di db : ekomit_dbrisma |
| sp_thnajaran_kini_dan_sebelumnya   | routines baru di db : ekomit_dbrisma |
| xf_properdate                      | BODY                                 |
+------------------------------------+--------------------------------------+
12 rows in set

Yak! akan terlihat di mana letak perbedaan routines di dalam dua database tersebut yang akan terdeteksi beda dari ntu routines ada di PARAMETER, di BODY, atau beda di RETURN (khusus stored functions). Dan klo ada routine baru, akan langsung di-kasih-tau ntu routines baru ada di database mana..

Gimana-gimana? Keren kan?

Oh iya, -- mencoba obyektif -- gw juga pengen beritaukan LIMITASI dalam pengimplementasian xp_routines_compare() gw ini, yaitu :
  • xp ini hanya bisa di call ama user yang punya GRANT PRIVILEGES sekelas root -- atau minim punya privileges SELECT ke database mysql.
  • ngga bs nge-compare dari 2 databases yang BERBEDA ENGINE -- karena database yang beda engine artinya beda database mysql nya.. Ntar lah kapan-kapan gw coba bikin versi cross-engine-nya (manfaatin fitur mysql replikasi, tentunya) -- tp gw gag janji dalam waktu dekat. Maklum, lagi banyak Pe-eR yg musti digarap nieh. hihihi...
Tunggu kelanjutan kisah ini...



_______________________


Rizky Prihanto
Software Architect PT Cinox Media Insani

9
Curhat tentang InnoDB

Lagi-lagi ada kegagalan pada calon aplikasi MBS kita yang di-host di MWN melalui server co-location kita. Masih ngga bisa mempergunakan InnoDB -- padahal 97.5 % tabel-tabel kita di dbrisma_solok itu makae InnoDB. Masalah MySQL di server co-location kita tampaknya berpangkal dari ketiadaan plugins InnoDB Storage Engine di server nya. Sama mereka (MWN), InnoDB emang di-disable karena dianggap banyak menimbulkan masalah. Icha tadi ngasih gw link ke thread ini :

http://forums.masterweb.net/viewtopic.php?f=8&t=1916

Jadi pada akhirnya InnoDB ngga di-support ama MWN dengan mengambil kebijakan melakukan skip-innodb. Entah ini ada hubungannya ato enggak dengan server co-location kita, di server variables ntu MySQL, terdeteksi status bahwa :

has_innodb = DISABLED

Berikut ini screenshot Navicat gw pas melakukan remote server monitoring :




Efeknya, walau gw definisi-in secara eksplisit pada klausa CREATE TABLE bahwa ENGINE = INNODB --> tetap ngga ngefek... dbrisma_solok, ekomit_dbrisma, dan ekomit_dbrisma_dev gw tetep kegenerate sebagai MyISAM seperti sekarang. Relationship beserta referential integrity nya jadi hilang..
Nah, gw, selaku (dummy a.k.a. unofficial) Database Administrator (DBA) di PT Cinox Media Insani ini, mau menjelaskan apa yang selama ini menjadi *konsep & miskonsepsi* bagi admin database biar semua pihak bisa mengambil hikmahnya dari kejadian ini :
  • InnoDB itu merupakan salah satu storage engine MySQL yang support transaksi & foreign-key (relasi tabel secara physical). Storage engine lainnya yg support adalah BDB (Berkeley DB) -- tapi sejak MySQL 5.1 udah bubar alias almarhum, karna long-time-no-support. Sedangkan InnoDB terus-terusan disupport sampai detik ini oleh kreatornya (Innobase OY) yang merupakan sub-departemen dari Oracle (yupe! Oracle yang itu... DBMS Engine yang maha-besar). Coba cek http://www.innodb.com/company dan http://www.oracle.com/innodb/index.html utk memastikan klo apa yang gw tulis di sini BUKAN HOAX.
  • Popularitas InnoDB di MySQL emang masih kalah ama MyISAM karena InnoDB baru diangkat jadi default-storage-engine ama MySQL 5 (sedangkan mysql customer udah makae MySQL sejak versi 3.x dan 4.x) -- disamping itu, aplikasi web yang sering menggadang MySQL emang (sebelum versi 5) jarang bangedd yg bener-bener memerlukan multi-feature yang ditawarin InnoDB. Mereka menjatuhkan pilihan ke MySQL sebagai DBMS yg lightweight utk project2 mereka yang kelasnya juga lightweight (seperti news-portal/company profile/blog/e-commerce). Sedangkan performa InnoDB pada saat itu malah tampak *membebani* status MySQL jadi heavyweight.. Konsumen Oracle & MSSQL utk pasar lightweight ngga banyak. Mereka concern ke support backend aplikasi berskala Enterprise (yg punya bobot sistem informasi lah). Dan InnoDB -- sejak awal emang dirancang utk aplikasi enterprise seperti itu.
  • MyISAM tenar karena selain ringan, maintenance-nya pun mudah. Mo backup bisa pakae beberapa cara, seperti mysqldump, mysqlhotcopy, bahkan pakae cara lugu --> copy folder database-nya trus paste ke backup-storage kita. InnoDB -- banyak yang ngga tau bahwa sebenarnya InnoDB juga bisa seperti itu. Makae tools mysqldump bisa, trus utk padaannya mysqlhotcopy --> Innobase udah nge-rilis shell script (Perl) yg dikasih nama innobackup yang bisa di-donlot di sini. Mau pakae cara lugu copy paste seperti MyISAM di atas juga bisa, walo perlu di-initialize dulu di awal bangedd (sebelum database/tabel berbasis InnoDB itu di-create) --> yaitu dengan menambahkan opsi di my.cnf begini : innodb_file_per_table -- yup! hanya itu doank! Setelah itu, baru "restore-dump" database kita kembali, dan data-data yang terdapat di masing2 tabel akan masuk ke file-file *.ibd secara independen.
  • Masih berhubungan dengan innodb_file_per_table -- kalo kita cuman ngikutin settingan default MySQL tentang InnoDB (yaitu dengan tidak meng-apply konfigurasi innodb_file_per_table), *semua data* dari *semua tabel InnoDB* dari *semua database* yang ada di server MySQL akan disimpan di *satu* file : ibdata --> dan ini seringkali 'membengkak-kan' size ntu file, dan memiliki efek *kerusakan data di satu tabel* akan menyebabkan CATASTROPHIC ERROR --> semua tabel InnoDB di semua database-database yang ngga bersalah dan ngga tau-apa-apa juga ikutan error. --> asumsi inilah yang sering dijadikan deduksi bagi database-administrator bahwa "pengaktifan InnoDB" bisa membawa bencana massal buat server database. Padahal dengan sedikit konfigurasi, hal itu bisa dicegah *sejak awal bangedd*
Gw bukan marketing Innobase OY, gw juga ngga punya kepentingan politis maupun ekonomis untuk membela InnoDB. Tapi berhubung gw *bener-bener butuh* InnoDB (dan sering makae), maka gw share ini... Malah, gw sedang nunggu harap-harap cemas kelahiran engine Maria (flexible as MyISAM but powerful like InnoDB) yang juga Transaction-Safe serta mendukung foreign-keys. Semenjak Monty Widenius angkat koper dari MySQL, belum ada kelanjutan progress Maria. Entah terhenti ato gimana... Apa kita tunggu kehadiran Drizzle aja? DBMS terbaru yang dikembangkan ama pentolan-pentolan MySQL Engineer yang hijrah sejak MySQL diakuisisi SUN?

Yang gw pengen *cegah* dengan menulis artikel ini adalah, jangan sampai kita mengasumsikan bahwa "MySQL ngga cocok untuk skala enterprise" -- hanya karena 'segelintir' kegagalan yang diakibatkan karena mis-konfigurasi aja.

Apakah bijaksana 'meremehkan' senapan laras panjang AK-47 dengan menganggapnya "ngga cocok utk perang pada skala enterprise" -- hanya karena 'segelintir' kegagalan yang diakibatkan karena 'kokang senapan-nya' masih terkunci??
HWAKAKAKAKAKA....
_______________________


Rizky Prihanto
Software Architect PT Cinox Media Insani

2
TVOne Streaming

Ini dia layanan TV Streaming yang di-provide ama Rileks.Com khusus untuk channel TVOne. Menggunakan protokol RTMP (Real Media) dan gosip-nya baru bisa running well klo bandwidth inet kita available 256kbps -- hmm.. lumayan besar jg tuh.

Tp gag apa2, dicoba aja gan..

N bandingin kualitasnya ama Indowebster TV yang juga gw posting di artikel lain.
Mari kita nonton TVOne Streaming langsung dari blog ini !




» Get the Flash Player « to see this player

_______________________


Rizky Prihanto
Software Architect PT Cinox Media Insani

2
Proper Case di MySQL

Sial, tester gw ngisi inputan iseng bangedd : kya gini nih :

a qUicK BRowN fOx jUmPs oVeR biLl

Selaku penanggung jawab data(base), tentunya gw gag pengen inputan asal kya gtu lulus sensor n masuk ke tabel gw. Klo di VB, gw pernah bikin function PCase (singkatan dari ProperCase) yang fungsinya bakal 'menyesuaikan paksa' string ini (a qUicK BRowN fOx jUmPs oVeR biLl) menjadi ini (A Quick Brown Fox Jumps Over Bill). Berikut ini potongan function gw di VB :

Public Function PCase(ByVal strKalimat As String) As String
 PCase = StrConv(strKalimat, vbProperCase)
End Function

Nah, masalahnya gw ngga ndevelop di VB. Dan gw masih belum percaya ama programmer-programmer PHP gw (hihihihi...) ~ gw pengen bikin stored functionnya di MySQL. Yaa, itung-itung ngelengkapin koleksi String Function di MySQL lah.. masa udah ada LCASE() dan UCASE() tapi utk bikin Proper Case ngga ada...

Setelah sedikit googling dan obok-obok algoritma dikit, gw berhasil "meramu" stored function untuk ngonvert string menjadi proper-case. Silakan simak functionnya di bawah ini :


-- Function "xf_propercase" DDL

CREATE FUNCTION `xf_propercase`(str varchar(255)) RETURNS varchar(255) CHARSET utf8
BEGIN
 DECLARE c CHAR(1);
 DECLARE s VARCHAR(128);
 DECLARE i INT DEFAULT 1;
 DECLARE bool INT DEFAULT 1;
 DECLARE punct CHAR(17) DEFAULT ' ()[]{},.-_!@;:?/';

 SET s = LCASE( str );
 WHILE i < LENGTH( str ) DO
 BEGIN
  SET c = SUBSTRING( s, i, 1 );
  IF LOCATE( c, punct ) > 0 THEN
   SET bool = 1;
  ELSEIF bool=1 THEN
   BEGIN
    IF c >= 'a' AND c <= 'z' THEN
     BEGIN
      SET s = CONCAT(LEFT(s,i-1),UCASE(c),SUBSTRING(s,i+1));
      SET bool = 0;
     END;
    ELSEIF c >= '0' AND c <= '9' THEN
     SET bool = 0;   
    END IF;
   END;
  END IF;
  SET i = i+1;
 END;
 END WHILE;
RETURN s;
END;

nah, klo kita coba panggil ntu function, caranya gini :

mysql> select xf_propercase('a qUicK BRowN fOx jUmPs oVeR biLl');
+----------------------------------------------------+
| xf_propercase('a qUicK BRowN fOx jUmPs oVeR Bill') |
+----------------------------------------------------+
| A Quick Brown Fox Jumps Over Bill                  |
+----------------------------------------------------+
1 row in set


SUKSES!! cihuyy....
_______________________


Rizky Prihanto
Software Architect PT Cinox Media Insani

4
Nyoba-Nyoba TV Streaming

Ini adalah layanang grabbing TVStreaming  dari Indowebster TV ~ butuh performa speed internet yg lumayan kenceng nih klo mau bagus. Klo bandwidth pas-pasan, yaa... putus-putus deh siarannya. Tapi, kelebihannya di Indowebster TV ini loe bisa pilih-pilih channel TV Indonesia sesuka-loe... FYI, di postingan laen gw coba grabbing TVOne juga (lebih mulus tayangannya)... silakan menuju TKP, gan..

Mari kita nikmati bersama2 TV Streaming dari Indowebster langsung dari blog ini !



_______________________


Rizky Prihanto
Software Architect PT Cinox Media Insani

2
Just Another BLOB Discussion

Ini arsip diskusi internal gw dengan temen2. Silakan menikmati.

Kalo menurut artikel yg tomfreakz refer-kan : http://forums.site5.com/showthread.php?t=14370

yg gw lihat malah "sisi positif" nya makae blob :

Q1:
I read that the BLOB type in MYSQL can store files up to approx. 2 gigs in file size. I need to store pictures that are approx. 5 mb, much smaller than the allowed size. The problem is, I noticed that the BLOB column says it's size limit is only 65,536 B!
If this is the case then how can I store any pictures or any files of any significance?

Can this file size be raised to something useful?
If not, then why even allow BLOB types?


Jawaban gw : -- BLOB emang cuman max 64KB. karna emang aslinya di-optimize utk nyimpen file2 kecil2 kya avatar, smilies, favicon, yaaa, web-widget lah.. :-)
klo butuh yg lebih dari 64KB, coba pakae MEDIUMBLOB. itu sampe 16MB. ato mo pake LONGBLOB ? sampe 4GB. cuman utk lebih dari 16MB ke atas, butuh tuning di my.ini nya MySQL, dimana default value dari max_allowed_packet=16M ~> mgkn MySQL mikir, itu udah cukup lah utk nge-fetching 1 record dengan tipe mediumblob pada kapasitas maksimal...


Q2:
Since this tiny tiny limit for BLOB types exists and if it can't be raised, I assume I'll have to go with plan B and store the file path for my pictures and store the actual picture files in a directory via PHP upon upload?

Regarding this, the questions:

Q3:
Isn't this creating a security risk by allowing the uploading of files into a directory?

Q4:
Can't hackers try to upload malicious files and then try to execute them?
This was one of the main reasons why I wanted to store the pictures in the database. Well, this and that I figure it'd require less coding.

Q5:
Can anyone give some pointers on how to go about doing this via PHP and to do so securely? protected login/data transfer,etc.

Q6:
Can site5's shared SSL cert be used for this kind of thing?

nah, tu orang nanyain problematic Q2, karna dia berasumsi tipe BLOB yg disedia-in ngga mendukung kebutuhan data yg dia perlukan (hehehe, ngga mbaca MySQL Manual sih...)
dan alibi yang dia berikan dgn Q3 dan Q4 sebenarnya malah memberikan POIN PLUS kenapa perlu penggunaan BLOB.

Disamping itu, lebih mudah manajemen file/pencarian/sorting klo pake BLOB, soalnya MySQL "sementara ini" merupakan satu-satunya DBMS engine yg bisa memperlakukan BLOB/binary data type selayaknya static-data-type. bisa di SORT, bisa di GROUP BY...

pernah kepikiran ngga :

SELECT id, image_thumbs FROM photo_images GROUP BY image; --> utk nampilin thumbnail2 (kalo ada beberapa) berdasarkan image induknya.

pretty cool, huh?

dan (ini pandangan subyektif gw) >> jauh lebih good penggunaan BLOB ketimbang absolute-path karena :

1. mudah di-dump/restore
2. lebih hemat space.. whazzup?? --> file JPG kan ngga bs di-kompress tuh. udah ukuran kecil. klo BLOB? dia bisa dicompress makae syntax :

"INSERT INTO photo_image (id, image) VALUES (" . $id . " , COMPRESS(" . mysqli_escape_string($imagedata) . ")"

dan ketika select, lakukan UNCOMPRESS()
"SELECT id, UNCOMPRESS(image) FROM photo_image WHERE id = " . $id

3. hanya perlu concern ke maintain DB, ngga usah lagi mikirin security di level file-system (yang tentu utk masing2 OS bisa beda)
4. sementara ini 3 dulu deh... --> yg punya warnet udah datang. gw harus pertanggungjawabkan manajemen bandwith yg kmaren gw pasang. xixixixi....

1
Kenapa Memilih MySQL

Ada sebuah pertanyaan yang mampir di milis tongkrongan gw (indoprog-vb@yahoogroups.com), seperti ini potongan pertanyaannya :

--- Arif Purnomo Aji (p*** [at] y*** [dot] com)

wrote:

> salam hangat buat semua....
>
> Saya seorang pemula yang ingin belajar vb,,
> Saat ini setahu saya ada banyak database yang bisa
> didampingkan dengan vb
> Kira-kira faktor apa saja yang harus kita perhatikan
> dalam memilih database..
> adakah perbedaan yang significan antara database
> yang satu dgn yang lain, misalnya dalam kecepatan
> pengolahan data.... atau mungkin ada salah satu
> database yang paling cocok buat disandingkan dgn
> vb6.....
>
> Mohon pencerahan dari rekan-rekan semua...
>
> thank's
> Aji




Klo menurut gw, di ERA generasi gw, database yang cocok itu adalah MySQL.
soalnya, MySQL saat ini *sedang berkembang* pelan tapi pasti utk jadi DBMS yang powerful.
Gw dulu pernah 'maksain' belajar Oracle, kagok duluan gw. konsep DBMS lom kenal, udah disodorin macam kya cursor, row-locking, XA transaction -- nyerah gw!

dan, tepat di bulan desember tahun 2004 lalu, gw jatuh hati ama pacar gw yg sekarang - MySQL 5.0.1 alpha. Setengah tahun sebelumnya gw makae MySQL 4.0 n gw NGGA ADA FEELING berlebih ama tu DBMS bermaskotkan ikan lumba2. Di masa gw waktu itu, MySQL udah terlalu cukup lah utk nyediain fitur standar 'penyimpanan data' -- n sejak MySQL 5.0.1-alpha muncul, gw sedikit kepincut ama istilah stored procedure yg diusung2nya (emang sih gw pernah denger tu istilah di praktikum DBMS di kampus makae MSSQL2000 -- tp biasa laah, namanya jg mahasiswa yg sulit diatur, ilmu2 MSSQL2000 gw gag ada yg nyangkut satupun di kuping)


Gw mulai perhatiin geliatnya MySQL 5.0.1 -- baca2 banyak whitepaper di situsnya. Sampe kenalan pula ama Per-Erik Martin (tentunya via forum) yg ternyata dia lead-coder nya fitur Stored Procedure nya MySQL. Gw cukup terbius ama pesona gadis muda yang masih alpha yg beberapa bulan kemudian gw tau ternyata maskot dia namanya SHAKILA. Sambil belajar, gw lambat laun ngerti apa sih itu SP, apa itu Trigger, gmn memanfaatin View, apa rahasia dibalik information_schema -- dan banyak bangedd konsep2 praktis yg gw tau selama gw intensif ngapelin kos-kosannya Shakila di dev.mysql.com --

... satu hal yg gag gw dapet waktu gw PeDeKaTe ama Oracle n MSSQL : nie DBMS (MySQL) perawan bangedd. rupawan pula. n dia CARE pula ama semua fans-fans nya, tetep rendah hati, selalu berbaur sama komunitasnya... Dan dia *setia* bangedd nemenin gw belajar, sementara dia sendiri semakin hari semakin mantaphhh dandanannya, semakin cantik isinya, n semakin besar anunya ^_^ (kualitas, maksutnya)

Bagi gw, di era gw (baru turun coding sejak tahun 2003-2004), DBMS yang paling cocok bwt gw adalah MySQL. Skrg dia punya adik yg ngga kalah manisnya, Maria (MySQL 5.1) -- dan perangkat2 tempur tu DBMS makin lama makin nggilaniey, macam MySQL Cluster, MySQL Proxy -- menurut gw, dia bener2 NUNGGU gw bwt ngerti-in dalemannya, n ketika gw ngerasa udah cukup ngerti -- dia tambah lagi fitur2 dia..

Demikianlah pengalaman SUBYEKTIF gw dengan MySQL ... Shakila dan Maria ...

Mengenai kesangsian yang muncul dari banyak pihak yang ragu-ragu sama kejelasan MySQL itu sekarang free atau berbayar, menurut gw sih, jangan telan berita sepenggal-sepenggal. Powernya MySQL jg bukan cuman di faktor "gratis"-nya seperti beberapa produk open-source macam GIMP n DIA yang hanya lebih di faktor 'harga' ketimbang Photoshop atau Visio. Coba masuk ke website nya MySQL : http://dev.mysql.com/downloads/ ~  di situ ada tulisan gini :

For users or organizations looking to maintain their own solutions.
  1. I have my own method of keeping my systems up to date and am comfortable upgrading and configuring MySQL.
  2. I have time to monitor and adjust the MySQL settings that will tune, scale and maintain performance.
  3. I have experience with database security so that I know when a security breach has occurred.
  4. I have experience designing, setting-up and monitoring the status of MySQL replication.
  5. I have time to identify and resolve technical issues for myself and others.
  6. I have time to design and tune application code, database schemas and dynamic queries for optimal performance.
Take me to the community downloads!

MySQL Enterprise (a.k.a. berbayar) -- itu yg sebenarnya dijual itu berupa "support" n "services". Mengutip pernyataan mereka ndiri : At the end of 2006, MySQL launched MySQL Enterprise, an offering with a robust set of services that improved the reliability, security and performance of MySQL servers. Utk lebih jelasnya, bisa maen-maen ke sini : http://www.mysql.com/products/which-edition.html

MySQL Community Edition -- absolutely free utk di-instal
sendiri di server mana aja. If you have time and experiences...


NB : Gw bukan aktivis MySQL yang digaji ama MySQL. Gw cuman seorang fans... 


6
Defacing

Defacing adalah merupakan bagian dari kegiatan hacking web atau program application, yang menfokuskan target operasi pada perubahan tampilan dan/atau konfigurasi fisik dari web atau program aplikasi tanpa melalui source code program tersebut. Sedangkan deface itu sendiri adalah hasil akhir dari kegiatan cracking dan sejenisnya – tekniknya adalah dengan mbaca source codenya (ini khusus untuk konteks web hacking), trus ngganti image (misalnya), editing html tag dkk, dan lain-lain.

JAHIL, sebuah kondisi ambiguitas....

Konon di suatu tempat yang (katanya) memiliki nilai-nilai luhur norma sosial (Kayaknya Indonesia banget deh .....), mereka memiliki semacam kode etik pada setiap sendi-sendi kehidupan sosialnya dan (katanya pula) mereka sangat menjunjung tinggi nilai-nilai tersebut, termasuk dalam kasus perbuatan “JAHIL”. Sebuah perilaku yang memiliki banyak kondisi. Kondisi dimana perbuatan jahil itu dapat ditolerir dan juga kondisi dimana perbuatan jahil itu tidak dapat ditolerir. Misalnya ada anak kecil yang nyolek bokong seorang wanita cantik yang juga montok. Reaksi wanita tersebut paling-paling hanya berujar, “Ah Adik ini, nakal deh kamu....... ". Untuk sementara persepsi jahil tereliminasi. Namun jika ada orang berumur 25 tahun dan melakukan aktivitas yang sama, maka akan ada dua kemungkinan respon dari wanita tersebut. Pertama, dia mungkin akan berujar, “KURANG AJAR!” PLAK, PLAK
(menampar). Alternatif kedua, wanita itu akan berujar, “Ah Mas ini, nakal deh kamu....... ”. Untuk sementara (lagi-lagi) persepsi jahil kembali tereliminasi.

Begitu pula dengan aktivitas “DEFACE” – bakal ada dua persepsi bagi orang-orang dalam menanggapi deface. Mungkin ada kalangan yang menganggap kalau program buatannya bisa di deface orang, dia akan merespon : “Wah..., keren juga nih. Programku sekalinya gak aman, ya ?” – tapi ada juga yang bakal ngerespon negatif seperti : “Tolong telepon pengacara saya, saya mau menuntut seseorang karena dia sudah defacing program saya!”.

Karena alasan kecil itulah maka deface dapat dikategorikan sebagai perbuatan jahil. Jahil, karena terkadang mereka yang melakukan deface tidak memiliki alasan profesional sebagai motif kegiatan mereka.

Deface banyak terjadi pada situs e-commerce web yang menggunakan MS IIS. Ini dikarenakan adanya bug pada IIS yang dikenal sebagai unicode bug. Dengan adanya bug ini seseorang dapat mengakses command line shell cmd.exe pada server keluarga Windows NT. Kelemahan IIS ini sempat ramai dibicarakan orang karena banyaknya korban. Mengakses server dengan memanfaatkan Unicode bug itu sendiri dilakukan melalui service HTTP (port 80), port yang pasti dibuka untuk memberikan layanan web. Setelah berhasil masuk ke sistem, pelaku web hacking menggunakan FTP untuk melakukan transfer terhadap halaman web dengan desain ‘kreatif’ yang dimilikinya untuk mengubah tampilan web target. Untuk kasus ini semua kegilaan yang telah dilakukan oleh si pelaku memiliki beberapa alasan tersendiri yaitu :

1. Ingin menjadi hacker
2. Mendapatkan popularitas
3. Ingin mendapat pujian

Alasan-alasan diatas memang cukup bisa dicerna logika. Tapi bagaimana dengan alasan-alasan yang unik seperti Nggak ada kerjaan, Suka-suka, Apa urusan loe, atau “aku pengen tu situs kesannya GUE BANGET, gitu” dan lain sebagainya. Menurut saya, tanpa suatu alasan apapun seseorang dapat saja melakukan web hacking.


Defacing, asyik juga.....

Memang kegiatan defacing suatu halaman web atau sebuah program aplikasi sangatlah menyenangkan (kami akui itu), tapi terlepas dari keasyikan (nge-deface) itu, sesungguhnya adalah perbuatan yang melanggar hukum dan jika kita tinggal di luar negeri bukan mustahil tindakan seperti ini dapat dikategorikan computer crime dan ada konsekuensi hukumannya. Tetapi karena kita hidup di Indonesia maka tidak mustahil pula kegiatan Defacing dapat kita lakukan dimana saja, kapan saja dan bahkan siapa saja. Mengapa ? karena kita belum memiliki payung hukum yang dapat dijadikan pedoman dalam menangani masalah kejahatan dunia maya.

Ada beberapa perbedaan mengenai kegiatan Meng-hack sebuah sistem yaitu dalam masalah “probing”, adalah mencari tahu kelemahan sebuah sistem. Computer security industry beranggapan bahwa probing merupakan kegiatan yang tidak etis. Sementara para computer underground menganggap bahwa mereka membantu dengan menunjukkan adanya kelemahan dalam sebuah sistem (meskipun sistem tersebut bukan dalam pengelolaannya). Kalau dianalogikan ke dalam kehidupan sehari-hari (jika anda setuju dengan analoginya), bagaimana pendapat anda terhadap seseorang (yang tidak diminta) yang mencoba-coba membuka-buka pintu atau jendela rumah anda dengan alasan untuk menguji keamanan rumah anda.

Ada program aplikasi yang bersifat freeware dan ada juga program aplikasi yang bersifat open source. Kedua pengertian ini (freeware dan open source) sangatlah berbeda, bukan berarti dengan status program itu freeware kita bisa dengan bebas melakukan deface terhadapnya. Hal itu bisa menyebabkan kesalahan interpretasi pada user lain dan mereka akan berangapan bahwa program tersebut adalah hasil ciptaan kita (yang nge-deface), belum lagi bagaimana perasaan orang atau perusahaan yang membuat program tersebut bila mengetahui bahwa mereka menggratiskan programnya untuk dicopy banyak orang tapi malah di-deface juga (tidak ada penghargaan sama sekali terhadap hak cipta). Ini mungkin kedengarannya hanya masalah sepele dan terus terang bagi kami tidak akan berdampak apa-apa, tapi bayangan bila program freeware tersebut merupakan sebuah program yang cukup penting dalam dunia bisnis e-commerce. Bisa-bisa orang akan berfikiran bahwa kitalah yang membuatnya, atau bisa juga akan menjatuhkan nama dari seseorang atau perusahaan yang telah membuatnya. Lebih celaka lagi bila kita defacing sebuah program aplikasi yang memang benar-benar bersifat komersial, artinya mereka telah mempatenkan produknya, dan bagi siapa saja yang akan menggunakannya harus membeli dan memiliki sertifikat keaslian dari program tersebut.

Dari pertimbangan tersebut, dapat dikatakan bahwa defacing adalah kegiatan yang mengarah pada computer-crime (walau sebenarnya lebih tepat dibilang bahwa defacing itu hanya berpotensi untuk berkembang menjadi kejahatan computer).

Kesadaran tentang pentingnya etika dalam dunia computer tentu ikut memacu sebagian orang untuk melakukan kegiatan deface, menurut mereka tu menyenangkan tetapi jelas sudah melanggar kode etik omputer. Ironis memang apabila kita menemukan sebuah program aplikasi yang telah di-deface tapi pemerintah atau pihak-pihak yang memiliki wewenang akan masalah ini tidak melakukan tindakan apa-apa terhadap pelakunya. Memang jika mereka (pihak berwajib) melakukan penelusuran terhadap kegiatan deface satu persatu akan sulit karena boleh jadi program yang sudah di-deface di deface lagi. Solusi yang cukup masuk akal adalah bagaimana menanamkan pengertian pada user akan pentingnya sebuah hak cipta orang lain. Dengan begitu apabila telah tumbuh semangat untuk menghormati sebuah hak cipta, bukan tidak mungkin secara umum kita dapat menepis anggapan orang bahwa di Indonesia banyak hackernya. “Dari hari kehari akan lahir calon hacker baru yang siap menularkan ilmunya pada teman-temannya”.

Hacking itu sesungguhnya itu merupakan seni dalam ber-coding. Di satu sisi, para programmer sedang mencari ilham tentang seni memproteksi software terhadap defacing, dan sisi lain para hacker sedang mencari ilham tentang seni menembus proteksi untuk melakukan defacing. Mencari ilham untuk dua kegiatan tersebut adalah dua hal yang sama-sama menyenangkan. Karena bagi masyarakat IT, berpikir itu menyenangkan, beibeh!

Sampai sejauh ini, setidaknya ada 3 definisi terhadap kegiatan hacking :
1. hacking adalah sebagai suatu bentuk kejahilan
2. hacking adalah sebagai salah satu wujud computer-crime
3. hacking adalah sebuah seni

Sekarang, tinggal bagaimana kita memandangnya dari sudut pandang yang mana, dan konteks pembicaraan yang mana.


0
Mengadopsi Agile Development Secara Praktek

Barusan mbaca buku Pattern of Agile Practice Adoption karangan Amr Elssamadisy (bisa didonlot secara online di sini : http://www.infoq/minibooks/agile-patterns) -- di situ dijelasin tentang beberapa domain kegiatan yang harus diperhatikan dalam mengadopsi praktek agile development, dimana masing-masing domain tersebut memiliki pola-pola praktek tersendiri yang saling berkesinambungan. Beberapa metode agile memiliki karakteristik fasenya sendiri, namun umumnya memiliki 3 (tiga) domain kegiatan yaitu requirements, design, dan development, yang terdiri dari praktek-praktek berupa :
1. Simple Design
2. Refactoring
3. Automated Developer Tests
4. Test-First Development
5. Test-Last Development
6. Collective Code Ownership
7. Continuous Integration
8. Functional Tests
9. Customer Part of Team

Berdasarkan pengalaman mendevelop software, dan mengkawinkannya dengan beberapa ide dari beberapa literatur mengenai agile development methodology yg laen, saya nambahin beberapa praktek agile lainnya, seperti :
10. Coding Standards
11. Pair Programming
12. Small Release.

Dan setelah menelusuri maknanya, saya modifikasi dikit tabel clustering dari aspek praktis agile development nya om Amr Elssamadisy tersebut menjadi seperti ini :



Berikut ini adalah penjelasan praktek-praktek agile development :


Domain Kegiatan :
1. Test-Driven Requirements
Test-driven requirements dilakukan dengan memotong jarak antara klien dengan tim developer dan melakukan komunikasi serta feedback antar keduanya secara intensif. Klien merupakan bagian integral dari tim. Dan klien secara progresif melakukan tes fungsional yang akan diperlakukan sebagai requirement oleh para developer.
2. Evolutionary Design
Desain sistem yang dibuat harus simpel namun memiliki nilai skalabilitas yaitu mampu menerima perubahan dan perluasan cakupan sistem di kemudian hari. Dalam domain kegiatan ini, yang benar-benar harus diperhatikan adalah kemampuan arsitektur software yang akan dikembangkan untuk beradaptasi dengan perubahan. Jika perubahan yang akan terjadi belum mampu diprediksikan di awal, minimal desain sistem yang akan dibuat harus dirancang supaya mudah untuk direfactoring. Konsep Object Oriented Analysis & Design (OOAD) sangat berperan dominan dalam hal ini.
3. Test-Driven Development
Domain kegiatan test-driven development ini mencakup nyaris sebagian besar pola-pola praktek agile development. Beberapa pola praktek bahkan saling beririsan dengan domain kegiatan yang lain. Ruang lingkup praktek dalam domain ini mencakup nyaris semua fase yang dilakukan dalam pengembangan software yaitu fase desain, coding, testing, release. Keberhasilan proses agile juga ditentukan dari keberhasilan domain kegiatan ini. Tidak berlebihan jika dikatakan bahwa agile development adalah test-driven development.

Aspek Praktis :
1. Coding Standards, yaitu penyeragaman pola dan teknik pemrograman untuk yang menjadi acuan bagi pengembangan aplikasi yang dilakukan dalam tim dan menyediakan pola baku untuk melakukan integrasi, pengujian, hingga analisis masalah-masalah yang berkaitan dengan bug.
2. Simple Design, yaitu elemen yang merujuk pada perancangan arsitektur sistem yang disiapkan untuk mampu menerima perubahan maupun penambahan fitur-fitur di kemudian hari, dengan acuan perancangan sistem berbasis komponen yang sederhana namun bersifat dinamis.
3. Refactoring, yaitu suatu kegiatan memodifikasi kode yang telah dimiliki untuk dipergunakan ulang dalam pembuatan kode pembentuk aplikasi. Refactoring dapat pula diartikan sebagai kegiatan memodifikasi kode yang didefinisikan sebagai sebuah modul fungsional yang mengalami penyesuaian setelah melewati beberapa fase pengujian.
4. Pair Programming, yaitu suatu disiplin dan budaya kerja yang diperkenalkan dalam agile development dimana sebuah isu pekerjaan ditangani oleh sepasang developer yang berperan sebagai eksekutor dan analisa. Dengan konsep ini, dapat menekan resiko terjadinya cacat produksi akibat kesalahan interpretasi dokumen requirement dengan kode program yang dihasilkan.
5. Collective Code Ownership, yaitu berwujud sebuah repository untuk menyimpan progress kode program yang terkatalog secara historis disertai dengan catatan mengenai perubahan yang dibuat oleh masing-masing programmer. Dengan adanya konsep kepemilikan kode secara kolektif ini, setiap programmer dalam tim dapat mereview hasil kode miliknya sendiri maupun milik rekan satu tim dan memodifikasinya, dengan tetap memperhatikan pencatatan riwayat dan otoritas perubahan dari kode tersebut.
6. Small Release, yaitu pengiriman progress untuk setiap bagian fungsional dari requirement yang telah selesai dikonstruksi (dan bebas bug) berupa modul atau komponen aplikasi.
7. Continuous Integration, yaitu proses menyatukan seluruh modul/komponen pembentuk aplikasi yang dilakukan setiap terjadi small-release yang telah selesai dilakukan pengujian baik secara otomatis maupun secara fungsional oleh pihak developer dan klien.
8. Test-First Development, yaitu inisialisasi unit testing yang akan dipergunakan dalam pembuatan perangkat pengujian pada awal fase konstruksi sebelum proses development aplikasi untuk semua requirement dilakukan.
9. Test-Last Development, yaitu proses evaluasi dan pengujian yang dilakukan secara manual oleh klien dan developer secara kolaboratif, atau dilakukan secara otomatis mempergunakan unit testing yang telah didefinisikan pada test-first development.
10. Automated Developer Tests, yaitu mekanisme otomatis untuk menjalankan unit testing yang telah didefinisikan pada test-first development untuk menguji seluruh modul/komponen pada aplikasi dan memastikan aplikasi bebas dari cacat, baik berupa cacat teknis maupun vulnerabilitas aplikasi terhadap kemungkinan error yang diakibatkan kesalahan input hingga hacking.
11. Functional Tests, yaitu merupakan pengujian rilis aplikasi yang dilakukan oleh developer bersama dengan klien secara kolaboratif untuk mengetahui feedback dan kesesuaian dari fungsi aplikasi dengan keperluan bisnis nyata. Bila diperlukan, pengujian fungsional akan memicu refactoring untuk menyesuaikan terhadap perubahan-perubahan fitur yang dianggap kurang tepat dengan kebutuhan klien di lapangan.




 

2
The Blogger Manifesto

Hacker Manifesto

Ini adalah dunia kami sekarang, dunianya elektron dan switch, keindahan sebuah baud. Kami mendayagunakan sebuah system yang telah ada tanpa membayar, yang bisa jadi biaya tersebut sangatlah murah jika tidak dijalankan dengan nafsu tamak mencari keuntungan, dan kalian sebut kami kriminal. Kami menjelajah, dan kalian sebut kami kriminal. Kami mengejar pengetahuan, dan kalian sebut kami kriminal. Kami hadir tanpa perbedaan warna kulit, kebangsaan, ataupun prasangka keagamaan, dan kalian sebut kami kriminal. Kalian membuat bom atom, kalian mengejar peperangan, kalian membunuh, berlaku curang, membohongi kami dan mencoba menyakinkan kami bahwa semua itu demi kebaikan kami, tetap saja kami yang disebut kriminal. Ya, aku memang kriminal. Kejahatanku adalah rasa keingintahuanku. Kejahatanku adalah menilai orang lain dari apa yang mereka katakan dan pikirkan, bukan pada penampilan mereka. Kejahatanku adalah menjadi lebih pintar dari kalian, sesuatu yang tak kalian maafkan. Aku memang seorang hacker, dan inilah manifesto saya. Kalian bisa saja menghentikanku, tetapi kalian tak mungkin menghentikan kami semua. Bagaimanapun juga, kami semua senasib seperjuangan.

Blogger manifesto

Ini adalah dunia kami sekarang, dunianya posts dan comments, keindahan sebuah linkback. Kami mendayagunakan sebuah situs publishing yang telah ada tanpa membayar, yang bisa jadi biaya tersebut sangatlah murah jika tidak dijalankan dengan nafsu tamak mencari keuntungan, dan kalian sebut kami kriminal. Kami blogwalking untuk sekedar bersilaturrahmi, dan kalian sebut kami kriminal. Kami membagikan pengetahuan atau bahkan hanya sekedar menyalurkan uneg-uneg pribadi, dan kalian sebut kami kriminal. Kami hadir tanpa perbedaan warna kulit, kebangsaan, ataupun prasangka keagamaan, dan kalian sebut kami kriminal. Kalian membuat bom atom, kalian mengejar peperangan, kalian membunuh, berlaku curang, membohongi kami dan mencoba menyakinkan kami bahwa semua itu demi kebaikan kami, tetap saja kami yang disebut kriminal. Ya, aku memang kriminal. Kejahatanku adalah rasa kepedulianku terhadap sesama. Kejahatanku adalah menilai orang lain dari apa yang mereka katakan dan pikirkan, bukan pada penampilan mereka. Kejahatanku adalah menjadi lebih populer dari kalian, sesuatu yang tak kalian maafkan. Aku memang seorang blogger, dan inilah manifesto saya. Kalian bisa saja menghentikanku, tetapi kalian tak mungkin menghentikan kami semua. Bagaimanapun juga, kami semua senasib seperjuangan.

---
Ditulis tidak di bawah pengaruh obat-obat terlarang ataupun di bawah tekanan siapapun. Hanya ditulis cuman untuk menumpahkan uneg-uneg di dalam otak...

*di mana ya letak persamaan antara blogger dan hacker?

8
Stored Function Terbilang di MySQL

Lagi iseng mode = on.

Karena bete gara2 ga bs nge-YouTube, barusan aku bikin stored function di MySQL yang akan mengconvert bilangan ke dalam 'terbilang' (entah siapa yg memulai mengistilahkan ini dengan nama 'terbilang' -- mgkn terinispirasi dari tulisan di kuitansi-kuitansi itu kali ye?). Dengan stored function utk mekanisme pembuat 'terbilang' ini, keuntungan2nya :

1. bisa di embedd di query kita tanpa perlu memprocessing ulang di front-end (sisi aplikasi).
2. ...sebenarnya cuman itu aja sih.., kan klo proses pengconvertan dilakukan di sisi
engine MySQL nya, artinya :

  • client ngga perlu sok-sok-an ngitung. klo develop di web sih ngga masalah, tp klo u bikin desktop,kan komputasi nya di sisi client. *walo ngga ngefek jg sih hare gene mana ada client yg mau makae kompie "bosok" berdaya komputasi rendah.
  • dengan di-embedd nya ke dalam query, manfaat nya, *tentu* mempermudah pengambilan data. mempermudah display ke grid, ato mungkin ke crystal report (seperti ulasan mas madhi dalam blog nya dulu). pokoke, mudah lah..

begini function nya : (silakan co-pas dan execute di konsole-konsole MySQL kesayangan anda)


CREATE DEFINER=`root`@`localhost` FUNCTION `xf_terbilang`(angka bigint) RETURNS varchar(5000) CHARSET utf8
BEGIN
DECLARE sString varchar(30);
DECLARE Bil1 varchar(255);
DECLARE Bil2 varchar(255);
DECLARE STot varchar(255);
DECLARE X int;
DECLARE Y int;
DECLARE Z int;
DECLARE Urai varchar(5000);
SET sString = CAST(angka as char);
SET Urai = '';
SET X = 0;
SET Y = 0;
WHILE X <>
SET X = X + 1;
SET sTot = MID(sString, X, 1);
SET Y = Y + CAST(sTot as UNSIGNED);
SET Z = LENGTH(sString) - X + 1;
CASE CAST(sTot as UNSIGNED)
WHEN 1 THEN
BEGIN
IF (Z = 1 OR Z = 7 OR Z = 10 OR Z = 13) THEN
SET Bil1 = 'SATU ';
ELSEIF (z = 4) THEN
IF (x = 1) THEN
SET Bil1 = 'SE';
ELSE
SET Bil1 = 'SATU';
END IF;
ELSEIF (Z = 2 OR Z = 5 OR Z = 8 OR Z = 11 OR Z = 14) THEN
SET X = X + 1;
SET sTot = MID(sString, X, 1);
SET Z = LENGTH(sString) - X + 1;
SET Bil2 = '';
CASE CAST(sTot AS UNSIGNED)
WHEN 0 THEN SET Bil1 = 'SEPULUH ';
WHEN 1 THEN SET Bil1 = 'SEBELAS ';
WHEN 2 THEN SET Bil1 = 'DUA BELAS ';
WHEN 3 THEN SET Bil1 = 'TIGA BELAS ';
WHEN 4 THEN SET Bil1 = 'EMPAT BELAS ';
WHEN 5 THEN SET Bil1 = 'LIMA BELAS ';
WHEN 6 THEN SET Bil1 = 'ENAM BELAS ';
WHEN 7 THEN SET Bil1 = 'TUJUH BELAS ';
WHEN 8 THEN SET Bil1 = 'DELAPAN BELAS ';
WHEN 9 THEN SET Bil1 = 'SEMBILAN BELAS ';
ELSE BEGIN END;
END CASE;
ELSE
SET Bil1 = 'SE';
END IF;
END;
WHEN 2 THEN SET Bil1 = 'DUA ';
WHEN 3 THEN SET Bil1 = 'TIGA ';
WHEN 4 THEN SET Bil1 = 'EMPAT ';
WHEN 5 THEN SET Bil1 = 'LIMA ';
WHEN 6 THEN SET Bil1 = 'ENAM ';
WHEN 7 THEN SET Bil1 = 'TUJUH ';
WHEN 8 THEN SET Bil1 = 'DELAPAN ';
WHEN 9 THEN SET Bil1 = 'SEMBILAN ';
ELSE SET Bil1 = '';
END CASE;
IF CAST(sTot as UNSIGNED) > 0 THEN
IF (Z = 2 OR Z = 5 OR Z = 8 OR Z = 11 OR Z = 14) THEN
SET Bil2 = 'PULUH ';
ELSEIF (Z = 3 OR Z = 6 OR Z = 9 OR Z = 12 OR Z = 15) THEN
SET Bil2 = 'RATUS ';
ELSE
SET Bil2 = '';
END IF;
ELSE
SET Bil2 = '';
END IF;
IF Y > 0 THEN
CASE Z
WHEN 4 THEN BEGIN SET Bil2 = CONCAT(Bil2, 'RIBU '); SET Y = 0; END;
WHEN 7 THEN BEGIN SET Bil2 = CONCAT(Bil2, 'JUTA '); SET Y = 0; END;
WHEN 10 THEN BEGIN SET Bil2 = CONCAT(Bil2, 'MILYAR '); SET Y = 0; END;
WHEN 13 THEN BEGIN SET Bil2 = CONCAT(Bil2, 'TRILYUN '); SET Y = 0; END;
ELSE BEGIN END;
END CASE;
END IF;
SET Urai = CONCAT(Urai, Bil1, Bil2);
END WHILE;
RETURN Urai;
END;


nah cara pemanggilannya, coba gini :

mysql> select xf_terbilang(512250300) as urai;
+-----------------------------------------------------------------+
| Urai |
+-----------------------------------------------------------------+
| LIMA RATUS DUA BELAS JUTA DUA RATUS LIMA PULUH RIBU TIGA RATUS |
+-----------------------------------------------------------------+
1 row in set

Query OK, 0 rows affected

Asyeek...
sukses!

eh bentar dulu...

setelah nyoba2, ternyata ada "limitasi" nya nie function. *mencoba berfikir obyektif nih. ndak selamanya kita musti narcis* hihihi...

ternyata : ini maksimal nilai yang VALID utk di-convert.

mysql> select xf_terbilang(999999999999999);
SEMBILAN RATUS SEMBILAN PULUH SEMBILAN TRILYUN blablablabla.

kalo kita execute

mysql> select xf_terbilang(999999999999999+1);

yang muncul malah :

+---------------------------------+
| xf_terbilang(999999999999999+1) |
+---------------------------------+
| SETRILYUN |
+---------------------------------+

dan utk angka2 di atas itu, yang muncul tetep sama : SETRILYUN.

hiks..

tp biarlah...
males ngobok2 lebih lanjut. *ntar lah klo ada case yang emang memerlukan "LEBIH" dari limitasi ini.

lagian siapa sih yang mo beli barang dengan nota tertulis di kuitansi sebesar 999 Trilyun?
hihihi.. Pemerintah mungkin. Wong 11 Trilyun aja tanpa pikir panjang berani 'dibuang' percuma utk nge-blokir akses situs-situs yang dianggap subversif.. Ups.., maap. Ini cuman intermezzo. Suer, saya bukan hacker. Belum. Dan saya ngga ada niat nge-post barang2 saru/porno di blog saya ini. *kecuali klo paragraf di atas sama pihak yang berwenang dianggap porno, yaa, meneketehe...

Utk solusi function terbilang di SQL Server 2000, mas Madhi pernah mempostingnya di sini. Silakan meluncur ke sana jika membutuhkan. Algoritma nya rada beda dengan punya saya, dan saya nggak mau mbandingin mana yang bagus mana yang jelek. Itu sama dengan perdebatan tiada ujung mengenai MS SQL Server vs MySQL. Ato blogger vs hacker (??) hehehe...

dan skrg. narcis mode = on.

Emang, abang eRQee emang CAKEP !!!

5
Menghitung Waktu Sholat

rencananya sih, *awalnya* mo usulin fitur jadwal sholat online utk di-embedd di aplikasi
*aslinya* sih mo cari RSS Feed google gadget yg udah nyedia-in itu jadi pengennya sih tinggal ambil doank...
*eh ketemunya* dokumen ttg algoritma waktu sholat (donlot di sini)
*penasaran mode = on*
*iseng mode = on*
*suntuk mode = on* - habis debat ama "mamanya anak2" (hiks...)

rancang2 tabel dulu :
+----+------+----------+-----------+----------+------------+
| ID | kota | Latitude | Longitude | timezone | ketinggian |
+----+------+----------+-----------+----------+------------+

DDL nya :

CREATE TABLE `tbl_city_coordinate` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`kota` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`latitude` float NOT NULL,
`longitude` float NOT NULL,
`timezone` float NOT NULL,
`ketinggian` float NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

*googling tentang koordinat astronomis kota jakarta*
*isi-isi data dulu*

INSERT INTO `tbl_city_coordinate` VALUES ('1', 'JAKARTA', '-6.21522', '106.818', '7', '100');


trus bikin stored function nya, ngikutin pedoman algoritma :


CREATE DEFINER=`root`@`localhost` FUNCTION `sf_waktusholat`(vKodeCity int, vTanggal date, idxwaktusholat tinyint) RETURNS varchar(20) CHARSET utf8
BEGIN
declare B float;
declare L float;
declare R float;
declare H float;
declare J int;
declare beta float;
declare D float;
declare T float;
declare Gd float;
declare Gn float;
declare Z float;
declare U float;
declare Vd float;
declare Vn float;
declare W float;
declare hasil float;
declare jam varchar(20);

set j = dayofyear(vTanggal);
set Gd = 19;
set Gn = 19;

SELECT 2 * pi() * J / dayofyear(CONCAT(year(now()),'-12-31')) INTO beta;
SELECT (180/pi()) * (0.006918 - (0.399912 * cos(beta))+(0.070257 * sin(beta))-(0.006758 * cos(2*beta))+(0.000907*sin(2*beta))-(0.002697*cos(3*beta))+(0.001480*sin(3*beta))) INTO D;

SELECT 229.18*(0.000075+(0.001868*cos(beta))-(0.032077*sin(beta))-(0.014615*cos(2*beta))-(0.040849*sin(2*beta))) INTO T;

SELECT latitude, longitude, (timezone) * 15, ketinggian
INTO B,L,R,H
FROM tbl_city_coordinate
WHERE id = vKodeCity;

SET Z = 12 + ((R-L)/15) - (T/60);
SET U = (180/(15*pi())) * ACOS((SIN((-0.8333-(0.0347 * SIGN(H) * SQRT(ABS(H))))*pi()/180)- SIN(D * pi() / 180) * SIN(B * pi() / 180) )/(COS(D * pi()/180) * COS(B * pi()/180)));
SET Vd = (180/(15*pi())) * ACOS((-1 * SIN(Gd * pi()/180) - SIN(D * pi()/180) * SIN(B * pi()/180))/(COS(D * pi()/180) * COS(B * pi()/180)));
SET Vn = (180/(15*pi())) * ACOS((-1 * SIN(Gn * pi()/180) - SIN(D * pi()/180) * SIN(B * pi()/180))/(COS(D * pi()/180) * COS(B * pi()/180)));
SET W = (180/(15*pi())) * ACOS((SIN(ATAN(1/(1 + TAN(ABS(B-D) * pi()/180)))) - SIN(D * pi()/180) * SIN(B * pi()/180))/(COS(D * pi()/180) * COS(B * pi()/180)));

case idxwaktusholat
when 0 then SET hasil = (z - Vd) - 0.134; /*imsyak*/
when 1 then SET hasil = Z - Vd - 0.033 ; /*subuh*/
when 2 then SET hasil = Z - U; /*matahari terbit*/
when 3 then SET hasil = Z + 0.05; /*zuhur*/
when 4 then SET hasil = Z + W + 0.033; /*ashar*/
when 5 then SET hasil = Z + U + 0.033; /*maghrib*/
when 6 then SET hasil = Z + Vn - 0.0167; /*isya*/
end case;

SET Jam = SEC_TO_TIME(hasil*3600);
RETURN jam;
END;


coba bikin stored procedure utk nampilin waktu sholat :

CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_waktusholat_tampil`(vIDKota int, tanggal date)
BEGIN
IF vIDKota <= 0 THEN
SELECT Kota, sf_waktusholat(id, date(tanggal), 1) as `Subuh`,
sf_waktusholat(id, date(tanggal), 3) as `Dhuhur`,
sf_waktusholat(id, date(tanggal), 4) as `Ashar`,
sf_waktusholat(id, date(tanggal), 5) as `Maghrib`,
sf_waktusholat(id, date(tanggal), 6) as `Isya`
FROM tbl_city_coordinate
ORDER BY Kota ASC;
ELSE
SELECT Kota, sf_waktusholat(id, date(tanggal), 1) as `Subuh`,
sf_waktusholat(id, date(tanggal), 3) as `Dhuhur`,
sf_waktusholat(id, date(tanggal), 4) as `Ashar`,
sf_waktusholat(id, date(tanggal), 5) as `Maghrib`,
sf_waktusholat(id, date(tanggal), 6) as `Isya`
FROM tbl_city_coordinate
WHERE id = vIDKota;
END IF;
END;

*coba dieksekusi tu SP :
call sp_waktusholat_tampil(1,'2008-04-01');

*hasilnya :
+---------+----------+----------+----------+----------+----------+
| Kota | Subuh | Dhuhur | Ashar | Maghrib | Isya |
+---------+----------+----------+----------+----------+----------+
| JAKARTA | 04:40:05 | 11:59:33 | 15:14:20 | 18:01:09 | 19:10:03 |
+---------+----------+----------+----------+----------+----------+

... cukup memuaskan ...
*kurang lebih lah dengan jadwal sholat utk wilayah Jakarta yg sekarang nampang di republika-online

script lengkap bisa didonlot di sini...

TIDUR AAAH...



29
Cara Belajar Menjadi Programmer

Hari ini hari pertama ku aktif kerja lagi stlh nyaris 10 hari berpetualang di Jatim-Kaltim. Pagi-pagi cek imel (udah beberapa hari ini aku offline), eh ada imel dari seseorang tak dikenal dengan ID "no kus" (mgkn namanya Kusno ato Soekarno hehehe *sok tau bangedd sih*) nanya gini :

"Aku pingin jadi programmer. tapi belajarnya mulai dari mana dulu? oh ya aku ingin belajar delphi dan databasenya sql server 2000. Terima Kasih"


Hmm..., udah lama aku ngga "mewaluh" nieh. Kebetulan... Aku merenung sebentar, kupikirkan pertanyaan dia.. Dulu waktu masih lugu-lugunya aku juga sempat menanyakan hal yang serupa soalnya. Gimana caranya *memulai* belajar untuk jadi programmer?

Singkat kata, uneg-uneg udah penuh, akhirnya aku jawab begini :


klo aku ngajarin temen2ku,
1. belajar bikin GUI
2. belajar database (bikin tabel, jalin koneksi, syntax2 SQL)
3. belajar simple CRUD (create, retreive, update, delete) via database langsung n via aplikasi
4. belajar bikin report
5. ulangi poin 1-4 tapi tambahin fasilitas macam2. upgrade aplikasi pelan2, coba imple semua tips n trik.

cara belajar (pemrograman) yang efektif, sebenarnya perlu kmu *sesuaikan* dgn gaya belajar alami kamu.
Ada 3 gaya belajar :
1. VISUAL
2. AUDITORIAL
3. KINESTETIS

konsepnya sama kya kmu maen LEGO (pasang-pasangan) waktu masih TK dulu ^_^. dari potongan2 kubus/object yang ada, misal kmu disuru gurumu bikin menara eiffel, apakah kamu :

1. liat buku panduan-nya trus tiru dan ikuti semua step-by-step nya yang ada di panduan itu, MAKA gaya belajar alami kamu tergolong AUDITORIAL

2. liat orang (temenmu/tetanggamu/gurumu) bikin menara eiffel, trus tiru cara dia mbikin tu menara eiffel, MAKA gaya belajar alami kamu tergolong VISUAL
3. kmu ga comfort niru step-by-step yg ada di buku panduan, ato kmu pusing ngliat n ngikutin cara kerja orang, kmu LEBIH suka nyoba-nyoba sendiri, improvisasi, trial-error... MAKA gaya belajar alami kamu tergolong KINESTETIS.

nah,


sekarang, kecenderungan mu belajar dengan gaya apa? terapkan juga itu dalam cara belajar pemrograman.

1. kalo u dominan AUDITORIAL, u bisa baca2 buku pemrograman, ikutin semua step-by-step nya
2. kalo u dominan VISUAL, u bisa belajar dengan *memperhatikan* programmer laen bekerja trus tiru cara kerjanya
3. kalo u dominan KINESTETIS, tiada cara lain bagimu utk belajar selain dengan IMPROVISASI. coba-coba, gagal, coba lagi, gagal, coba lagi...

*kebanyakan programmer dan inventor (researcher, penemu, ilmuwan) itu orang-orang kinestetis.. tapi ngga menutup kemungkinan orang dengan gaya belajar alami AUDITORIAL dan VISUAL juga bisa jadi KINESTETIS suatu hari.. ini cuman masalah kebiasaan aja..


untuk permulaan, u bisa belajar pemrograman dengan tema sederhana misal bikin aplikasi buku telepon.
bikin GUI nya dulu,
struktur database,
CRUD,
report
trus ulangi semuanya sampe u ngrasa u udah cukup mahir...

algoritma? pelajarin sambil jalan..
InsyaAllah bisa.
yang penting tekun aja..

klo u memilih "menjerumuskan diri" ke Delphi, ikut milis/forum.
http://www.delphi-id.com
http://www.diskusiweb.com
delphindo@yahoogroups.com
ato
ke blog ini : http://ekoindri.wordpress.com
orangnya pinter delphi, baek, suka ngasi tips-n-trik, rajin ngupdate blog nya, penulis buku jg, sabar (spesifikasi wajib yg harus dimiliki seorang guru)

oke?

selamat mencoba!

NB :
oia, satu lagi :

jangan merasa malu untuk MENCONTEK dan MENIRU.
sebenarnya NYONTEK itu juga salah satu proses belajar
(kesalahan utama guru2 kita waktu SD-SMA selalu *mengharamkan* nyontek)
.. mereka ga sadar, klo sebenarnya Bill Gates bisa bikin Microsoft Windows jadi sebesar saat ini juga dari modal MENCONTEK.

ada filosofi bagus yang dianut ama Bill Gates ama Steve Jobbs (pendiri Apple Inc.) :

"...seniman yang PANDAI, dia MENIRU. seniman yang HEBAT, dia MENCURI..."

silakan interpretasikan sendiri maksud kata2 mereka itu...

--
wassalam,


Rizky Prihanto
http://www.software-arsitek.web.id
+62 856 496 00 496
+62 22 3018 3328

6
Business Intelligence "murah" makae VB6+Excel

Pernah liat aplikasi Business Intelligence? Ngerti apa itu Business Intelligence? Artikel terdahulu di blog ini sempat menjelaskan definisi "business intelligence", silakan baca klo masih blom mudeng apa itu BI (singkatan umum utk Business Intelligence). Nah, dalam artikel ku kali ini, aku akan bicara secara teknis (yippie... coding-coding...) tentang gimana mbikin aplikasi BI sederhana dan murah makae Visual Basic n Microsoft Excel. Murah? Yupz! Nyaris semua aplikasi BI di pasaran harganya mahal-mahal loo... Karena informasi yang disediakan dari aplikasi ini emang muahall bangedd. Berharga. Lha terus kenapa yg mo ta' tulis ini kulabelin "murah"? Hehehe, biar terkesan kontroversial ajah... - alasan utamanya sih, bcoz mbikin aplikasi BI pake VB6 + Excel ini GUAMPANGG bangedd n harga produksi nya ngga sampe ngabisin 2 batang rokok seharga @ Rp 600,00 - harga aplikasi development nya jg *murah* koq. xixixi (u know what I meant laah..). Berapa sih harga VB6 dan Microsoft Office 2003 ?!?!


Jadi begini, sebelum kulanjutin - aku mau cerita dikit dulu tentang apa sih komponen2 yang akan kita dalam aplikasi BI murah kita... Yaa, nggak semua komponen BI seperti dalam artikel yang ku post sebelumnya bakal kita coba implementasikan di sini sih. Namanya jg BI "murah" -- wajar donk? xixixi. Yang jelas, murah disini bukan berarti murahan! Ntar liat aja hasilnya, loe pasti terpana bolak-balik - "begini simpel seperti ini kah tuk bikin BI itu?"

Oke, cukup nge-gombalnya. Jadi begini, bahan2 yang kita butuhkan utk bikin nie aplikasi :

1. Data Source
Aplikasi business inteligence itu termasuk kategori OLAP (Online Analytical Processing). Proses ini merupakan kelanjutan dari proses data-mining (penambangan data). Nah, supaya aplikasi BI bisa jalan, tentunya sebelumnya musti ada donk data yg mo di-proses utk di-analisis...
Sebagai contoh dalam artikel-ku ini aku bikinin deh 1 tabel dalam 1 schema utk simulasi penambangan data.

DDL nya sebagai berikut (owya, aku makae MySQL. Lagi males makae access, ngga praktis utk coding pake script):


CREATE DATABASE db_contohdatamining;
USE db_contohdatamining;
CREATE TABLE tbldatamining (
kode int(10) NOT NULL auto_increment,
NamaSiswa varchar(50) NOT NULL,
Semester tinyint NOT NULL,
MataPelajaran varchar(50) NOT NULL,
Nilai tinyint NOT NULL,
PRIMARY KEY(kode)
)ENGINE=MyISAM;


tu tabel adalah contoh doank. Ntar sumber data mu ya ngambil dari tabel itu. Bisa aja sih u me-mining data dari query select yang multi tabel, atau kmu pre-definisi-kan pake VIEW. Sama aja itu.. Di sini aku asumsikan, ya itu lah kira2 struktur sumber data nya. Dalam struktur relasional database, lebih sehat sih klo ada TblMataPelajaran sendiri, n TblSiswa sendiri. Yah, ini kan cuman contoh. Suka-suka gue donk... Gue kan udah cukup baek (cakep lagi) utk ngasih contoh ini ke loe-loe pade... (cape loo blogging hal2 yg berbau tutorial itu). hihihi...

Oke, trus ini jg kusertakan beberapa contoh value data. Eksekusi aja :

INSERT INTO tblDataMining
(NamaSiswa,Semester,MataPelajaran,Nilai)
VALUES

('eRQee',1,'PPKn',7), ('eRQee',1,'Agama',8),
('eRQee',1,'B.Ind',8),('eRQee',1,'B.Ing',8),
('eRQee',2,'PPKn',6), ('eRQee',2,'Agama',6),
('eRQee',2,'B.Ind',7),('eRQee',2,'B.Ing',9),
('Neeah',1,'PPKn',9), ('Neeah',1,'Agama',8),
('Neeah',1,'B.Ind',6),('Neeah',1,'B.Ing',6),
('Neeah',2,'PPKn',8), ('Neeah',2,'Agama',7),
('Neeah',2,'B.Ind',7),('Neeah',2,'B.Ing',7),
('GNuKa',1,'PPKn',7), ('GNuKa',1,'Agama',9),
('GNuKa',1,'B.Ind',8),('GNuKa',1,'B.Ing',7),
('GNuKa',2,'PPKn',7), ('GNuKa',2,'Agama',9),
('GNuKa',2,'B.Ind',7),('GNuKa',2,'B.Ing',7),
('Tomb',1,'PPKn',6), ('Tomb',1,'Agama',7),
('Tomb',1,'B.Ind',6),('Tomb',1,'B.Ing',9),
('Tomb',2,'PPKn',6), ('Tomb',2,'Agama',6),
('Tomb',2,'B.Ind',7),('Tomb',2,'B.Ing',8);


2. cExcelReport.bas
Ini class-module bikinanku. Jujur, ini class module pertama yg kubikin beberapa tahun yg lalu. Udah beberapa kali sih mengalami penyempurnaan, tp aku cukup puas dengan nie class. Mengenkapsulasi beberapa kebutuhan utk reporting ato manipulating Excel Spreadsheet secara remote dari VB. :cool: Ntar kubedah deh arsitektur class-ku ini di postingan-ku yg laen...

Untuk mbikin PivotTable secara ostosmastis dari VB, pakae method ini :

Public Sub CreatePivotTable(sSourceRange As String, _
sDestinationRange As String, _
sRowFields As String, _
sColumnFields As String, _
sDataFields As String, _
sTitleDataFields As String)
Dim pt As Object

On Error GoTo Hell
Set pt = oSheet.PivotTableWizard _
( _
SourceType:=1, _
SourceData:=oSheet.Range(sSourceRange), _
TableDestination:=oSheet.Range(sDestinationRange) _
)

pt.AddFields RowFields:=sRowFields, _
ColumnFields:=sColumnFields
pt.AddDataField pt.PivotFields(sDataFields), sTitleDataFields
Exit Sub

Hell:
debug.print "[" & err.number & "] " & err.description
End Sub


Owya, cExcelReport.bas ini bisa you donlot di sini. Monggo dipake, gpp... aku ikhlas koq. But keep my credits on the top of ur code, please... Utk menghormati Creative Common Licenses... hehehe. Banyak programmer yg ngga gila harta, tp nyaris semua programmer gila hormat loo... (tonton/baca aja Takedown, bintangnya Kevin Mitnick ama Tsutsomu Shimomura...).

3. Sedikit code di salah satu form VB.
Kmu codingin ini di salah satu form mu. Jangan lupa juga, include-kan reference ke Microsoft ActiveX Data Objects Library 2.8 (versi sebelumnya nggak apa2 sieh, asal jangan 2.5 ke bawah aja)... Juga masukin component Microsoft Windows Common Controls 6.0 (soalnya di cExcelReport-ku ada kebutuhan utk export dari Listview). Reference utk Microsoft Excel xx Object Library *amat sangat* tidak dibutuhkan. Dengan cExcelReport.bas ku -- versi Excel yg dibutuhkan nggak ditentukan. BEBAS! Cuman harus ada aja... Klo u jalanin nie aplikasi di kompie yg ngga ada Excel-nya, InsyaAllah nggak jalan... hehehe, suer disambar geledek..

'--declaration
Private xls as cExcelReport
Private db as ADODB.Connection

Private Const CONST_HOST = "localhost"
Private Const CONST_PORT = "3306"
Private Const CONST_SCHEMA = "db_contohdatamining"
Private Const CONST_USERNAME = "root"
Private Const CONST_PASSWORD = "123456"

'--routine to open database connection
Private Sub OpenDB(ByRef db as ADODB.Connection)
db.CursorLocation = adUseClient
db.ConnectionString = "DRIVER={MySQL ODBC 3.51 Driver};" _
& "SERVER=" & CONST_HOST & ";" _
& "PORT=" & CONST_PORT & ";" _
& "DATABASE=" & CONST_SCHEMA & ";" _
& "UID=" & CONST_USERNAME & ";" _
& "PWD=" & CONST_PASSWORD & ";" _
& "OPTION=" & 1 + 2 + 8 + 16 + 2048
db.open
DoEvents
If Err.Number <> 0 And db.state <> adStateOpen Then
GoTo Hell
End If
Exit Sub
Hell:
msgbox "[" & err.number & "] " & err.description
End Sub

'--form load
Private Sub Form_Load()
Set db = New ADODB.Connection
db.mode = adModeReadWrite
db.CursorLocation = adUseClient
OpenDB
End Sub

'--tombol klik
Private Sub Command1_Click()
screen.mousepointer = vbHourglass
Dim sRangeSourceAwal As String, sRangeSourceAkhir As String
Dim sRangeDest As String
'tahap 1 : persiapkan object excel dan bikin dokumen baru
Set xls = New cExcelReport
xls.init

Dim iI As Integer, rs As ADODB.Recordset, sSQL As String
sSQL = "SELECT NamaSiswa,Semester,MataPelajaran,Nilai " & _
"FROM TblDataMining"
Set rs = db.execute(sSQL)
if rs.recordcount > 0 then
'tahap 2 : data-mining
xls.TulisCell 9, 1, "NamaSiswa", vbWhite
xls.TulisCell 9, 2, "Semester", vbWhite
xls.TulisCell 9, 3, "MataPelajaran", vbWhite
xls.TulisCell 9, 4, "Nilai", vbWhite
sRangeSourceAwal = "$A$9"
For iI = 1 To rs.RecordCount
xls.TulisCell 9 + iI, 1, rs(0).Value, vbWhite 'Nama Siswa
xls.TulisCell 9 + iI, 2, rs(1).Value, vbWhite 'Semester
xls.TulisCell 9 + iI, 3, rs(2).Value, vbWhite 'Mata Pelajaran
xls.TulisCell 9 + iI, 4, rs(3).Value, vbWhite, , , , , , , True 'nilai
rs.MoveNext
Next iI
sRangeSourceAkhir = "$D$" & CStr(9 + CLng(rs.RecordCount))
sRangeDest = "$F$10"
'tahap 3 : bikin pivot table
xls.CreatePivotTable sRangeSourceAwal & ":" & sRangeSourceAkhir, _
sRangeDest, _
"MataPelajaran", _
"NamaSiswa;Semester", _
"Nilai", _
"Sum of Nilai"
xls.ChangeWidth 0, 1, 4
'tahap 4 : tampilkan file excel
xls.tampil
else
Msgbox "Tidak ada data yang dapat di-analisis, bro...", _
vbInformation + vbOkOnly, "Maaf"

end if
rs.close
Set rs = nothing
Screen.mousepointer = vbDefault
End Sub

'--form unload
Private Sub Form_Unload()
on error resume next
set db = nothing
set xls = nothing
End Sub

n mau tau hasilnya kya apa? Lihatlah capturan berikut ini :


Lho? Kosong?

Hehehe, emang... tp coba aja klik tombolnya. Ntar bakal muncul dokumen Excel seperti ginian deh :



Yup, PivotTable Excel udah siap utk dipake untuk analisis. Coba drag Field-field di dock-window "Pivot Fields" ke dalam kotak biru dalam grid, Taroh field nilai di tengah, yg lainnya terserah u... ntar bakal menghasilkan tabel yang kira-kira seperti ini penampakannya :



Mau lebih representatif utk menganalisis? Klik kanan tu PivotTable , klik popup PivotChart... Otomatis, tanpa keluarin keringat apa2 (ato batang rokok tambahan utk disulut) -- udah jadi deh chart mu... Keren kan?



N mau di-kustomisasi ? monggo silahkan... uthex-uthex aja combo2 di field utk custom grouping or custom sorting tanpa pusing-pusing bikin/ngirim query lagi ke database... Mo ngganti "skin" chart utk analisis data multidimensional jg bisa... tinggal pilih field-nya, drag, pilih tipe chart (coba-coba aja ndiri), n bisa deh jadi kya seperti gambar berikut :


Pegimane? Mudah bukan? Keren bukan? Cakep bukan? Seperti inilah kira-kira aplikasi BI sederhana itu... seperti yg muncul dalam diskusi di milis, BI kurang lebih aja sama kya Pivot Excel...

Utk buat yg kesulitan nyoba, u bisa donlot source demo project nya di sini (tp u musti pake MySQL n eksekusi script SQL seperti yg udah kujelasin di atas).. mo sesuai-in dengan db favoritmu ndiri, silakan.. ganti ndiri yak? hehehe....