tag:blogger.com,1999:blog-42455611857239086082024-03-06T10:30:33.871+07:00Rizky Prihantolearn the rules, break the rules, and create the new ones...eRQeehttp://www.blogger.com/profile/04138933553082003934noreply@blogger.comBlogger53125tag:blogger.com,1999:blog-4245561185723908608.post-32617212920797693152010-02-13T09:28:00.003+07:002010-02-13T09:52:43.616+07:00Cara-Cara Membuka Windows Explorer<span style="font-family: trebuchet ms;">Sekian cara membuka Windows Explorer:</span><br /><ol style="font-family: trebuchet ms;"><li>Start Menu -> Accessories -> Windows Explorer</li><li>Bikin shortcut Windows Explorer di desktop atau di Quick Launch trus buka dari sana<br /></li><li>Win Key + E</li><li>Klik Kanan Start Menu trus pilih Explore</li><li>Klik Kanan My Computer trus pilih Explore</li><li>Klik Kanan Recycle Bin trus pilih Explore</li><li>Win Key + R trus ketik explorer</li><li>Dobel klik My Computer trus setelah muncul window, aktifkan navigation pane</li><li>Pakae Internet Explorer trus tulis path file kita seperti biasa</li><li>Klik menu menu "My Document" atau "My Pictures" di start menu, toh semuanya juga bakal nge-launching Windows Explorer<br /></li><li>Win Key + R trus ketik cmd trus ketik explorer</li><li>Start Menu -> Accessories -> Command Prompt trus ketik explorer</li><li>Lupakan Windows Explorer, aku lebih suka nge-browse file pakai ACDSee<br /></li><li>Tambahkan windows explorer di start-up program trus untuk membuka windows explorer lakukan dengan cara restart komputer!<br /></li></ol><span style="font-family: trebuchet ms;">Yang manakah Anda?</span>eRQeehttp://www.blogger.com/profile/04138933553082003934noreply@blogger.com4tag:blogger.com,1999:blog-4245561185723908608.post-44954251840456484712010-02-06T11:41:00.003+07:002010-02-13T09:21:25.768+07:00Batch Script Generator untuk Backup Database<span style="font-family:trebuchet ms,sans-serif;">Jalankan ini di console query mysql client kesayangan anda:<br /><br /><span style="font-family:courier new,monospace;">set @path_backup = 'D:\\backup\\';</span><br /><span style="font-family:courier new,monospace;">set @sv_host = '192.168.10.121';</span><br /><span style="font-family:courier new,monospace;">set @sv_port = '3306';</span><br /><span style="font-family:courier new,monospace;">set @sv_uname = 'root';</span><br /><span style="font-family:courier new,monospace;">set @sv_pwd = '123123';</span><br /><br /><span style="font-family:courier new,monospace;">select * into outfile <span style="color: rgb(204, 0, 0);">'D:\\script_batch_mysqldump.<wbr>bat'</span></span><br /><span style="font-family:courier new,monospace;">lines terminated by '\n'</span><br /><span style="font-family:courier new,monospace;">from </span><br /><span style="font-family:courier new,monospace;">(</span><br /><span style="font-family:courier new,monospace;">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,'.<wbr>sql') as syntax from information_schema.schemata as db where db.schema_name not in ('information_schema','mysql',<wbr>'test')</span><br /><br /><span style="font-family:courier new,monospace;">union</span><br /><br /><span style="font-family:courier new,monospace;">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',<wbr>'test')</span><br /><span style="font-family:courier new,monospace;">) as script;</span><br /><br /><br />sesuaikan value dari variabel-variabel yang ada di SET itu dengan informasi koneksi yang benar.<br />trus sesuaikan juga OUTPUT PATH dari file bat yang akan di-processing (yg gw kasih font warna merah di atas)<br /><br />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.<br /><br />Kalo yang "struktur" saja, itu isinya:<br /></span><ol><li><span style="font-family:trebuchet ms,sans-serif;">DDL untuk create table</span></li><li><span style="font-family:trebuchet ms,sans-serif;">script stored procedure/function, kalo ada<br /></span></li><li><span style="font-family:trebuchet ms,sans-serif;">script pembentuk trigger, kalo ada</span></li><li><span style="font-family:trebuchet ms,sans-serif;">script pembentuk events, kalo ada<br /></span></li></ol><span style="font-family:trebuchet ms,sans-serif;">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.<br /><br />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.<br /><span style="font-size:6px;"><br />oke, silakan dicoba.</span><br /><br /><span style="font-size:130%;">atau kalo mau, adopsi query-query select gw utk nge-build generator sendiri pake bahasa-bahasa pemrograman andalan anda...</span></span>eRQeehttp://www.blogger.com/profile/04138933553082003934noreply@blogger.com4tag:blogger.com,1999:blog-4245561185723908608.post-920296607753961622009-06-25T16:36:00.000+07:002009-06-25T16:36:51.386+07:00Mengintip Cara Perhitungan Klasemen pada PSB Solok 2009Penerimaan Siswa Baru (PSB) Solok 2009 sudah dimulai sejak beberapa hari yang lalu. Antusiasme positif dari siswa sangat tinggi terhadap sistem online yang ditawarkan oleh Dinas Pendidikan Kota Solok tahun ini dengan memberikan fasilitas pendaftaran siswa baru melalui beragam media interaktif seperti web (<a href="http://psb.solokcerdas.com/" target="_blank">http://psb.solokcerdas.com</a>) dan SMS Server dengan mengirimkan sms menggunakan format tertentu ke nomor <strong>0811665540</strong>. <br />
<br />
Banyak feedback yang diterima oleh Dinas Pendidikan Kota Solok mengenai sistem PSB Online ini, terutama pertanyaan mengenai bagaimana sesungguhnya cara perhitungan klasemen pada PSB Solok 2009. Hal ini sebenarnya telah dijelaskan secara detail oleh Team ICT Dinas Pendidikan Kota Solok pada roadshow sosialisasi PSB Online 2009 yang telah dilakukan di semua sekolah di Kota Solok sejak bulan lalu. Namun ada baiknya jika kami jelaskan ulang melalui website ini.<br />
<br />
<div class="fullpost"><br />
Perhitungan dan penentuan peringkat dalam klasemen untuk setiap sekolah secara mendasar mengacu pada :<br />
<ol><li>Jumlah kuota yang disediakan masing-masing sekolah, meliputi:</li>
<ul><li>kuota dalam rayon</li>
<li>kuota luar rayon (untuk siswa yang berasal dari sekolah luar rayon dan dari luar kota)<br />
</li>
</ul><li>Batas minimal Nilai UN yang ditetapkan oleh masing-masing sekolah<br />
</li>
</ol>Adapun mekanisme pengurutan (sorting) untuk menentukan posisi siswa dalam tabel klasemen per masing-masing sekolah adalah berdasarkan :<br />
<ol><li>Nilai UN Total</li>
<li>Nilai Bhs Indonesia</li>
<li>Nilai Matematika</li>
<li>Nilai IPA</li>
<li>Nilai Bahasa Inggris</li>
<li>Tanggal & Jam Melakukan Pendaftaran</li>
</ol>Jika seorang siswa memiliki nilai UN total yang sama besar dengan siswa lain, maka sebagai komparasi akan dibandingkan lagi nilai UN per mata pelajaran dengan urutan nilai Bahasa Indonesia dilakukan perbandingan terlebih dahulu, baru setelah itu Matematika, dan seterusnya. Jika nilai-nilai mata pelajaran antara siswa tersebut masih sama -- yang mana hal ini kecil kemungkinannya untuk terjadi -- pengurutan untuk memperoleh peringkat yang lebih tinggi antara kedua siswa tersebut akan dilakukan berdasarkan tanggal dan jam siswa tersebut melakukan pendaftaran ke sekolah tersebut.<br />
<br />
Peringkat dalam klasemen ini akan terus bergeser mengikuti dinamika jumlah siswa pendaftar yang telah terverifikasi oleh Panitia PSB sampai batas waktu terakhir klasemen memasuki tanggal penutupan.<br />
<br />
Untuk siswa-siswa yang sudah berada di luar kuota dari tabel klasemen di masing-masing sekolah, disarankan untuk segera mengganti pilihan sekolahnya ke sekolah lain. Penggantian sekolah pilihan ini hanya bisa dilakukan untuk siswa yang sudah melaporkan nilai DANUN-nya ke Panitia PSB di posko-posko PSB yang tersebar di semua sekolah peserta PSB Online ini.<br />
<br />
Untuk siswa-siswa yang saat ini sudah berada di "zona degradasi" alias di papan bawah klasemen masing-masing sekolah, juga amat disarankan untuk mengganti pilihan sekolahnya, dengan harapan kemungkinan di tabel klasemen sekolah lain siswa tersebut masih memiliki posisi aman untuk menempati papan atas atau papan tengah klasemen.<br />
<br />
PSB Solok 2009 ini diselenggarakan dalam 2 gelombang klasemen, yaitu :<br />
<div><ul><li>Gelombang 1, dilaksanakan pada tanggal 22 Juni 2009 hingga 30 Juni 2009</li>
<li>Gelombang 2, dilaksanakan pada tanggal 8 Juli 2009 hingga 9 Juli 2009</li>
</ul></div>Mekanisme perhitungan dan pengurutan pada kedua gelombang klasemen itu adalah sama dan mengikuti pola perhitungan yang sama seperti yang telah dijelaskan di atas. Sedangkan ketika Klasemen Gelombang 2 berakhir, proses penerimaan siswa baru bagi siswa-siswa yang masih berada di luar kuota akan dilakukan oleh Dinas Pendidikan Kota Solok bekerjasama dengan seluruh sekolah peserta PSB di Kota Solok melalui proses Bursa Calon Siswa.<br />
<br />
Demikian penjelasan dari Team ICT Diknas Kota Solok mengenai 'dapur' sistem PSB Online 2009 ini, semoga dapat dipahami oleh segenap siswa di Kota Solok yang tengah berjuang meraih mimpi dan harapan di calon sekolah baru. Kami ucapkan selamat melaksanakan PSB Online 2009 ini, semoga sukses!<br clear="all" /><span style="color: #888888;"> </span><br />
<br />
_______________________<br />
<br />
<img src="http://qvezst.googlepages.com/my-hand-signature.jpg" /><br />
<b>Rizky Prihanto</b><br />
Software Architect <a href="http://www.cinox.co.id/" target="_self">PT Cinox Media Insani</a></div>eRQeehttp://www.blogger.com/profile/04138933553082003934noreply@blogger.com0tag:blogger.com,1999:blog-4245561185723908608.post-66060121269951729062009-06-17T18:52:00.001+07:002009-06-17T18:53:36.874+07:00Mendistribusikan MyODBC dalam Installer Aplikasi<div style="font-family: "Trebuchet MS",sans-serif;">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 <a href="http://www.vbmysql.com/projects/vbmysqldirect">vbmysqldirect</a>, <a href="http://www.devart.com/mydac">MyDAC</a>, <a href="http://www.microolap.com/products/connectivity/dbx4mysql/">dbExpress</a>, atau MySQL Connector yang lain -- ya ngga perlu MyODBC).<br />
</div><div style="font-family: "Trebuchet MS",sans-serif;"></div><div style="font-family: "Trebuchet MS",sans-serif;">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.<br />
</div><div style="font-family: "Trebuchet MS",sans-serif;"></div><span style="font-family: "Trebuchet MS",sans-serif;">Di artikel kali ini gw mencoba mengupas mengenai teknik-teknik 'memaksakan' client menginstall secara otomatis MyODBC supaya program kita bisa running well.</span><br />
<br />
<div class="fullpost"><br />
<br />
<span style="font-family: trebuchet ms,sans-serif; font-size: medium;">caranya </span><span style="font-family: trebuchet ms,sans-serif;">(gw asumsikan kita akan redistribute-kan MyODBC 5.1) :</span><br />
<br />
<span style="font-family: trebuchet ms,sans-serif;">1. di installer loe, u </span><b style="color: #cc0000; font-family: trebuchet ms,sans-serif;">copy</b><span style="font-family: trebuchet ms,sans-serif;">-kan file2 berikut ke %SYSDIR% (terserah sih mo dimana sebenarnya):</span><br />
<span style="font-family: courier new,monospace;"> a) libmysql.dll</span><br />
<span style="font-family: courier new,monospace;"> b) myodbc5.dll</span><br />
<span style="font-family: courier new,monospace;"> c) myodbc5.lib </span><br />
<span style="font-family: courier new,monospace;"> d) myodbc5S.dll </span><br />
<span style="font-family: courier new,monospace;"> e) myodbc5S.lib </span><br />
<br />
<span style="font-family: trebuchet ms,sans-serif;">2. Lakukan </span><b style="color: #cc0000; font-family: trebuchet ms,sans-serif;">install driver</b><span style="font-family: trebuchet ms,sans-serif;"> manual dengan nge-add registry berikut ini :</span><br />
<span style="font-family: courier new,monospace;"> classkey = HKEY_LOCAL_MACHINE</span><br />
<span style="font-family: courier new,monospace;"> sectionkey = "SOFTWARE\ODBC\ODBCINST.INI\<wbr></wbr>MySQL ODBC 5.1 Driver"</span><br />
<span style="font-family: trebuchet ms,sans-serif;"> trus bikin beberapa key yaitu :</span><br />
<span style="font-family: courier new,monospace;"> a) nama key = "Driver"</span><br />
<span style="font-family: courier new,monospace;"> tipe = REG_SZ</span><br />
<span style="font-family: courier new,monospace;"> value = "C:\WINDOWS\System32\myodbc5.<wbr></wbr>dll"<span style="font-family: arial narrow,sans-serif;"> --> sesuaikan ini dgn tempat di mana u nge-extract (step 1)</span></span><br />
<span style="font-family: courier new,monospace;"> b) nama key = "Setup"</span><br />
<span style="font-family: courier new,monospace;"> tipe = REG_SZ</span><br />
<span style="font-family: courier new,monospace;"> value = "C:\WINDOWS\System32\myodbc5S.<wbr></wbr>dll"</span><br />
<span style="font-family: courier new,monospace;"> c) nama key = "UsageCount"</span><br />
<span style="font-family: courier new,monospace;"> tipe = REG_DWORD</span><br />
<span style="font-family: courier new,monospace;"> value = 1</span><br />
<br />
<span style="font-family: trebuchet ms,sans-serif;">3. Langkah terakhir, lakukan </span><b style="color: #cc0000; font-family: trebuchet ms,sans-serif;">register driver</b><span style="font-family: trebuchet ms,sans-serif;"> ke ODBC driver, juga dgn maen-maen registry berikut :</span><br />
<span style="font-family: trebuchet ms,sans-serif;"> <span style="font-family: courier new,monospace;"> classkey = HKEY_LOCAL_MACHINE</span></span><br />
<span style="font-family: courier new,monospace;"> sectionkey = "SOFTWARE\ODBC\ODBCINST.INI\<wbr></wbr>ODBC Driver"</span><br />
<span style="font-family: trebuchet ms,sans-serif;"> bikin key :</span><br />
<span style="font-family: courier new,monospace;"> nama = "MySQL ODBC 5.1 Driver"</span><br />
<span style="font-family: courier new,monospace;"> tipe = REG_SZ</span><br />
<span style="font-family: courier new,monospace;"> value = "installed"</span><br />
<br />
<span style="font-family: trebuchet ms,sans-serif; font-size: medium;">udah. </span><span style="font-family: trebuchet ms,sans-serif;">itu cara bikin installer sendiri utk MyODBC 5.1</span><br />
<span style="font-family: trebuchet ms,sans-serif;">kalo utk versi MyODBC 3.51, silakan sesuaikan sendiri (tapi buat apa makae 3.51 hare gene?)</span><br />
<span style="font-family: trebuchet ms,sans-serif; font-size: medium;"><br />
bisa loe adopsi di :</span><br />
<ol style="font-family: trebuchet ms,sans-serif;"><li>jalankan ntu script di setiap app.initialization (tentu cek dulu, execute cuman kalo if not exists)<br />
</li>
<li><i>atau</i> embedd ke dalam script installer loe (semua installer pastinya bisa nge-manipulate registry kan?)</li>
<li><i>atau</i> bikin program exe sendiri yang akan menjalankan <b>"silent-install"</b> 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.<br />
</li>
</ol><span style="font-family: trebuchet ms,sans-serif; font-size: medium;">mau cara gampang? </span><br />
<span style="font-family: trebuchet ms,sans-serif;">Bikin installer-nya pakae </span><a href="http://nsis.sourceforge.net/" style="font-family: trebuchet ms,sans-serif;" target="_blank">NSIS</a><span style="font-family: trebuchet ms,sans-serif;"> (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 </span><i style="font-family: trebuchet ms,sans-serif;">automatic-install</i><span style="font-family: trebuchet ms,sans-serif;"> server mysql sendiri!).</span><br />
<br />
<span style="font-family: trebuchet ms,sans-serif; font-size: medium;">Cara :</span><br />
<span style="font-family: trebuchet ms,sans-serif;">1. siapkan installer MySQL ODBC 5.1 terbaru (anggap namanya : mysql-connector-odbc-5.1.5-<wbr></wbr>win32.msi)</span><br />
<span style="font-family: trebuchet ms,sans-serif;">2. sisipkan di script NSIS loe begini :</span><br />
<span style="font-family: courier new,monospace;"> SetOutPath "$TEMP"</span><br />
<span style="font-family: courier new,monospace;"> SetOverwrite On</span><br />
<span style="font-family: courier new,monospace;"> File "..\resources\mysql-connector-<wbr></wbr>odbc-5.1.5-win32.msi"</span><br />
<span style="font-family: courier new,monospace;"> ExecWait 'msiexec /i "$TEMP\mysql-connector-odbc-5.<wbr></wbr>1.5-win32.msi"' $0</span><br />
<span style="font-family: trebuchet ms,sans-serif;">3. compile script installer loe untuk menghasilkan 1 file installer (aplikasi loe + prerequisites-nya)</span><br />
<br />
<span style="font-family: trebuchet ms,sans-serif; font-size: medium;">Penjelasan Script NSIS:</span><br />
<div style="font-family: trebuchet ms,sans-serif; margin-left: 40px;"><b style="color: #cc0000;">baris pertama,</b> itu akan melakukan change-dir ke direktori tujuan ekstrak sebuah file (dalam hal ini TEMP DIR)<br />
<b style="color: #cc0000;">baris kedua,</b> itu akan melakukan flagging kalo file yg akan di-ekstrak udah ada, dia akan di-overwrite<br />
<b style="color: #cc0000;">baris ketiga,</b> itu meng-copy-kan dari installer berupa file setup mysql-connector-odbc-5.1.5-<wbr></wbr>win32.msi ke TEMP DIR. parameter dari File itu adalah alamat dari paket instalan mysql-connector-odbc-5.1.5-<wbr></wbr>win32.msi ketika installer <u>sedang</u> dibentuk<br />
<b style="color: #cc0000;">baris keempat,</b> itu akan melakukan eksekusi file installer mysql-connector-odbc-5.1.5-<wbr></wbr>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.</div><br />
<span style="font-family: trebuchet ms,sans-serif; font-size: medium;">kelebihan dari cara gampang ini?</span><br />
<ul style="font-family: trebuchet ms,sans-serif;"><li>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: <b>mudah!</b>)<br />
</li>
<li>loe bisa replace source install-an mysql odbc versi berapapun dgn mudah</li>
<li>file installer yang kelak akan di-distribusikan ke user cuman 1 doank. udah all in one.</li>
</ul><span style="font-family: trebuchet ms,sans-serif; font-size: medium;">Kira-kira begitu...</span><br />
<span style="font-family: trebuchet ms,sans-serif;"></span> <span style="color: #cc6600; font-family: trebuchet ms,sans-serif; font-size: x-large;">Happy exploring...</span><br />
_______________________<br />
<br />
<img src="http://qvezst.googlepages.com/my-hand-signature.jpg" /><br />
<b>Rizky Prihanto</b><br />
Software Architect <a href="http://www.cinox.co.id/" target="_self">PT Cinox Media Insani</a></div>eRQeehttp://www.blogger.com/profile/04138933553082003934noreply@blogger.com5tag:blogger.com,1999:blog-4245561185723908608.post-87595054065428984662009-05-22T10:43:00.000+07:002009-05-22T10:43:26.583+07:00Konsep Sistem Terintegrasi<div style="text-align: justify;"><span style="font-family: "Trebuchet MS",sans-serif;">Dalam konteks sistem informasi, sistem terintegrasi <i>(integrated system) </i>merupakan sebuah rangkaian proses untuk menghubungkan beberapa sistem-sistem komputerisasi dan software aplikasi baik secara fisik maupun secara fungsional. Sistem terintegrasi akan menggabungkan komponen sub-sub sistem ke dalam satu sistem dan menjamin fungsi-fungsi dari sub sistem tersebut sebagai satu kesatuan sistem.</span></div><div style="text-align: justify;"><br style="font-family: "Trebuchet MS",sans-serif;" /><span style="font-family: "Trebuchet MS",sans-serif;">Sistem terintegrasi merupakan tantangan menarik dalam <i>software development</i> karena pengembangannya harus terus mengacu pada konsistensi sistem, agar sub-sub sistem yang sudah ada dan tetap dimanfaatkan secara operasional masih tetap berfungsi sebagaimana mestinya baik ketika proses mengintegrasikan sistem maupun setelah terintegrasi. Tantangannya adalah bagaimana merancang sebuah mekanisme mengintegrasikan sistem-sistem tersebut dengan <i>effort</i> paling minimal – bahkan jika diperlukan, tidak harus melakukan <i>refactoring</i> atau <i>re-developing</i> lagi sistem-sistem yang sudah ada.</span><br />
</div><div class="fullpost"><br />
<br />
<div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;">Ada beberapa metode yang dapat dipergunakan dalam membangun sistem terintegrasi, sebagaimana yang direferensikan berdasarkan artikel dari <a href="http://en.wikipedia.org/wiki/System_integration">Wikipedia</a> yaitu :</div><ul style="font-family: "Trebuchet MS",sans-serif; text-align: justify;"><li><b><i>Vertical Integration,</i></b> merupakan proses mengintegrasikan sub-sub sistem berdasarkan fungsionalitas dengan menghubungkan sub-sub sistem yang sudah ada tersebut supaya bisa berinteraksi dengan sistem terpusat dengan tetap berpijak pada arsitektur sub sistem yang lama. Metode ini memiliki keuntungan yaitu dapat dilakukan dengan cepat dan hanya melibatkan beberapa entitas d<i>evelopment</i> yang terkait dalam proses pembuatan sistem lama. Kelemahannya, metode ini tidak memungkinkan untuk mengimplementasikan fungsi-fungsi baru atau proses bisnis baru ke dalam sub-sistem yang sudah ada – karena <i>effort</i> lebih tinggi ada di proses <i>“mempelajari”</i> arsitektur sistem lama dan menjadikannya acuan untuk membuat sistem terintegrasi. Untuk menghadirkan ekspansi fungsionalitas atau proses bisnis baru adalah harus membuat sub-sistem baru.</li>
<li><b><i>Star Integration,</i></b> atau lebih dikenal sebagai <i>spaghetti integration,</i> adalah proses mengintegrasikan sistem dengan cara menghubungkan satu sub sistem ke semua sub-sub sistem lainnya. Sebuah fungsi bisnis yang diimplementasikan dalam sebuah sub sistem akan di-<i>broadcast</i> ke semua sub-sub sistem lain yang dependen terhadap fungsi bisnis tersebut supaya dapat dipergunakan sebagaimana mestinya. Untuk integrasi sistem dengan ruang lingkup kecil atau menengah dan dengan pemisahan fungsi bisnis yang jelas dan spesifik, metode integrasi ini layak untuk dipertimbangkan. Namun jika fungsi bisnis banyak terlibat di beberapa sub sistem secara dependen, pada akhir proses integrasi sistem akan terlihat sedikit <i>“kekacauan”</i> dalam diagram – proses interkoneksi antar sub sistem akan tampak seperti s<i>paghetti</i>. Efeknya, biaya perawatan dan ekspansi sistem di masa yang akan datang akan memerlukan <i>effort </i>yang sangat berat untuk mempelajari skema integrasi sistem berikut <i>dependency</i>-nya.</li>
<li><b><i>Horizontal Integration,</i></b> atau ada yang mengistilahkan dengan <i>Enterprise Service Bus (ESB)</i>, merupakan sebuah metode yang mengintegrasikan sistem dengan cara membuat suatu <i>layer</i> khusus yang berfungsi sebagai <i>interpreter</i>, dimana semua sub-sub sistem yang sudah ada akan berkomunikasi ke <i>layer</i> tersebut. Model ini lebih menawarkan fleksibilitas dan menghemat biaya integrasi, karena yang perlu difokuskan dalam implementasi proses pengintegrasian hanya <i>layer interpreter</i> tersebut. Untuk menangani ekspansi proses bisnis juga hanya perlu diimplementasikan di <i>layer interpreter </i>itu juga, dan sub sistem baru yang akan menangani <i>interface </i>dari proses bisnis ekstensi tersebut akan berkomunikasi langsung ke layer dan layer akan menyediakan keperluan-keperluan data/interface untuk sub sistem lain yang memerlukannya.</li>
</ul><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;">Metode Enterprise Service Bus (ESB) ini – seperti yang dilansir dari <a href="http://en.wikipedia.org/wiki/Enterprise_service_bus">Wikipedia</a> juga – memiliki banyak kelebihan jika diadopsi dalam merancang arsitektur sistem terintegrasi, yaitu antara lain :</div><ol style="font-family: "Trebuchet MS",sans-serif; text-align: justify;"><li>Lebih cepat dalam melakukan penyesuaian dengan sistem yang telah ada</li>
<li>Meningkatkan fleksibilitas, mudah untuk diperbaharui mengikuti perubahan keperluan sistem <i>(system requirements)</i></li>
<li>Membuat standar sistem sehingga bisa diaplikasikan di sub sistem mana pun</li>
<li>Porsi pekerjaan software development lebih banyak di <i>“konfigurasi”</i> daripada <i>“menulis code” </i>untuk integrasi</li>
<li>Dapat diterapkan mulai ruang lingkup kecil hingga di level <i>enterprise</i></li>
</ol><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;">Namun metode <i>horizontal integration</i> atau <i>Enterprise System Bus (ESB)</i> yang tampaknya ideal ini bukan berarti tidak ada kelemahan. Beberapa kelemahan yang cukup signifikan pengaruhnya antara lain :</div><ol style="font-family: "Trebuchet MS",sans-serif; text-align: justify;"><li>Pembuatan standar sistem dalam Enterprise Message Model banyak berkutat di aspek analisis dan manajerial, biaya analisis benar-benar tinggi karena perlu berkolaborasi dengan analis-analis yang bertanggung jawab terhadap arsitektur dan desain sistem-sistem yang telah ada.</li>
<li>Secara khusus memerlukan perangkat keras <i>(hardware)</i> yang spesifik, seperti misalnya <i>business-logic-server</i> yang independen dan tidak integral dengan salah satu atau sebagian dari sub sistem yang telah ada.</li>
<li>Perlu tambahan tenaga (SDM) berupa <i>Middleware Analyst</i> yang akan mengkonfigurasi, merawat, dan mengoperasikan layer <i>Enterprise Service Bus</i>.</li>
<li>Karena biasanya ESB mempergunakan XML sebagai bahasa komunikasi antar sistem, tentu akan memerlukan <i>resources</i> dan komputasi berlebih untuk melakukan <i>parsing-reparsing </i>dalam komunikasi data.</li>
<li>Memerlukan <i>effort</i> yang cukup tinggi dalam mengimplementasikan ESB karena cukup banyak <i>layer</i>/tingkatan aplikasi yang harus ditangani, tidak hanya aplikasi-aplikasi interface dari sub-sub sistem saja, melainkan juga <i>layer interpreter </i>yang juga memiliki karakteristik sebagai aplikasi juga.</li>
</ol><div style="text-align: justify;"><span style="font-family: "Trebuchet MS",sans-serif;">Pada akhir kisah, merancang dan membuat sebuah sistem terintegrasi -- memang bukan merupakan pekerjaan yang ringan. Apalagi kalau sejak awal pengembangan sistem-sistem terpisah yg sudah ada itu tidak dirancang untuk saling diintegrasikan satu sama lain. </span></div><div style="text-align: justify;"></div><div style="text-align: justify;"><span style="font-family: "Trebuchet MS",sans-serif;">Tapi itulah hidup..., kita tidak bisa tau (sistem kita) besok bakal jadi bagaimana -- terus berkembang, atau berakhir di rak-rak penyimpanan CD usang di ruang arsip yang berdebu.</span> </div><br />
_______________________<br />
<br />
<img src="http://qvezst.googlepages.com/my-hand-signature.jpg" /><br />
<b>Rizky Prihanto</b><br />
Software Architect <a href="http://www.cinox.co.id/" target="_self">PT Cinox Media Insani</a></div>eRQeehttp://www.blogger.com/profile/04138933553082003934noreply@blogger.com3tag:blogger.com,1999:blog-4245561185723908608.post-77613275212182488082009-05-01T18:11:00.002+07:002009-05-01T18:15:24.619+07:00Dampak Evaluasi Implementasi dalam SDLC<div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;">Di facebook gw, ada message di inbox yg berasal dari salah satu friend gw. Isinya *dia nanya* begini :</div><blockquote style="font-family: "Trebuchet MS",sans-serif;"><span style="font-size: x-small;">Maaf baru aja add tp dah repoti<br />
</span><br />
<div style="text-align: justify;"><span style="font-size: x-small;"> need help u makalah gw, sebenernya sumber kesalahan suaru software tu dari mananya? apakah selalu desainnya, atau mungkin ga implementasinya? need referensi yang sahih buat dasarnya</span></div><span style="font-size: x-small;"> thx 4 ur att.</span></blockquote><div style="font-family: "Trebuchet MS",sans-serif;"></div><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;">Gw bukan mo mengomentari "kenapa beliau ngga nanya via imel aja? tp kenapa lewat FB yg mana fungsi utamanya bukan untuk imel-imel-an, melainkan untuk narcis-narcis-an.." ~ bukan. Gw mo nyoba jawab pertanyaan dia, coz sebenarnya gw juga sering (SERING-BANGEDD) mengalami masalah berupa kesalahan di software yg tim gw bikin, itu sebenarnya karena kita kurang evaluasi di faktor mana-nya?</div><div style="font-family: "Trebuchet MS",sans-serif;"></div><span style="font-family: "Trebuchet MS",sans-serif;">Kira-kira begini hasil pemikiran gw :</span><br />
<div class="fullpost"><br />
<br />
<div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;">Kalo dirunut-runut, ada beberapa tahap dasar dari sebuah siklus pengembangan sistem (SDLC), yaitu :</div><ol style="font-family: "Trebuchet MS",sans-serif;"><li>Perencanaan</li>
<li>Analisis</li>
<li>Desain</li>
<li>Konstruksi</li>
<li>Implementasi</li>
<li>Maintenance/support</li>
</ol><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;"></div><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;">Produk sistem yang dihasilkan itu sendiri, akan dinikmati oleh user di dalam fase IMPLEMENTASI (beda artinya dengan KONSTRUKSI -- walau banyak miskonsepsi mengenai ini dalam materi-materi Rekayasa Perangkat Lunak, bahwa proses "coding" itu adalah proses "implementasi". Bukan! Itu konstruksi.).</div><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;"></div><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;">Nah, masalahnya -- seperti case yang coba dibedah temen gw tsb, kalo ada kesalahan dalam suatu produk software -- itu yang salah ada di fase mana?</div><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;"></div><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;">Hmm... jawabannya : semua fase dalam SDLC selalu menimbulkan potensi munculnya sebuah kesalahan.</div><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;"></div><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;">Yaa, kita ngga perlu membahas kalo programmer juga manusia, punya rasa punya hati, juga punya khilaf ^_^ ~ itu manusiawi. Tapi mari sekali-sekali kita simak bagaimana sebenarnya SDLC itu sendiri. Silakan perhatikan gambar di bawah ini : </div><div class="separator" style="clear: both; text-align: center;"></div><div style="text-align: center;"><img alt="http://qvezst.googlepages.com/sdlc_feedback.JPG" height="282" src="http://qvezst.googlepages.com/sdlc_feedback.JPG" width="420" /></div><br />
<br />
<div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;">Dari gambar di atas, dapat dideduksikan bahwa sebuah "perulangan" fase terjadi jika : </div><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;"><ul style="font-family: "Trebuchet MS",sans-serif; text-align: justify;"><li><span style="font-size-adjust: none; font-size: 7pt; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"></span><span lang="IN">kesalahan program (error/bug)</span></li>
<li><span style="font-size-adjust: none; font-size: 7pt; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"></span><span lang="IN">ketidakcocokan solusi sistem (software) dengan teknologi baru</span></li>
<li><span style="font-size-adjust: none; font-size: 7pt; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"></span><span lang="IN">terdapat masalah-masalah dan keperluan bisnis yang baru</span></li>
<li><span style="font-size-adjust: none; font-size: 7pt; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"></span><span lang="IN">solusi sistem (software) sudah tidak layak lagi<o:p></o:p></span></li>
</ul><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;"></div><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;"></div><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;">Untuk proses terjadinya "revisi" karena kesalahan program, step dalam SDLC yang harus di-ulangi adalah di fase KONSTRUKSI. Artinya, perbaiki code atau mungkin coding ulang.</div><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;"></div><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;">Sedangkan kalo ketidak-cocokan solusi dengan teknologi baru -- misalnya, ekspansi pembayaran cash menjadi pembayaran debit/kartu kredit atau karena upgrading DBMS atau karena pengen dirombak ke platform teknologi terbaru (contohnya, yg tadinya di-coding-in under DOS menjadi di-coding-in under Windows, atau dibikin dari VB6 pengen diganti jadi .NET) -- fase DESAIN harus diulangi dan implikasinya, fase KONSTRUKSI juga harus diulangi.</div><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;"></div><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;">Kalo terdapat masalah-masalah dan proses bisnis baru? Misalnya: ternyata sistem yg udah terimplementasi dengan baik ini diharuskan TERINTEGRASI dengan sistem di atasnya yg lebih besar; atau terdapat penambahan beberapa requirement baru yang belum terfasilitasi di sistem existing. Kalo itu yang terjadi, proses SDLC mau-ngga-mau harus diulangi dari fase ANALISIS, trus DESAIN lagi, trus CODING lagi deh...</div><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;"></div><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;"><br />
Dan yang paling parah, yg ini nih : ternyata setelah IMPLEMENTASI sekian tahun lamanya, solusi sistem yang terimplementasi di aplikasi existing ini udah bener-bener usang dan ngga layak pakai. Mau tetap dipertahankan untuk dioperasikan, salah. Kalo itu yang terjadi, PERENCANAAN ULANG! ~ tapi, diambil sisi positifnya aja. Perencanaan ulang dan mengulang segalanya dari awal lagi, kan artinya PROJECT BARU. <i>hehehe... loemayan laah daripada loe manyun</i>. ^_^</div><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;"></div><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;"><br />
Sebagaimana lagu PeterPan, memang benar bahwa TAK ADA YANG ABADI. Bahkan sistem dan aplikasi. Tahun 2000 lalu, seiring dengan launching-nya Windows Millennium, Bill Gates mengatakan : DOS udah mati. Sah-sah saja. Ngga ada yang benar-benar perlu disesali.</div><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;"></div><div style="text-align: justify;"><br />
<span style="font-family: "Trebuchet MS",sans-serif;">Kalo dapat komplain dari end-user atau stakeholder pemesan sistem yang kita bangun, syukurilah... Itu artinya kita tetap menjaga relasi dengan dia dan menjaga perputaran siklus development kita tetap berjalan. Stakeholder yang bijaksana, tentunya mengerti sedalam-dalamnya bahwa setiap terjadi perubahan sistem PASCA-IMPLEMENTASI akibat ini-itu, pasti ada biayanya. Dan pada kenyataannya pun, kita sebagai system-developer juga sering mbikin proposal bukan cuman judulnya "proposal pembuatan sistem" atau "proposal pengembangan sistem" -- tapi juga "proposal pemutakhiran sistem". Waaa, sering bangedd nie muncul di Media Indonesia tender-tender di instansi pemerintah yang bertemakan PEMUTAKHIRAN. Artinya : update sistem lama, entah starting point-nya dari </span><b style="font-family: "Trebuchet MS",sans-serif;">re-code</b><span style="font-family: "Trebuchet MS",sans-serif;">, </span><b style="font-family: "Trebuchet MS",sans-serif;">re-design</b><span style="font-family: "Trebuchet MS",sans-serif;">, </span><b style="font-family: "Trebuchet MS",sans-serif;">re-analysis</b><span style="font-family: "Trebuchet MS",sans-serif;">, atau ... </span><b style="font-family: "Trebuchet MS",sans-serif;">REVOLUSI!</b></div><br />
<br />
_______________________<br />
<br />
<img src="http://qvezst.googlepages.com/my-hand-signature.jpg" /><br />
<b>Rizky Prihanto</b><br />
Software Architect <a href="http://www.cinox.co.id/" target="_self">PT Cinox Media Insani</a></div></div>eRQeehttp://www.blogger.com/profile/04138933553082003934noreply@blogger.com0tag:blogger.com,1999:blog-4245561185723908608.post-58794207038209650122009-04-30T15:31:00.000+07:002009-04-30T15:31:44.836+07:00xp_autokode<span style="font-family: courier new,monospace;">Barusan baca-baca blog-nya dendie tentang </span><a href="http://dendieisme.blogspot.com/2009/03/mysql-store-procedure.html" style="font-family: courier new,monospace;" target="_blank">Stored Procedure</a><span style="font-family: courier new,monospace;">. Ada yg comment, nanya, pengen nge-convert stored-procedure yg dia bikin dari SQL Server ke SP di MySQL. Dia co-pas-kan script SP di SQL Server-nya sebagai berikut :</span><br style="font-family: courier new,monospace;" /> <br style="font-family: courier new,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">==============================<wbr></wbr>==============</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">CREATE PROCEDURE [dbo].[AutoNumber] </span><br style="font-family: "Courier New",Courier,monospace;" /> <span style="font-family: "Courier New",Courier,monospace;">@NoMember varchar(10) OUTPUT</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">AS</span><br style="font-family: "Courier New",Courier,monospace;" /> <span style="font-family: "Courier New",Courier,monospace;">DECLARE @NoTertinggi numeric,</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> @Indek int</span><br style="font-family: "Courier New",Courier,monospace;" /> <span style="font-family: "Courier New",Courier,monospace;">Select @NoTertinggi=MAX(CAST(RIGHT([<wbr></wbr>No Member],8)As Numeric))</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">From Member</span><br style="font-family: "Courier New",Courier,monospace;" /> <span style="font-family: "Courier New",Courier,monospace;">Set @NoMember = 'NM'</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">If @NoTertinggi is null</span><br style="font-family: "Courier New",Courier,monospace;" /> <span style="font-family: "Courier New",Courier,monospace;">set @NoTertinggi = 0</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">set @NoTertinggi = @NoTertinggi + 1</span><br style="font-family: "Courier New",Courier,monospace;" /> <span style="font-family: "Courier New",Courier,monospace;">set @Indek = LEN(@NoTertinggi)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">ulang:</span><br style="font-family: "Courier New",Courier,monospace;" /> <span style="font-family: "Courier New",Courier,monospace;">if @Indek <> 8</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">begin</span><br style="font-family: "Courier New",Courier,monospace;" /> <span style="font-family: "Courier New",Courier,monospace;">set @NoMember = @NoMember + '0'</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">set @Indek = @Indek + 1</span><br style="font-family: "Courier New",Courier,monospace;" /> <span style="font-family: "Courier New",Courier,monospace;">goto ulang</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">end </span><br style="font-family: "Courier New",Courier,monospace;" /> <span style="font-family: "Courier New",Courier,monospace;">set @NoMember = @NoMember + cast(@NoTertinggi as varchar)</span><br style="font-family: "Courier New",Courier,monospace;" /><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">GO</span><br />
==============================<br />
<div class="ii gt" id=":2u5"><br />
<br />
Setelah gw tracing singkat, ntu SP tujuannya adalah untuk nge-generate auto-number otomatis dari sebuah tabel. Hmm..., gw jadi sedikit tergelitik untuk nge-share xp_autokode buatan-ku di masa-lalu nih utk nanganin kasus serupa. Begini script-nya :</div><div class="fullpost"><br />
<br />
<span style="color: #999999; font-family: "Courier New",Courier,monospace;">/* Procedure "xp_autokode_out" DDL */</span><br style="font-family: "Courier New",Courier,monospace;" /><br style="font-family: "Courier New",Courier,monospace;" /> <span style="font-family: "Courier New",Courier,monospace;"><span style="color: #000099;">delimiter $$<br />
create procedure</span> `xp_autokode_out`(<br />
depan <span style="color: #000099;">varchar</span>(20), <br />
digit <span style="color: #000099;">tinyint</span>, <br />
tabel <span style="color: #000099;">varchar</span>(255), <br />
kolom <span style="color: #000099;">varchar</span>(255), <br />
<span style="color: #000099;">out </span>newvalue <span style="color: #000099;">varchar</span>(255)<br />
)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="color: #000099; font-family: "Courier New",Courier,monospace;">begin</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> <span style="color: #000099;">if</span> digit > 0 <span style="color: #000099;">then</span></span><br style="font-family: "Courier New",Courier,monospace;" /> <span style="font-family: "Courier New",Courier,monospace;"> <span style="color: #000099;">if length</span>(<span style="color: #000099;">trim</span>(depan)) = 0 <span style="color: #000099;">then</span></span><br style="font-family: "Courier New",Courier,monospace;" /> <span style="font-family: "Courier New",Courier,monospace;"> <span style="color: #000099;">set</span> @sql = <span style="color: #000099;">concat</span>(<span style="color: #990000;">' select concat("'<span style="color: black;">,<span style="color: #000099;">trim</span>(depan),</span>'",lpad(<wbr></wbr>ifnull(cast(max(substr('<span style="color: black;">,<wbr></wbr>kolom,</span>',length("'<span style="color: black;">,<span style="color: #000099;">trim</span>(depan),</span><wbr></wbr>'")+1,'<span style="color: black;">, digit,</span>')) as signed),0)+1,'<span style="color: black;">,digit,</span>',0)) as newkode into @value</span></span><span style="color: #990000; font-family: "Courier New",Courier,monospace;"> from '<span style="color: black;">,tabel,</span></span><span style="font-family: "Courier New",Courier,monospace;"><span style="color: #990000;">' where left('<span style="color: black;">,kolom,</span>',length('<span style="color: black;">,kolom,</span><wbr></wbr>')-'<span style="color: black;">,digit,</span>') = "'<span style="color: black;">,<span style="color: #000099;">trim</span>(depan),</span>'" AND ('<span style="color: black;">,kolom,</span>'+0)/'<span style="color: black;">,kolom,</span>' = 1'</span>);</span><br style="font-family: "Courier New",Courier,monospace;" /> <span style="font-family: "Courier New",Courier,monospace;"> <span style="color: #000099;">else</span></span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> <span style="color: #000099;">set </span>@sql = <span style="color: #000099;">concat</span>(<span style="color: #990000;">' select concat("'<span style="color: black;">,<span style="color: #000099;">trim</span>(depan),</span>'",lpad(<wbr></wbr>ifnull(cast(max(substr('<span style="color: black;">,<wbr></wbr>kolom,</span>',length("'<span style="color: black;">,<span style="color: #000099;">trim</span>(depan),</span><wbr></wbr>'")+1,'<span style="color: black;">, digit,</span>')) as signed),0)+1,'<span style="color: black;">,digit,</span>',0)) as newkode into @value</span></span><span style="color: #990000; font-family: "Courier New",Courier,monospace;"> from '<span style="color: black;">,tabel,</span></span><span style="font-family: "Courier New",Courier,monospace;"><span style="color: #990000;">' where left('<span style="color: black;">,kolom,</span>',length('<span style="color: black;">,kolom,</span><wbr></wbr>')-'<span style="color: black;">,digit,</span>') = "'<span style="color: black;">,<span style="color: #000099;">trim</span>(depan),</span>'"'</span>);</span><br style="font-family: "Courier New",Courier,monospace;" /> <span style="font-family: "Courier New",Courier,monospace;"> <span style="color: #000099;">end if;</span></span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> <span style="color: #000099;">prepare</span> query <span style="color: #000099;">from</span> @sql;</span><br style="font-family: "Courier New",Courier,monospace;" /> <span style="font-family: "Courier New",Courier,monospace;"> <span style="color: #000099;"> execute</span> query;</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> <span style="color: #000099;"> set</span> newvalue = @value;</span><br style="font-family: "Courier New",Courier,monospace;" /> <span style="font-family: "Courier New",Courier,monospace;"> <span style="color: #000099;">else</span></span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> <span style="color: #000099;">select</span> <span style="color: #990000;">'Digit tidak boleh lebih kecil dari 1 !!!'</span> <span style="color: #000099;">as</span> pesan;</span><br style="font-family: "Courier New",Courier,monospace;" /> <span style="font-family: "Courier New",Courier,monospace;"> <span style="color: #000099;">end if;</span></span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"></span><span style="color: #000099; font-family: "Courier New",Courier,monospace;">end $$ <br />
delimiter ;</span> <br />
<br />
<br />
ntu xp ~ <i>extended stored procedure -- gw menamakan xp-xp generic gw begitu</i> ~ adalah routine yg bisa meng-generate autonumber untuk *sembarang tabel* dengan primary key berupa varchar atau char. Dan bisa dalam formatting tertentu, pula. <br />
<br />
Misalnya : <br />
mo bikin nomor nota <b><span style="font-size: medium;">B-00001</span></b> dari sebuah tabel <b>penjualan</b> dengan kolom primary key namanya <b>"kode"</b>, loe tinggal rumusin dulu format2 autonumber yg mo di-generate sbb :<br />
<br />
<div style="margin-left: 40px;"><i><b>Prefix :</b></i> "B-"<br />
<b><i>Jumlah Digit :</i></b> 5 ~> 00001 terdiri 5 digit angka, bukan?<br />
<b><i>Nama Tabel :</i></b> penjualan<br />
<b><i>Nama Kolom :</i></b> kode<br />
</div>Cara pemanggilan SP :<br />
<br />
<span style="font-family: "Courier New",Courier,monospace;">mysql > call xp_autokode_out("B-",5,"<wbr></wbr>penjualan","kode",@new_kode);</span><br style="font-family: "Courier New",Courier,monospace;" /> <span style="font-family: "Courier New",Courier,monospace;">mysql> select @new_kode as `kode_baru`;<br />
+-----------+<br />
| kode_baru |<br />
+-----------+<br />
| B-00001 |<br />
+-----------+</span><br />
<br clear="all" /><br />
<span style="font-size: x-large;">cobain ndiri deh... </span><br />
<br />
Dan loe bisa ekspansikan penggunaan xp ini di dalam stored procedure loe. Misalnya, sp untuk simpan nota, seperti ini contohnya :<br />
<br />
<span style="color: #000099; font-family: "Courier New",Courier,monospace;">delimiter $$</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"><span style="color: #000099;">create procedure</span> `sp_penjualan_simpan`(</span><br style="font-family: "Courier New",Courier,monospace;" /> <span style="font-family: "Courier New",Courier,monospace;"> v_kode_barang <span style="color: #000099;">varchar</span>(20), </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> v_jumlah <span style="color: #000099;">int</span>, </span><br style="font-family: "Courier New",Courier,monospace;" /> <span style="font-family: "Courier New",Courier,monospace;"> v_harga <span style="color: #000099;">double</span></span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">)</span><br style="font-family: "Courier New",Courier,monospace;" /> <span style="color: #000099; font-family: "Courier New",Courier,monospace;">begin</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> <span style="color: #000099;">declare </span>new_kuitansi <span style="color: #000099;">varchar</span>(20);</span><br style="font-family: "Courier New",Courier,monospace;" /> <span style="font-family: "Courier New",Courier,monospace;"> <span style="color: #000099;">call</span> xp_autokode_out(<span style="color: #990000;">"B-"</span>,5,<span style="color: #990000;">"<wbr></wbr>penjualan"</span>,<span style="color: #990000;">"kode"</span>,new_<wbr></wbr>kuitansi);</span><br style="font-family: "Courier New",Courier,monospace;" /> <span style="font-family: "Courier New",Courier,monospace;"> <span style="color: #000099;">insert into</span> penjualan <span style="color: #000099;">values</span> (new_kuitansi, v_kode_barang, v_jumlah, v_harga);</span><br style="font-family: "Courier New",Courier,monospace;" /> <span style="color: #000099; font-family: "Courier New",Courier,monospace;">end $$</span><br style="color: #000099; font-family: "Courier New",Courier,monospace;" /><span style="color: #000099; font-family: "Courier New",Courier,monospace;">delimiter ;</span><br />
<br />
<span style="font-size: medium;">gimana-gimana? keren kan?</span><br />
_______________________<br />
<br />
<img src="http://qvezst.googlepages.com/my-hand-signature.jpg" /><br />
<b>Rizky Prihanto</b><br />
Software Architect <a href="http://www.cinox.co.id/" target="_self">PT Cinox Media Insani</a></div>eRQeehttp://www.blogger.com/profile/04138933553082003934noreply@blogger.com9tag:blogger.com,1999:blog-4245561185723908608.post-52573028807177267822009-02-26T07:20:00.000+07:002009-02-26T07:20:04.277+07:00Teknik Praktis AnalisisDi <a href="http://www.cinox.co.id/">Cinox Media Insani</a>, kami sering 'berganti-ganti formasi' dalam setiap pengerjaan sebuah project. Kadang, setelah progress berjalan, developer kami perannya digantikan oleh developer kami yang lain. Hal ini sangat mudah dilakukan karena kami semua mempergunakan framework aplikasi yang sama, dan kami sudah memahami standarisasi code yang ditetapkan oleh perusahaan, juga kami sudah tau karakteristik coding masing-masing rekan yg duduk di samping kami.<br />
<br />
Beberapa minggu belakangan, gw melihat sebuah 'potensi baru' dalam tim kami yang solid ini. Gw mo latihan switch-role ke definisi jenjang yang berbeda. Bukan substitusi antar coder, tapi substitusi di level query building, di level art-designing, dan di level architecting. Permasalahan umum-nya yg dihadapi, apakah ada standarisasi di aspek query building, art-designing, dan bahkan architecting? Bukankah hal-hal tersebut adalah aspek-aspek subyektif yang *so-pasti* berbeda klo ditangani oleh orang-orang yang berbeda?<br />
<br />
Betul sekali.<br />
<br />
Maksut gw sebenarnya bukan substitusi dalam arti di tengah2 permainan sang architect diganti ama architect lain. Bukan begitu. Tapi formasi tempur Cinox pada "starting line-up" nya utk posisi-posisi architect, query-builder, art-designer -- seyogyanya jangan melulu di-isi oleh orang-orang yang sama terus. Bosan. Gag ada variasi-nya. Jadi, maksut gw, substitusi di sini adalah <b><i>memberikan kesempatan</i></b> bagi bro-bro dan sis-sis Cinoxers yang lain untuk "ikut merasakan" gimana sengsara-nya jadi Software Architect, atau jadi Art-Designer, atau jadi Query Developer.<br />
<br />
Oke, deal!<br />
<br />
Project yang jadi 'kelinci percobaan' udah ditentukan. Yang dijadikan case-study adalah <span style="color: purple;">aplikasi manajemen penerimaan pajak daerah</span>. Gw lirik-lirik dokumen output yg diharapkan, cukup simpel. Dan gw coba utk project ini, gw hibahkan role Software Architect ke <a href="http://phphanifa.wordpress.com/">Bro Ali Hanifa</a>. Hehehe.. sekalian belajar buat dia. Udah selayaknya dia naik 'pangkat' jadi Programmer/Analyst mengingat potensi besar yang dia tunjukin "kadang-kadang" udah cukup bagus utk di-upgrade ke level selanjutnya.<br />
<br />
Eh, tau-tau... selang beberapa hari setelah dia nyoba ngebikin Spesifikasi Aplikasi, nongol imel dari dia yang isinya *curhat* -- dia kebingungan. BINGOENG ABIEZZ mo mulai nge-trace dari mana, sementara apa yang dia dapat hanya satu bundel format reporting yang diberikan ama Dinas Pendapatan Daerah.<br />
<br />
<span style="font-size: large;">Terlalu raw. Terlalu mentah.</span><br />
<br />
Akhirnya, gw coba share-share dikit tentang teknik praktis analisis sebagai berikut (gw co-pas aja dari imel yg gw tulis utk beliau via milis staff@cinox.co.id) :<br />
<br />
<div class="fullpost"><br />
Sebenarnya <span style="font-size: medium;">"merumuskan spec"</span> dari <u>data2 mentah</u> seperti format laporan itu <b style="color: red;">adalah</b> fungsi dari Software Architect berpusing-pusing ria di awal. hehehe...<br />
<br />
klo data mentah masih kurang menggambarkan requirements? yang (biasa gw) bisa lakukan adalah :<br />
<ol><li>tanya ke marketing kita atau "penghubung kita" --> <span style="color: #993300; font-size: medium;">apa sih yg elo janji-in ke client?</span> itu akan jadi patokan dasar pembuatan spec kita. Dokumen kontrak kerjasama sebenarnya harus diberikan ke SA <i>(oke lah, silakan sensor bagian tentang nominal project</i><i>)</i> -- karena dari situ kita bisa dapatkan <b>scope pekerjaan</b>. Batasan, scope, sampai di garis mana seorang SA boleh berimajinasi tentang struktur aplikasi yg bakal dihasilkan. Jangan sampe, marketing bilang ke client "sampe pendataan pajak" -- eh si S.A. berfantasi sampe ke "Wikimapia untuk informasi subyek pajak secara GIS" hehehe... -- atau sebaliknya. Scope yang dijanjiin sampe di state ini, tp spec yang dibuat ngga nyampae ke sono. Ini berbahaya. Sangat berbahaya.<br />
</li>
<li><span style="color: #993300; font-size: medium;">bikin prototype</span> trus ajukan ke client, klo begini kurangnya di mana?</li>
<li>klo client abstain ato malah bingung dengan spec prototype, kita <span style="color: #993300; font-size: medium;">tanyakan penilaian spec kita ke orang lain yg lebih 'terampil'</span> : pegawai-nya client. Soalnya kebanyakan client itu adalah top-management. Sedangkan kebanyakan aplikasi yg kita bikin itu adalah aplikasi yg bakal dikonsumsi ama level low-management.</li>
<li>bingung bikin prototype? <span style="color: #993300; font-size: medium;">pelajarin proposal dan spec orang</span>. Google adalah sahabat Anda.</li>
<li>Juga <span style="color: #993300; font-size: medium;">cari referensi apakah ada produk opensource serupa</span> yg pernah dibikin orang? ato walo gag opensource, ada gag produk orang yg ada live-demo-nya? SourceForge.Net adalah kekasih Anda utk urusan beginian..<br />
</li>
<li><span style="color: #993300; font-size: medium;">baca-baca referensi non-teknis</span> tentang kasus yg dihadapi itu banyak membantu pemahaman kita n mempengaruhi spec yg kita bikin. Misal : undang-undang perpajakan daerah, bacaan2 direktori pajak dari <a href="http://pajak.go.id/" target="_blank">pajak.go.id</a>, artikel2 di koran atau portal berita seputar pajak</li>
<li>dan cukup penting juga kita <span style="color: #993300; font-size: medium;">"berteman" ama orang2 yg bergumul dengan tema sistem yg mo kita kembangkan</span>. Misal, gw : punya temen SMA yg skrg kerja di pajak, kerja di depkeu, yg dulu kuliah di FIA Negara atau Ekonomi -- obok2 Facebook & Friendster Anda utk mendapatkan contact teman2 lama Anda...</li>
<li>juga, cukup penting juga kita <span style="color: #993300; font-size: medium;">"berteman" ama sesama software developer</span> <b><i>yang mungkin</i></b> pernah mbikin sistem/aplikasi serupa. Klo ini, Kaskus room 147, diskusiweb, dan milis-milis komunitas software developer adalah tempat yang tepat untuk scouting.</li>
<li><span style="color: #993300; font-size: medium;">Pengalaman pribadi</span> dalam bikin sistem serupa sebelumnya juga "sangat berharga bangedd" utk membentuk perspektif spec yang akan kita hasilkan.<br />
</li>
</ol><span style="color: #666666; font-size: x-large;">begitulah bro...</span> keep on rolling the eyes..<br />
<br />
Untuk kasus aplikasi pajak daerah ini ini, mgkn <a href="http://phphanifa.wordpress.com/">bro Ali</a> bisa bikin spec utk dinikmati ama <a href="http://enjoybarengtika.com/">Jeng Tika</a> (query), <a href="http://en-gb.facebook.com/people/Anggita-Dyan-Kusumadety/1635860313">Non Dety </a>(desain), ama <a href="http://dendieisme.blogspot.com/">Suhu Dendie</a> (coder) dengan berpatokan dari struktur-schema yang akan gw bikinkan. Tapi utk development-lifecycle yg bener, bikin spec IO ama bikin struktur-schema itu adalah responsibility dari SA secara keseluruhan --> karena dalam bikin IO n struktur itu dilakukan secara iteratif n bersamaan. Saling mengevaluasi satu sama lain.<br />
<br />
gpp.. kita jadikan ini <span style="font-size: medium;"><span style="color: #cc0000;">ajang </span>buat belajar bareng</span> aja.. -- siapatau ntar "dalam perjalanan" kita nge-development, kita bisa dapat pengalaman-pengalaman yg <u><b>makin mematangkan</b></u> perspektif kita tentang Software Engineering...<br />
<br />
<span style="color: #666666; font-size: x-large;"><b>:-)</b></span><br />
<br />
_______________________<br />
<br />
<img src="http://qvezst.googlepages.com/my-hand-signature.jpg" /><br />
<b>Rizky Prihanto</b><br />
Software Architect <a href="http://www.cinox.co.id/" target="_self">PT Cinox Media Insani</a></div>eRQeehttp://www.blogger.com/profile/04138933553082003934noreply@blogger.com0tag:blogger.com,1999:blog-4245561185723908608.post-70483318036018014462009-02-02T02:53:00.027+07:002009-02-02T03:06:22.024+07:00MySQL & General Public LicenseAda 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?<br />
<b><i><br />
</i></b><br />
<b><i>Adhari C. Mahendra </i></b>-- tampaknya beliau bekerja di Sun Microsystems Indonesia memberikan tanggapan menarik. Gw co-pas aja conversation mereka di sini :<br />
<br />
<br />
fansul wrote:<br />
<br />
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"> mau tanya tentang license mysql apakah benar2 gratis untuk dipakai<br />
diperusahaan.<br />
<br />
</blockquote>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.<br />
<br />
Selain itu ada lisensi OEM jika anda hendak menjual branding produk anda yang didalamnya ada MySQL.<div class="Ih2E3d"><br />
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"> soalnya lagi mempertimbangkan mau pakai oracle atau mysql, di cabang2<br />
karena ada rencana merubah program dari ver lama dos ke ver windows<br />
dengan back end mysql/oracle.<br />
klu harus beli, bisa beli dimana dan harganya berapa di hitung per<br />
user atau bagaimana ?<br />
tks.<br />
<br />
</blockquote></div>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.<br />
<br />
***<br />
Ada lagi pendapat dari <b><i>Abangkis</i></b> (gw gag bs mengidentifikasikan siapa nama sebenarnya dari Bapak satu ini ^_^) yaitu :<br />
<br />
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 :<br />
- update berkala<br />
- binary khusus<br />
- software2 enterprise khusus yang amat membantu untuk memaintain database.<br />
- dll<br />
<br />
untuk lebih detailnya bisa dilihat di : <a href="http://globalspecials.sun.com/store/mysql/ContentTheme/pbPage.categoryEnterprise" target="_blank">http://globalspecials.sun.com/<wbr></wbr>store/mysql/ContentTheme/<wbr></wbr>pbPage.categoryEnterprise</a><br />
<br />
SLA ini dihitung berdasarkan jumlah server, dan merupakan subscription tahunan. Kalau oracle bisa per user atau per cpu. Untuk harga, bisa dibandingkan sendiri di <a href="http://www.oracle.com/corporate/pricing/pricelists.html" target="_blank">http://www.oracle.com/<wbr></wbr>corporate/pricing/pricelists.<wbr></wbr>html</a>. Perbedaannya lumayan jauh :P<br />
<br />
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.<br />
<br />
<br />
***<br />
<br />
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...<br />
<br />
<br />
<br />
<div class="fullpost"><br />
Berbicara mengenai *gimana sebenarnya* lisensi MySQL untuk produk komersial yg kita bikin, memang sangat membingungkan... Simak pernyataan berikut yang dikutip dari <a href="http://www.mysql.com/about/legal/licensing/foss-exception/">artikel ini</a> :<br />
<dl style="margin-left: 40px;"><dt><b>Q2:</b> Does the FOSS License Exception apply to all Sun software products, including the MySQL database server?</dt>
<dt><b>A:</b> 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. </dt>
<dt> </dt>
<dt><b>Q4: </b>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?<br />
<br />
<b> A: </b>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<br />
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." <br />
</dt>
</dl>Di situ dijelaskan bahwa FOSS License hanya berlaku untuk MySQL Client Library. Bukan <b>database</b>-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 <b>tidak selalu</b> 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.<br />
<br />
Nah, yang jadi masalah itu sebenarnya adalah *pendapat awam* tentang GPL itu sendiri.. Itu bener2 jadi momok menakutkan bagi para <i>coderpreneur</i><b> </b>(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?" ^_^<br />
<br />
<a href="http://www.stallman.org/" target="_blank">Richard Stallman</a>, 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. <b>*hanya saja*</b> -- kalau suatu saat <u>client kita</u> 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 <b>nilai investasi lebih</b> 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)<br />
<br />
Klo interpretasi saya sendiri, IMHO :<br />
<ol><li>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.</li>
<li>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 <i>face-to-face</i> datang dan minta sendiri. :P -- dan biarkan <i>idealisme dan harga diri</i> yang berbicara kemudian... ^_^<br />
</li>
<li>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? <i>Power of community</i> itu sama seperti cara Son Goku mengalahkan Iblis Bhu : mengumpulkan energi manusia se planet bumi dengan BOLA SEMANGAT.</li>
<li>Masalah finansial, -- setelah gw pelajari dari pengalaman-pengalaman gw -- ada banyak hal yang <b>ternyata <span style="font-size: medium;">lebih valuable </span>secara finance</b> 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/<wbr></wbr>consulting itu dengan partner developer lain. Kita jadi trainer/consultant dari produk dia, dia jadi trainer/consultant dari produk kita.<br />
</li>
</ol>Gw punya <a href="http://www.hendyirawan.net/" target="_blank">temen</a> 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 <a href="http://www.cinox.co.id/" target="_blank">kantor gw</a> pas malam lailatul qadar bulan ramadhan kemaren. Bener2 ILLUMINATING deh. Dia ngingetin gw lagi tentang <b>apa alasan utama gw terjerembab di dunia code</b> seperti sekarang ini : yaitu mengabdikan code-code gw untuk kemajuan negara ini.<br />
<br />
Duit bisa dicari coyy.. - kalo emang kita baik ama orang, orang akan bantu kita -- dan Tuhan sendiri juga akan sayang ama kita...<br />
<br />
(eh, makin OOT ya? -- kembali ke laptop deh)<br />
<br />
tentang Lisensi MySQL, gw cukup mengutip tulisan di website-nya MySQL ini :<br />
<br />
<b><span style="font-size: medium;">For users or organizations looking to maintain their own solutions,</span></b> <b><span style="font-size: medium;">(if) I have :</span></b><br />
<ul><li>My own method of keeping my systems up to date and am comfortable upgrading and configuring MySQL.</li>
<li>Time to monitor and adjust the MySQL settings that will tune, scale and maintain performance.</li>
<li>Experience with database security so that I know when a security breach has occurred. </li>
<li>Experience designing, setting-up and monitoring the status of MySQL replication.</li>
<li>Time to identify and resolve technical issues for myself and others.</li>
<li>Time to design and tune application code, database schemas and dynamic queries for optimal performance.</li>
</ul><b>TAKE ME TO THE COMMUNITY DOWNLOADS</b><br />
<br />
yang gw interpretasikan : "yeah, I just only need the Community Edition of that database server..."<br />
<br />
Demikian sedikit "curhat" dari saya tentang MySQL Licensing ^_^ <br />
-- maaf klo banyak yg OOT atau mencederai perasaan temen-temen... (-_-)<br />
_______________________<br />
<br />
<img src="http://qvezst.googlepages.com/my-hand-signature.jpg" /><br />
<b>Rizky Prihanto</b><br />
Software Architect <a href="http://www.cinox.co.id/" target="_self">PT Cinox Media Insani</a></div>eRQeehttp://www.blogger.com/profile/04138933553082003934noreply@blogger.com1tag:blogger.com,1999:blog-4245561185723908608.post-31268205654552042502008-12-09T01:17:00.000+07:002008-12-09T01:25:44.188+07:00Too Many Connections Error<div style="text-align: justify;"><span style="font-family: "Trebuchet MS",sans-serif;">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.</span><br style="font-family: "Trebuchet MS",sans-serif;" /><br style="font-family: "Trebuchet MS",sans-serif;" /><span style="font-family: "Trebuchet MS",sans-serif;">Salah satu issue besar yang acapkali menimpa server yg menggunakan MySQL, adalah berhubungan dengan error <span style="color: red;">Too Many Connections</span>. Setidaknya, apa yg gw omongkan di sini bukan hoax -- tanyakanlah itu pada admin <a href="http://kaskus.us/">Kaskus.us</a>, admin <a href="http://www.masterweb.net/">MWN</a>, admin <a href="http://www.diskusiweb.com/">diskusiweb</a>, admin ekomit (hehehe, sumpah bukan gw) -- error Too Many Connection itu bener-bener menyebalkan. <span style="color: #a64d79;">SANGAT-SANGAT-SANGAT-SANGAT-MENYEBALKAN</span>.</span><br style="font-family: "Trebuchet MS",sans-serif;" /><br style="font-family: "Trebuchet MS",sans-serif;" /><span style="font-family: "Trebuchet MS",sans-serif;">Sebenarnya, apa sih error Too Many Connections itu? Dan kenapa bisa (sering bangedd) terjadi. Artikel gw kali ini akan mencoba membahasnya.</span></div><div class="fullpost"><br />
<div style="font-family: "Trebuchet MS",sans-serif;">Too Many Connections itu terjadi karena beberapa habit, seperti :</div><ol><li>terlalu banyak koneksi yang terjadi secara simultan --> cukup sering dijumpai oleh site-site yang emang ramai pengunjung.</li>
<li>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.</li>
<li>terlalu banyak koneksi yang udah obsolete, tapi belum di-release / di-free-kan.</li>
</ol><div style="font-family: "Trebuchet MS",sans-serif;"></div><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;">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 <b>max_connections</b>. 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.<br />
<br />
Utk habit kedua, terdapat banyaknya paket cacat di pool MySQL, cara nanganinnya adalah dengan melakukan flush menggunakan tools mysqladmin. bikin batch-script yang isinya <b>mysqladmin flush-hosts</b> -- trus pasang sebagai handler di Web Server atau di program desktop (sesuaikan dengan environmentnya) kalo2 menemukan error di MySQL engine dengan kode error <b>SQLSTATE = 08S01</b> (utk server error yg berhubungan dengan bad packet) atau <b>46000</b> (utk server error yg berhubungan dengan koneksi), atau ndeteksi dari kode error ODBC -<b>2147467259</b> (ni value yg gw trap dari error ADODB makae MyODBC).<br />
<br />
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 : <a href="http://forums.devshed.com/php-development-5/mysql-pconnect-22495.html">http://forums.devshed.com/php-development-5/mysql-pconnect-22495.html</a>). </div><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;"> </div><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;">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 <b>max_connections </b>-- klo udah mencapai limit, koneksi baru dari client baru ngga akan terbentuk.<br />
<br />
Utk me-manage dari sisi administrasi server mengenai persistent connection ini, ada 2 variabel server yg perlu diperhatikan.<br />
1. <b>max_connections</b> --> seperti pembahasan pada habit pertama;<br />
2. <b>wait_timeout </b>--> 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.<br />
<br />
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, <i>*always-selalu-musti*</i> lakukan closing terhadap object koneksi klo proses querying selesai. lakukan mysql_close() segera ketika dibutuhkan.<br />
<br />
Kekurangan mysql_connect() ini ketimbang mysql_pconnect() dalam persistent connection adalah <u>ngga ada</u> 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 : <b>ini pemborosan jumlah koneksi!</b><br />
<br />
<span style="color: #a64d79;">Be aware dengan non-persistent-connection! Kerapian code Anda menentukan kualitas aplikasi Anda sendiri!</span><br />
<br />
Emm..., <br />
<br />
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 <b>interactive_timeout</b>.<br />
<br />
Anehnya, settingan default <b>interactive_timeout</b> ini JUGA 8 jam! sama seperti settingan default <b>wait_timeout</b>. 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?<br />
<br />
Nah, saran gw, ubahlah <b>interactive_timeout</b> 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 <span style="color: red;">"MySQL Server Has Gone Away"</span>, atau cursor melakukan infinite loops, atau ... macam-macam dah. Dengan meminimalisasi <b>interactive_timeout</b> ke nilai waktu yang lebih representatif, kemungkinan terjadi error Too Many Connections bisa di-eliminir.<br />
<br />
--<br />
<br />
Apa yang paling menyebalkan klo kita dapetin error Too Many Connections?<br />
<br />
<span style="font-size: x-large;">Restart Server!!</span> cuman itu solusinya.<br />
<br />
*males bangedd deh...</div><br />
_______________________<br />
<br />
<img src="http://qvezst.googlepages.com/my-hand-signature.jpg" /><br />
<b>Rizky Prihanto</b><br />
Software Architect <a href="http://www.cinox.co.id/" target="_self">PT Cinox Media Insani</a></div>eRQeehttp://www.blogger.com/profile/04138933553082003934noreply@blogger.com7tag:blogger.com,1999:blog-4245561185723908608.post-25161607609130950192008-12-04T22:53:00.004+07:002008-12-07T19:47:40.728+07:00Membandingkan Stored Procedure Antar 2 Database di MySQL<div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;">Pernah coding secara massive di pemrograman internal DBMS makae stored procedures/functions?</div><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;">Bekerja dalam tim?</div><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;">Punya beberapa database yang dipakae dalam setiap fase development? misal :</div><ul><li><b><i>db_ini_dev :</i></b> dikonsumsi oleh para coder-coder cakep kita</li>
<li><b><i>db_ini_test :</i></b> dikonsumsi oleh para tester-tester cantik kita</li>
<li><b><i>db_ini :</i></b> dikonsumsi ama client-client baik kita</li>
</ul><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;"></div><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;"></div><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;">Atau pernah bekerja dalam tim yang tersebar di beberapa tempat yang terpisah, dimana masing-masing punya local database untuk kegiatan coding masing-masing?</div><ul><li><b><i>db_ini_dev_bandung :</i></b> dikonsumsi oleh para coder-coder cakep kita di Buah Batu Regency</li>
<li><b><i>db_ini_dev_solok :</i></b> dikonsumsi oleh para coder-coder tampan kita di Perumnas Koto Baru Solok</li>
<li><b><i>db_ini_test :</i></b> di-host di sebuah server public dengan spesifikasi medium di sebuah gedung di Kuningan, Jakarta</li>
<li><b><i>db_ini :</i></b> di host di server public yang sama dengan db_ini_test</li>
</ul><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;"></div><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;">Ketika small-release udah digulirkan, mau-ngga-mau setiap perubahan struktur database (tabel/routines/trigger/view) harus di-broadcast ke database-database kita tersebut.</div><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;"></div><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;"><span style="font-size: large;"><b>Puyeng meng-analisis diferensial?</b></span></div><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;"></div><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;"><br />
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)</div><div class="fullpost"><br />
<div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;">Ini script gw untuk "mendeteksi" apakah ada SP yang beda definisi (atau SP baru) dari dua database yang identik. Silakan donlot di sini : <a href="http://qvezst.googlepages.com/xp_routines_compare.zip">http://qvezst.googlepages.com/xp_routines_compare.zip</a></div><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;"></div><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;"><br />
Pertama-tama yang harus dilakukan adalah dengan meng-execute ntu script <b>ke database mysql</b>. 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 <b>xp_execute</b> dan <b>xp_routines_compare</b>.</div><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;"></div><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;"><br />
<b style="color: red;">xp_execute</b> adalah routine yg gw bikin untuk memudahkan pemanggilan PREPARED STATEMENTS di dalam stored routines, daripada tiap kali harus nulis <span style="font-family: "Courier New",Courier,monospace;">PREPARE ... EXECUTE ... DEALLOCATE</span> -- mending tinggal panggil <b><span style="font-family: "Courier New",Courier,monospace;">call xp_execute("select blablabla");</span></b></div><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;"></div><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;"><br />
dan <b style="color: red;">xp_routines_compare</b>, 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 :</div><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;"></div><div style="font-family: "Courier New",Courier,monospace; text-align: justify;"><span style="font-size: x-small;"><code><br />
<span style="color: #990000; font-family: "Courier New",Courier,monospace;">mysql>call mysql.xp_routines_compare('ekomit_dbrisma','ekomit_dbrisma_test');</span></code></span></div><div style="color: #990000; font-family: "Courier New",Courier,monospace; text-align: justify;"><span style="font-size: xx-small;">+------------------------------------+--------------------------------------+</span></div><div style="color: #990000; font-family: "Courier New",Courier,monospace; text-align: justify;"><span style="font-size: xx-small;">| routine_yg_berbeda | letak_perbedaan |</span></div><div style="color: #990000; font-family: "Courier New",Courier,monospace; text-align: justify;"><span style="font-size: xx-small;">+------------------------------------+--------------------------------------+</span></div><div style="color: #990000; font-family: "Courier New",Courier,monospace; text-align: justify;"><span style="font-size: xx-small;">| sf_psb_get_nama_sekolah | routines baru di db : ekomit_dbrisma |</span></div><div style="color: #990000; font-family: "Courier New",Courier,monospace; text-align: justify;"><span style="font-size: xx-small;">| sf_report_get_count | routines baru di db : ekomit_dbrisma |</span></div><div style="color: #990000; font-family: "Courier New",Courier,monospace; text-align: justify;"><span style="font-size: xx-small;">| sf_statistik_getcount | routines baru di db : ekomit_dbrisma |</span></div><div style="color: #990000; font-family: "Courier New",Courier,monospace; text-align: justify;"><span style="font-size: xx-small;">| sp_disdik_kategori_laporan | routines baru di db : ekomit_dbrisma |</span></div><div style="color: #990000; font-family: "Courier New",Courier,monospace; text-align: justify;"><span style="font-size: xx-small;">| sp_disdik_lihat_laporan | routines baru di db : ekomit_dbrisma |</span></div><div style="color: #990000; font-family: "Courier New",Courier,monospace; text-align: justify;"><span style="font-size: xx-small;">| sp_psb_cluster_daftar_sekolah_save | PARAMETER BODY |</span></div><div style="color: #990000; font-family: "Courier New",Courier,monospace; text-align: justify;"><span style="font-size: xx-small;">| sp_psb_sekolah_luar_cluster_combo | BODY |</span></div><div style="color: #990000; font-family: "Courier New",Courier,monospace; text-align: justify;"><span style="font-size: xx-small;">| sp_psb_sekolah_prs_view | PARAMETER BODY |</span></div><div style="color: #990000; font-family: "Courier New",Courier,monospace; text-align: justify;"><span style="font-size: xx-small;">| sp_psb_sekolah_prs_view1record | routines baru di db : ekomit_dbrisma |</span></div><div style="color: #990000; font-family: "Courier New",Courier,monospace; text-align: justify;"><span style="font-size: xx-small;">| sp_stats_agama | routines baru di db : ekomit_dbrisma |</span></div><div style="color: #990000; font-family: "Courier New",Courier,monospace; text-align: justify;"><span style="font-size: xx-small;">| sp_thnajaran_kini_dan_sebelumnya | routines baru di db : ekomit_dbrisma |</span></div><div style="color: #990000; font-family: "Courier New",Courier,monospace; text-align: justify;"><span style="font-size: xx-small;">| xf_properdate | BODY |</span></div><div style="color: #990000; font-family: "Courier New",Courier,monospace; text-align: justify;"><span style="font-size: xx-small;">+------------------------------------+--------------------------------------+</span></div><div style="color: #990000; font-family: "Courier New",Courier,monospace; text-align: justify;"><div><span style="font-size: xx-small;">12 rows in set</span></div></div><br />
<div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;"></div><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;">Yak! akan terlihat di mana letak perbedaan routines di dalam dua database tersebut yang akan terdeteksi beda dari ntu routines ada di <b>PARAMETER</b>, di <b>BODY</b>, atau beda di <b>RETURN</b> (khusus stored functions). Dan klo ada routine baru, akan langsung di-kasih-tau ntu routines baru ada di database mana..</div><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;"></div><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;"><br />
Gimana-gimana? Keren kan?</div><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;"></div><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;"><br />
Oh iya, -- mencoba obyektif -- gw juga pengen beritaukan <b>LIMITASI </b>dalam pengimplementasian <b><span style="font-family: "Courier New",Courier,monospace;">xp_routines_compare()</span></b> gw ini, yaitu :</div><ul style="font-family: "Trebuchet MS",sans-serif; text-align: justify;"><li>xp ini hanya bisa di call ama user yang punya GRANT PRIVILEGES sekelas root -- atau minim punya privileges SELECT ke database mysql.</li>
<li>ngga bs nge-compare dari 2 databases yang BERBEDA ENGINE -- karena database yang beda engine artinya beda database <b>mysql</b> 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...<br />
</li>
</ul><div style="font-family: "Trebuchet MS",sans-serif; text-align: justify;">Tunggu kelanjutan kisah ini...</div><br />
<br />
<br />
_______________________<br />
<br />
<img src="http://qvezst.googlepages.com/my-hand-signature.jpg" /><br />
<b>Rizky Prihanto</b><br />
Software Architect <a href="http://www.cinox.co.id/" target="_self">PT Cinox Media Insani</a></div>eRQeehttp://www.blogger.com/profile/04138933553082003934noreply@blogger.com1tag:blogger.com,1999:blog-4245561185723908608.post-8982322087764462042008-11-15T14:15:00.005+07:002008-11-15T14:40:19.092+07:00Curhat tentang InnoDBLagi-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 :<br /><br /><a href="http://forums.masterweb.net/viewtopic.php?f=8&t=1916" target="_blank">http://forums.masterweb.net/viewtopic.php?f=8&t=1916</a><br /><br />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 :<br /><br /><span style="font-family:courier new;">has_innodb = DISABLED</span><br /><br />Berikut ini screenshot Navicat gw pas melakukan remote server monitoring :<br /><br /><br /><div class="fullpost"><br /><img src="http://q.v.e.z.s.t.m.a.n.i.a.googlepages.com/have_innodb_disabled.JPG" width="367" height="258" /><br />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..<br />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 : </div><ul><li><div class="fullpost">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 <em>long-time-no-support</em>. 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 <a href="http://www.innodb.com/company" target="_blank">http://www.innodb.com/company</a> dan <a href="http://www.oracle.com/innodb/index.html" target="_blank">http://www.oracle.com/innodb/index.html</a> utk memastikan klo apa yang gw tulis di sini <span style="color:#ff0000;">BUKAN HOAX</span>.</div></li><li><div class="fullpost">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 <em>lightweight</em> utk project2 mereka yang kelasnya juga <em>lightweight</em> (seperti news-portal/company profile/blog/e-commerce). Sedangkan performa InnoDB pada saat itu malah tampak *membebani* status MySQL jadi <em>heavyweight</em>.. 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.</div></li><li><div class="fullpost">MyISAM tenar karena selain ringan, maintenance-nya pun mudah. Mo backup bisa pakae beberapa cara, seperti <span style="color:#33cc00;"><strong>mysqldump</strong></span>, <span style="color:#33cc00;"><strong>mysqlhotcopy</strong></span>, bahkan pakae cara lugu --> <span style="color:#33cc00;"><strong>copy folder</strong></span> database-nya trus paste ke backup-storage kita. InnoDB -- banyak yang ngga tau bahwa sebenarnya InnoDB juga bisa seperti itu. Makae tools <strong><span style="color:#33cc00;">mysqldump</span></strong> bisa, trus utk padaannya mysqlhotcopy --> Innobase udah nge-rilis shell script (Perl) yg dikasih nama <strong><span style="color:#33cc00;">innobackup</span></strong> yang bisa <a href="http://www.innodb.com/download/innobackup-1.5.0" target="_blank">di-donlot di sini</a>. Mau pakae cara lugu <strong><span style="color:#33cc00;">copy paste</span></strong> 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 : <span style="font-family:courier new;">innodb_file_per_table</span> -- 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 <strong>*.ibd</strong> secara independen. </div></li><li><div class="fullpost">Masih berhubungan dengan <span style="font-family:courier new;">innodb_file_per_table</span> -- kalo kita cuman ngikutin settingan default MySQL tentang InnoDB (yaitu dengan <strong><u>tidak</u></strong> meng-apply konfigurasi <span style="font-family:courier new;">innodb_file_per_table</span>), <span style="color:#ff0000;">*semua data*</span> dari <span style="color:#ff0000;">*semua tabel InnoDB*</span> dari <span style="color:#ff0000;">*semua database*</span> yang ada di server MySQL akan disimpan di <span style="color:#ff0000;">*satu*</span> file : <strong>ibdata</strong> --> dan ini seringkali 'membengkak-kan' size ntu file, dan memiliki efek <span style="color:#ff0000;"><em>*kerusakan data di satu tabel* akan menyebabkan CATASTROPHIC ERROR</em></span> --> 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*</div></li></ul><div class="fullpost">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 <a href="https://launchpad.net/drizzle" target="_blank">Drizzle</a> aja? DBMS terbaru yang dikembangkan ama pentolan-pentolan MySQL Engineer yang hijrah sejak MySQL diakuisisi SUN?<br /><br />Yang gw pengen *cegah* dengan menulis artikel ini adalah, <u><strong>jangan sampai</strong></u> kita mengasumsikan bahwa "MySQL ngga cocok untuk skala enterprise" -- hanya karena 'segelintir' kegagalan yang diakibatkan karena mis-konfigurasi aja.<br /><br />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??<br /><strong><span style="color:#ff6600;">HWAKAKAKAKAKA....</span></strong><br />_______________________<br /><br /><img src="http://qvezst.googlepages.com/my-hand-signature.jpg" /><br /><b>Rizky Prihanto</b><br />Software Architect <a href="http://www.cinox.co.id/" target="_self">PT Cinox Media Insani</a> </div>eRQeehttp://www.blogger.com/profile/04138933553082003934noreply@blogger.com9tag:blogger.com,1999:blog-4245561185723908608.post-47668956804474313292008-10-15T21:02:00.001+07:002008-10-15T21:15:35.020+07:00TVOne StreamingIni dia layanan TV Streaming yang di-provide ama <a href="http://www.rileks.com/">Rileks.Com</a> 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.<br />
<br />
Tp gag apa2, dicoba aja gan..<br />
<br />
N bandingin kualitasnya ama Indowebster TV yang juga gw posting di <a href="http://rizky.prihanto.web.id/2008/10/nyoba-nyoba-tv-streaming.html">artikel lain</a>.<br />
Mari kita nonton TVOne Streaming <a href="http://rizky.prihanto.web.id/2008/10/tvone-streaming.html">langsung dari blog ini</a> !<br />
<br />
<br />
<div class="fullpost"><br />
<script src="http://qvezst.googlepages.com/swfobject.js" type="text/javascript">
</script><br />
<div id="live2"><a href="http://www.macromedia.com/go/getflashplayer"><b>» Get the Flash Player «</b></a> to see this player</div><script type="text/javascript">
var lf = new SWFObject("http://qvezst.googlepages.com/player.swf", "livetv", "400", "300", "9");
lf.addParam("allowscriptaccess", "always");
lf.addParam("allowfullscreen", "true");
lf.addParam("menu", "false");
lf.addVariable("file", "rtmp://streaming.rileks.com/livetv");
lf.addVariable("image", "http://www.tvone.co.id/images/tv_ads.jpg");
lf.addVariable("id", "tvone");
lf.addVariable("autostart","false");
lf.addVariable("overstretch","fit");
lf.write("live2");
</script><br />
_______________________<br />
<br />
<img src="http://qvezst.googlepages.com/my-hand-signature.jpg" /><br />
<b>Rizky Prihanto</b><br />
Software Architect <a href="http://www.cinox.co.id/" target="_self">PT Cinox Media Insani</a></div>eRQeehttp://www.blogger.com/profile/04138933553082003934noreply@blogger.com2tag:blogger.com,1999:blog-4245561185723908608.post-4486410285817774162008-10-15T14:47:00.000+07:002008-10-15T15:45:25.730+07:00Proper Case di MySQLSial, tester gw ngisi inputan iseng bangedd : kya gini nih :<br />
<br />
<span style="font-size: large;">a qUicK BRowN fOx jUmPs oVeR biLl</span><br />
<br />
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 :<br />
<br />
<div style="font-family: "Courier New",Courier,monospace;">Public Function PCase(ByVal strKalimat As String) As String<br />
PCase = StrConv(strKalimat, vbProperCase)<br />
End Function</div><br />
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...<br />
<br />
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 :<br />
<br />
<div class="fullpost"><br />
<span style="font-family: "Courier New",Courier,monospace;">-- Function "xf_propercase" DDL</span><br />
<br />
<span style="font-family: "Courier New",Courier,monospace;">CREATE FUNCTION `xf_propercase`(str varchar(255)) RETURNS varchar(255) CHARSET utf8</span><br />
<span style="font-family: "Courier New",Courier,monospace;">BEGIN</span><br />
<span style="font-family: "Courier New",Courier,monospace;"> DECLARE c CHAR(1); </span><br />
<span style="font-family: "Courier New",Courier,monospace;"> DECLARE s VARCHAR(128); </span><br />
<span style="font-family: "Courier New",Courier,monospace;"> DECLARE i INT DEFAULT 1; </span><br />
<span style="font-family: "Courier New",Courier,monospace;"> DECLARE bool INT DEFAULT 1; </span><br />
<span style="font-family: "Courier New",Courier,monospace;"> DECLARE punct CHAR(17) DEFAULT ' ()[]{},.-_!@;:?/'; </span><br />
<br />
<span style="font-family: "Courier New",Courier,monospace;"> SET s = LCASE( str ); </span><br />
<span style="font-family: "Courier New",Courier,monospace;"> WHILE i < LENGTH( str ) DO </span><br />
<span style="font-family: "Courier New",Courier,monospace;"> BEGIN </span><br />
<span style="font-family: "Courier New",Courier,monospace;"> SET c = SUBSTRING( s, i, 1 ); </span><br />
<span style="font-family: "Courier New",Courier,monospace;"> IF LOCATE( c, punct ) > 0 THEN </span><br />
<span style="font-family: "Courier New",Courier,monospace;"> SET bool = 1; </span><br />
<span style="font-family: "Courier New",Courier,monospace;"> ELSEIF bool=1 THEN </span><br />
<span style="font-family: "Courier New",Courier,monospace;"> BEGIN </span><br />
<span style="font-family: "Courier New",Courier,monospace;"> IF c >= 'a' AND c <= 'z' THEN </span><br />
<span style="font-family: "Courier New",Courier,monospace;"> BEGIN </span><br />
<span style="font-family: "Courier New",Courier,monospace;"> SET s = CONCAT(LEFT(s,i-1),UCASE(c),SUBSTRING(s,i+1)); </span><br />
<span style="font-family: "Courier New",Courier,monospace;"> SET bool = 0; </span><br />
<span style="font-family: "Courier New",Courier,monospace;"> END; </span><br />
<span style="font-family: "Courier New",Courier,monospace;"> ELSEIF c >= '0' AND c <= '9' THEN </span><br />
<span style="font-family: "Courier New",Courier,monospace;"> SET bool = 0; </span><span style="font-family: "Courier New",Courier,monospace;"> </span><br />
<span style="font-family: "Courier New",Courier,monospace;"> END IF; </span><br />
<span style="font-family: "Courier New",Courier,monospace;"> END; </span><br />
<span style="font-family: "Courier New",Courier,monospace;"> END IF; </span><br />
<span style="font-family: "Courier New",Courier,monospace;"> SET i = i+1; </span><br />
<span style="font-family: "Courier New",Courier,monospace;"> END; </span><br />
<span style="font-family: "Courier New",Courier,monospace;"> END WHILE; </span><br />
<span style="font-family: "Courier New",Courier,monospace;">RETURN s; </span><br />
<span style="font-family: "Courier New",Courier,monospace;">END;</span><br />
<br />
nah, klo kita coba panggil ntu function, caranya gini :<br />
<br />
<span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;">mysql> select xf_propercase('a qUicK BRowN fOx jUmPs oVeR biLl');</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">+----------------------------------------------------+</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">| xf_propercase('a qUicK BRowN fOx jUmPs oVeR Bill') |</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">+----------------------------------------------------+</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">| A Quick Brown Fox Jumps Over Bill |</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">+----------------------------------------------------+</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">1 row in set</span></span><br />
<br />
<b><span style="font-size: large;">SUKSES!! cihuyy....</span></b><br />
_______________________<br />
<br />
<img src="http://qvezst.googlepages.com/my-hand-signature.jpg" /><br />
<b>Rizky Prihanto</b><br />
Software Architect <a href="http://www.cinox.co.id/" target="_self">PT Cinox Media Insani</a></div>eRQeehttp://www.blogger.com/profile/04138933553082003934noreply@blogger.com2tag:blogger.com,1999:blog-4245561185723908608.post-89777704419607495732008-10-13T20:53:00.000+07:002008-10-15T21:41:33.573+07:00Nyoba-Nyoba TV StreamingIni adalah layanang grabbing TVStreaming dari <a href="http://www.indoweb.tv/">Indowebster TV</a> ~ 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)... <a href="http://rizky.prihanto.web.id/2008/10/tvone-streaming.html">silakan menuju TKP</a>, gan..<br />
<br />
Mari kita nikmati bersama2 TV Streaming dari Indowebster <a href="http://rizky.prihanto.web.id/2008/10/nyoba-nyoba-tv-streaming.html">langsung dari blog ini</a> !<br />
<div class="fullpost"><br />
<iframe border="0" frameborder="0" height="360" marginheight="0" marginwidth="0" name="tvchannelindoweb" scrolling="no" src="http://www.indoweb.tv/embed.php" width="450"></iframe><br />
<br />
_______________________<br />
<br />
<img src="http://qvezst.googlepages.com/my-hand-signature.jpg" /><br />
<b>Rizky Prihanto</b><br />
Software Architect <a href="http://www.cinox.co.id/" target="_self">PT Cinox Media Insani</a></div>eRQeehttp://www.blogger.com/profile/04138933553082003934noreply@blogger.com2tag:blogger.com,1999:blog-4245561185723908608.post-89038459685787512652008-08-22T16:44:00.002+07:002008-10-12T21:24:30.260+07:00Just Another BLOB Discussion<div align="justify"><span>Ini arsip diskusi internal gw dengan temen2. Silakan menikmati.</span><span><br /></span><span><br /></span><span>Kalo menurut artikel yg </span><a href="http://tomfreakz.blogspot.com/"><span>tomfreakz</span></a><span> refer-kan : </span><a href="http://forums.site5.com/showthread.php?t=14370"><span>http://forums.site5.com/showthread.php?t=14370</span></a><span><br /></span><span><br /></span><span>yg gw lihat malah "sisi positif" nya makae blob :</span><span><br /></span><span><br /></span><strong><span>Q1:</span></strong><span><br /></span><span></span><blockquote><span>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!</span><span><br /></span><span>If this is the case then how can I store any pictures or any files of any significance?</span><span><br /></span><span><br /></span><span>Can this file size be raised to something useful?</span><span><br /></span><span>If not, then why even allow BLOB types?</span></blockquote><span></span><span><br /></span><span><br /></span><strong><span>Jawaban gw :</span></strong><span> -- BLOB emang cuman max 64KB. karna emang aslinya di-optimize utk nyimpen file2 kecil2 kya avatar, smilies, favicon, yaaa, web-widget lah.. :-)</span><span><br /></span><span>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...</span><br /></div><br /><div class="fullpost"><br /><span><strong>Q2:</strong><br />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?<br /><br />Regarding this, the questions:<br /><br /><strong>Q3:</strong><br />Isn't this creating a security risk by allowing the uploading of files into a directory?<br /><br /><strong>Q4:</strong><br />Can't hackers try to upload malicious files and then try to execute them?<br />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.<br /><br /><strong>Q5:</strong><br />Can anyone give some pointers on how to go about doing this via PHP and to do so securely? protected login/data transfer,etc.<br /><br /><strong>Q6:</strong><br />Can site5's shared SSL cert be used for this kind of thing?<br /><br />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...)<br />dan alibi yang dia berikan dgn Q3 dan Q4 sebenarnya malah memberikan POIN PLUS kenapa perlu penggunaan BLOB.<br /><br />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...<br /><br />pernah kepikiran ngga :</span><br /><span>SELECT id, image_thumbs FROM photo_images GROUP BY image;</span> <span>--> utk nampilin thumbnail2 (kalo ada beberapa) berdasarkan image induknya.<br /><br />pretty cool, huh?<br /><br />dan (ini pandangan subyektif gw) >> jauh lebih good penggunaan BLOB ketimbang absolute-path karena :<br /><br />1. mudah di-dump/restore<br />2. lebih hemat space.. whazzup?? --> file JPG kan ngga bs di-kompress tuh. udah ukuran kecil. klo BLOB? dia bisa dicompress makae syntax :</span><br /><span>"INSERT INTO photo_image (id, image) VALUES (" . $id . " , COMPRESS(" . mysqli_escape_string($imagedata) . ")"</span><br /><br /><span>dan ketika select, lakukan UNCOMPRESS()</span><br /><span>"SELECT id, UNCOMPRESS(image) FROM photo_image WHERE id = " . $id</span><br /><br /><span>3. hanya perlu concern ke maintain DB, ngga usah lagi mikirin security di level file-system (yang tentu utk masing2 OS bisa beda)<br />4. sementara ini 3 dulu deh... --> yg punya warnet udah datang. gw harus pertanggungjawabkan manajemen bandwith yg kmaren gw pasang. xixixixi....</span><br /></div>eRQeehttp://www.blogger.com/profile/04138933553082003934noreply@blogger.com2tag:blogger.com,1999:blog-4245561185723908608.post-30262460418025418722008-06-15T09:02:00.003+07:002008-10-12T21:24:30.261+07:00Kenapa Memilih MySQL<div align="justify"><span style="font-family:trebuchet ms;">Ada sebuah pertanyaan yang mampir di milis tongkrongan gw (indoprog-vb@yahoogroups.com), seperti ini potongan pertanyaannya :</span><br /></div><br /><span style="font-family:courier new;"></span><blockquote><span style="font-family:courier new;">--- </span><i><strong><span style="font-family:courier new;">Arif Purnomo Aji (p*** [at] y*** [dot] com)</span></strong></i><span style="font-family:courier new;"> </span><p><span style="font-family:courier new;"> wrote:</span><span style="font-family:courier new;"><br /></span><span style="font-family:courier new;"><br /></span><span style="font-family:courier new;">> salam hangat buat semua....</span><span style="font-family:courier new;"><br /></span><span style="font-family:courier new;">></span><span style="font-family:courier new;"><br /></span><span style="font-family:courier new;">> Saya seorang pemula yang ingin belajar vb,,</span><span style="font-family:courier new;"><br /></span><span style="font-family:courier new;">> Saat ini setahu saya ada banyak database yang bisa</span><span style="font-family:courier new;"><br /></span><span style="font-family:courier new;">> didampingkan dengan vb</span><span style="font-family:courier new;"><br /></span><span style="font-family:courier new;">> Kira-kira faktor apa saja yang harus kita perhatikan</span><span style="font-family:courier new;"><br /></span><span style="font-family:courier new;">> dalam memilih database..</span><span style="font-family:courier new;"><br /></span><span style="font-family:courier new;">> adakah perbedaan yang significan antara database</span><span style="font-family:courier new;"><br /></span><span style="font-family:courier new;">> yang satu dgn yang lain, misalnya dalam kecepatan</span><span style="font-family:courier new;"><br /></span><span style="font-family:courier new;">> pengolahan data.... atau mungkin ada salah satu</span><span style="font-family:courier new;"><br /></span><span style="font-family:courier new;">> database yang paling cocok buat disandingkan dgn</span><span style="font-family:courier new;"><br /></span><span style="font-family:courier new;">> vb6.....</span><span style="font-family:courier new;"><br /></span><span style="font-family:courier new;">></span><span style="font-family:courier new;"><br /></span><span style="font-family:courier new;">> Mohon pencerahan dari rekan-rekan semua...</span><span style="font-family:courier new;"><br /></span><span style="font-family:courier new;">></span><span style="font-family:courier new;"><br /></span><span style="font-family:courier new;">> thank's</span><span style="font-family:courier new;"><br /></span><span style="font-family:courier new;">> Aji</span></p></blockquote><p><span style="font-family:courier new;"></span><br /><br /><br /><div align="justify"><span style="font-family:trebuchet ms;">Klo menurut gw, di <strong>ERA generasi gw</strong>, database yang cocok itu adalah MySQL.<br />soalnya, MySQL saat ini *sedang berkembang* pelan tapi pasti utk jadi DBMS yang powerful.<br />Gw dulu pernah 'maksain' belajar Oracle, kagok duluan gw. konsep DBMS lom kenal, udah disodorin macam kya cursor, row-locking, XA transaction -- nyerah gw!<br /><br />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)</span><br /></div><div class="fullpost"><br /><div align="justify"><span style="font-family:trebuchet ms;">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 <i>kos-kosannya</i> Shakila di <a href="http://dev.mysql.com">dev.mysql.com</a> --<br /><br />... 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)<br /><br />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..<br /><br />Demikianlah pengalaman SUBYEKTIF gw dengan MySQL ... Shakila dan Maria ...<br /><br />Mengenai kesangsian yang muncul dari banyak pihak yang <i>ragu-ragu</i> 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 <i>lebih</i> di faktor 'harga' ketimbang Photoshop atau Visio. Coba masuk ke website nya MySQL : <a href="http://dev.mysql.com/downloads/">http://dev.mysql.com/downloads/</a> ~ di situ ada tulisan gini :<br /><br />For users or organizations looking to maintain their own solutions.<br /><ol><li>I have my own method of keeping my systems up to date and am comfortable upgrading and configuring MySQL.<br /></li><li>I have time to monitor and adjust the MySQL settings that will tune, scale and maintain performance.<br /></li><li>I have experience with database security so that I know when a security breach has occurred.<br /></li><li>I have experience designing, setting-up and monitoring the status of MySQL replication.<br /></li><li>I have time to identify and resolve technical issues for myself and others.<br /></li><li>I have time to design and tune application code, database schemas and dynamic queries for optimal performance.<br /></li></ol>Take me to the <a href="http://dev.mysql.com/downloads/mysql/?rz=gdl#downloads">community downloads</a>!<br /><br />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 : <a href="http://www.mysql.com/products/which-edition.html">http://www.mysql.com/products/which-edition.html</a><br /><br />MySQL Community Edition -- absolutely free utk di-instal </span><span style="font-family:trebuchet ms;"><strong>sendiri</strong></span><span style="font-family:trebuchet ms;"> di server mana aja. If you have time and experiences...<br /><br /><br /><strong><span style="color:#cc0000;">NB :</span></strong> Gw bukan aktivis MySQL yang digaji ama MySQL. Gw cuman seorang fans... </span><br /></div><br /></div>eRQeehttp://www.blogger.com/profile/04138933553082003934noreply@blogger.com1tag:blogger.com,1999:blog-4245561185723908608.post-64301010832965250792008-05-19T17:12:00.000+07:002008-10-12T21:27:27.154+07:00Defacing<div align="justify"><span style="font-family:trebuchet ms;">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.<br /><br /></span><span style="font-family:trebuchet ms;"><span style="font-size:130%;"><strong>JAHIL, sebuah kondisi ambiguitas....</strong></span></span><span style="font-family:trebuchet ms;"><br /><br />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,<span style="color:#3333ff;"> “Ah Adik ini, nakal deh kamu....... "</span>. 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,<span style="color:#3333ff;"> “KURANG AJAR!” PLAK, PLAK</span></span><span style="font-family:trebuchet ms;"><span style="color:#000000;"><i>(menampar)</i></span></span><span style="font-family:trebuchet ms;"><span style="color:#3333ff;">”</span>. Alternatif kedua, wanita itu akan berujar, <span style="color:#3333ff;">“Ah Mas ini, nakal deh kamu....... ”</span>. Untuk sementara (lagi-lagi) persepsi jahil kembali tereliminasi.</span><br /></div><div class="fullpost"><br /><div align="justify"><span style="font-family:trebuchet ms;">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 : <span style="color:#3333ff;">“Wah..., keren juga nih. Programku sekalinya gak aman, ya ?”</span> – tapi ada juga yang bakal ngerespon negatif seperti :<span style="color:#3333ff;"> “Tolong telepon pengacara saya, saya mau menuntut seseorang karena dia sudah defacing program saya!”</span>.<br /><br />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.<br /><br />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 :<br /><br />1. Ingin menjadi hacker<br />2. Mendapatkan popularitas<br />3. Ingin mendapat pujian<br /><br />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.<br /><br /><br /><strong><span style="font-size:130%;">Defacing, asyik juga.....</span></strong><br /><br />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.<br /><br />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.<br /><br />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.<br /><br />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).<br /><br />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”.<br /><br />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!<br /><br />Sampai sejauh ini, setidaknya ada 3 definisi terhadap kegiatan hacking :<br />1. hacking adalah sebagai suatu bentuk kejahilan<br />2. hacking adalah sebagai salah satu wujud computer-crime<br />3. hacking adalah sebuah seni<br /><br />Sekarang, tinggal bagaimana kita memandangnya dari sudut pandang yang mana, dan konteks pembicaraan yang mana.</span><br /></div><br /></div>eRQeehttp://www.blogger.com/profile/04138933553082003934noreply@blogger.com6tag:blogger.com,1999:blog-4245561185723908608.post-49550248955534436102008-05-17T13:46:00.000+07:002008-10-12T21:26:03.548+07:00Mengadopsi Agile Development Secara Praktek<div align="justify"><span>Barusan mbaca buku Pattern of Agile Practice Adoption karangan Amr Elssamadisy (bisa didonlot secara online di sini : <a href="http://www.infoq/minibooks/agile-patterns">http://www.infoq/minibooks/agile-patterns</a>) -- 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 :<br />1. Simple Design<br />2. Refactoring<br />3. Automated Developer Tests<br />4. Test-First Development<br />5. Test-Last Development<br />6. Collective Code Ownership<br />7. Continuous Integration<br />8. Functional Tests<br />9. Customer Part of Team<br /><br />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 :<br />10. Coding Standards<br />11. Pair Programming<br />12. Small Release.<br /><br />Dan setelah menelusuri maknanya, saya modifikasi dikit tabel clustering dari aspek praktis agile development nya om Amr Elssamadisy tersebut menjadi seperti ini :</span><br /></div><div align="center"><img src="http://qvezst.googlepages.com/aspekpraktisagile.JPG" /></div><br /><br /><div align="justify"><span>Berikut ini adalah penjelasan praktek-praktek agile development :</span><br /></div><br /><div class="fullpost"><br /><div align="justify"><span><strong>Domain Kegiatan :</strong><br />1. Test-Driven Requirements<br />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.<br />2. Evolutionary Design<br />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.<br />3. Test-Driven Development<br />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.<br /><br /><strong>Aspek Praktis :</strong><br />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.<br />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.<br />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.<br />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.<br />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.<br />6. Small Release, yaitu pengiriman progress untuk setiap bagian fungsional dari requirement yang telah selesai dikonstruksi (dan bebas bug) berupa modul atau komponen aplikasi.<br />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.<br />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.<br />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.<br />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.<br />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.<br /><br /></span><br /></div><br /><br /> <br /></div>eRQeehttp://www.blogger.com/profile/04138933553082003934noreply@blogger.com0tag:blogger.com,1999:blog-4245561185723908608.post-36123972211020981202008-04-15T09:40:00.002+07:002008-10-12T21:27:27.154+07:00The Blogger Manifesto<span style="font-size:130%;"><span style="font-family: trebuchet ms; font-weight: bold;">Hacker Manifesto </span></span><br /><div style="text-align: justify;"><br /><blockquote style="font-family: trebuchet ms;">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, <span style="font-style: italic;">tetap saja</span> 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.</blockquote></div><span style="font-weight: bold;"><br /><span style="font-size:130%;"><span style="font-family: trebuchet ms;">Blogger manifesto</span></span></span><br /><div style="text-align: justify;"><span style="font-family: trebuchet ms;"><blockquote>Ini adalah dunia kami sekarang, dunianya posts dan comments, keindahan sebuah linkback. Kami mendayagunakan sebuah <span style="font-weight: bold; font-style: italic;">situs publishing</span> 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 <span style="font-style: italic; font-weight: bold;">blogwalking untuk sekedar bersilaturrahmi</span>, dan kalian sebut kami kriminal. Kami <span style="font-style: italic; font-weight: bold;">membagikan pengetahuan</span> <span style="font-style: italic; font-weight: bold;">atau bahkan hanya sekedar menyalurkan uneg-uneg pribadi</span>, 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, <span style="font-style: italic;">tetap saja</span> kami yang disebut kriminal. Ya, aku memang kriminal. Kejahatanku adalah <span style="font-style: italic; font-weight: bold;">rasa kepedulianku terhadap sesama</span>. 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 <span style="font-style: italic; font-weight: bold;">blogger</span>, dan inilah manifesto saya. Kalian bisa saja menghentikanku, tetapi kalian tak mungkin menghentikan kami semua. Bagaimanapun juga, kami semua senasib seperjuangan.</blockquote></span><br /><span style="font-family: trebuchet ms;">---</span><br /><span style="font-family: trebuchet ms;">Ditulis tidak di bawah pengaruh obat-obat terlarang ataupun di bawah tekanan siapapun. Hanya ditulis cuman untuk menumpahkan uneg-uneg di dalam otak...<br /><br />*di mana ya letak persamaan antara blogger dan hacker?<br /></span></div>eRQeehttp://www.blogger.com/profile/04138933553082003934noreply@blogger.com2tag:blogger.com,1999:blog-4245561185723908608.post-78496444647694878702008-04-08T18:40:00.003+07:002008-10-12T21:24:30.262+07:00Stored Function Terbilang di MySQL<div style="text-align: justify;"><span style="font-family:trebuchet ms;">Lagi iseng mode = on.</span><br /><br /><span style="font-family:trebuchet ms;">Karena bete gara2 ga bs nge-YouTube, barusan aku bikin stored function di MySQL yang akan mengconvert bilangan ke dalam 'terbilang' (<span style="font-style: italic;">entah siapa yg memulai mengistilahkan ini dengan nama 'terbilang' -- mgkn terinispirasi dari tulisan di kuitansi-kuitansi itu kali ye?</span>). Dengan stored function utk mekanisme pembuat 'terbilang' ini, keuntungan2nya :</span><br /><br /><span style="font-family:trebuchet ms;"><span style="font-weight: bold;">1. </span>bisa di embedd di query kita tanpa perlu memprocessing ulang di front-end (sisi aplikasi).</span><br /><span style="font-family:trebuchet ms;"><span style="font-weight: bold;">2.</span> ...sebenarnya cuman itu aja sih.., kan klo proses pengconvertan dilakukan di sisi<br /> engine MySQL nya, artinya :</span><br /><ul><li><span style="font-family:trebuchet ms;"> client ngga perlu sok-sok-an ngitung. klo develop di web sih ngga masalah, tp klo u bikin desktop,</span><span style="font-family:trebuchet ms;">kan komputasi nya di sisi client. *walo ngga ngefek jg sih hare gene mana ada client yg mau makae</span><span style="font-family:trebuchet ms;"> kompie <span style="color: rgb(192, 192, 192);">"bosok"</span> berdaya komputasi rendah.</span></li><li><span style="font-family:trebuchet ms;">dengan di-embedd nya ke dalam query, manfaat nya, *tentu* mempermudah pengambilan data. mempermudah</span><span style="font-family:trebuchet ms;"> display ke grid, ato mungkin ke crystal report (seperti ulasan mas madhi dalam <a href="http://mamadh.wordpress.com/2007/03/05/fungsi-terbilang-di-sql-server/">blog nya</a> dulu).</span><span style="font-family:trebuchet ms;"> pokoke, mudah lah..</span></li></ul><br /><span style="font-family:trebuchet ms;">begini function nya : (silakan co-pas dan execute di konsole-konsole MySQL kesayangan anda)</span></div><br /><div class="fullpost"><br /><span style="font-family:trebuchet ms;"><pre>CREATE DEFINER=`root`@`localhost` FUNCTION `xf_terbilang`(angka bigint) RETURNS varchar(5000) CHARSET utf8<br /><span style="font-family: courier new;font-family:trebuchet ms;" >BEGIN</span><br /><span style="font-family: courier new;font-family:trebuchet ms;" > DECLARE sString varchar(30);</span><br /><span style="font-family: courier new;font-family:trebuchet ms;" > DECLARE Bil1 varchar(255);</span><br /><span style="font-family: courier new;font-family:trebuchet ms;" > DECLARE Bil2 varchar(255);</span><br /><span style="font-family: courier new;font-family:trebuchet ms;" > DECLARE STot varchar(255);</span><br /><span style="font-family: courier new;font-family:trebuchet ms;" > DECLARE X int;</span><br /><span style="font-family: courier new;font-family:trebuchet ms;" > DECLARE Y int;</span><br /><span style="font-family: courier new;font-family:trebuchet ms;" > DECLARE Z int;</span><br /><span style="font-family: courier new;font-family:trebuchet ms;" > DECLARE Urai varchar(5000);</span><br /><span style="font-family: courier new;font-family:trebuchet ms;" > SET sString = CAST(angka as char);</span><br /><span style="font-family: courier new;font-family:trebuchet ms;" > SET Urai = '';</span><br /><span style="font-family: courier new;font-family:trebuchet ms;" > SET X = 0;</span><br /><span style="font-family: courier new;font-family:trebuchet ms;" > SET Y = 0;</span><br /><span style="font-family: courier new;font-family:trebuchet ms;" > WHILE X <><br />SET X = X + 1;<br />SET sTot = MID(sString, X, 1);<br />SET Y = Y + CAST(sTot as UNSIGNED);<br />SET Z = LENGTH(sString) - X + 1;<br />CASE CAST(sTot as UNSIGNED)<br />WHEN 1 THEN<br /> BEGIN<br /> IF (Z = 1 OR Z = 7 OR Z = 10 OR Z = 13) THEN<br /> SET Bil1 = 'SATU ';<br /> ELSEIF (z = 4) THEN<br /> IF (x = 1) THEN<br /> SET Bil1 = 'SE';<br /> ELSE<br /> SET Bil1 = 'SATU';<br /> END IF;<br /> ELSEIF (Z = 2 OR Z = 5 OR Z = 8 OR Z = 11 OR Z = 14) THEN<br /> SET X = X + 1;<br /> SET sTot = MID(sString, X, 1);<br /> SET Z = LENGTH(sString) - X + 1;<br /> SET Bil2 = '';<br /> CASE CAST(sTot AS UNSIGNED)<br /> WHEN 0 THEN SET Bil1 = 'SEPULUH ';<br /> WHEN 1 THEN SET Bil1 = 'SEBELAS ';<br /> WHEN 2 THEN SET Bil1 = 'DUA BELAS ';<br /> WHEN 3 THEN SET Bil1 = 'TIGA BELAS ';<br /> WHEN 4 THEN SET Bil1 = 'EMPAT BELAS ';<br /> WHEN 5 THEN SET Bil1 = 'LIMA BELAS ';<br /> WHEN 6 THEN SET Bil1 = 'ENAM BELAS ';<br /> WHEN 7 THEN SET Bil1 = 'TUJUH BELAS ';<br /> WHEN 8 THEN SET Bil1 = 'DELAPAN BELAS ';<br /> WHEN 9 THEN SET Bil1 = 'SEMBILAN BELAS ';<br /> ELSE BEGIN END;<br /> END CASE;<br /> ELSE<br /> SET Bil1 = 'SE';<br /> END IF;<br /> END;<br />WHEN 2 THEN SET Bil1 = 'DUA ';<br />WHEN 3 THEN SET Bil1 = 'TIGA ';<br />WHEN 4 THEN SET Bil1 = 'EMPAT ';<br />WHEN 5 THEN SET Bil1 = 'LIMA ';<br />WHEN 6 THEN SET Bil1 = 'ENAM ';<br />WHEN 7 THEN SET Bil1 = 'TUJUH ';<br />WHEN 8 THEN SET Bil1 = 'DELAPAN ';<br />WHEN 9 THEN SET Bil1 = 'SEMBILAN ';<br />ELSE SET Bil1 = '';<br />END CASE;<br />IF CAST(sTot as UNSIGNED) > 0 THEN<br />IF (Z = 2 OR Z = 5 OR Z = 8 OR Z = 11 OR Z = 14) THEN<br /> SET Bil2 = 'PULUH ';<br />ELSEIF (Z = 3 OR Z = 6 OR Z = 9 OR Z = 12 OR Z = 15) THEN<br /> SET Bil2 = 'RATUS ';<br />ELSE<br /> SET Bil2 = '';<br />END IF;<br />ELSE<br />SET Bil2 = '';<br />END IF;<br />IF Y > 0 THEN<br />CASE Z<br /> WHEN 4 THEN BEGIN SET Bil2 = CONCAT(Bil2, 'RIBU '); SET Y = 0; END;<br /> WHEN 7 THEN BEGIN SET Bil2 = CONCAT(Bil2, 'JUTA '); SET Y = 0; END;<br /> WHEN 10 THEN BEGIN SET Bil2 = CONCAT(Bil2, 'MILYAR '); SET Y = 0; END;<br /> WHEN 13 THEN BEGIN SET Bil2 = CONCAT(Bil2, 'TRILYUN '); SET Y = 0; END;<br /> ELSE BEGIN END;<br />END CASE;<br />END IF;<br />SET Urai = CONCAT(Urai, Bil1, Bil2);<br />END WHILE;<br />RETURN Urai;<br />END;</span></pre><br /><br /><span style="font-family:trebuchet ms;">nah cara pemanggilannya, coba gini :</span><br /><br /><span style="font-family:courier new;">mysql> select xf_terbilang(512250300) as urai;</span><br /><span style="font-family:courier new;">+-----------------------------------------------------------------+</span><br /><span style="font-family:courier new;">| Urai |</span><br /><span style="font-family:courier new;">+-----------------------------------------------------------------+</span><br /><span style="font-family:courier new;">| LIMA RATUS DUA BELAS JUTA DUA RATUS LIMA PULUH RIBU TIGA RATUS |</span><br /><span style="font-family:courier new;">+-----------------------------------------------------------------+</span><br /><span style="font-family:courier new;">1 row in set</span><br /><br /><span style="font-family:courier new;">Query OK, 0 rows affected</span><br /><br /><span style="font-family:trebuchet ms;">Asyeek...</span><br /><span style="font-family:trebuchet ms;">sukses!</span><br /><br /><span style="font-family:trebuchet ms;">eh bentar dulu...</span><br /><br /><span style="font-family:trebuchet ms;">setelah nyoba2, ternyata ada "limitasi" nya nie function. <span style="color: rgb(0, 102, 0);">*mencoba berfikir obyektif nih</span>. ndak selamanya kita musti narcis* <span style="font-style: italic; font-weight: bold;">hihihi...</span></span><br /><br /><span style="font-family:trebuchet ms;">ternyata : ini maksimal nilai yang VALID utk di-convert.<br /><br /></span><span style="font-family:courier new;">mysql> select xf_terbilang(999999999999999);</span><br /><span style="font-family:trebuchet ms;">SEMBILAN RATUS SEMBILAN PULUH SEMBILAN TRILYUN blablablabla.</span><br /><br /><span style="font-family:trebuchet ms;">kalo kita execute<br /><br /></span><span style="font-family:courier new;">mysql> select xf_terbilang(999999999999999+1);</span><br /><span style="font-family:trebuchet ms;"><br />yang muncul malah :</span><br /><span style="font-family:courier new;">+---------------------------------+</span><br /><span style="font-family:courier new;">| xf_terbilang(999999999999999+1) |</span><br /><span style="font-family:courier new;">+---------------------------------+</span><br /><span style="font-family:courier new;">| SETRILYUN |</span><br /><span style="font-family:courier new;">+---------------------------------+</span><br /><br /><div style="text-align: justify;"><span style="font-family:trebuchet ms;">dan utk angka2 di atas itu, yang muncul tetep sama : SETRILYUN.</span><br /><br /><span style="font-family:trebuchet ms;">hiks..</span><br /><br /><span style="font-family:trebuchet ms;">tp biarlah...</span><br /><span style="font-family:trebuchet ms;">males ngobok2 lebih lanjut. *ntar lah klo ada case yang emang memerlukan "LEBIH" dari limitasi ini.</span><br /><br /><span style="font-family:trebuchet ms;">lagian <span style="font-weight: bold;">siapa sih</span> yang mo beli barang dengan nota tertulis di kuitansi sebesar 999 Trilyun?</span><br /><span style="font-family:trebuchet ms;">hihihi.. Pemerintah mungkin. Wong 11 Trilyun aja tanpa pikir panjang berani <span style="font-style: italic;">'dibuang'</span> percuma utk <span style="font-weight: bold;">nge-blokir</span> akses situs-situs yang dianggap subversif.. Ups.., maap. Ini cuman <span style="font-style: italic;">intermezzo</span>. Suer, saya bukan hacker. Belum. Dan saya ngga ada niat nge-post barang2 saru/porno di blog saya ini. <span style="color: rgb(0, 102, 0);">*kecuali klo paragraf di atas sama pihak yang berwenang dianggap porno, yaa, meneketehe...</span></span><br /><br /><span style="font-family:trebuchet ms;">Utk solusi function terbilang di SQL Server 2000, <a href="http://mamadh.wordpress.com/2007/03/05/fungsi-terbilang-di-sql-server/">mas Madhi pernah mempostingnya di sini</a>. 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 (<span style="font-weight: bold;">??</span>) hehehe...</span><br /><br /><span style="font-family:trebuchet ms;">dan skrg. narcis mode = on.</span><br /></div><br /><span style="font-family:trebuchet ms;">Emang, abang eRQee emang <span style="color: rgb(204, 0, 0);font-size:180%;" ><span style="font-weight: bold;">CAKEP</span></span> !!!</span><br /></span></div>eRQeehttp://www.blogger.com/profile/04138933553082003934noreply@blogger.com10tag:blogger.com,1999:blog-4245561185723908608.post-78175781265500889852008-04-02T00:42:00.002+07:002008-10-12T21:24:30.263+07:00Menghitung Waktu Sholat<div style="text-align: justify;"><span style="font-family: trebuchet ms;">rencananya sih, <span style="font-weight: bold;">*awalnya*</span> mo usulin fitur jadwal sholat online utk di-embedd di aplikasi</span><br /><span style="font-family: trebuchet ms;"><span style="font-weight: bold;">*aslinya*</span> sih mo cari RSS Feed google gadget yg udah nyedia-in itu jadi pengennya sih tinggal ambil doank...</span><br /><span style="font-family: trebuchet ms;"><span style="font-weight: bold;">*eh ketemunya*</span> dokumen ttg algoritma waktu sholat (<span style="font-size:130%;"><a href="http://qvezst.googlepages.com/PrayerTimeAlgorithmforSoftwareDevelo.doc">donlot di sini</a></span>)</span><br /><span style="font-family: trebuchet ms;"> *penasaran mode = on*</span><br /><span style="font-family: trebuchet ms;">*iseng mode = on*</span><br /><span style="font-family: trebuchet ms;">*suntuk mode = on* - habis debat ama "mamanya anak2" (hiks...)</span><br /></div><br /><span style="font-family: trebuchet ms;">rancang2 tabel dulu :</span><br /><span style="font-family:courier new,monospace;">+----+------+----------+------<wbr>-----+----------+------------+</span><br /><span style="font-family: courier new,monospace;">| ID | kota | Latitude | Longitude | timezone | ketinggian |</span><br /><span style="font-family:courier new,monospace;">+----+------+----------+------<wbr>-----+----------+------------+</span><br /><br /><span style="font-family: trebuchet ms;">DDL nya :</span><br /><br /><span style="font-family: courier new,monospace;">CREATE TABLE `tbl_city_coordinate` (</span><br /><span style="font-family: courier new,monospace;"> `id` int(11) unsigned NOT NULL AUTO_INCREMENT,</span><br /> <span style="font-family: courier new,monospace;"> `kota` varchar(255) COLLATE utf8_unicode_ci NOT NULL,</span><br /><span style="font-family: courier new,monospace;"> `latitude` float NOT NULL,</span><br /> <span style="font-family: courier new,monospace;"> `longitude` float NOT NULL,</span><br /><span style="font-family: courier new,monospace;"> `timezone` float NOT NULL,</span><br /> <span style="font-family: courier new,monospace;"> `ketinggian` float NOT NULL,</span><br /><span style="font-family: courier new,monospace;"> PRIMARY KEY (`id`)</span><br /> <span style="font-family: courier new,monospace;">) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;</span><br /><br /><span style="font-family: trebuchet ms;">*googling tentang koordinat astronomis kota jakarta*</span><br /><span style="font-family: trebuchet ms;">*isi-isi data dulu*</span><br /><br /><span style="font-family: courier new,monospace;">INSERT INTO `tbl_city_coordinate` VALUES ('1', 'JAKARTA', '-6.21522', '106.818', '7', '100');</span><br /><br /><br /><span style="font-family: trebuchet ms;">trus bikin stored function nya, ngikutin pedoman algoritma :</span><br /><div class="fullpost"><br /><br /><span style="font-family: courier new,monospace;">CREATE DEFINER=`root`@`localhost` FUNCTION `sf_waktusholat`(vKodeCity int, vTanggal date, idxwaktusholat tinyint) RETURNS varchar(20) CHARSET utf8</span><br /> <span style="font-family: courier new,monospace;">BEGIN</span><br /><span style="font-family: courier new,monospace;"> declare B float;</span><br /> <span style="font-family: courier new,monospace;"> declare L float;</span><br /><span style="font-family: courier new,monospace;"> declare R float;</span><br /> <span style="font-family: courier new,monospace;"> declare H float;</span><br /><span style="font-family: courier new,monospace;"> declare J int;</span><br /> <span style="font-family: courier new,monospace;"> declare beta float;</span><br /><span style="font-family: courier new,monospace;"> declare D float;</span><br /> <span style="font-family: courier new,monospace;"> declare T float;</span><br /><span style="font-family: courier new,monospace;"> declare Gd float;</span><br /> <span style="font-family: courier new,monospace;"> declare Gn float;</span><br /><span style="font-family: courier new,monospace;"> declare Z float;</span><br /> <span style="font-family: courier new,monospace;"> declare U float;</span><br /><span style="font-family: courier new,monospace;"> declare Vd float;</span><br /> <span style="font-family: courier new,monospace;"> declare Vn float;</span><br /><span style="font-family: courier new,monospace;"> declare W float;</span><br /> <span style="font-family: courier new,monospace;"> declare hasil float;</span><br /><span style="font-family: courier new,monospace;"> declare jam varchar(20);</span><br /> <br /><span style="font-family: courier new,monospace;"> set j = dayofyear(vTanggal);</span><br /><span style="font-family: courier new,monospace;"> set Gd = 19;</span><br /> <span style="font-family: courier new,monospace;"> set Gn = 19;</span><br /><br /><span style="font-family: courier new,monospace;"> SELECT 2 * pi() * J / dayofyear(CONCAT(year(now()),'<wbr>-12-31')) INTO beta;</span><br /> <span style="font-family: courier new,monospace;"> 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;</span><br /> <br /><span style="font-family: courier new,monospace;"> 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;</span><br /> <br /><span style="font-family: courier new,monospace;"> SELECT latitude, longitude, (timezone) * 15, ketinggian</span><br /><span style="font-family: courier new,monospace;"> INTO B,L,R,H</span><br /> <span style="font-family: courier new,monospace;"> FROM tbl_city_coordinate</span><br /><span style="font-family: courier new,monospace;"> WHERE id = vKodeCity;</span><br /> <br /><span style="font-family: courier new,monospace;"> SET Z = 12 + ((R-L)/15) - (T/60);</span><br /><span style="font-family: courier new,monospace;"> 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)));</span><br /> <span style="font-family: courier new,monospace;"> 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)));</span><br /> <span style="font-family: courier new,monospace;"> 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)));</span><br /> <span style="font-family: courier new,monospace;"> 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)));</span><br /> <br /><span style="font-family: courier new,monospace;"> case idxwaktusholat</span><br /><span style="font-family: courier new,monospace;"> when 0 then SET hasil = (z - Vd) - 0.134; /*imsyak*/</span><br /> <span style="font-family: courier new,monospace;"> when 1 then SET hasil = Z - Vd - 0.033 ; /*subuh*/</span><br /><span style="font-family: courier new,monospace;"> when 2 then SET hasil = Z - U; /*matahari terbit*/</span><br /> <span style="font-family: courier new,monospace;"> when 3 then SET hasil = Z + 0.05; /*zuhur*/</span><br /><span style="font-family: courier new,monospace;"> when 4 then SET hasil = Z + W + 0.033; /*ashar*/</span><br /> <span style="font-family: courier new,monospace;"> when 5 then SET hasil = Z + U + 0.033; /*maghrib*/</span><br /><span style="font-family: courier new,monospace;"> when 6 then SET hasil = Z + Vn - 0.0167; /*isya*/</span><br /> <span style="font-family: courier new,monospace;"> end case;</span><br /><br /><span style="font-family: courier new,monospace;"> SET Jam = SEC_TO_TIME(hasil*3600);</span><br /> <span style="font-family: courier new,monospace;"> RETURN jam;</span><br /><span style="font-family: courier new,monospace;">END;</span><br /><br /><br /><span style="font-family: trebuchet ms;">coba bikin stored procedure utk nampilin waktu sholat :</span><br /><br /><span style="font-family: courier new,monospace;">CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_waktusholat_tampil`(vIDKota int, tanggal date)</span><br /><span style="font-family: courier new,monospace;">BEGIN</span><br /> <span style="font-family: courier new,monospace;"> IF vIDKota <= 0 THEN</span><br /><span style="font-family: courier new,monospace;"> SELECT Kota, sf_waktusholat(id, date(tanggal), 1) as `Subuh`,</span><br /> <span style="font-family: courier new,monospace;"> sf_waktusholat(id, date(tanggal), 3) as `Dhuhur`,</span><br /><span style="font-family: courier new,monospace;"> sf_waktusholat(id, date(tanggal), 4) as `Ashar`,</span><br /> <span style="font-family: courier new,monospace;"> sf_waktusholat(id, date(tanggal), 5) as `Maghrib`,</span><br /><span style="font-family: courier new,monospace;"> sf_waktusholat(id, date(tanggal), 6) as `Isya`</span><br /> <span style="font-family: courier new,monospace;"> FROM tbl_city_coordinate</span><br /><span style="font-family: courier new,monospace;"> ORDER BY Kota ASC;</span><br /> <span style="font-family: courier new,monospace;"> ELSE</span><br /><span style="font-family: courier new,monospace;"> SELECT Kota, sf_waktusholat(id, date(tanggal), 1) as `Subuh`,</span><br /> <span style="font-family: courier new,monospace;"> sf_waktusholat(id, date(tanggal), 3) as `Dhuhur`,</span><br /><span style="font-family: courier new,monospace;"> sf_waktusholat(id, date(tanggal), 4) as `Ashar`,</span><br /> <span style="font-family: courier new,monospace;"> sf_waktusholat(id, date(tanggal), 5) as `Maghrib`,</span><br /><span style="font-family: courier new,monospace;"> sf_waktusholat(id, date(tanggal), 6) as `Isya`</span><br /> <span style="font-family: courier new,monospace;"> FROM tbl_city_coordinate</span><br /><span style="font-family: courier new,monospace;"> WHERE id = vIDKota;</span><br /> <span style="font-family: courier new,monospace;"> END IF;</span><br /><span style="font-family: courier new,monospace;">END;</span><br /><br /><span style="font-family: trebuchet ms;">*coba dieksekusi tu SP :</span><br /><span style="font-family: courier new,monospace;">call sp_waktusholat_tampil(1,'2008<wbr>-04-01');</span><br /><br /><span style="font-family: trebuchet ms;">*hasilnya :</span><br /><span style="font-family: courier new,monospace;">+---------+----------+--------<wbr>--+----------+----------+-----<wbr>-----+</span><br /><span style="font-family: courier new,monospace;">| Kota | Subuh | Dhuhur | Ashar | Maghrib | Isya |</span><br /> <span style="font-family: courier new,monospace;">+---------+----------+--------<wbr>--+----------+----------+-----<wbr>-----+</span><br /><span style="font-family: courier new,monospace;">| JAKARTA | 04:40:05 | 11:59:33 | 15:14:20 | 18:01:09 | 19:10:03 |</span><br /> <span style="font-family: courier new,monospace;">+---------+----------+--------<wbr>--+----------+----------+-----<wbr>-----+</span><br /><br /><span style="font-family: trebuchet ms;">... cukup </span><span style="font-family: trebuchet ms;font-size:6;" >memuaskan</span><span style="font-family: trebuchet ms;"> ...</span><br /><div style="text-align: justify;"><span style="font-family: trebuchet ms;">*kurang lebih lah dengan jadwal sholat utk wilayah Jakarta yg sekarang nampang di republika-online</span><br /></div> <br /><span style="font-family: trebuchet ms;">script lengkap bisa <span style="font-size:130%;"><a href="http://qvezst.googlepages.com/waktusholat.sql">didonlot di sini</a></span>...</span><br /><br /><span style="color: rgb(204, 0, 0); font-family: trebuchet ms;">TIDUR AAAH...</span><br /><span style="color:#888888;"><br /></span><br /><br /></div>eRQeehttp://www.blogger.com/profile/04138933553082003934noreply@blogger.com5tag:blogger.com,1999:blog-4245561185723908608.post-27485764647591324282008-03-27T14:50:00.005+07:002008-10-12T21:26:03.549+07:00Cara Belajar Menjadi Programmer<div style="text-align: justify;"><span style="font-family:trebuchet ms;">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 :</span><br /><br /><span style="font-family:trebuchet ms;"><blockquote>"Aku pingin jadi programmer. tapi belajarnya mulai dari mana dulu? oh ya aku ingin belajar delphi dan databasenya sql server 2000. Terima Kasih"</blockquote></span><br /><br /><span style="font-family:trebuchet ms;">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. <span style="color: rgb(102, 102, 204);font-size:130%;" >Gimana caranya *memulai* belajar untuk jadi programmer?</span></span><br /><br /><span style="font-family:trebuchet ms;">Singkat kata, uneg-uneg udah penuh, akhirnya aku jawab begini :</span><br /></div><br /><div class="fullpost"><br /><div style="text-align: justify;"><span style="font-family:trebuchet ms;">klo aku ngajarin temen2ku,</span><br /><span style="font-family:trebuchet ms;">1. belajar bikin GUI</span><br /><span style="font-family:trebuchet ms;">2. belajar database (bikin tabel, jalin koneksi, syntax2 SQL)</span><br /><span style="font-family:trebuchet ms;">3. belajar simple CRUD (create, retreive, update, delete) via database langsung n via aplikasi</span><br /><span style="font-family:trebuchet ms;">4. belajar bikin report</span><br /><span style="font-family:trebuchet ms;"> 5. ulangi poin 1-4 tapi tambahin fasilitas macam2. upgrade aplikasi pelan2, coba imple semua tips n trik.</span><br /><br /><span style="font-family:trebuchet ms;">cara belajar (pemrograman) yang efektif, sebenarnya perlu kmu *sesuaikan* dgn gaya belajar alami kamu.</span><br /><span style="font-family:trebuchet ms;">Ada 3 gaya belajar :</span><br /><span style="font-family:trebuchet ms;"> 1. VISUAL</span><br /><span style="font-family:trebuchet ms;">2. AUDITORIAL</span><br /><span style="font-family:trebuchet ms;">3. KINESTETIS</span><br /><br /><span style="font-family:trebuchet ms;">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 :</span><br /><span style="font-family:trebuchet ms;"><br />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 <span style="font-weight: bold;">AUDITORIAL</span></span><br /><span style="font-family:trebuchet ms;">2. liat orang (temenmu/tetanggamu/gurumu) bikin menara eiffel, trus tiru cara dia mbikin tu menara eiffel, MAKA gaya belajar alami kamu tergolong <span style="font-weight: bold;">VISUAL</span></span><br /><span style="font-family:trebuchet ms;">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 <span style="font-weight: bold;">KINESTETIS</span>.</span><br /><span style="font-family:trebuchet ms;"><br />nah,</span><br /><br /><span style="font-family:trebuchet ms;">sekarang, kecenderungan mu belajar dengan gaya apa? terapkan juga itu dalam cara belajar pemrograman.<br /><br /></span><span style="font-family:trebuchet ms;">1. kalo u dominan AUDITORIAL, u bisa baca2 buku pemrograman, ikutin semua step-by-step nya</span><br /><span style="font-family:trebuchet ms;">2. kalo u dominan VISUAL, u bisa belajar dengan *memperhatikan* programmer laen bekerja trus tiru cara kerjanya</span><br /><span style="font-family:trebuchet ms;">3. kalo u dominan KINESTETIS, tiada cara lain bagimu utk belajar selain dengan IMPROVISASI. coba-coba, gagal, coba lagi, gagal, coba lagi...</span><br /><span style="font-family:trebuchet ms;"><br />*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..</span><br /><br /><span style="font-family:trebuchet ms;">untuk permulaan, u bisa belajar pemrograman dengan tema sederhana misal bikin aplikasi buku telepon.</span><br /><span style="font-family:trebuchet ms;">bikin GUI nya dulu,</span><br /><span style="font-family:trebuchet ms;">struktur database,</span><br /><span style="font-family:trebuchet ms;">CRUD,</span><br /><span style="font-family:trebuchet ms;">report</span><br /><span style="font-family:trebuchet ms;">trus ulangi semuanya sampe u ngrasa u udah cukup mahir...</span><br /><br /><span style="font-family:trebuchet ms;">algoritma? pelajarin sambil jalan..</span><br /><span style="font-family:trebuchet ms;">InsyaAllah bisa.</span><br /><span style="font-family:trebuchet ms;">yang penting tekun aja..</span><br /><br /><span style="font-family:trebuchet ms;">klo u memilih "menjerumuskan diri" ke Delphi, ikut milis/forum.</span><br /><a style="font-family: trebuchet ms;" href="http://www.delphi-id.com/" target="_blank">http://www.delphi-id.com</a><br /><a style="font-family: trebuchet ms;" href="http://www.diskusiweb.com/" target="_blank">http://www.diskusiweb.com</a><br /><a style="font-family: trebuchet ms;" href="mailto:delphindo@yahoogroups.com" target="_blank">delphindo@yahoogroups.com</a><br /><span style="font-family:trebuchet ms;">ato</span><br /><span style="font-family:trebuchet ms;">ke blog ini : </span><a style="font-family: trebuchet ms;" href="http://ekoindri.wordpress.com/" target="_blank">http://ekoindri.wordpress.com</a><br /><span style="font-family:trebuchet ms;"> orangnya pinter delphi, baek, suka ngasi tips-n-trik, rajin ngupdate blog nya, penulis buku jg, sabar (spesifikasi wajib yg harus dimiliki seorang guru)</span><br /><br /><span style="font-family:trebuchet ms;">oke?</span><br /><br /><span style="font-family:trebuchet ms;">selamat mencoba!</span><br /><br /><span style="font-weight: bold;font-family:trebuchet ms;" >NB :</span><br /><span style="font-family:trebuchet ms;">oia, satu lagi :</span><br /><br /><span style="font-family:trebuchet ms;">jangan merasa malu untuk MENCONTEK dan MENIRU.</span><br /><span style="font-family:trebuchet ms;">sebenarnya NYONTEK itu juga salah satu proses belajar</span><br /><span style="font-family:trebuchet ms;">(kesalahan utama guru2 kita waktu SD-SMA selalu *mengharamkan* nyontek)</span><br /><span style="font-family:trebuchet ms;">.. mereka ga sadar, klo sebenarnya Bill Gates bisa bikin Microsoft Windows jadi sebesar saat ini juga dari modal MENCONTEK.</span><br /><br /><span style="font-family:trebuchet ms;">ada filosofi bagus yang dianut ama Bill Gates ama Steve Jobbs (pendiri Apple Inc.) :</span><br /><br /><span style="font-family:trebuchet ms;">"...seniman yang PANDAI, dia MENIRU. seniman yang HEBAT, dia MENCURI..."</span><br /><br /><span style="font-family:trebuchet ms;">silakan interpretasikan sendiri maksud kata2 mereka itu...<br /><br /></span><span style="font-family: trebuchet ms;">-- </span><br /><span style="font-family: trebuchet ms;">wassalam,</span><br /><br /> <br /><span style="font-family: trebuchet ms;">Rizky Prihanto</span><br /><a style="font-family: trebuchet ms;" href="http://www.software-arsitek.web.id/" target="_blank">http://www.software-arsitek<wbr>.web.id</a><br /><span style="font-family: trebuchet ms;">+62 856 496 00 496</span><br /><span style="font-family: trebuchet ms;">+62 22 3018 3328</span><br /></div><br /></div>eRQeehttp://www.blogger.com/profile/04138933553082003934noreply@blogger.com27tag:blogger.com,1999:blog-4245561185723908608.post-86818977486586615002008-02-01T00:06:00.001+07:002008-11-02T12:23:08.935+07:00Business Intelligence "murah" makae VB6+Excel<div style="text-align: justify;"><span style="font-family: trebuchet ms;">Pernah liat aplikasi Business Intelligence? Ngerti apa itu Business Intelligence? <a href="http://rizky.prihanto.web.id/2007/07/sekilas-business-intelligence.html">Artikel terdahulu di blog ini</a> 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 (<span style="color: #666666; font-style: italic;">yippie... coding-coding...</span>) tentang gimana mbikin aplikasi BI sederhana dan <span style="color: #cc0000; font-weight: bold;">murah</span> makae Visual Basic n Microsoft Excel. <span style="color: #cc0000; font-weight: bold;">Murah?</span> <span style="font-style: italic;">Yupz!</span> Nyaris semua aplikasi BI di pasaran harganya mahal-mahal loo... Karena informasi yang disediakan dari aplikasi ini emang <span style="color: #009900; font-style: italic; font-weight: bold;">muahall bangedd</span>. Berharga. <span style="color: #666666; font-style: italic;">Lha terus kenapa yg mo ta' tulis ini kulabelin "<span style="color: #cc0000;">murah</span>"?</span> Hehehe, biar terkesan kontroversial ajah... - alasan utamanya sih, bcoz mbikin aplikasi BI pake VB6 + Excel ini <span style="color: #009900; font-style: italic; font-weight: bold;">GUAMPANGG bangedd</span> n harga produksi nya ngga sampe ngabisin 2 batang rokok seharga @ Rp 600,00 - harga aplikasi development nya jg <span style="color: #cc0000; font-weight: bold;">*murah*</span> koq. xixixi (u know what I meant laah..). <span style="color: #666666; font-style: italic;">Berapa sih harga VB6 dan Microsoft Office 2003 ?!?!</span></span></div><div class="fullpost"><br />
<br />
<div style="text-align: justify;"><span style="font-family: trebuchet ms;">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 <a href="http://www.software-arsitek.web.id/2007/07/sekilas-business-intelligence.html">artikel yang ku post sebelumnya</a> bakal kita coba implementasikan di sini sih. Namanya jg BI "murah" -- wajar donk? xixixi. Yang jelas, murah disini <span style="font-style: italic;">bukan berarti</span> murahan! Ntar liat aja hasilnya, loe pasti terpana bolak-balik - <span style="color: #666666; font-style: italic;">"begini simpel seperti ini kah tuk bikin BI itu?"</span></span><br />
<br />
<span style="font-family: trebuchet ms;">Oke, cukup nge-gombalnya. Jadi begini, bahan2 yang kita butuhkan utk bikin nie aplikasi :<br />
<br />
</span><span style="font-size: 130%;"><span style="font-family: trebuchet ms; font-weight: bold;">1. Data Source</span></span><br />
<span style="font-family: trebuchet ms;">Aplikasi business inteligence itu termasuk kategori <span style="font-weight: bold;">OLAP</span> (<span style="font-style: italic;">Online Analytical Processing</span>). Proses ini merupakan kelanjutan dari proses <span style="font-style: italic;">data-mining</span> (penambangan data). Nah, supaya aplikasi BI bisa jalan, tentunya sebelumnya musti ada donk data yg mo di-proses utk di-analisis...</span><br />
<span style="font-family: trebuchet ms;">Sebagai contoh dalam artikel-ku ini aku bikinin deh 1 tabel dalam 1 schema utk simulasi penambangan data.</span><br />
<br />
<span style="font-family: trebuchet ms;">DDL nya sebagai berikut (owya, aku makae <a href="http://dev.mysql.com/">MySQL</a>. Lagi males makae access, ngga praktis utk coding pake script):</span><br />
<br />
<code><br />
<span style="font-family: trebuchet ms;"><span style="color: #000099;">CREATE DATABASE</span> db_contohdatamining;</span><br />
<span style="font-family: trebuchet ms;"><span style="color: #000099;">USE </span>db_contohdatamining;</span><br />
<span style="font-family: trebuchet ms;"><span style="color: #000099;">CREATE TABLE</span> tbldatamining <span style="color: #cc0000;">(</span></span><br />
<span style="font-family: trebuchet ms;">kode <span style="color: #993399;">int</span><span style="color: #cc0000;">(</span>10<span style="color: #cc0000;">)</span> <span style="color: #000099;">NOT NULL</span> <span style="color: #000099;">auto_increment</span>,</span><br />
<span style="font-family: trebuchet ms;">NamaSiswa <span style="color: #993399;">varchar</span><span style="color: #cc0000;">(</span>50<span style="color: #cc0000;">)</span> <span style="color: #000099;">NOT NULL</span>,</span><br />
<span style="font-family: trebuchet ms;">Semester <span style="color: #993399;">tinyint</span> <span style="color: #000099;">NOT NULL</span>,</span><br />
<span style="font-family: trebuchet ms;">MataPelajaran <span style="color: #993399;">varchar</span><span style="color: #cc0000;">(</span>50<span style="color: #cc0000;">)</span> <span style="color: #000099;">NOT NULL</span>,</span><br />
<span style="font-family: trebuchet ms;">Nilai <span style="color: #993399;">tinyint</span> <span style="color: #000099;">NOT NULL</span>,</span><br />
<span style="font-family: trebuchet ms;"><span style="color: #000099;">PRIMARY KEY</span><span style="color: #cc0000;">(</span>kode<span style="color: #cc0000;">)</span></span><br />
<span style="font-family: trebuchet ms;"><span style="color: #cc0000;">)</span><span style="color: #000099;">ENGINE<span style="color: #cc0000;">=</span>MyISAM</span>;</span><br />
</code><br />
<br />
<span style="font-family: trebuchet ms;">tu tabel adalah contoh doank. Ntar sumber data mu ya ngambil dari tabel itu. Bisa aja sih u me-mining data dari <span style="color: #cc0000; font-style: italic;">query select</span> yang multi tabel, atau kmu pre-definisi-kan pake <span style="color: #cc0000; font-style: italic;">VIEW</span>. Sama aja itu.. Di sini aku asumsikan, ya itu lah kira2 struktur sumber data nya. Dalam struktur relasional database, <span style="color: #009900; font-style: italic;">lebih sehat sih</span> klo ada <span style="color: #000099;">TblMataPelajaran</span> sendiri, n <span style="color: #000099;">TblSiswa</span> sendiri. Yah, ini kan cuman contoh. <span style="color: #666666; font-style: italic;">Suka-suka gue donk..</span>. Gue kan udah cukup baek (<span style="font-weight: bold;">cakep lagi</span>) utk ngasih contoh ini ke <span style="color: #666666; font-style: italic;">loe-loe pade</span>... (cape loo blogging hal2 yg berbau tutorial itu). hihihi...</span><br />
<br />
<span style="font-family: trebuchet ms;">Oke, trus ini jg kusertakan beberapa contoh value data. Eksekusi aja :</span><br />
<code><br />
<span style="font-family: trebuchet ms;">INSERT INTO tblDataMining<br />
(NamaSiswa,Semester,MataPelajaran,Nilai)<br />
VALUES</span><br />
<span style="font-family: trebuchet ms;">('eRQee',1,'PPKn',7), ('eRQee',1,'Agama',8),</span><br />
<span style="font-family: trebuchet ms;">('eRQee',1,'B.Ind',8),('eRQee',1,'B.Ing',8),</span><br />
<span style="font-family: trebuchet ms;">('eRQee',2,'PPKn',6), ('eRQee',2,'Agama',6),</span><br />
<span style="font-family: trebuchet ms;">('eRQee',2,'B.Ind',7),('eRQee',2,'B.Ing',9),</span><br />
<span style="font-family: trebuchet ms;">('Neeah',1,'PPKn',9), ('Neeah',1,'Agama',8),</span><br />
<span style="font-family: trebuchet ms;">('Neeah',1,'B.Ind',6),('Neeah',1,'B.Ing',6),</span><br />
<span style="font-family: trebuchet ms;">('Neeah',2,'PPKn',8), ('Neeah',2,'Agama',7),</span><br />
<span style="font-family: trebuchet ms;">('Neeah',2,'B.Ind',7),('Neeah',2,'B.Ing',7),</span><br />
<span style="font-family: trebuchet ms;">('GNuKa',1,'PPKn',7), ('GNuKa',1,'Agama',9),</span><br />
<span style="font-family: trebuchet ms;">('GNuKa',1,'B.Ind',8),('GNuKa',1,'B.Ing',7),</span><br />
<span style="font-family: trebuchet ms;">('GNuKa',2,'PPKn',7), ('GNuKa',2,'Agama',9),</span><br />
<span style="font-family: trebuchet ms;">('GNuKa',2,'B.Ind',7),('GNuKa',2,'B.Ing',7),</span><br />
<span style="font-family: trebuchet ms;">('Tomb',1,'PPKn',6), ('Tomb',1,'Agama',7),</span><br />
<span style="font-family: trebuchet ms;">('Tomb',1,'B.Ind',6),('Tomb',1,'B.Ing',9),</span><br />
<span style="font-family: trebuchet ms;">('Tomb',2,'PPKn',6), ('Tomb',2,'Agama',6),</span><br />
<span style="font-family: trebuchet ms;">('Tomb',2,'B.Ind',7),('Tomb',2,'B.Ing',8);</span><br />
</code><br />
<br />
<span style="font-size: 130%;"><span style="font-family: trebuchet ms; font-weight: bold;">2. cExcelReport.bas</span></span><br />
<span style="font-family: trebuchet ms;">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. <span style="color: #666666; font-style: italic;">:cool:</span> Ntar kubedah deh arsitektur class-ku ini di postingan-ku yg laen...</span><br />
<br />
<span style="font-family: trebuchet ms;">Untuk mbikin PivotTable secara ostosmastis dari VB, pakae method ini :</span><br />
<code><br />
<span style="font-family: trebuchet ms;">Public Sub CreatePivotTable(sSourceRange As String, _</span><br />
<span style="font-family: trebuchet ms;">sDestinationRange As String, _</span><br />
<span style="font-family: trebuchet ms;">sRowFields As String, _</span><br />
<span style="font-family: trebuchet ms;">sColumnFields As String, _</span><br />
<span style="font-family: trebuchet ms;">sDataFields As String, _</span><br />
<span style="font-family: trebuchet ms;">sTitleDataFields As String)</span><br />
<span style="font-family: trebuchet ms;">Dim pt As Object</span><br />
<br />
<span style="font-family: trebuchet ms;">On Error GoTo Hell</span><br />
<span style="font-family: trebuchet ms;">Set pt = oSheet.PivotTableWizard _</span><br />
<span style="font-family: trebuchet ms;">( _</span><br />
<span style="font-family: trebuchet ms;">SourceType:=1, _</span><br />
<span style="font-family: trebuchet ms;">SourceData:=oSheet.Range(sSourceRange), _</span><br />
<span style="font-family: trebuchet ms;">TableDestination:=oSheet.Range(sDestinationRange) _</span><br />
<span style="font-family: trebuchet ms;">)</span><br />
<br />
<span style="font-family: trebuchet ms;">pt.AddFields RowFields:=sRowFields, _</span><br />
<span style="font-family: trebuchet ms;">ColumnFields:=sColumnFields</span><br />
<span style="font-family: trebuchet ms;">pt.AddDataField pt.PivotFields(sDataFields), sTitleDataFields</span><br />
<span style="font-family: trebuchet ms;">Exit Sub</span><br />
<br />
<span style="font-family: trebuchet ms;">Hell:</span><br />
<span style="font-family: trebuchet ms;">debug.print "[" & err.number & "] " & err.description</span><br />
<span style="font-family: trebuchet ms;">End Sub</span><br />
</code><br />
<br />
<span style="font-family: trebuchet ms;">Owya, cExcelReport.bas ini <a href="http://qvezst.googlepages.com/cExcelReport.cls">bisa you donlot di sini.</a> Monggo dipake, gpp... aku ikhlas koq. <span style="font-style: italic;">But keep my credits on the top of ur code, please...</span> Utk menghormati <a href="http://creativecommons.org/">Creative Common Licenses</a>... hehehe. Banyak programmer yg ngga gila harta, tp nyaris semua programmer gila hormat loo... (tonton/baca aja <a href="http://www.takedown.com/">Takedown</a>, bintangnya Kevin Mitnick ama Tsutsomu Shimomura...).</span><br />
<br />
<span style="font-size: 130%; font-weight: bold;"><span style="font-family: trebuchet ms;">3. Sedikit code di salah satu form VB.</span></span><br />
<span style="font-family: trebuchet ms;">Kmu codingin ini di salah satu form mu. Jangan lupa juga, include-kan reference ke <span style="font-weight: bold;">Microsoft ActiveX Data Objects Library 2.8</span> (versi sebelumnya nggak apa2 sieh, asal jangan 2.5 ke bawah aja)... Juga masukin component <span style="font-weight: bold;">Microsoft Windows Common Controls 6.0</span> (soalnya di cExcelReport-ku ada kebutuhan utk export dari Listview). Reference utk Microsoft Excel xx Object Library <span style="color: #cc0000;">*amat sangat*</span> <span style="font-weight: bold;">tidak dibutuhkan</span>. 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, <span style="font-style: italic;">suer disambar geledek..</span></span><br />
<code><br />
<span style="font-family: trebuchet ms;">'--declaration</span><br />
<span style="font-family: trebuchet ms;">Private xls as cExcelReport</span><br />
<span style="font-family: trebuchet ms;">Private db as ADODB.Connection</span><br />
<br />
<span style="font-family: trebuchet ms;">Private Const CONST_HOST = "localhost"</span><br />
<span style="font-family: trebuchet ms;">Private Const CONST_PORT = "3306"</span><br />
<span style="font-family: trebuchet ms;">Private Const CONST_SCHEMA = "db_contohdatamining"</span><br />
<span style="font-family: trebuchet ms;">Private Const CONST_USERNAME = "root"</span><br />
<span style="font-family: trebuchet ms;">Private Const CONST_PASSWORD = "123456"</span><br />
<br />
<span style="font-family: trebuchet ms;">'--routine to open database connection</span><br />
<span style="font-family: trebuchet ms;">Private Sub OpenDB(ByRef db as ADODB.Connection)</span><br />
<span style="font-family: trebuchet ms;">db.CursorLocation = adUseClient</span><br />
<span style="font-family: trebuchet ms;">db.ConnectionString = "DRIVER={MySQL ODBC 3.51 Driver};" _</span><br />
<span style="font-family: trebuchet ms;">& "SERVER=" & CONST_HOST & ";" _</span><br />
<span style="font-family: trebuchet ms;">& "PORT=" & CONST_PORT & ";" _</span><br />
<span style="font-family: trebuchet ms;">& "DATABASE=" & CONST_SCHEMA & ";" _</span><br />
<span style="font-family: trebuchet ms;">& "UID=" & CONST_USERNAME & ";" _</span><br />
<span style="font-family: trebuchet ms;">& "PWD=" & CONST_PASSWORD & ";" _</span><br />
<span style="font-family: trebuchet ms;">& "OPTION=" & 1 + 2 + 8 + 16 + 2048</span><br />
<span style="font-family: trebuchet ms;">db.open</span><br />
<span style="font-family: trebuchet ms;">DoEvents</span><br />
<span style="font-family: trebuchet ms;">If Err.Number <> 0 And db.state <> adStateOpen Then</span><br />
<span style="font-family: trebuchet ms;">GoTo Hell</span><br />
<span style="font-family: trebuchet ms;">End If</span><br />
<span style="font-family: trebuchet ms;">Exit Sub</span><br />
<span style="font-family: trebuchet ms;">Hell:</span><br />
<span style="font-family: trebuchet ms;">msgbox "[" & err.number & "] " & err.description</span><br />
<span style="font-family: trebuchet ms;">End Sub</span><br />
<br />
<span style="font-family: trebuchet ms;">'--form load</span><br />
<span style="font-family: trebuchet ms;">Private Sub Form_Load()</span><br />
<span style="font-family: trebuchet ms;">Set db = New ADODB.Connection</span><br />
<span style="font-family: trebuchet ms;">db.mode = adModeReadWrite</span><br />
<span style="font-family: trebuchet ms;">db.CursorLocation = adUseClient</span><br />
<span style="font-family: trebuchet ms;">OpenDB</span><br />
<span style="font-family: trebuchet ms;">End Sub</span><br />
<br />
<span style="font-family: trebuchet ms;">'--tombol klik</span><br />
<span style="font-family: trebuchet ms;">Private Sub Command1_Click()</span><br />
<span style="font-family: trebuchet ms;">screen.mousepointer = vbHourglass</span><br />
<span style="font-family: trebuchet ms;">Dim sRangeSourceAwal As String, sRangeSourceAkhir As String</span><br />
<span style="font-family: trebuchet ms;">Dim sRangeDest As String</span><br />
<span style="font-family: trebuchet ms;">'tahap 1 : persiapkan object excel dan bikin dokumen baru</span><br />
<span style="font-family: trebuchet ms;">Set xls = New cExcelReport</span><br />
<span style="font-family: trebuchet ms;">xls.init</span><br />
<br />
<span style="font-family: trebuchet ms;">Dim iI As Integer, rs As ADODB.Recordset, sSQL As String</span><br />
<span style="font-family: trebuchet ms;">sSQL = "SELECT NamaSiswa,Semester,MataPelajaran,Nilai " & _</span><br />
<span style="font-family: trebuchet ms;">"FROM TblDataMining"</span><br />
<span style="font-family: trebuchet ms;">Set rs = db.execute(sSQL)</span><br />
<span style="font-family: trebuchet ms;">if rs.recordcount > 0 then</span><br />
<span style="font-family: trebuchet ms;">'tahap 2 : data-mining</span><br />
<span style="font-family: trebuchet ms;">xls.TulisCell 9, 1, "NamaSiswa", vbWhite</span><br />
<span style="font-family: trebuchet ms;">xls.TulisCell 9, 2, "Semester", vbWhite</span><br />
<span style="font-family: trebuchet ms;">xls.TulisCell 9, 3, "MataPelajaran", vbWhite</span><br />
<span style="font-family: trebuchet ms;">xls.TulisCell 9, 4, "Nilai", vbWhite</span><br />
<span style="font-family: trebuchet ms;">sRangeSourceAwal = "$A$9"</span><br />
<span style="font-family: trebuchet ms;">For iI = 1 To rs.RecordCount</span><br />
<span style="font-family: trebuchet ms;">xls.TulisCell 9 + iI, 1, rs(0).Value, vbWhite 'Nama Siswa</span><br />
<span style="font-family: trebuchet ms;">xls.TulisCell 9 + iI, 2, rs(1).Value, vbWhite 'Semester</span><br />
<span style="font-family: trebuchet ms;">xls.TulisCell 9 + iI, 3, rs(2).Value, vbWhite 'Mata Pelajaran</span><br />
<span style="font-family: trebuchet ms;">xls.TulisCell 9 + iI, 4, rs(3).Value, vbWhite, , , , , , , True 'nilai</span><br />
<span style="font-family: trebuchet ms;">rs.MoveNext</span><br />
<span style="font-family: trebuchet ms;">Next iI</span><br />
<span style="font-family: trebuchet ms;">sRangeSourceAkhir = "$D$" & CStr(9 + CLng(rs.RecordCount))</span><br />
<span style="font-family: trebuchet ms;">sRangeDest = "$F$10"</span><br />
<span style="font-family: trebuchet ms;">'tahap 3 : bikin pivot table</span><br />
<span style="font-family: trebuchet ms;">xls.CreatePivotTable sRangeSourceAwal & ":" & sRangeSourceAkhir, _</span><br />
<span style="font-family: trebuchet ms;">sRangeDest, _</span><br />
<span style="font-family: trebuchet ms;">"MataPelajaran", _</span><br />
<span style="font-family: trebuchet ms;">"NamaSiswa;Semester", _</span><br />
<span style="font-family: trebuchet ms;">"Nilai", _</span><br />
<span style="font-family: trebuchet ms;">"Sum of Nilai"</span><br />
<span style="font-family: trebuchet ms;">xls.ChangeWidth 0, 1, 4</span><br />
<span style="font-family: trebuchet ms;">'tahap 4 : tampilkan file excel</span><br />
<span style="font-family: trebuchet ms;">xls.tampil</span><br />
<span style="font-family: trebuchet ms;">else</span><br />
<span style="font-family: trebuchet ms;">Msgbox "Tidak ada data yang dapat di-analisis, bro...", _<br />
vbInformation + vbOkOnly, "Maaf"</span><br />
<span style="font-family: trebuchet ms;">end if</span><br />
<span style="font-family: trebuchet ms;">rs.close</span><br />
<span style="font-family: trebuchet ms;">Set rs = nothing</span><br />
<span style="font-family: trebuchet ms;">Screen.mousepointer = vbDefault</span><br />
<span style="font-family: trebuchet ms;">End Sub</span><br />
<br />
<span style="font-family: trebuchet ms;">'--form unload</span><br />
<span style="font-family: trebuchet ms;">Private Sub Form_Unload()</span><br />
<span style="font-family: trebuchet ms;">on error resume next</span><br />
<span style="font-family: trebuchet ms;">set db = nothing</span><br />
<span style="font-family: trebuchet ms;">set xls = nothing</span><br />
<span style="font-family: trebuchet ms;"><span style="font-family: courier new;">End Sub</span><br />
</span></code><br />
<span style="font-family: trebuchet ms;">n mau tau hasilnya kya apa? Lihatlah capturan berikut ini :<br />
</span><span style="font-family: trebuchet ms;"></span><br />
<div align="center"><img src="http://qvezst.googlepages.com/form_kosongan.JPG" /></div><br />
<span style="font-family: trebuchet ms;">Lho? Kosong?<br />
<br />
Hehehe, emang... tp coba aja klik tombolnya. Ntar bakal muncul dokumen Excel seperti ginian deh :<br />
</span><span style="font-family: trebuchet ms;"></span><br />
<div align="center"><img src="http://qvezst.googlepages.com/vba_pivot_kosong.JPG" /></div><br />
<span style="font-family: trebuchet ms;"><br />
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 :<br />
</span><span style="font-family: trebuchet ms;"></span><br />
<div align="center"><img src="http://qvezst.googlepages.com/vba_pivot_isi.JPG" /></div><br />
<span style="font-family: trebuchet ms;"><br />
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?<br />
</span><span style="font-family: trebuchet ms;"></span><span style="font-family: trebuchet ms;"></span><br />
<div align="center"><img src="http://qvezst.googlepages.com/vba_pivot_chart.JPG" /></div><br />
<br />
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 :<br />
<div align="center"><img src="http://qvezst.googlepages.com/vba_pivot_chart_modif.JPG" /></div><br />
<br />
Pegimane? Mudah bukan? Keren bukan? Cakep bukan? Seperti inilah kira-kira aplikasi BI sederhana itu... seperti yg muncul dalam diskusi di milis, BI <span style="font-style: italic;">kurang lebih aja</span> sama kya Pivot Excel...<br />
<br />
Utk buat yg kesulitan nyoba, <a href="http://qvezst.googlepages.com/PivotDemo.zip">u bisa donlot <span style="font-weight: bold;">source</span> demo project nya di sini</a> (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....<br />
<br />
<br />
</div></div>eRQeehttp://www.blogger.com/profile/04138933553082003934noreply@blogger.com7tag:blogger.com,1999:blog-4245561185723908608.post-80279983659159126102008-01-17T21:03:00.001+07:002008-10-12T21:19:10.435+07:00Daftar Kode Area Telepon Indonesia<div style="text-align: justify;"><span style="color: rgb(153, 0, 0); font-style: italic;font-family:trebuchet ms;" >... kali aja butuh ...<br />__________________________<br /></span><br /><span style="font-family:trebuchet ms;">Nanggroe Aceh Darussalam</span><br /><br /><span style="font-family:trebuchet ms;"> * 0627 - Subussalam</span><br /><span style="font-family:trebuchet ms;"> * 0629 - Kutacane</span><br /><span style="font-family:trebuchet ms;"> * 0641 - Langsa</span><br /><span style="font-family:trebuchet ms;"> * 0642 - Blangkejeren</span><br /><span style="font-family:trebuchet ms;"> * 0643 - Takengon</span><br /><span style="font-family:trebuchet ms;"> * 0644 - Bireuen</span><br /><span style="font-family:trebuchet ms;"> * 0645 - Lhokseumawe</span><br /><span style="font-family:trebuchet ms;"> * 0646 - Idi</span><br /><span style="font-family:trebuchet ms;"> * 0650 - Sinabung (Simeulue)</span><br /><span style="font-family:trebuchet ms;"> * 0651 - Banda Aceh, Jantho, Lamno</span><br /><span style="font-family:trebuchet ms;"> * 0652 - Sabang</span><br /><span style="font-family:trebuchet ms;"> * 0653 - Sigli</span><br /><div class="fullpost"><br /><span style="font-family:trebuchet ms;"> * 0654 - Calang</span><br /><span style="font-family:trebuchet ms;"> * 0655 - Meulaboh</span><br /><span style="font-family:trebuchet ms;"> * 0656 - Tapaktuan</span><br /><span style="font-family:trebuchet ms;"> * 0657 - Bakongan</span><br /><span style="font-family:trebuchet ms;"> * 0658 - Singkil</span><br /><span style="font-family:trebuchet ms;"> * 0659 - Blangpidie</span><br /><br /><span style="font-family:trebuchet ms;">Sumatra Utara</span><br /><br /><span style="font-family:trebuchet ms;"> * 061 - Medan, Binjai, Stabat</span><br /><span style="font-family:trebuchet ms;"> * 0620 - Pangkalanbrandan</span><br /><span style="font-family:trebuchet ms;"> * 0621 - Tebingtinggi</span><br /><span style="font-family:trebuchet ms;"> * 0622 - Pematangsiantar</span><br /><span style="font-family:trebuchet ms;"> * 0623 - Kisaran, Tanjungbalai</span><br /><span style="font-family:trebuchet ms;"> * 0624 - Rantauprapat</span><br /><span style="font-family:trebuchet ms;"> * 0625 - Parapat</span><br /><span style="font-family:trebuchet ms;"> * 0626 - Pangururan</span><br /><span style="font-family:trebuchet ms;"> * 0627 - Sidikalang, Salak</span><br /><span style="font-family:trebuchet ms;"> * 0628 - Karo</span><br /><span style="font-family:trebuchet ms;"> * 0630 - Telukdalam</span><br /><span style="font-family:trebuchet ms;"> * 0631 - Sibolga</span><br /><span style="font-family:trebuchet ms;"> * 0632 - Balige</span><br /><span style="font-family:trebuchet ms;"> * 0633 - Tarutung</span><br /><span style="font-family:trebuchet ms;"> * 0634 - Padangsidempuan</span><br /><span style="font-family:trebuchet ms;"> * 0636 - Panyabungan</span><br /><span style="font-family:trebuchet ms;"> * 0638 - Barus</span><br /><span style="font-family:trebuchet ms;"> * 0639 - Gunungsitoli</span><br /><br /><span style="font-family:trebuchet ms;">Sumatra Barat</span><br /><br /><span style="font-family:trebuchet ms;"> * 0751 - Padang, Pariaman</span><br /><span style="font-family:trebuchet ms;"> * 0752 - Bukittinggi, Batusangkar, Padang Panjang, Payakumbuh</span><br /><span style="font-family:trebuchet ms;"> * 0753 - Lubuksikaping</span><br /><span style="font-family:trebuchet ms;"> * 0754 - Sawahlunto</span><br /><span style="font-family:trebuchet ms;"> * 0755 - Solok, Alahanpanjang</span><br /><span style="font-family:trebuchet ms;"> * 0756 - Painan</span><br /><span style="font-family:trebuchet ms;"> * 0757 - Balaiselasa</span><br /><span style="font-family:trebuchet ms;"> * 0759 - Muarasiberut</span><br /><br /><span style="font-family:trebuchet ms;">Riau</span><br /><br /><span style="font-family:trebuchet ms;"> * 0760 - Telukkuantan</span><br /><span style="font-family:trebuchet ms;"> * 0761 - Pekanbaru, Pangkalankerinci, Rumbai</span><br /><span style="font-family:trebuchet ms;"> * 0762 - Bangkinang</span><br /><span style="font-family:trebuchet ms;"> * 0763 - Selatpanjang</span><br /><span style="font-family:trebuchet ms;"> * 0764 - Siak Sri Indrapura</span><br /><span style="font-family:trebuchet ms;"> * 0765 - Dumai, Duri</span><br /><span style="font-family:trebuchet ms;"> * 0766 - Bengkalis</span><br /><span style="font-family:trebuchet ms;"> * 0767 - Bagan Siapi-api</span><br /><span style="font-family:trebuchet ms;"> * 0768 - Tembilahan</span><br /><span style="font-family:trebuchet ms;"> * 0769 - Rengat, Airmolek</span><br /><br /><span style="font-family:trebuchet ms;">Kepulauan Riau</span><br /><br /><span style="font-family:trebuchet ms;"> * 0771 - Tanjungpinang</span><br /><span style="font-family:trebuchet ms;"> * 0772 - Terempa</span><br /><span style="font-family:trebuchet ms;"> * 0773 - Ranai</span><br /><span style="font-family:trebuchet ms;"> * 0776 - Dabosingkep</span><br /><span style="font-family:trebuchet ms;"> * 0777 - Tanjungbalai Karimun</span><br /><span style="font-family:trebuchet ms;"> * 0778 - Batam, Kabil, Nongsa</span><br /><span style="font-family:trebuchet ms;"> * 0779 - Tanjungbatu</span><br /><br /><span style="font-family:trebuchet ms;">Jambi</span><br /><br /><span style="font-family:trebuchet ms;"> * 0740 - Tanjung Jabung Timur, Muara Sabak, Mendahara</span><br /><span style="font-family:trebuchet ms;"> * 0741 - Jambi</span><br /><span style="font-family:trebuchet ms;"> * 0742 - Kualatungkal</span><br /><span style="font-family:trebuchet ms;"> * 0743 - Muarabulian</span><br /><span style="font-family:trebuchet ms;"> * 0744 - Muaratebo</span><br /><span style="font-family:trebuchet ms;"> * 0745 - Sarolangun</span><br /><span style="font-family:trebuchet ms;"> * 0746 - Bangko</span><br /><span style="font-family:trebuchet ms;"> * 0747 - Muarabungo</span><br /><span style="font-family:trebuchet ms;"> * 0748 - Sungaipenuh</span><br /><br /><span style="font-family:trebuchet ms;">Sumatra Selatan</span><br /><br /><span style="font-family:trebuchet ms;"> * 0711 - Palembang, Pangkalanbalai, Betung, Indralaya</span><br /><span style="font-family:trebuchet ms;"> * 0712 - Kayuagung</span><br /><span style="font-family:trebuchet ms;"> * 0713 - Prabumulih</span><br /><span style="font-family:trebuchet ms;"> * 0714 - Sekayu, Musi Banyuasin</span><br /><span style="font-family:trebuchet ms;"> * 0731 - Lahat</span><br /><span style="font-family:trebuchet ms;"> * 0733 - Lubuk Linggau, Pendopo</span><br /><span style="font-family:trebuchet ms;"> * 0734 - Muaraenim</span><br /><span style="font-family:trebuchet ms;"> * 0735 - Baturaja</span><br /><br /><span style="font-family:trebuchet ms;">Bangka-Belitung</span><br /><br /><span style="font-family:trebuchet ms;"> * 0715 - Belinyu</span><br /><span style="font-family:trebuchet ms;"> * 0716 - Mentok</span><br /><span style="font-family:trebuchet ms;"> * 0717 - Pangkalpinang, Sungailiat</span><br /><span style="font-family:trebuchet ms;"> * 0718 - Koba, Toboali</span><br /><span style="font-family:trebuchet ms;"> * 0719 - Manggar, Tanjungpandan</span><br /><br /><span style="font-family:trebuchet ms;">Bengkulu</span><br /><br /><span style="font-family:trebuchet ms;"> * 0732 - Curup</span><br /><span style="font-family:trebuchet ms;"> * 0736 - Bengkulu, Tais</span><br /><span style="font-family:trebuchet ms;"> * 0737 - Argamakmur, Mukomuko</span><br /><span style="font-family:trebuchet ms;"> * 0738 - Muara Aman</span><br /><span style="font-family:trebuchet ms;"> * 0739 - Bintuhan, Manna</span><br /><br /><span style="font-family:trebuchet ms;">Lampung</span><br /><br /><span style="font-family:trebuchet ms;"> * 0721 - Bandarlampung</span><br /><span style="font-family:trebuchet ms;"> * 0724 - Kotabumi</span><br /><span style="font-family:trebuchet ms;"> * 0725 - Metro</span><br /><span style="font-family:trebuchet ms;"> * 0726 - Menggala</span><br /><span style="font-family:trebuchet ms;"> * 0727 - Kalianda</span><br /><span style="font-family:trebuchet ms;"> * 0728 - Liwa</span><br /><span style="font-family:trebuchet ms;"> * 0729 - Pringsewu</span><br /><br /><span style="font-family:trebuchet ms;">Jakarta Raya</span><br /><br /><span style="font-family:trebuchet ms;"> * 021 - Jakarta, Depok, Tangerang, Bekasi</span><br /><br /><span style="font-family:trebuchet ms;">Banten</span><br /><br /><span style="font-family:trebuchet ms;"> * 0252 - Rangkasbitung</span><br /><span style="font-family:trebuchet ms;"> * 0253 - Pandeglang, Labuan</span><br /><span style="font-family:trebuchet ms;"> * 0254 - Serang, Cilegon, Merak</span><br /><br /><span style="font-family:trebuchet ms;">Jawa Barat</span><br /><br /><span style="font-family:trebuchet ms;"> * 022 - Bandung, Cimahi, Soreang , Lembang</span><br /><span style="font-family:trebuchet ms;"> * 0231 - Cirebon, Losari</span><br /><span style="font-family:trebuchet ms;"> * 0232 - Kuningan</span><br /><span style="font-family:trebuchet ms;"> * 0233 - Majalengka, Kadipaten</span><br /><span style="font-family:trebuchet ms;"> * 0234 - Indramayu, Jatibarang</span><br /><span style="font-family:trebuchet ms;"> * 0251 - Bogor</span><br /><span style="font-family:trebuchet ms;"> * 0257 - Pasauran</span><br /><span style="font-family:trebuchet ms;"> * 0260 - Subang, Pamanukan</span><br /><span style="font-family:trebuchet ms;"> * 0261 - Sumedang</span><br /><span style="font-family:trebuchet ms;"> * 0262 - Garut</span><br /><span style="font-family:trebuchet ms;"> * 0263 - Cianjur</span><br /><span style="font-family:trebuchet ms;"> * 0264 - Purwakarta</span><br /><span style="font-family:trebuchet ms;"> * 0265 - Tasikmalaya, Banjar, Ciamis, Pangandaran</span><br /><span style="font-family:trebuchet ms;"> * 0266 - Sukabumi, Pelabuhan Ratu</span><br /><span style="font-family:trebuchet ms;"> * 0267 - Karawang</span><br /><br /><span style="font-family:trebuchet ms;">Jawa Tengah</span><br /><br /><span style="font-family:trebuchet ms;"> * 024 - Semarang, Ungaran</span><br /><span style="font-family:trebuchet ms;"> * 0271 - Surakarta (Solo), Kartasura, Sukoharjo, Karanganyar, Sragen</span><br /><span style="font-family:trebuchet ms;"> * 0272 - Klaten</span><br /><span style="font-family:trebuchet ms;"> * 0273 - Wonogiri</span><br /><span style="font-family:trebuchet ms;"> * 0275 - Purworejo,Kutoarjo</span><br /><span style="font-family:trebuchet ms;"> * 0276 - Boyolali</span><br /><span style="font-family:trebuchet ms;"> * 0280 - Majenang, Sidareja (Kabupaten Cilacap bagian barat)</span><br /><span style="font-family:trebuchet ms;"> * 0281 - Purwokerto, Banyumas, Purbalingga</span><br /><span style="font-family:trebuchet ms;"> * 0282 - Cilacap (bagian timur)</span><br /><span style="font-family:trebuchet ms;"> * 0283 - Tegal, Slawi, Brebes</span><br /><span style="font-family:trebuchet ms;"> * 0284 - Pemalang</span><br /><span style="font-family:trebuchet ms;"> * 0285 - Pekalongan, Batang (bagian barat)</span><br /><span style="font-family:trebuchet ms;"> * 0286 - Banjarnegara, Wonosobo</span><br /><span style="font-family:trebuchet ms;"> * 0287 - Kebumen, Gombong</span><br /><span style="font-family:trebuchet ms;"> * 0289 - Bumiayu (Kabupaten Brebes bagian selatan)</span><br /><span style="font-family:trebuchet ms;"> * 0291 - Demak, Jepara, Kudus</span><br /><span style="font-family:trebuchet ms;"> * 0292 - Purwodadi</span><br /><span style="font-family:trebuchet ms;"> * 0293 - Magelang, Mungkid, Temanggung</span><br /><span style="font-family:trebuchet ms;"> * 0294 - Kendal, Kaliwungu, Weleri (Kabupaten Batang bagian timur)</span><br /><span style="font-family:trebuchet ms;"> * 0295 - Pati, Rembang, Lasem</span><br /><span style="font-family:trebuchet ms;"> * 0296 - Blora, Cepu</span><br /><span style="font-family:trebuchet ms;"> * 0297 - Karimun Jawa</span><br /><span style="font-family:trebuchet ms;"> * 0298 - Salatiga, Ambarawa (Kabupaten Semarang bagian tengah dan selatan)</span><br /><br /><span style="font-family:trebuchet ms;">DI Yogyakarta</span><br /><br /><span style="font-family:trebuchet ms;"> * 0274 - Yogyakarta, Sleman, Wates, Bantul, Wonosari</span><br /><br /><span style="font-family:trebuchet ms;">Jawa Timur</span><br /><br /><span style="font-family:trebuchet ms;"> * 031 - Surabaya, Gresik, Sidoarjo, Bangkalan</span><br /><span style="font-family:trebuchet ms;"> * 0321 - Mojokerto, Jombang</span><br /><span style="font-family:trebuchet ms;"> * 0322 - Lamongan, Babat</span><br /><span style="font-family:trebuchet ms;"> * 0323 - Sampang</span><br /><span style="font-family:trebuchet ms;"> * 0324 - Pamekasan</span><br /><span style="font-family:trebuchet ms;"> * 0325 - Sangkapura (Bawean)</span><br /><span style="font-family:trebuchet ms;"> * 0327 - Kepulauan Kangean, Kepulauan Masalembu</span><br /><span style="font-family:trebuchet ms;"> * 0328 - Sumenep</span><br /><span style="font-family:trebuchet ms;"> * 0331 - Jember</span><br /><span style="font-family:trebuchet ms;"> * 0332 - Bondowoso, Sukosari, Prajekan</span><br /><span style="font-family:trebuchet ms;"> * 0333 - Banyuwangi, Muncar</span><br /><span style="font-family:trebuchet ms;"> * 0334 - Lumajang</span><br /><span style="font-family:trebuchet ms;"> * 0335 - Probolinggo, Kraksaan</span><br /><span style="font-family:trebuchet ms;"> * 0336 - Ambulu, Puger (Kabupaten Jember bagian selatan)</span><br /><span style="font-family:trebuchet ms;"> * 0338 - Situbondo, Besuki</span><br /><span style="font-family:trebuchet ms;"> * 0341 - Malang, Kepanjen, Batu</span><br /><span style="font-family:trebuchet ms;"> * 0342 - Blitar, Wlingi</span><br /><span style="font-family:trebuchet ms;"> * 0343 - Pasuruan, Pandaan, Gempol</span><br /><span style="font-family:trebuchet ms;"> * 0351 - Madiun, Caruban, Magetan, Ngawi</span><br /><span style="font-family:trebuchet ms;"> * 0352 - Ponorogo</span><br /><span style="font-family:trebuchet ms;"> * 0353 - Bojonegoro</span><br /><span style="font-family:trebuchet ms;"> * 0354 - Kediri, Pare</span><br /><span style="font-family:trebuchet ms;"> * 0355 - Tulungagung, Trenggalek</span><br /><span style="font-family:trebuchet ms;"> * 0356 - Tuban</span><br /><span style="font-family:trebuchet ms;"> * 0357 - Pacitan</span><br /><span style="font-family:trebuchet ms;"> * 0358 - Nganjuk, Kertosono</span><br /><br /><span style="font-family:trebuchet ms;">Bali</span><br /><br /><span style="font-family:trebuchet ms;"> * 0361 - Denpasar, Gianyar, Kuta, Tabanan, Tampaksiring, Ubud</span><br /><span style="font-family:trebuchet ms;"> * 0362 - Singaraja</span><br /><span style="font-family:trebuchet ms;"> * 0363 - Amlapura</span><br /><span style="font-family:trebuchet ms;"> * 0365 - Negara, Gilimanuk</span><br /><span style="font-family:trebuchet ms;"> * 0366 - Klungkung, Kintamani</span><br /><span style="font-family:trebuchet ms;"> * 0368 - Baturiti</span><br /><br /><span style="font-family:trebuchet ms;">Nusa Tenggara Barat</span><br /><br /><span style="font-family:trebuchet ms;"> * 0370 - Mataram, Praya</span><br /><span style="font-family:trebuchet ms;"> * 0371 - Sumbawa</span><br /><span style="font-family:trebuchet ms;"> * 0372 - Alas, Taliwang</span><br /><span style="font-family:trebuchet ms;"> * 0373 - Dompu</span><br /><span style="font-family:trebuchet ms;"> * 0374 - Bima</span><br /><span style="font-family:trebuchet ms;"> * 0376 - Selong</span><br /><br /><span style="font-family:trebuchet ms;">Nusa Tenggara Timur</span><br /><br /><span style="font-family:trebuchet ms;"> * 0380 - Kupang, Baa (Roti)</span><br /><span style="font-family:trebuchet ms;"> * 0381 - Ende</span><br /><span style="font-family:trebuchet ms;"> * 0382 - Maumere</span><br /><span style="font-family:trebuchet ms;"> * 0383 - Larantuka</span><br /><span style="font-family:trebuchet ms;"> * 0384 - Bajawa</span><br /><span style="font-family:trebuchet ms;"> * 0385 - Labuhanbajo, Ruteng</span><br /><span style="font-family:trebuchet ms;"> * 0386 - Kalabahi</span><br /><span style="font-family:trebuchet ms;"> * 0387 - Waingapu, Waikabubak</span><br /><span style="font-family:trebuchet ms;"> * 0388 - Kefamenanu, Soe</span><br /><span style="font-family:trebuchet ms;"> * 0389 - Atambua</span><br /><br /><span style="font-family:trebuchet ms;">Kalimantan Barat</span><br /><br /><span style="font-family:trebuchet ms;"> * 0561 - Pontianak, Mempawah</span><br /><span style="font-family:trebuchet ms;"> * 0562 - Sambas, Singkawang, Bengkayang</span><br /><span style="font-family:trebuchet ms;"> * 0563 - Ngabang</span><br /><span style="font-family:trebuchet ms;"> * 0564 - Sanggau</span><br /><span style="font-family:trebuchet ms;"> * 0565 - Sintang</span><br /><span style="font-family:trebuchet ms;"> * 0567 - Putussibau</span><br /><span style="font-family:trebuchet ms;"> * 0568 - Nangapinoh</span><br /><br /><span style="font-family:trebuchet ms;">Kalimantan Tengah</span><br /><br /><span style="font-family:trebuchet ms;"> * 0513 - Kualakapuas, Pulangpisau</span><br /><span style="font-family:trebuchet ms;"> * 0519 - Muarateweh</span><br /><span style="font-family:trebuchet ms;"> * 0522 - Ampah</span><br /><span style="font-family:trebuchet ms;"> * 0525 - Buntok</span><br /><span style="font-family:trebuchet ms;"> * 0526 - Tamianglayang</span><br /><span style="font-family:trebuchet ms;"> * 0528 - Purukcahu</span><br /><span style="font-family:trebuchet ms;"> * 0531 - Sampit</span><br /><span style="font-family:trebuchet ms;"> * 0532 - Pangkalan Bun, Kumai</span><br /><span style="font-family:trebuchet ms;"> * 0534 - Kendawangan</span><br /><span style="font-family:trebuchet ms;"> * 0536 - Palangkaraya, Kasongan</span><br /><span style="font-family:trebuchet ms;"> * 0537 - Kualakurun</span><br /><span style="font-family:trebuchet ms;"> * 0538 - Kualapembuang</span><br /><span style="font-family:trebuchet ms;"> * 0539 - Kualakuayan</span><br /><br /><span style="font-family:trebuchet ms;">Kalimantan Selatan</span><br /><br /><span style="font-family:trebuchet ms;"> * 0511 - Banjarmasin, Banjarbaru, Martapura, Marabahan</span><br /><span style="font-family:trebuchet ms;"> * 0512 - Pelaihari</span><br /><span style="font-family:trebuchet ms;"> * 0517 - Kandangan, Barabai, Rantau, Negara</span><br /><span style="font-family:trebuchet ms;"> * 0518 - Kotabaru, Batulicin</span><br /><span style="font-family:trebuchet ms;"> * 0526 - Tanjung</span><br /><span style="font-family:trebuchet ms;"> * 0527 - Amuntai</span><br /><br /><span style="font-family:trebuchet ms;">Kalimantan Timur</span><br /><br /><span style="font-family:trebuchet ms;"> * 0541 - Samarinda, Tenggarong</span><br /><span style="font-family:trebuchet ms;"> * 0542 - Balikpapan</span><br /><span style="font-family:trebuchet ms;"> * 0543 - Tanahgrogot</span><br /><span style="font-family:trebuchet ms;"> * 0545 - Melak</span><br /><span style="font-family:trebuchet ms;"> * 0548 - Bontang</span><br /><span style="font-family:trebuchet ms;"> * 0549 - Sangatta</span><br /><span style="font-family:trebuchet ms;"> * 0551 - Tarakan</span><br /><span style="font-family:trebuchet ms;"> * 0552 - Tanjungselor</span><br /><span style="font-family:trebuchet ms;"> * 0553 - Malinau</span><br /><span style="font-family:trebuchet ms;"> * 0554 - Tanjungredeb</span><br /><span style="font-family:trebuchet ms;"> * 0556 - Nunukan</span><br /><br /><span style="font-family:trebuchet ms;">Sulawesi Utara</span><br /><br /><span style="font-family:trebuchet ms;"> * 0430 - Amurang</span><br /><span style="font-family:trebuchet ms;"> * 0431 - Manado, Tomohon, Tondano</span><br /><span style="font-family:trebuchet ms;"> * 0432 - Tahuna</span><br /><span style="font-family:trebuchet ms;"> * 0434 - Kotamobagu</span><br /><span style="font-family:trebuchet ms;"> * 0438 - Bitung</span><br /><br /><span style="font-family:trebuchet ms;">Gorontalo</span><br /><br /><span style="font-family:trebuchet ms;"> * 0435 - Gorontalo, Limboto</span><br /><span style="font-family:trebuchet ms;"> * 0443 - Marisa</span><br /><br /><span style="font-family:trebuchet ms;">Sulawesi Tengah</span><br /><br /><span style="font-family:trebuchet ms;"> * 0450 - Parigi</span><br /><span style="font-family:trebuchet ms;"> * 0451 - Palu</span><br /><span style="font-family:trebuchet ms;"> * 0452 - Poso</span><br /><span style="font-family:trebuchet ms;"> * 0453 - Tolitoli</span><br /><span style="font-family:trebuchet ms;"> * 0457 - Donggala</span><br /><span style="font-family:trebuchet ms;"> * 0458 - Tentena</span><br /><span style="font-family:trebuchet ms;"> * 0461 - Luwuk</span><br /><span style="font-family:trebuchet ms;"> * 0462 - Banggai</span><br /><span style="font-family:trebuchet ms;"> * 0463 - Bunta</span><br /><span style="font-family:trebuchet ms;"> * 0464 - Ampana</span><br /><span style="font-family:trebuchet ms;"> * 0465 - Kolonedale</span><br /><br /><span style="font-family:trebuchet ms;">Sulawesi Barat</span><br /><br /><span style="font-family:trebuchet ms;"> * 0422 - Majene</span><br /><span style="font-family:trebuchet ms;"> * 0426 - Mamuju</span><br /><span style="font-family:trebuchet ms;"> * 0428 - Polewali</span><br /><br /><span style="font-family:trebuchet ms;">Sulawesi Selatan</span><br /><br /><span style="font-family:trebuchet ms;"> * 0411 - Makassar, Maros, Sungguminasa</span><br /><span style="font-family:trebuchet ms;"> * 0413 - Bulukumba</span><br /><span style="font-family:trebuchet ms;"> * 0414 - Bantaeng (Selayar)</span><br /><span style="font-family:trebuchet ms;"> * 0417 - Malino</span><br /><span style="font-family:trebuchet ms;"> * 0418 - Takalar</span><br /><span style="font-family:trebuchet ms;"> * 0419 - Janeponto</span><br /><span style="font-family:trebuchet ms;"> * 0420 - Enrekang</span><br /><span style="font-family:trebuchet ms;"> * 0421 - Parepare, Pinrang</span><br /><span style="font-family:trebuchet ms;"> * 0422 - Manene</span><br /><span style="font-family:trebuchet ms;"> * 0423 - Makale, Rantepao</span><br /><span style="font-family:trebuchet ms;"> * 0427 - Barru</span><br /><span style="font-family:trebuchet ms;"> * 0428 - Wonomulyo</span><br /><span style="font-family:trebuchet ms;"> * 0471 - Palopo</span><br /><span style="font-family:trebuchet ms;"> * 0473 - Masamba</span><br /><span style="font-family:trebuchet ms;"> * 0481 - Watampone</span><br /><span style="font-family:trebuchet ms;"> * 0482 - Sinjai</span><br /><span style="font-family:trebuchet ms;"> * 0484 - Watansoppeng</span><br /><span style="font-family:trebuchet ms;"> * 0485 - Sengkang</span><br /><br /><span style="font-family:trebuchet ms;">Sulawesi Tenggara</span><br /><br /><span style="font-family:trebuchet ms;"> * 0401 - Kendari</span><br /><span style="font-family:trebuchet ms;"> * 0402 - Baubau</span><br /><span style="font-family:trebuchet ms;"> * 0403 - Raha</span><br /><span style="font-family:trebuchet ms;"> * 0404 - Wanci</span><br /><span style="font-family:trebuchet ms;"> * 0405 - Kolaka</span><br /><span style="font-family:trebuchet ms;"> * 0408 - Unaaha</span><br /><br /><span style="font-family:trebuchet ms;">Maluku dan Maluku Utara</span><br /><br /><span style="font-family:trebuchet ms;"> * 0910 - Bandaneira</span><br /><span style="font-family:trebuchet ms;"> * 0911 - Ambon</span><br /><span style="font-family:trebuchet ms;"> * 0913 - Namlea</span><br /><span style="font-family:trebuchet ms;"> * 0914 - Masohi</span><br /><span style="font-family:trebuchet ms;"> * 0915 - Bula</span><br /><span style="font-family:trebuchet ms;"> * 0916 - Tual</span><br /><span style="font-family:trebuchet ms;"> * 0917 - Dobo</span><br /><span style="font-family:trebuchet ms;"> * 0918 - Saumlaku</span><br /><span style="font-family:trebuchet ms;"> * 0921 - Soasiu</span><br /><span style="font-family:trebuchet ms;"> * 0922 - Jailolo</span><br /><span style="font-family:trebuchet ms;"> * 0923 - Morotai</span><br /><span style="font-family:trebuchet ms;"> * 0924 - Tobelo</span><br /><span style="font-family:trebuchet ms;"> * 0927 - Labuha</span><br /><span style="font-family:trebuchet ms;"> * 0929 - Sanana</span><br /><span style="font-family:trebuchet ms;"> * 0931 - Saparua</span><br /><br /><span style="font-family:trebuchet ms;">Papua dan Irian Jaya Barat</span><br /><br /><span style="font-family:trebuchet ms;"> * 0901 - Timika, freeport, Tembagapura</span><br /><span style="font-family:trebuchet ms;"> * 0902 - Agats (Asmat)</span><br /><span style="font-family:trebuchet ms;"> * 0951 - Sorong</span><br /><span style="font-family:trebuchet ms;"> * 0952 - Teminabuan</span><br /><span style="font-family:trebuchet ms;"> * 0955 - Bintuni</span><br /><span style="font-family:trebuchet ms;"> * 0956 - Fakfak</span><br /><span style="font-family:trebuchet ms;"> * 0957 - Kaimana</span><br /><span style="font-family:trebuchet ms;"> * 0966 - Sarmi</span><br /><span style="font-family:trebuchet ms;"> * 0967 - Jayapura, Abepura</span><br /><span style="font-family:trebuchet ms;"> * 0969 - Wamena</span><br /><span style="font-family:trebuchet ms;"> * 0971 - Merauke</span><br /><span style="font-family:trebuchet ms;"> * 0975 - Tanahmerah</span><br /><span style="font-family:trebuchet ms;"> * 0980 - Ransiki</span><br /><span style="font-family:trebuchet ms;"> * 0981 - Biak</span><br /><span style="font-family:trebuchet ms;"> * 0983 - Serui</span><br /><span style="font-family:trebuchet ms;"> * 0984 - Nabire</span><br /><span style="font-family:trebuchet ms;"> * 0986 - Manokwari</span><br /><br /><span style="font-family:trebuchet ms;">Seluler</span><br /><br /><span style="font-family:trebuchet ms;">Silahkan merujuk ke Kode Area Seluler GSM dan CDMA untuk kode wilayah masing-masing telepon seluler. Empat angka pertama pada nomor telepon seluler merujuk pada operator dari telepon seluler tersebut, seperti:</span><br /><br /><span style="font-family:trebuchet ms;"> * 0811, 0812, 0813, 0852 - Telkomsel</span><br /><span style="font-family:trebuchet ms;"> * 0814, 0815, 0816, 0855, 0856, 0858 - Indosat</span><br /><span style="font-family:trebuchet ms;"> * 0817, 0818, 0819, 0859 - XL</span><br /><span style="font-family:trebuchet ms;"> * 0832 - Lippo Telecom</span><br /><span style="font-family:trebuchet ms;"> * 0888 - Mobile-8</span><br /><span style="font-family:trebuchet ms;"> * 0896 - Tri</span></div></div>eRQeehttp://www.blogger.com/profile/04138933553082003934noreply@blogger.com5