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.

Tampilkan postingan dengan label Database. Tampilkan semua postingan
Tampilkan postingan dengan label Database. Tampilkan semua postingan

4
Batch Script Generator untuk Backup Database

Jalankan ini di console query mysql client kesayangan anda:

set @path_backup = 'D:\\backup\\';
set @sv_host = '192.168.10.121';
set @sv_port = '3306';
set @sv_uname = 'root';
set @sv_pwd = '123123';

select * into outfile 'D:\\script_batch_mysqldump.bat'
lines terminated by '\n'
from
(
select concat('mysqldump --host=',@sv_host,' --port=',@sv_port,' -u',@sv_uname,' -p',@sv_pwd,' --add-drop-table --max_allowed_packet=1GB --routines --triggers --quote-names -E --no-data ', db.schema_name ,' > ',@path_backup, 'structure_',db.schema_name,'.sql') as syntax from information_schema.schemata as db where db.schema_name not in ('information_schema','mysql','test')

union

select concat('mysqldump --host=',@sv_host,' --port=',@sv_port,' -u',@sv_uname,' -p',@sv_pwd,' --add-drop-table --extended-insert --hex-blob --max_allowed_packet=16GB --lock-tables --no-create-db --no-create-info --quote-names --order-by-primary --dump-date ',db.schema_name,' > ',@path_backup, 'data_', db.schema_name,'.sql') as syntax from information_schema.schemata as db where db.schema_name not in ('information_schema','mysql','test')
) as script;


sesuaikan value dari variabel-variabel yang ada di SET itu dengan informasi koneksi yang benar.
trus sesuaikan juga OUTPUT PATH dari file bat yang akan di-processing (yg gw kasih font warna merah di atas)

setelah itu di-eksekusi, NISCAYA akan di-hasilkan sebuah file BAT di directory di server untuk langsung segera di-eksekusi untuk nge-generate script backup SEMUA DATABASE kita ke dalam 2 file utk masing-masing database, yaitu struktur saja atau data saja.

Kalo yang "struktur" saja, itu isinya:
  1. DDL untuk create table
  2. script stored procedure/function, kalo ada
  3. script pembentuk trigger, kalo ada
  4. script pembentuk events, kalo ada
Sedangkan kalo yang "data" saja, itu isinya dump-dump-an isi data dalam database kita. Sengaja dipisah karena mungkin kita ingin merubah struktur entah create table/routines/dll (mengedit file *.sql -nya menggunakan notepad/text editor) tanpa perlu merubah data. Tentunya beban untuk meng-edit script struktur saja akan lebih ringan ketimbang kalo dicampur dengan script data.

Masalah lainnya yang bisa dicegah dengan memisahkan dump2an data dengan struktur ini adalah RUSAKNYA DATA. Kalo data kita berbentuk binary, atau dibentuk dengan character set khusus (memakai tulisan arab, misalnya) -- seandainya dibuka di editor yang sifatnya nggak I18N-aware (notepad, contohnya), InsyaAllah script dump2an data tersebut akan rusak. Dengan memisahkan script dump2an struktur dan data secara terpisah, setidaknya kita nggak perlu ngebuka data.sql kalo emang nggak penting2 amat untuk menjaga eksistensi data tersebut.

oke, silakan dicoba.


atau kalo mau, adopsi query-query select gw utk nge-build generator sendiri pake bahasa-bahasa pemrograman andalan anda...

5
Mendistribusikan MyODBC dalam Installer Aplikasi

Ada yang nanya di milis mysql-indonesia@googlegroups.com tentang bagaimana caranya nginstall MyODBC secara otomatis dalam mendistribusikan aplikasi kita. Kadang, ketika kita memaketkan produk software kita (platform desktop, windows) -- kita ngga bisa menjamin apakah di komputer client sudah terinstall MyODBC yang diperlukan supaya aplikasi kita bisa connect ke database MySQL (tentunya bagi yang mempergunakan ODBC sebagai bridge koneksi. Kalo yang makae native API seperti vbmysqldirect, MyDAC, dbExpress, atau MySQL Connector yang lain -- ya ngga perlu MyODBC).
Gw jadi ingat jaman-jaman kelam dulu, pas masih develop pakae VB6, ribet bangedd rasanya 'menginstallkan' pre-requisites aplikasi kita ke client macam OCX, DLL, flash player plugins, dan tentu saja.. MyODBC. Tapi sejak gw mulai bosan ama keribetan itu -- gw akhirnya riset mengenai teknik-teknik membuat instalasi yang membuat gw sempet terjerembab 'sedikit alih profesi' jadi Deployment Engineer di tim gw dulu. Tentu saja gw musti memastikan bahwa aplikasi gw ketika di-distribusikan ngga bakal gagal di-execute selain di kompie gw sendiri, termasuk diantaranya menjalin koneksi dengan MySQL melalui MyODBC.
Di artikel kali ini gw mencoba mengupas mengenai teknik-teknik 'memaksakan' client menginstall secara otomatis MyODBC supaya program kita bisa running well.



caranya (gw asumsikan kita akan redistribute-kan MyODBC 5.1) :

1. di installer loe, u copy-kan file2 berikut ke %SYSDIR% (terserah sih mo dimana sebenarnya):
    a) libmysql.dll
    b) myodbc5.dll
    c) myodbc5.lib
    d) myodbc5S.dll
    e) myodbc5S.lib

2. Lakukan install driver manual dengan nge-add registry berikut ini :
  classkey = HKEY_LOCAL_MACHINE
  sectionkey = "SOFTWARE\ODBC\ODBCINST.INI\MySQL ODBC 5.1 Driver"
    trus bikin beberapa key yaitu :
  a) nama key = "Driver"
     tipe = REG_SZ
     value = "C:\WINDOWS\System32\myodbc5.dll" --> sesuaikan ini dgn tempat di mana u nge-extract (step 1)
  b) nama key = "Setup"
     tipe = REG_SZ
     value = "C:\WINDOWS\System32\myodbc5S.dll"
  c) nama key = "UsageCount"
     tipe = REG_DWORD
     value = 1

3. Langkah terakhir, lakukan register driver ke ODBC driver, juga dgn maen-maen registry berikut :
    classkey = HKEY_LOCAL_MACHINE
    sectionkey = "SOFTWARE\ODBC\ODBCINST.INI\ODBC Driver"
    bikin key :
    nama = "MySQL ODBC 5.1 Driver"
    tipe = REG_SZ
    value = "installed"

udah. itu cara bikin installer sendiri utk MyODBC 5.1
kalo utk versi MyODBC 3.51, silakan sesuaikan sendiri (tapi buat apa makae 3.51 hare gene?)

bisa loe adopsi di :

  1. jalankan ntu script di setiap app.initialization (tentu cek dulu, execute cuman kalo if not exists)
  2. atau embedd ke dalam script installer loe (semua installer pastinya bisa nge-manipulate registry kan?)
  3. atau bikin program exe sendiri yang akan menjalankan "silent-install" ntu proses, trus masukin ke script installer loe n loe program supaya ntar installer akan jalanin otomatis ntu myodbc-silent-installer setelah proses nginstall aplikasi loe selesai.
mau cara gampang?
Bikin installer-nya pakae NSIS (Nullsoft Scriptable Install System). Berhubung output installer dia bukan berbasis *.msi, loe bisa lakukan proses instalasi paralel (installer dalam installer) dengan file-file setup laen (pre-requisites software) yg mungkin elo butuhkan dalam redistribute aplikasi loe (misal : driver, connector, plugins, codec, bahkan automatic-install server mysql sendiri!).

Cara :
1. siapkan installer MySQL ODBC 5.1 terbaru (anggap namanya : mysql-connector-odbc-5.1.5-win32.msi)
2. sisipkan di script NSIS loe begini :
  SetOutPath "$TEMP"
  SetOverwrite On
  File "..\resources\mysql-connector-odbc-5.1.5-win32.msi"
  ExecWait 'msiexec /i "$TEMP\mysql-connector-odbc-5.1.5-win32.msi"' $0
3. compile script installer loe untuk menghasilkan 1 file installer (aplikasi loe + prerequisites-nya)

Penjelasan Script NSIS:
baris pertama, itu akan melakukan change-dir ke direktori tujuan ekstrak sebuah file (dalam hal ini TEMP DIR)
baris kedua, itu akan melakukan flagging kalo file yg akan di-ekstrak udah ada, dia akan di-overwrite
baris ketiga, itu meng-copy-kan dari installer berupa file setup mysql-connector-odbc-5.1.5-win32.msi ke TEMP DIR. parameter dari File itu adalah alamat dari paket instalan mysql-connector-odbc-5.1.5-win32.msi ketika installer sedang dibentuk
baris keempat, itu akan melakukan eksekusi file installer mysql-connector-odbc-5.1.5-win32.msi -- efeknya, ntar user pas nginstall aplikasi loe, dia akan "dipaksa" masuk ke installer MyODBC. ExecWait adalah sebuah mekanisme shell-execute yang akan menunggu proses sampai proses instalasi MyODBC selesai dijalanin user, baru kemudian lanjut ke proses install sisanya.

kelebihan dari cara gampang ini?
  • loe gag perlu pusing2 ria maen2 registry (seperti cara "manual" gw di atas -- walo ada kelebihannya juga cara manual ini : loe jadi ngerti struktur registrasi ODBC Driver di sistem operasi loe. Jadi klo mo pakae connector apapun utk connect ke DBMS apapun: mudah!)
  • loe bisa replace source install-an mysql odbc versi berapapun dgn mudah
  • file installer yang kelak akan di-distribusikan ke user cuman 1 doank. udah all in one.
Kira-kira begitu...
Happy exploring...
_______________________


Rizky Prihanto
Software Architect PT Cinox Media Insani

1
MySQL & General Public License

Ada diskusi menarik di milis mysql-indonesia@googlegroups.com yang *mempertanyakan* seputar lisensi MySQL yang rada-rada ambigu. Kekhawatiran muncul apabila kita me-rilis aplikasi komersil -- apakah bentrok dengan GPL dan melanggar "kontrak-kontrak sosial" yang udah disepakati di dalamnya?


Adhari C. Mahendra -- tampaknya beliau bekerja di Sun Microsystems Indonesia memberikan tanggapan menarik. Gw co-pas aja conversation mereka di sini :


fansul wrote:

mau tanya tentang license mysql apakah benar2 gratis untuk dipakai
diperusahaan.

License MySQL by default adalah GPL, jadi impactnya, aplikasi yang anda bangun adalah GPL. Sun atau dulunya MySQL AB tidak menarik bayaran atas license, mereka hanya jualan support sekaligus memberikan hak kepada yang membeli support untuk merubah lisensi GPL ke lisensi lain.

Selain itu ada lisensi OEM jika anda hendak menjual branding produk anda yang didalamnya ada MySQL.

soalnya lagi mempertimbangkan mau pakai oracle atau mysql, di cabang2
karena ada rencana merubah program dari ver lama dos ke ver windows
dengan back end mysql/oracle.
klu harus beli, bisa beli dimana dan harganya berapa di hitung per
user atau bagaimana ?
tks.

Kalau anda hendak membeli support MySQL anda bisa menghubungi kantor Sun Microsystems Indonesia di Wisma Metropolitan I Lt 13, minta kontak sales software. Harga support tergantung level dari support yang dibeli dan dihitung per system terserah jumlah user dan jumlah CPU yang dimiliki per systemnya.

***
Ada lagi pendapat dari Abangkis (gw gag bs mengidentifikasikan siapa nama sebenarnya dari Bapak satu ini ^_^) yaitu :

Secara garis besar penggunaan MySQL bisa dibilang gratis. Sedangkan yang dijual oleh Sun adalah Support Subscription/SLA. Dengan membeli Support subscription maka anda akan mendapatkan Support dan beberapa fitur lain seperti :
- update berkala
- binary khusus
- software2 enterprise khusus yang amat membantu untuk memaintain database.
- dll

untuk lebih detailnya bisa dilihat di : http://globalspecials.sun.com/store/mysql/ContentTheme/pbPage.categoryEnterprise

SLA ini dihitung berdasarkan jumlah server, dan merupakan subscription  tahunan. Kalau oracle bisa per user atau per cpu. Untuk harga, bisa dibandingkan sendiri di  http://www.oracle.com/corporate/pricing/pricelists.html. Perbedaannya lumayan jauh :P

Nah kalau kita bicara license, seperti pak adhari bilang, license MySQL adalah GPL. Kalau aplikasi yang anda kembangkan adalah untuk internal perusahaan maka hal ini tidak akan terlalu berpengaruh. Karena source code aplikasi dimiliki oleh perusahaan anda juga.


***

Benar-benar conversation yang menarik. Gw pengen membahas GPL dari sisi "konteks" -- terlepas itu diberlakukan di MySQL atau di produk-produk opensource yang laen. Begini ceritanya...




Berbicara mengenai *gimana sebenarnya* lisensi MySQL untuk produk komersial yg kita bikin, memang sangat membingungkan... Simak pernyataan berikut yang dikutip dari artikel ini :
Q2: Does the FOSS License Exception apply to all Sun software products, including the MySQL database server?
A: No. The FOSS License Exception does not apply to Sun's MySQL database server or any Sun or MySQL software other than the GPL-licensed MySQL Client Libraries. 
 
Q4: Can commercial OEMs, ISVs or VARs combine and distribute commercial products with Sun's GPL-licensed MySQL software under the FOSS License Exception? Does this include the MySQL database server?

A: Distributors of commercial products that combine GPL-licensed MySQL software with commercially licensed software (i.e., software not licensed under a FOSS license) must comply with the terms of the GPL. This includes use and distribution of the GPL-licensed MySQL database
server and MySQL Client Libraries. The FOSS License Exception does not apply with respect to products licensed under any license other than the FOSS licenses listed in the section above titled "FOSS License List."
Di situ dijelaskan bahwa FOSS License hanya berlaku untuk MySQL Client Library. Bukan database-nya. Saya lebih "senang" (atau tenang?) menginterpretasikan masalah lisensi MySQL ini seperti yang Pak Adhari Mahendra dan Pak Abangkis jelaskan di atas. Bahwa aplikasi kita yang mempergunakan MySQL sebagai database/backend itu mempergunakan lisensi GPL ketika di-deploy ke client. Aplikasi GPL tidak selalu harus dibuat dari platform yang GPL juga (misal PHP/Python). Tapi aplikasi yg dibikin dari C++, Delphi, .NET, atau VB juga boleh di-rilis sebagai GPL.

Nah, yang jadi masalah itu sebenarnya adalah *pendapat awam* tentang GPL itu sendiri.. Itu bener2 jadi momok menakutkan bagi para coderpreneur (ini istilah gw sendiri utk "pengusaha" code) : "apakah klo saya makae MySQL, brarti aplikasi saya gag boleh dijual (dikomersilkan) ???" -- dan kebingungan massal ini juga sering dimanfaatkan oleh (calon) customer yang membutuhkan software aplikasi : "ini kan GPL? mestinya gratis donk... mahal amat ngejual-nya?" ^_^

Richard Stallman, pencetus GPL itu sendiri, pernah menganalogikan Open Source dan GPL itu begini : "this is not about FREE BEER. but consider this (open-source) as FREE SPEECH" -- *dalem bangedd maknanya.. Kita berhak memasang harga sebesar-besarnya untuk aplikasi yang kita buat. Karena itu artinya kita telah "bersikap adil" terhadap jerih-payah kita. *hanya saja* -- kalau suatu saat client kita meminta source-code kita, berikanlah... Itu adalah GPL. Kenapa? Dengan GPL, kita sebagai developer sebenarnya dimudahkan, karena *mungkin* yang perlu kita lakukan klo mau membuat custom-build application hanya perlu melakukan refactoring dari aplikasi yang sudah ada. Poin ini sebenarnya juga memiliki nilai investasi lebih bagi stakeholder (client), karena dia ngga perlu "membayar" developer sebelumnya untuk sekedar konsultasi mengenai arsitektur sistem-nya dahulu. Di sisi lain, programmer juga dilindungi "kepemilikannya" -- karena GPL melarang kita memodifikasi tanpa menyertakan credit title author asli di code program. Walaupun hal ini *amat sangat mudah* dihapus oleh developer selanjutnya, tapi kekuatan hukum-nya kuat bangedd apabila developer asli pengen menuntut-nya dengan menyertakan bukti copy asli code aplikasi tsb. (Entah gimana dengan hukum di Indonesia, bisa ngga mengakomodir masalah ini klo suatu ketika ada code yang di-meja-hijau-kan)

Klo interpretasi saya sendiri, IMHO :
  1. aplikasi yg dikeluarkan under GPL, itu source-code-nya memang harus diserahkan ke publik. Tapi definisikan "publik" itu sendiri siapa? yaitu client kita... Client berhak dapat source-code dari aplikasi yang dia beli.
  2. Kalo developer tetangga -- yang dalam arti lain sama dengan "kompetitor kita" -- boleh ngga "nyontek" source-code dari aplikasi2 yang kita? -- ini pertanyaan rumit. Tapi hadapi saja. Siapapun developer yang pengen tau isi source-code dari aplikasi2 GPL kita, beranikan diri untuk face-to-face datang dan minta sendiri. :P -- dan biarkan idealisme dan harga diri yang berbicara kemudian... ^_^
  3. Kalo suatu saat definisi publik di poin 1 itu makin melebar ke publik = komunitas atau publik = masyarakat -- buka aja code-nya n taruh di repository publik. Toh, klo emang kita yang bener2 bikin ndiri ntu aplikasi, kita juga bisa bikin ulang lagi aplikasi itu kapanpun kita mau. Kekayaan intelektual kita ngga akan berkurang secuil-pun dengan melakukan hal itu. Malah ada peluang "nambah" -- dengan dapat feedback dari orang2... -- loe pikir, MySQL bisa sebesar ini karena coder-coder di MySQL AB doank apa? Power of community itu sama seperti cara Son Goku mengalahkan Iblis Bhu : mengumpulkan energi manusia se planet bumi dengan BOLA SEMANGAT.
  4. Masalah finansial, -- setelah gw pelajari dari pengalaman-pengalaman gw -- ada banyak hal yang ternyata lebih valuable secara finance ketimbang aplikasi gw sendiri : CONTENT dan SUPPORT. Kalo gw bikin web-portal, duit bisa datang dari content (entah iklan, entah isi berita itu sendiri) -- dan kalo gw bikin aplikasi sistem informasi, kue terbanyak dari income adalah dari PELATIHAN, PENDAMPINGAN, dan CONSULTING. Bahkan dengan GPL -- kita bisa saling berbagi kue pelatihan/pendampingan/consulting itu dengan partner developer lain. Kita jadi trainer/consultant dari produk dia, dia jadi trainer/consultant dari produk kita.
Gw punya temen yang bijaksana bangedd, dia punya filosofi gini : "Developer Indonesia kalo mau bersaing, bersainglah di sisi materi/finansial -- tapi utk urusan teknologi, sebaiknya saling bahu-membahu" -- dia menyampaikan itu waktu berkunjung ke kantor gw pas malam lailatul qadar bulan ramadhan kemaren. Bener2 ILLUMINATING deh. Dia ngingetin gw lagi tentang apa alasan utama gw terjerembab di dunia code seperti sekarang ini : yaitu mengabdikan code-code gw untuk kemajuan negara ini.

Duit bisa dicari coyy.. - kalo emang kita baik ama orang, orang akan bantu kita -- dan Tuhan sendiri juga akan sayang ama kita...

(eh, makin OOT ya? -- kembali ke laptop deh)

tentang Lisensi MySQL, gw cukup mengutip tulisan di website-nya MySQL ini :

For users or organizations looking to maintain their own solutions, (if) I have :
  • My own method of keeping my systems up to date and am comfortable upgrading and configuring MySQL.
  • Time to monitor and adjust the MySQL settings that will tune, scale and maintain performance.
  • Experience with database security so that I know when a security breach has occurred.
  • Experience designing, setting-up and monitoring the status of MySQL replication.
  • Time to identify and resolve technical issues for myself and others.
  • Time to design and tune application code, database schemas and dynamic queries for optimal performance.
TAKE ME TO THE COMMUNITY DOWNLOADS

yang gw interpretasikan : "yeah, I just only need the Community Edition of that database server..."

Demikian sedikit "curhat" dari saya tentang MySQL Licensing ^_^
-- maaf klo banyak yg OOT atau mencederai perasaan temen-temen... (-_-)
_______________________


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
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

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... 


10
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...



5
CHARSET dan COLLATION

Beberapa hari yang lalu, teman sekampungku di Samarinda (1smail) nanya via YM : "Q koq aku ngga bs ngecek field yg case-sensitive ya? semuanya dianggap insensitive". Hmm, dia pake MySQL. Frontend yg dia pake adalah PHP. Dia udah ngasi aku script dia. 'SELECT * FROM TAnggota WHERE Username = $username;' ~> efeknya, apapun isi variabel $username, komparasi stringnya tetep dianggap case-insensitive..

Kucoba di console-ku.

SELECT 'User' = 'uSeR';

hasilnya 0 (alias false)...

wah, udah case-sensitive koq. Trus kulaporin ke dia. "MySQL case-sensitive koq.. kmu nya aja yg keliru paling." *hehehe, tuduhan tak berdasar*... tp 1smail tetep bersikukuh klo dia nyoba di field dia bakal diperlakukan case-insensitive.

Trus aku coba2 buka MySQL manual.. ketemu tulisan kya gini :

Normally, if any expression in a string comparison is case sensitive, the comparison is performed in case-sensitive fashion.


*bingung aku. MySQL bilang, dia case-sensitive. Aku coba, case-sensitive. Koq 1smail coba, case-insensitive yak?

trus aku search2 lagi MySQL manual... ketemu lagi tulisan kya gini :

By default, MySQL searches are not case sensitive (although there are some character sets that are never case insensitive, such as czech). This means that if you search with col_name LIKE 'a%', you get all column values that start with A or a. If you want to make this search case sensitive, make sure that one of the operands has a case sensitive or binary collation. For example, if you are comparing a column and a string that both have the latin1 character set, you can use the COLLATE operator to cause either operand to have the latin1_general_cs or latin1_bin collation.


OALAAAAHH, ngono tho... masalah collation ternyata. (Aku lumayan berpengalaman utk masalah CHARSET n COLLATION ini, mengingat beberapa minggu yang lalu aku cukup disibukin ttg gimana caranya masukin query utk field dgn value berupa tulisan arab. heheHe..., tuntutan profesi...)

Trus, kusuru 1smail checking struktur tabelnya TAnggota dia. Cek, column `username` nya apa charset n collationnya. Ternyata, charset = latin1 dan collation = latin1_swedish_ci

Itu dia masalahnya gas..

latin1_swedish_ci ~> ci di sini refer to 'case-insensitive'. Jelas, column username akan diperlakukan insensitive pada string comparison. Ta' suruh ganti collationnya jadi latin1_general_cs. Trus coba lagi.

BISA!

*Tp muncul 1 pertanyaan, kenapa di engine MySQL ku ngga perlu nyetting collation bisa?

Ternyata, pendekatan yg di-ijinkan MySQL utk nentuin collation ada beberapa cara :
1. cara CASTING. on-the-fly. dilakukan ketika melakukan query. contoh :

SELECT * FROM Table_Name WHERE col_name COLLATE latin1_general_cs LIKE 'a%'

2. definisiin pas pembuatan DDL. pas CREATE TABLE. contoh :

CREATE TABLE Table_Name
(
col_name CHARACTER SET latin1 COLLATE latin1_general_cs
) ENGINE = MyISAM;

3. tambahin parameter pas run service MySQL:
--collation-server=latin1_general_cs

4. setting di my.ini (ato my.cnf)
default-character-set=latin1
collation-server=latin1_general_cs

cara no 3 & 4 akan mbikin settingan default MySQL pas create table baru akan nge-apply collation-nya column otomatis akan jadi latin1_general_cs.

dan ternyata pas ta' check-n-recheck, ternyata dulu aku nyetting my.ini ku dgn system variable seperti itu. makanya MySQL Engine ku secara default melakukan string comparison nerapin mode sensitif.. Hehehe, maklum, dah lama ngga ngobok2 settingan server. Aku klo bolak-balik reinstall MySQL (karna bolak-balik reinstall OS?) tinggal copy-in my.ini ku ke directory tertentu n aktivasi server ku pake command-prompt

E:\MySQL\bin>mysqld-nt --install MySQL --defaults-file="E:\MySQL\my-shiepp.ini"

semua database-ku, login account ku, n settingan ku, akan kembali seperti sedia kala...

Begitulah, MySQL. menarik emang.. apalagi liat nasionalisme mereka yg nyetting default collation pake latin1_swedish_ci. Swedia, their homeland... Salute utk MySQL. berhasil mengibarkan panji-panji Viking Kuning di dunia internasional...

Merah putih kapan ya?


Wassalam,

Qvezst

1
Online Analytical Processing (OLAP)

Konsep sistem penunjang keputusan dicetuskan oleh dua orang profesor dari Massachusset Institute of Technology (MIT) yaitu Anthony Gorry dan Michael Scott Morton pada tahun 1971. Sistem penunjang keputusan adalah suatu mekanisme bantu bagi middle-manager ke atas untuk mendapatkan model informasi, dan simulasi serta analisis statistik dalam situasi pengambilan keputusan yang semi-terstruktur. (Gorry & Scott Morton dalam [OET-02] p.99).

Semakin kompleksnya pengembangan sistem-sistem informasi pemrosesan transaksional yang berevolusi ke arah Online Transactional Processing (OLTP) System, menimbulkan konsekuensi semakin rumit dan semakin banyak data maupun informasi yang harus dianalisis oleh pihak manajemen. Untuk itu dikembangkan suatu metode pengelolaan data dalam skala besar dengan membuat suatu data warehouse. ([CHA-96] p.1). Pada data warehouse, semua data disimpan dan diintegrasikan, termasuk riwayat data (historical data), untuk dimanfaatkan sebagai dukungan penganalisisan data dan pengambilan keputusan nantinya (Pires, 2006:10).

Cakupan sistem penunjang keputusan pun semakin berkembang untuk menyesuaikan kebutuhan analisis informasi yang juga semakin kompleks. Pada pertengahan dekade 1990, bersamaan dengan adopsi besar-besaran data-warehousing pada sejumlah perusahaan besar dunia, dikenalkan suatu teknik analisis penunjang keputusan yaitu OLAP, Online Analytical Processing ([CHA-96] p.2).

Online Analytical Processing (OLAP) menawarkan metode analisis data secara kompleks dan terkustomisasi yang disesuaikan dengan kebutuhan akan informasi oleh para analis maupun eksekutif. Data yang dikelola oleh OLAP berasal dari data warehouse ([PIR-06] p.10). Pengguna OLAP umumnya memanfaatkan OLAP dengan pola analisis seperti berikut ini ([PIR-06] p.12) :

  • Meringkas dan mengumpulkan sejumlah besar data
  • Melakukan filtering, pengurutan, dan memberikan peringkat (rangking)
  • Membandingkan beberapa set dari data
  • Membuat sketsa/bagan/diagram
  • Menganalisis dan menemukan pola dari data
  • Menganalisis kecenderungan data


Pola-pola tersebut kemudian dijadikan acuan oleh pengembang perangkat lunak pendukung pengambilan keputusan, termasuk pengembang database, untuk mengembangkan sistem berbasis OLAP. Fokus pengembangan OLAP-tools tersebut adalah untuk menyediakan analisis multidimensional dari data dengan berbagai variasi penyajian secara interaktif. OLAP-tools dirancang untuk bekerja dengan data mentah hierarchical, lalu mengelompokkannya dan meringkasnya ke dalam bentuk multidimensional (
[AIT-06] p.161).

Beberapa RDBMS terkemuka seperti Microsoft SQL Server dan Oracle telah menyatakan dukungan terhadap OLAP maupun data warehouse. Database engine yang OLAP-capable menawarkan fitur built-in berupa perintah-perintah maupun function khusus untuk menangani OLAP, seperti grouping, aggregating, summarizing, filtering, sorting, rangking, hingga membuat pivot tables ([KOF-05] p.234).

Walaupun komite ANSI sudah lama memasukkan definisi OLAP-Function sejak dikeluarkannya standar SQL:99 ([ISO-99] p.419-465), sangat disayangkan MySQL hingga versi 5.0 belum merencanakan ketersediaan fasilitas OLAP-Functions (kecuali klausa GROUP BY) ([KOF-05] p.234). Namun masih ada pendekatan lain untuk menyajikan fitur OLAP untuk pengelolaan data dalam MySQL, dengan bantuan spreadsheet yang OLAP-capable seperti Microsoft Excel. Sebuah fitur yang sangat menarik untuk manajemen dan analisis data multidimensional dalam Microsoft Excel adalah PivotTables ([HER-05] p.107).

Referensi

[AIT-06] Aitken, Peter G., Excel PivotTables and Charts, Wiley Publishing Inc., Indianapolis : 2006.

[CHA-96] Chauduri, Surajit & Dayal, Umeshwar, An Overview of Data Warehousing and OLAP Technology, VLDB Conference, New Delhi : 1996.

[HER-05] Hermawan, Julius, Membangun Decision Support System, Penerbit Andi, Yogyakarta : 2005.

[ISO-99] ISO & ANSI, ISO/IEC 9075-2 : SQL/Foundation Part 2, ISO Central Secretariat, Geneva : 1999.

[KOF-05] Köfler, Michael, The Definitive Guide to MySQL5, Apress Publisher, Berkeley, CA : 2005.

[OET-02] Oetomo, Budi Sutedjo Dharma, S.Kom, MM., Perencanaan & Pembangunan Sistem Informasi, Penerbit Andi, Yogyakarta : 2002.

[PIR-06] Pires, Joäo Moura, Data Warehouse Architecture Overview, Bases de Dados e DataWarehouse, Lisbon : 2006.