tag:blogger.com,1999:blog-39518431828044005802024-03-13T13:47:00.715-07:00pitrasacha adytia blogPitrasacha Adytiahttp://www.blogger.com/profile/16093495676685831039noreply@blogger.comBlogger12125tag:blogger.com,1999:blog-3951843182804400580.post-78858441050148459632009-12-17T09:09:00.001-08:002009-12-17T09:10:04.618-08:00selamat tahun baru 1 muharramSelamat tahun baru 1 muharram. Semoga hari esok lebih baik dari hari ini.Pitrasacha Adytiahttp://www.blogger.com/profile/16093495676685831039noreply@blogger.com3tag:blogger.com,1999:blog-3951843182804400580.post-18953658561349450322009-05-06T09:19:00.000-07:002009-05-06T10:02:46.759-07:00scalable PHP APPSUntuk membuat aplikasi php yang lebih bagus performance nya, selain dari arsitektur aplikasi dan database nya sendiri, juga perlu kita pikirkan rancangan arsitektur server nya.<br /><br />Berikut rancangan arsitektur server aplikasi PHP yang saya sukai<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_MPtLox4vm-U/SgHB87U59MI/AAAAAAAAABU/VNw09s85WLw/s1600-h/loadBalancing.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 309px; height: 400px;" src="http://4.bp.blogspot.com/_MPtLox4vm-U/SgHB87U59MI/AAAAAAAAABU/VNw09s85WLw/s400/loadBalancing.jpg" alt="" id="BLOGGER_PHOTO_ID_5332756686245065922" border="0" /></a>Dari arsitektur di atas .. setidaknya ada beberapa hal , yang akan saya bahas di artikel selanjutnya :<br /><ol><li>Load balancing dengan nginx<br /></li><li>Apa itu cgi dan fastcgi ? dan mengapa php fastcgi ?</li><li>Mysql master slave replication</li><li>Mysql proxy</li></ol>Pitrasacha Adytiahttp://www.blogger.com/profile/16093495676685831039noreply@blogger.com4tag:blogger.com,1999:blog-3951843182804400580.post-76424461386201905362009-05-05T11:01:00.001-07:002009-05-05T11:09:36.498-07:00PREVENT YOUR PHP APPS, FROM SQL INJECTIONMENURUT SAYA , CARA PALING MUDAH DAN SEDERHANA untuk menghindari sql injection di aplikasi php kita, adalah dengan menggunakan fungsi prepare statement yang di sediakan oleh pdo.<br /><br />Bagi anda yang sudah menggunakan php5, bisa menggunakan pdo lib sebagai layer untuk koneksi aplikasi anda ke database.<br /><br />referensi menarik dari PDO bisa anda baca di http://www.phpro.org/tutorials/Introduction-to-PHP-PDO.html<br /><br />contoh prepare statement<br /><br /><code><code><span style="color: rgb(0, 0, 0);"><span style="color: rgb(0, 119, 0);"> </span><span style="color: rgb(255, 128, 0);">/*** prepare the SQL statement ***/<br /> </span><span style="color: rgb(0, 0, 187);">$stmt </span><span style="color: rgb(0, 119, 0);">= </span><span style="color: rgb(0, 0, 187);">$dbh</span><span style="color: rgb(0, 119, 0);">-></span><span style="color: rgb(0, 0, 187);">prepare</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(221, 0, 0);">"SELECT username FROM tabel_user WHERE password = :pwd"</span><span style="color: rgb(0, 119, 0);">);<br /><br /> </span><span style="color: rgb(255, 128, 0);">/*** bind the paramaters ***/</span><span style="color: rgb(0, 119, 0);"><br /> </span><span style="color: rgb(0, 0, 187);">$stmt</span><span style="color: rgb(0, 119, 0);">-></span><span style="color: rgb(0, 0, 187);">bindParam</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(221, 0, 0);">':pwd'</span><span style="color: rgb(0, 119, 0);">, </span><span style="color: rgb(0, 0, 187);">$password</span><span style="color: rgb(0, 119, 0);">, </span><span style="color: rgb(0, 0, 187);">PDO</span><span style="color: rgb(0, 119, 0);">::</span><span style="color: rgb(0, 0, 187);">PARAM_STR</span><span style="color: rgb(0, 119, 0);">, </span><span style="color: rgb(0, 0, 187);">5</span><span style="color: rgb(0, 119, 0);">);<br /><br /> </span><span style="color: rgb(255, 128, 0);">/*** execute the prepared statement ***/<br /> </span><span style="color: rgb(0, 0, 187);">$stmt</span><span style="color: rgb(0, 119, 0);">-></span><span style="color: rgb(0, 0, 187);">execute</span><span style="color: rgb(0, 119, 0);">();<br /><br /> </span><span style="color: rgb(255, 128, 0);">/*** fetch the results ***/<br /> </span><span style="color: rgb(0, 0, 187);">$result </span><span style="color: rgb(0, 119, 0);">= </span><span style="color: rgb(0, 0, 187);">$stmt</span><span style="color: rgb(0, 119, 0);">-></span><span style="color: rgb(0, 0, 187);">fetchAll</span><span style="color: rgb(0, 119, 0);">();</span></span></code></code><br /><br />kita telah binding :pwd dengan inputan $password di mana masukan yang di bolehkan ada string dengan panjang 5<br /><br />cukup sederhana...Pitrasacha Adytiahttp://www.blogger.com/profile/16093495676685831039noreply@blogger.com0tag:blogger.com,1999:blog-3951843182804400580.post-56790831884541152272009-05-05T10:28:00.000-07:002009-05-05T10:47:25.020-07:00CARA MENGHILANGKAN NOTICE di php 5<span style="font-size:180%;">p</span>hp 5, sekarang itu lebih stritch, kalo variabel tidak di assign di awal, kemudian kita langsung lakukan operasi echo atau print, maka akan muncul notice. Sebenarnya untuk development mode, munculnya notice ini bagus, untuk memberitau ke kita, bahwa variabel kita belum di assign<br /><br />misal jika kita langsung lakukan operasi, echo $nama<br />padahal $nama itu kosong dan belum di define maka pasti muncul notice ...<br /><br />cara penanggulangannya ya deklarasikan dulu<br />$nama = NULL;<br />/* proses php lainnya di sini */<br />echo $nama;<br /><br />pasti gak muncul notice ..., kalo udah kebanyakan kasus seperti ini dan pusing , jadi pengen notice nya dihilangkan yang artinya mau di abaikan saja , ya mau gak mau ubah aja di php.ini nya ... di bagian error reporting nya di set menjadi :<br /><br />error_reporting = E_ALL & ~E_NOTICE<br /><br />artinya semua error tetep di tampilkan kecuali notice opsi ~ itu artinya negasi, atau tidak di tampilkan. walaupun cara ini sebenarnya tidak recommended untuk development mode. untuk option error_reporting ini ada beberapa di antarnya<br /><ol><li>E_ALL, maka akan menampilkan semua error dan warning dari script php kita</li><li>E_ERROR, akan menampilkan hanya fatal error dari script kita</li><li>E_WARNING, akan menampilkan warning dari script kita</li><li>E_NOTICE, menampilkan notice dari script kita</li></ol>kalo untuk tahap development saya, biasanya saya menggunakan<br /><br />error_reporting = E_ALL & E_NOTICEPitrasacha Adytiahttp://www.blogger.com/profile/16093495676685831039noreply@blogger.com1tag:blogger.com,1999:blog-3951843182804400580.post-3950504686047374992009-05-03T21:03:00.000-07:002009-05-04T04:15:33.527-07:00ORM, DOCTRINE PADA SYMFONY FRAMEWORK<span style="font-size:85%;">NOTE : tulisan ini dengan asumsi pembaca sudah mengerti <a href="http://symfony-project.org/">symfony framework</a></span><br /><br />ketika awal membuat program elfa di kantor kami<br /><a href="http://rizky.prihanto.web.id/">RIZKY</a> menyarankan dengan gigih dan berapi api untuk tidak menggunakan <a href="http://en.wikipedia.org/wiki/Object-relational_mapping">ORM</a>, atau wrapper istilahnya mysql er ...<br /><br />tapi aku tetep kekeuh menggunakan <a href="http://en.wikipedia.org/wiki/Object-relational_mapping">ORM</a> dan doctrine yang terpilih menjadi <a href="http://en.wikipedia.org/wiki/Object-relational_mapping">ORM</a>. alasanku sebenarnya simple saja, kalo mau menggunakan SP ada beberapa masalah berikut :<br /><ol><li>SDM untuk masalah sp sp an ini belum cukup banyak di kantor kamu, dan untuk elfa ini SDM yang terlibat mencar mencar, artinya gak cuman megang elday tok, kecuali <a href="http://www.enjoybarengtika.com/">tika</a> yang saat ini idle terus gw pinjam, menjadi query er juga tapi tentu saja dengan doctrine</li><li>Berbeda dengan risma, <a href="http://rizky.prihanto.web.id/">om rq</a> bisa terus memonitor sp sp nya dia, melakukan testing, hingga menemukan beberapa bug punya nya <a href="http://akang-nduk.com/">ucil</a>. Nah untuk elfa ini aku khawatir gak bisa di monitor sampai sedetail itu</li><li>Ada kondisi SDM harus bertukar tukar. <a href="http://www.facebook.com/profile.php?id=1437949217">miftah</a> dan <a href="http://www.facebook.com/profile.php?id=699652537">sulis</a> masih harus di sicerdas, jika suatu saat kondisi terburuk katakan lah aku yang harus menggantikan, aku lebih suka mendebug function di model layer php daripada harus mendebug SP. karena tools profiling di doctrine ini cukup mendukung untuk melakukan debuging. Dan aku yakin SDM yang available sekarang lebih suka mendebugnya di level PHP :)<br /></li></ol>dan setelah membaca blog dari mysql performance blog, ada yang menyarankan menggunakan "wrapper PDO", karena tools untuk profiling nya cukup banyak, mulai dari log query , execution time, terus penanganan DIRTY QUERY, dan inputan untuk menghindari mysql injection...., doctrine adalah ORM yang menggunakan lib pdo<br /><br />Dengan kata lain DOCTRINE akan mengeliminir kesalahan kesalahan programer untuk melakuan DIRTY QUERY ... dan memudahkan debuging dengan ada nya profiling toolsnya ... dan bukan hanya itu kita juga bisa melakukan unit testing untuk masing masing function nya. Ini ... yang akan aku bahas di tulisan ini juga<br /><br />Bagiku ada cons dan pros nya menggunakan ORM atau TIDAK, business layer di DBMS atau di PHP. tapi untuk memudahkan monitoring kita harus memilih salah satu, jangan pakek dua dua nya, manage nya bakal ribet ... kalo makek ORM dan business layernya di PHP, ya gunakan lah itu terus sebisa mungkin di project itu jangan di campur dengan menulis logic di DBMS nya<br />kalo udah nulis logic di DBMS nya, ya tulislah logic nya di DBMS nya , jangan di campur nulis logic di PHP nya ...<br /><br />untuk program elfa ini, miftah dan tika benar benar aku paksa menuliskan logic nya pada business layer nya yang sudah disediakan doctrine. Ini habit coding yang harus di galakkan ...<br /><br />JADI kita punya 2 miniatur project di sini, elfa dengan PHP business logic, dan RISMA dengan DBMS business logic.<br /><br />comment ku selama ini untuk make <a href="http://en.wikipedia.org/wiki/Object-relational_mapping">ORM</a> ... gak sempurna , masih banyak kekurangan di sana sini .. dan karena ORM ini diharapkan mampu kompatibel dengan berbagai DBMS harga yang harus di bayar adalah kita gak bisa menggunakan function specific dari DBMS ... , tapi Doctrine versi terakhir sudah bisa , dengan jalan kita ngasih flag dulu, kalo kita mau makek MYSQL oleh karena itu ijinkan untuk menggunakan function specific dari MYSQL ...gitu... akhirnya bisa di panggil function nya itu..<br /><br />Untuk doctrine ...<br />ada 3 macam data yang bisa kita buat di fixtures.yml<br /><ol><li> initiate data, ini adalah data inisialisasi yang harus di isikan agar sistem berjalan</li><li>test data, ketika kita ingin melakukan unit testing pada function logic kita, tentu saja kita butuh tabel kita itu kosong untuk kemudian di isi data testing kemudian di lakukan unit testing , pasti ada data yang ke insert, ke update, ke delete. pada tiap automated testing data ini akan selalu di truncate dan di isi lagi dengan data testing untuk di testing</li><li>user data, ini adalah data real dari user ketika data sudah masuk production.<br /></li></ol>Oleh karena itu framework apapun baik itu symfony, ruby on rails, java ... khan pada dasarnya adalah best practise pengalaman para programmer2 yang membuat framework itu. Dan mereka selalu menyediakan 3 environment database :<br /><br />1. production<br />2. test<br />3. development<br /><br /><span style="font-weight: bold;"><br /></span>Pitrasacha Adytiahttp://www.blogger.com/profile/16093495676685831039noreply@blogger.com1tag:blogger.com,1999:blog-3951843182804400580.post-91314396386431300372009-05-03T20:16:00.001-07:002009-05-04T05:32:35.214-07:00ISOLATION LEVEL di MYSQL<span style="font-size:180%;">D</span>alam menyambut pembuatan program program MLM yang bernama **** di kantor saya yang bakal menjadi tandingan situs aplikasi binary nya DBS ,<br />saya sempat berdiksusi ama rekan kerja dan juga Master MySQL kita bung <a href="http://rizky.prihanto.web.id/">rizky prihanto</a>, yang kebetulan hari ini lagi jadi pembicara bagi komunitas mysql. ada beberapa hal menarik<br /><br />Dulu bung <a href="http://rizky.prihanto.web.id/">rizky</a> pernah bilang kepada daku mengenai mekanisme transaksi di mysql untuk progam **** yang kita sedang develop ini. Kalau tidak salah, dulu kami sempat di bahas mengenai mekanisme locking table, di mana default dari INNODB adalah kalo tabel itu di select maka akan secara otomatis tabel tersebut locking.<br /><br />Coba baca manual mysql dikit dikit, ternyata bener ketika di select dulu, maka tabel itu akan ke lock tapi ... bagi temen temen yang belum tau,<br />patut di ketahui bahwa mekanisme itu terjadi dalam ruang lingkup :<br /><ol><li>statement transaction</li><li>tabel yang ke lock itu tergantung pada tipe isolation levelnya, pada kasus isolation level repeatble read, read commited dan unread commited, operasi select tidak akan melock table, tapi operasi update otomatis akan melocking tabel , nah pada isolation level serializable, operasi select akan melakukan locking table.<br /></li></ol>oke muncul kata kata aneh ya.<br /><br />1. START TRANSACTION<br />2. COMMIT<br />3. SAVEPOINT<br />4. ROLLBACK TO SAVEPOINT<br />5. ROLLBACK<br />6. INSERT DELAYED<br />7. SNAPSHOT<br />8. SERIALIZABLE<br />9. TRANSACTION ISOLATION LEVEL<br /><br />nah email ini ... akan membahas beberapa di antaranya yaitu <span style="font-weight: bold;">START TRANSACTION, COMMIT, ROLLBACK </span>dan<span style="font-weight: bold;"> TRANSACTION ISOLATION LEVEL.</span><br /><br /><span style="font-weight: bold;">TRANSACTION ISOLATION LEVEL</span><br /><br />seperti yang dulu pernah di bahas sama master DBMS kita di stt telkom <a href="http://www.facebook.com/people/Dhinta-Darmantoro/1294852210">bapak dhinta darmontoro</a>, dan bagi kelas malam yang sekelas sama aku, pasti gak asing sama istilahh ini, karena dulu ada kerja lab nya ... ya salah satunya mendemo kan mekanisme isolation level, tapi pada waktu itu menggunakan ORACLE, bukan MYSQL. Bagaimana dengan MYSQL, gak jauh berbeda ternyata<br /><br />ISOLATION LEVEL TERBAGI MENJADI<br /><br />1. READ COMMITED,<br />2. UNREAD COMMITED,<br />3. REPEATABLE READ<br />4. SERIALIZABLE<br /><br />Nah kita coba satu satu aja ya ...<br /><br />kita mulai dari default nya INNODB dulu <span style="font-weight: bold;"><br /><br /><span style="font-size:180%;">REPEATABLE READ</span></span><br /><br />kita liat dulu dengan menuliskan sintaks berikut ini<br /><br />SELECT @@tx_isolation;<br />+-----------------+<br />| @@tx_isolation |<br />+-----------------+<br />| REPEATABLE-READ |<br />+-----------------+<br />1 row in set (0.00 sec)<br /><br />ya sudah REPEATABLE READ<br /><br />aku coba buka 2 console di kubuntu ku agar bisa menjalankan 2 transaksi yang berbeda.<br /><br /><span style="font-weight: bold;">REPEATABLE READ KASUS 1</span><br /><br />Transaksi 1 :<br /><br /><span style="font-weight: bold; color: rgb(0, 0, 153);">trx1</span> mysql> begin;<br />Query OK, 0 rows affected (0.00 sec)<br /><br /><span style="font-weight: bold; color: rgb(0, 0, 153);">trx1</span> mysql> select * from mysaldo;<br />+-------+<br />| saldo |<br />+-------+<br />| 100 |<br />+-------+<br />1 row in set (0.00 sec)<br /><br /><span style="font-weight: bold; color: rgb(0, 0, 153);">trx1</span> mysql> update mysaldo set saldo = saldo + 100;<br />Query OK, 1 row affected (0.00 sec)<br />Rows matched: 1 Changed: 1 Warnings: 0<br /><br /><span style="font-weight: bold; color: rgb(0, 0, 153);">trx1</span> mysql> select * from mysaldo;<br />+-------+<br />| saldo |<br />+-------+<br />| 200 |<br />+-------+<br />1 row in set (0.00 sec)<br /><br />Transaksi 2 :<br /><br /><span style="font-weight: bold;"><span style="color: rgb(255, 0, 0);">trx2</span> </span>mysql> begin;<br />Query OK, 0 rows affected (0.00 sec)<br /><br /><span style="font-weight: bold; color: rgb(255, 0, 0);">trx2</span><span style="color: rgb(255, 0, 0);"> </span>mysql> select * from mysaldo;<br />+-------+<br />| saldo |<br />+-------+<br />| 100 |<br />+-------+<br />1 row in set (0.00 sec)<br /><br />kita kembali dulu ke Transaksi 1<br /><br />kemudian kita lakukan commit di Transaksi 1<br /><br /><span style="font-weight: bold; color: rgb(0, 0, 153);">trx1</span> mysql> commit;<br />Query OK, 0 rows affected (0.00 sec)<br /><br />lalu kita kembali ke Transaksi 2 dan lakukan select lagi<br /><br /><span style="font-weight: bold; color: rgb(255, 0, 0);">trx2</span> mysql> select * from mysaldo;<br />+-------+<br />| saldo |<br />+-------+<br />| 100 |<br />+-------+<br />1 row in set (0.00 sec)<br /><br />masih 100, karena apa karena di transaksi 2 kita belum melakukan commit<br /><span style="font-weight: bold;">nah inilah yang di sebut REPATABLE READ</span><br />coba lakukan commit ...<br /><br /><span style="font-weight: bold; color: rgb(255, 0, 0);">trx2</span> mysql> commit;<br />Query OK, 0 rows affected (0.00 sec)<br /><br /><span style="font-weight: bold; color: rgb(255, 0, 0);">trx2</span> mysql> select * from mysaldo;<br />+-------+<br />| saldo |<br />+-------+<br />| 200 |<br />+-------+<br />1 row in set (0.00 sec)<br /><br /><span style="font-weight: bold;">REPEATABLE READ KASUS 2</span><br /><br />Transaksi 1 :<br /><br />trx1 mysql> begin;<br />Query OK, 0 rows affected (0.00 sec)<br /><br /><br />trx1 mysql> select * from mysaldo;<br />+-------+<br />| saldo |<br />+-------+<br />| 100 |<br />+-------+<br />1 row in set (0.00 sec)<br /><br />trx1 mysql> update mysaldo set saldo = saldo - 50;<br />Query OK, 1 row affected (0.00 sec)<br />Rows matched: 1 Changed: 1 Warnings: 0<br /><br />trx1 mysql> select * from mysaldo;<br />+-------+<br />| saldo |<br />+-------+<br />| 50 |<br />+-------+<br />1 row in set (0.00 sec)<br /><br />NAH SKARANG KITA LIHAT TRANSAKSI 2 YA ...<br /><br />trx2 mysql> begin;<br />Query OK, 0 rows affected (0.00 sec )<br /><br />trx2 mysql> select * from mysaldo;<br />+-------+<br />| saldo |<br />+-------+<br />| 100 |<br />+-------+<br />1 row in set (0.00 sec)<br /><br />trx2 mysql> update mysaldo set saldo = saldo + 200;<br /><br />DIA AKAN MENUNGGU TRANSAKSI 1 MELAKUKAN COMMIT DULU, JADI KONDISINYA TIDAK LANGSUNG MUNCUL PESAN<br />mysql> Query OK, 1 row affected (44.27 sec)<br /><br />NAH SETELAH aku masuk lagi ke Transaksi 1 dan melakukan<br /><br />trx1 mysql> commit;<br />Query OK, 0 rows affected (0.01 sec)<br /><br />MAKA di TRANSAKSI 2<br />baru muncul<br /><br />trx2 Query OK, 1 row affected (44.27 sec)<br />Rows matched: 1 Changed: 1 Warnings: 0<br /><br />trx2 mysql> select * from mysaldo;<br />+-------+<br />| saldo |<br />+-------+<br />| 250 |<br />+-------+<br />1 row in set (0.00 sec)<br /><br /><span style="font-weight: bold;font-size:100%;" >JADI TERNYATA REPEATABLE READ , data yang di baca selalu konsisten</span> , tidak mungkin menghasilkan result/nilai yang berbeda, inti dari repeatble read ini adalah result select selalu konsisten, bukan begitu ? seperti yang terlihat di atas, coba kita bandingkan dengan metode isolation level yang lainnya:<br /><br /><span style="font-weight: bold;font-size:180%;" >READ UNCOMMITED</span><br /><br />kita ubah dulu isolation level dari mysql menjadi read uncommited<br /><br />mysql> SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;<br />Query OK, 0 rows affected (0.00 sec)<br /><br />mysql> SELECT @@GLOBAL.tx_isolation, @@tx_isolation;<br />+-----------------------+-----------------+<br />| @@GLOBAL.tx_isolation | @@tx_isolation |<br />+-----------------------+-----------------+<br />| READ-UNCOMMITTED | REPEATABLE-READ |<br />+-----------------------+-----------------+<br />1 row in set (0.00 sec)<br /><br />yoii sudah sudah ...<br /><br />READ UNCOMMITED KASUS 1<br /><br />Transaksi 1 :<br /><br />trx1 mysql> begin;<br />Query OK, 0 rows affected (0.00 sec)<br /><br />trx1 mysql> select * from mysaldo;<br />+-------+<br />| saldo |<br />+-------+<br />| 100 |<br />+-------+<br />1 row in set (0.00 sec)<br /><br />trx1 mysql> update mysaldo set saldo = saldo + 100;<br />Query OK, 1 row affected (0.00 sec)<br />Rows matched: 1 Changed: 1 Warnings: 0<br /><br />trx1 mysql> select * from mysaldo;<br />+-------+<br />| saldo |<br />+-------+<br />| 200 |<br />+-------+<br />1 row in set (0.00 sec)<br /><br />berhenti sampai sini, transaksi 1 tidak kita commit dulu ... langsung ke transaksi 2<br /><br />trx2 mysql> select * from mysaldo;<br />+-------+<br />| saldo |<br />+-------+<br />| 200 |<br />+-------+<br />1 row in set (0.00 sec)<br /><br />sudah bisa di baca di trx2 walaupun belum di commit lho di trx1<br /><br />kalo aku rollback trx1 , di trx2 result dari select di mysaldo kembali menjadi 100<br /><br />beda khan dengan isolation level repeateble read di atas, oke lanjut ke kasus 2<br /><br />READ UNCOMMITED KASUS 2<br /><br />oke dari read uncommited kasus 1, pikiranku yang agak menggelitik adalah ... misalnya transaksi ku yang pertama menambah jadi 100, jadi saldo ku sekarang adalah 200.<br />dan aku sebagai user sudah bisa langsung lihat ... bahwa duitku sekarang adalah 200, hasil dari penambahan di transaksi 1, walaupun transaksi 1 belum di commit.<br /><br />Nah aku tergoda membelanjakan duitku itu 200 untuk beli pulsa misalnya. Ketika aku mau beli pulsa seharaga 200, tiba tiba trx1 yang penambahan 100 itu rollback bukannya commit ..... lalu gimana dong ????<br /><br />kita coba aja ya ....<br /><br />Transaksi 1 :<br /><br />trx1 mysql> begin;<br />Query OK, 0 rows affected (0.00 sec)<br /><br />trx1 mysql> select * from mysaldo;<br />+-------+<br />| saldo |<br />+-------+<br />| 100 |<br />+-------+<br />1 row in set (0.00 sec)<br /><br />trx1 mysql> update mysaldo set saldo = saldo + 100;<br />Query OK, 1 row affected (0.00 sec)<br />Rows matched: 1 Changed: 1 Warnings: 0<br /><br />stop gak di commit dulu pindah ke transaksi 2<br /><br />Transaksi 2 :<br /><br />mysql> begin;<br />Query OK, 0 rows affected (0.00 sec)<br /><br />mysql> select * from mysaldo;<br />+-------+<br />| saldo |<br />+-------+<br />| 200 |<br />+-------+<br />1 row in set (0.00 sec)<br /><br />mysql> update mysaldo set saldo = saldo - 200;<br /><br /><span style="font-weight: bold;">UPDATE INI TERNYATA TIDAK BISA ... DIA STATUS NYA WAITING TRANSAKSI 1 COMMIT DULU ATAU ROLLBACK,<br />KALO TRANSAKSI 1 COMMIT artinya PROSES BENER GAK ADA YANG SALAH, SALDO KU SEKARANG JADI 0 ...<br />TAPI KALO TERNYATA TRANSAKSI 1 ROLLBACK , apakah yang akan terjadi ???</span><br /><br />di transaksi 1 kita melakukan rollback :<br /><br />trx1 mysql> rollback;<br />Query OK, 0 rows affected (0.01 sec)<br /><br />INILAH YANG TERJADI DI TRANSAKSI 2 :<br /><br />trx2 mysql> select * from mysaldo;<br />+-------+<br />| saldo |<br />+-------+<br />| -100 |<br />+-------+<br />1 row in set (0.00 sec)<br /><br /><span style="font-weight: bold;">Hasilnya -100<br />untuk itulah isolation level read uncommited ini sering di kenal dengan sebutan DIRTY READ</span><br /><br /><br /><span style="font-weight: bold;font-size:180%;" >READ COMMITED</span><br /><br />mysql> SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;<br />Query OK, 0 rows affected (0.00 sec)<br /><br />mysql> SELECT @@GLOBAL.tx_isolation, @@tx_isolation;<br />+-----------------------+------------------+<br />| @@GLOBAL.tx_isolation | @@tx_isolation |<br />+-----------------------+------------------+<br />| READ-COMMITTED | READ-UNCOMMITTED |<br />+-----------------------+------------------+<br />1 row in set (0.00 sec)<br /><br /><br /><span style="font-weight: bold;">READ COMMITED KASUS 1</span><br /><br />Transaksi 1<br /><br />trx1 mysql> select * from mysaldo;<br />+-------+<br />| saldo |<br />+-------+<br />| 100 |<br />+-------+<br />1 row in set (0.00 sec)<br /><br />trx1 mysql> update mysaldo set saldo = saldo + 100;<br />Query OK, 1 row affected (0.00 sec)<br />Rows matched: 1 Changed: 1 Warnings: 0<br /><br /><span style="font-weight: bold;">STOP JANGAN DI COMMIT DULU .. lanjutkan ke transaksi 2 dulu</span><br /><br />Transaksi 2<br /><br />mysql> begin;<br />Query OK, 0 rows affected (0.00 sec)<br /><br />mysql> select * from mysaldo;<br />+-------+<br />| saldo |<br />+-------+<br />| 100 |<br />+-------+<br />1 row in set (0.00 sec)<br /><br />Kita lihat pada kasus 1 ini tidak ada beda dengan isolation level repeatable read ... hasil transaksi 1 ketika belum di commit tidak bisa di baca di transaksi 2<br />berbeda dengan read uncomited yang sudah langsung bisa di baca di transaksi 2<br /><br />lanjut ...<br /><br />pada transakasi 1 kita melakukan commit<br /><br />trx1 mysql> commit;<br />Query OK, 0 rows affected (0.02 sec)<br /><br />Kita lihat apa yang terjadi di transaksi 2<br /><br />mysql> select * from mysaldo;<br />+-------+<br />| saldo |<br />+-------+<br />| 200 |<br />+-------+<br />1 row in set (0.00 sec)<br /><br />Kita lihat di sini ... level isolation level ini berbeda dengan repeatable read, jika repeatable read kasus seperti ini, di transaksi 2 belum akan kebaca menjadi bernilai 200. tapi masih 100 karena transkasi 2 nya harus di commit dulu juga baru bisa kebaca 200<br /><br />untuk kasus kedua dari model dari read commited ini saya rasa udah terbayang. Yang jelas jika saya di transaksi 1 dapat tambahan 100 dan belum commit<br />maka saya tidak akan bisa membaca saldo saya 200, dan ketika transaksi pertama sudah commit baru terbaca 200, artinya ketika di transaksi kedua 200 ini mau saya habis belanjakan sudah tidak di jumpai masalah pada isolation level read uncommited<br /><br />lanjut pada isolation level terakhir ....<br /><br /><br /><span style="font-weight: bold;font-size:180%;" >SERIALIZABLE</span><span style="font-size:180%;"><br /></span><br />set isolation level jadi serializeable ...<br /><br />nah serializeable ini satu langkah lebih dari pada isolation level repeatable read. karena dengan serializable ini query select sudah di anggap transaksi dan akan melakukan locking tabel. jadi jika pada transaksi 1 kita hanya melakukan select, kemudian di interrupt transaksi kedua dengan melakukan update.<br />maka update di transkasi kedua ini tidak akan jalan sebelum transkasi 1 commit dulu. Di mana hal ini masih memungkinkan jida di lakukan dengan isolation level repeatable read<br /><br />Transaksi 1<br /><br />trx1 mysql> begin;<br />Query OK, 0 rows affected (0.00 sec)<br /><br />trx1 mysql> select * from mysaldo;<br />+-------+<br />| saldo |<br />+-------+<br />| 100 |<br />+-------+<br />1 row in set (0.00 sec)<br /><br />STOP di interrupt transaksi kedua<br /><br />Transaksi 2<br /><br />trx2 mysql> begin;<br /><br />Query OK, 0 rows affected (0.00 sec)<br /><br />trx2 mysql> select * from mysaldo;<br />+-------+<br />| saldo |<br />+-------+<br />| 100 |<br />+-------+<br />1 row in set (0.00 sec)<br /><br />mysql> update mysaldo set saldo = saldo + 100;<br /><br />Nah update ini tidak bisa , karena tabel mysaldo masih ke lock gara gara operasi select pada transaksi 1. Kita lihat dengan demikian upaya modifikasi tabel pada transaksi 2 tidak akan bisa menunggu transaksi 1 commit dulu.<br /><br /><br />aku pribadi masih tetep megang repeatble read, serializeable lebih bagus, tapi lebih banyak menggunakan resource dan punya issue performance ...<br /><br />tapi seperti yang ada dalam forum mysql , kalo urusan nya sudah data penting, WHO CARES ABOUT PERFORMANCE ????<br /><br />tanggapan, pertanyaan ... share, dan koreksi atas tulisan ini ....<br /><br />monggo kita bahas ....Pitrasacha Adytiahttp://www.blogger.com/profile/16093495676685831039noreply@blogger.com0tag:blogger.com,1999:blog-3951843182804400580.post-69483799638121099652007-05-17T17:41:00.000-07:002007-05-17T17:42:22.667-07:00dot project untuk manajemen proyeksatu lagi solusi open sources bagi UKM yang ingin memonitoring sebuah proyek, dan tidak sangup membeli microsof project.... maka silahakan download dotproject<br /><br />Manajemen proyek dengan dot project<br /><br />Untuk menangani proyek baik skala besar maupun skala kecil, diperlukan manajemen proyek yang baik sehingga bisa selesai tepat waktu dan tidak over cost. salah satu untuk menyiasati nya adalah menggunakan dotproject. Dengan dot project kita bisa membagi pekerjaan ke dalam beberapa thread dan di assign siapa yang bertanggung jawab untuk melaksanakannya. Selain itu kita juga bisa menentukan maindays dari thread yang telah kita tentukan .....<br /><br />thread tadi kemudian bisa di update perkembangannya oleh orang yang telah di assign sebagai pengangung jawab thread tadi. Sehingga pengawas project dalam hal ini project manager dapat memonitoring seberapa jauh sudah proyeknya berjalan. Dan bisa mengambil banyak langkah jika ada keterlambatan dalam pengerjaan. di dotproject juga disediakan forum dikusi untuk saling berdikusi tentang project. dot project merupakan aplikasi web based ... sehingga bisa di install di internet jadi sekarang jarak bukan persoalan lagi bagi seorang project manager untuk selalu memonitoring project nya ....<br /><br />Ilustrasi nyata dari dot project :<br /><br />Misal kita menerima project membuat sistem informasi sekolah :<br />Maka menggunakan dot project project manager dapat menetukan tahap tahap pembangunan sistem informasi seperti data gathering, analisa, penyusunan ER, flow chart, kemudian implementasi. thread itu bisa di pecah pecha lagi misalnya analisa terdiri dari pembuatan kuesioner, pengolahan kuesioner dll. Setiap thread tadi dapat di assign ke analis, programmer atau user lainnya sebagai penanggung jawab. Nanti ketika analis , programmer atau pun user lainnya masuk / login ke dot project maka yang tampil adalah daftar perkerjaan yang harus dia lakukan beserta lama waktunya, kemudian mereka bisa update status dari perkerjaan mereka dalam persen. Dengan demikian project manager dapat terus mengamati perkembangan projectnya<br /><br />dotproject saya lihat sudah diterapkan di beberapa software house di indonesia , untuk download dan keterangan lebih lanjut ttg dotproject ada di alamat url ini : http://www.dotproject.net/<br /><br />berikut petikan salah satu testimonial dot project :<br /><br />The Linux Knowledge Base and Tutorial uses dotProject not only as its primary project management tool, but also to store events and other information that we need to keep track of.<br /><br />With all of the features and content we have, running the Linux Tutorial is not an easy task. We are constantly improving and adding to our already extensive offering. When we first started, all of our TODOs were managed with lists in various text files or piles of notes. As the site grew, the number of things we needed to keep track of grew considerably and our so-called management system was obviously not up to the task. After we tried a couple of different project management tools, we finally decided upon dotProject and never looked back.<br /><br />We have defined projects for the major functional and content areas within the Tutorial. These serve to help organize the tasks and sub-tasks. Since we constantly upgrading and improving these site, the individual tasks come and go, but these projects never end. Currently we are managing over 50 project, with 300 tasks. With the limited number of people working on this project, it is still a daunting taks. However, without dotProject it would be near impossible.<br /><br />In gratitude for the work done and how much it is helping us, we have added dotProject to the list of "powered by" icons, which you can find at the bottom of each page. Please visit us when you get a chance by pointing your browser to www.linux-tutorial.info.<br /><br />Thanks for a great product!<br /><br />best regards<br /><br />PitrasachaPitrasacha Adytiahttp://www.blogger.com/profile/16093495676685831039noreply@blogger.com1tag:blogger.com,1999:blog-3951843182804400580.post-73879404633358434672007-05-17T17:27:00.000-07:002007-05-17T17:40:09.305-07:00Google Maps API ....Google Maps API ...<br />Google menyediakan API untuk menampilkan peta pada halaman website. Kabarnya aplikasi ini menggunakan ajax yang merupakan gabungan dari javascript dan xml . Kita bebas menggunakan API dari google ini. Caranya mudah ... tinggal sign up untuk mendapatkan API key dari google di alamat http://www.google.com/apis/maps/signup.html . sesaat setelah kita sign up kemudian kita akan diberi API key yang akan kita embed ke aplikasi kita. saya mendapat key ABQIAAAAFvEXBy-kWNZUwAZB-k650hT0wvkpcIi06gwS5bthpHvLfHdxvxQsS2ta5jLYbn3iasZvOW9yTWV2fg Setelah dapat API key nya ... kita bisa menulis sintaks sederhana demikian :<br /><br />buat script javascript <br /><br /> script src="" file="api&v="2&key="ABQIAAAAFvEXBy-kWNZUwAZB-k650hT0wvkpcIi06gwS5bthpHvLfHdxvxQsS2ta5jLYbn3iasZvOW9yTWV2fg<br /> script<br /> <br />Buat function untuk load map <br /><br /> function load() {<br /> if (GBrowserIsCompatible()) {<br /> var map = new GMap2(document.getElementById("map"));<br /> map.setCenter(new GLatLng(37.4419, -122.1419), 13);<br /> }<br /> }<br /><br />Pada tag body html tambahkan fungsi onload="load()". and the last tambahkan tag div<br /> div id="map" style="width: 800px; height: 600px"<br /> simpan dalam extension .html dari script sederhana diatas maka hasilnya bisa di lihat di alamat berikut : http://www.sicerdas.com/gmap/ untuk keperluan yang lebih kompleks (bahkan bisa membuat tracking system)!!!!. Google menyediakan manual penggunaan API ini!! silahkan ngoprek di alamat ini : http://www.google.com/apis/maps/ kita juga bisa mengganti petanya dengan peta indonesia kok ..., , contoh lainnya adalah http://www.revolucija.hr/gmap/ Oh iya ... kita harus mempunyai IP Public buat menggunakan aplikasi ini ;) ..komentar ku .... aplikasi ini salah satu keunggulan web base aplikasi yang menggunakan ajax ... basisnya web tapi tidak ada refresh , kita juga bisa menggeser geser aplikasi map tsb dengan cepat dan baik .... akan kah aplikasi web akan dapat menggantikan typical aplikasi desktop?? dan apakah ajax itu sebenarnya ....? Kita akan coba bahas pada tulisan selanjutnya ....</p> <p>best regards .....Pitrasacha Adytiahttp://www.blogger.com/profile/16093495676685831039noreply@blogger.comtag:blogger.com,1999:blog-3951843182804400580.post-20848503841877286752007-05-13T19:54:00.000-07:002007-05-14T00:04:20.713-07:00siteMANAGER : PHP framework for php 4 - Introduction of smart formDari semua framework yang bertebaran di internet, hatiku telah jatuh pada siteManager, makin lama ketergantungan dengan framework ini makin menggila ...... sayangnya framework ini untuk php4, untuk bisa jalan di atas php5 ... harus ngoprekkkk jauhh .... cape deyyyyy<br /><br />Kenapa aku butuh framework , bukan kah framework bikin lebih lambat? benar aplikasi dari native coding jauh lebih cepat ketimbang menggunakan framework, tapi lihat dulu skala nya ... dan kepentingannya ...<br /><br />Untuk skala proyek medium yang melibatkan lebih dari 2 programmer, saya jamin menggunakan framework itu recomended. Biasanya style coding masing masing programmer itu khan berbeda beda, nah framework ini setidaknya bisa membuat semacam standar coding, yang di sepakati. Sehingga jika kelak harus gonta ganti programmer ,it's easy .... maintenance pun jadi lebih mudah, walaupun tidak semudah java ya ... hehhe<br /><br />siteManager itu terdiri dari :<br /><ol><li>module system</li><li>template system</li><li>dan code plates</li></ol><span style="font-weight: bold;">MODULE SYSTEM<br /></span>Module adalah inti dari siteManager, module berisi fungsi fungsi , berisi proses, module di siteManager memiliki extension.mod, module merupakan class, dan nama class nya harus sama dengan nama file nya, kayak java gitu ... halah ....<br />Module bisa menggunakan module lain,bisa menggunakan library lain, module yang sudah disediakan siteManager adalah member system, login system, smart grid, smart form, nanti akan kita coba praktek kan. Keistemewaan dari siteManager adalah pada smartGrid dan smartForm nya ... cun abis ,keren<br /><br /><span style="font-weight: bold;">TEMPLATE SYSTEM</span><br />ini mah sama dengan sistem templating lainnya, hanya saja pada siteManager templatenya tidak menyediakan blog untuk perulangan.<br /><br /><span style="font-weight: bold;">CODEPLATE<span style="font-weight: bold;"></span></span><span style="font-weight: bold;"><span style="font-weight: bold;"></span><br /></span>hampir sama dengan template cuman lebih smart, kita bisa menggabungkan module, template, sub template, sub dari sub template<br /><br />Tiga itu inti dari siteManager, sedangkan library lainnya seperti session management(menggunakan database atau file), Koneksi DATABASE(bisa memilih lebih dari satu database ) dan lain lain juga sudah ada ...... dan tinggal gunakan<br /><br />siteManager bisa di dowmload pada situs : <a href="http://www.roadsend.com/">www.roadsend.com</a><br /><br />Cara instalasi dan contoh penggunaan siteManager<br />1. Download dulu siteManager nya<br />2. Setelah itu untuk konfigurasi pada siteManager ada 2 file yang akan kita config :<br /><ul><li>localConfig.xsm</li></ul> ada beberapa yang harus di setting pada localConfig.xsm:<br /> setting direktori modules, lib dan templates<br /> setting koneksi database,kita bisa memiliki lebih dari satu koneksi<br /> setting session management,kita bisa menentukan meggunakan file atau database,keunggulan jika make database adalah ,kita bisa menyimpan apapun termasuk object ke dalam session<span style="font-style: italic;"><section name="sessions"></section></span><span style="font-style: italic;"><var name="containerType" value="database"></var></span><span style="font-style: italic;"><var name="useMemberSystem" value="true"></var></span><span style="font-style: italic;"><var name="forceSessionID" value="false"></var></span><span style="font-style: italic;"><var name="sessionCookie" value="varCookie"></var></span><span style="font-style: italic;"><var name="sessionIDName" value="sID"></var></span><br /><ul><li>globalConfig.xsm</li></ul> Yang paling penting kita setting di sini adalah variabel ini : smRoot, yang menyatakan absolute path dari direktori siteManager<br /><ul><li>common.inc</li></ul> Pada common.inc ini yang paling penting itu kita letakkan di sini adalah : <br /><br /> <span style="font-style: italic;"> require(dirname(__FILE__)."/../siteManager/siteManager.inc");</span><br /><span style="font-style: italic;"> $adminDir = dirname(__FILE__).'/';</span><br /><span style="font-style: italic;"> $SM_siteManager->loadSite($adminDir.'config/localConfig.xsm');</span><br /><span style="font-style: italic;"> $SM_siteManager->dbConnect();</span><br /><span style="font-style: italic;"> // use sessions</span><br /><span style="font-style: italic;"> $SM_siteManager->startSessions();</span><br /><span style="font-style: italic;"> //load member info</span><br /><span style="font-style: italic;"> //$SM_siteManager->sessionH->flushMemberInfo();</span><br /><span style="font-style: italic;"> $memberInfo = $SM_siteManager->sessionH->getMemberData();</span><br /><span style="font-weight: bold;"><br />Buat Module Member Login<br /></span>testing membuat module login system dengan menggunakan library memberSystem yang ada pada siteManager, dan menggunakan smartForm :<br /><br /> <span style="font-style: italic;">$loginForm =& $this->newSmartForm();</span><br /><span style="font-style: italic;"> $loginForm->addDirective('postScript',$_SERVER['REQUEST_URI']);</span><br /><span style="font-style: italic;"> $loginForm->addDirective('requiredBadMsg','Masih kosong,isi dulu');</span><br /><span style="font-style: italic;"> $loginForm->addDirective('showRequiredHelp',true);</span><br /><span style="font-style: italic;"> $loginForm->loadTemplate("loginForm");</span><br /><br /><span style="font-style: italic;"> $un =& $loginForm->add('userName','','text',true);</span><br /><span style="font-style: italic;"> $un->configure(array('size'=>'15','maxLength'=>'10'));</span><br /><br /><span style="font-style: italic;"> $pw =& $loginForm->add('passWord','','text',true);</span><br /><span style="font-style: italic;"> $pw->configure(array('size'=>'15','maxLength'=>'10','passWord'=>true));</span><br /><span style="font-style: italic;"> </span><br /><span style="font-style: italic;"> $loginForm->add("submitButton","","submit");</span><br /><span style="font-style: italic;"> $loginForm->setArgs('submitButton',array('value'=>' Login '));</span><br /><br /><span style="font-style: italic;"> // run the form</span><br /><span style="font-style: italic;"> $loginForm->runForm();</span><br /><br /><span style="font-style: italic;"> // was data verified?</span><br /><span style="font-style: italic;"> if ($loginForm->dataVerified()) {</span><br /><span style="font-style: italic;"> $passMd5 = md5($loginForm->getVar('passWord'));</span><br /><span style="font-style: italic;"> $user = $loginForm->getVar('userName');</span><br /><span style="font-style: italic;"> // attempt to login</span><br /><span style="font-style: italic;"> if ($this->sessionH->attemptLogin($user,$passMd5)) {</span><br /><span style="font-style: italic;"> // they logged in succesfully</span><br /><span style="font-style: italic;"> } else {</span><br /><span style="font-style: italic;"> // unsuccessful login</span><br /><span style="font-style: italic;"> }</span><br /><span style="font-style: italic;"> } else {</span><br /><span style="font-style: italic;"> $this->say($loginForm->output());</span><br /><span style="font-style: italic;"> }</span><br /><br />Gimana dengan smartForm di atas ... gak kelihatan jagoannya ya .... nah sekarang bikin modul registrasi masih dengan smartForm .... biasanya kalo pada registrasi form itu yang perlu di lakukan adalah pengecekan keunikan dari username, terus penulisan alamat email yang benar, pembatasan username, mengambil record dari database ... hal itu cukup mudah menggunakan smartForm<br /><br />Untuk pengecekan field yang tidak boleh kosong cukup begini<br /><span style="font-style: italic;">$newForm->add('userName','Username','text',true,'',array('size'=>'15','maxLength'=>'20'));<br /><span style="font-weight: bold;"><br /></span></span>untuk membatasi karakter yang boleh masuk cukup kasih ereg seperti ini<span style="font-style: italic;"><span style="font-weight: bold;"><br /></span> $newForm->addFilter('userName','preg','Username antara 3 sampai 20 karakter',array('pattern'=>"/^\w{".$this->directive['minUserNameLen'].",".$this->directive['maxUserNameLen']."}\$/"));<br /></span><br />untuk pengecekan keunikan di database kita bisa tambahkan filter seperti ini<br /><span style="font-style: italic;">$newForm->addFilter('userName','dbUnique','Maaf, Username sudah terdaftar',array('tableName'=>$this->directive['tableUser'],'checkField'=>$this->directive['userLoginField']));</span><br /><br />Untuk pengecekan email misalnya ..... cukup begini :<br /><span style="font-style: italic;">$newForm->addFilter('email','email','Alamat email tidak benar'); </span><br /><br />Dan masih banyak lagi fungsi filter lainnya ... dan kita pun bisa bikin sendiri liberary untuk filter ...<br />Form tersebut jika isian tidak sesuai dengan filter nya maka akan memunculkan informasi yang sesuai dengan pesan error yang kita tuliskan juga pada filter itu seperti : maaf username sudah terdaftar ...., simple ,fast !!!<br /><br />Oh ya kurang nih gimana cara menampilkan data dari database ke dalam select box , begini doang<br /><br /><span style="font-style: italic;"> $kota =& $newForm->add('{nama field}','{caption}','dbSelect',false);</span><br /><span style="font-style: italic;"> $kota->configure(array( 'dataBaseID' => {koneksi id database},</span><br /><span style="font-style: italic;"> 'tableName' => {nama tabel},</span><br /><span style="font-style: italic;"> 'whereClause' => {nama tabel}, </span><br /><span style="font-style: italic;"> 'dataField' => {field primary key},</span><br /><span style="font-style: italic;"> 'viewField' => {kolom yang ingin di tampilkan},</span><br /><span style="font-style: italic;"> 'orderBy' => {order by}));</span><br /><br />Yeahhhhhhhhhhhhhhhhh .... smartForm ...........so how about smartGRID...... ntar lagi ahhhhPitrasacha Adytiahttp://www.blogger.com/profile/16093495676685831039noreply@blogger.com0tag:blogger.com,1999:blog-3951843182804400580.post-86885262312683708032007-05-12T18:01:00.000-07:002007-05-12T18:25:23.569-07:00ANDA INGIN KAYA ? BACA TIPS INIDulu aku pernah ketemu dengan seorang pengusaha. AKu kagum dengan ide ide nya, dia penuh dengan ide... aku tanya ke beliau ... PAK apa yang harus saya lakukan agar saya bisa menjadi orang kaya ... beliau bertutur ada 3 syarat yang harus di miliki untuk bisa menjadi kaya pada jaman seperti ini :<br /><ol><li>Kita harus memiliki massa</li><li>Kita harus memiliki produk</li><li>Kita harus memiliki websites</li></ol>Kemaren baru membaca postingan blog dari pak romy <a href="http://romisatriawahono.net/">http://romisatriawahono.net/</a> yang judulnya <span style="font-weight: bold;">6 tahap membangun komunitas maya</span> , saya jadi mikir ternyata yang di maksud pengusaha tadi mungkin senada dengan yang dikatakan pak romy yaitu membangun community building yang menurut pak romi terdiri dari tahapan : <strong>IS</strong>e<strong>S</strong>o<strong>SBI </strong>= <strong>I</strong>dentification - <strong>Se</strong>gmentation - <strong>So</strong>lution - <strong>S</strong>elling - <strong>B</strong>randing - <strong>I</strong>nnovation.<br /><br />Menurut yang saya tangkap dari pengusaha tersebut dengan apa yang dikatakan pak romy sebenarnya sejalan :<br /><ul><li>identification, segementation bisa diartikan : kita harus memiliki massa</li><li>solution : kita harus memiliki produk yang unik</li><li>selling, branding dan innovation : Akan lebih mudah dan cepat jika kita memiliki websites</li></ul>Well menurut kacamata saya itu klop .... tapi melaksanakan hal diatas tentu lah tidak mudah, kadang orang harus bertahun tahun untuk membentuk massa, belom lagi kita menciptakan solution atau create sebuah produk yang sesuai dengan massa tadi, kemudian baru lah kita buat tools pembantunya yaitu websites<br /><br />Websites menghubungkan orang di seluruh dunia, dengan websites kegiatan selling, branding dan innovation tentu akan jauh lebih mudah<br /><br />What the next step? lommm tau .. punya massa aja tidak. <span style="font-weight: bold;">But</span> aku jadi tertarik dengan mengembangkan ekonomi kerakyatan, berapa banyak orang yang yang butuh tanaman obat , tanaman hias yang ada di indonesia dan berapa orang yang bisa memproduksi nya, atau berapa orang yang menyukai hasil kerajinan tangan atau hasil lainnya dari ukm ukm di indonesia, dan berapa banyak ukm yang sanggup menghasilkan produk berkualitas yang sesuai dengan keinginan pasar dunia. Knapa tidak kita ciptakan aja komunitas seperti itu, kita juga bisa bikin semacam etalase bagi yang tertarik dengan membangun sebuah websites, disamping kita memajukan ukm ukm ini ....<br /><br />Gak tau ideku ini udah ada atau beloommm, tapi setelah mendengar dan melihat, banyak hal jadi terpikirkan. SO bagaimana kita bisa menjadi kaya? sebaiknya sih jangan kaya tapi cerdas finansial. Orang kaya bisa membikin yang kaya tambah kaya, yang miskin tambah miskin,sedangkan orang yang cerdas finansial bisa membuat semua orang kaya ....<br /><br />GETO ...... kaliiiiiiiiiiiPitrasacha Adytiahttp://www.blogger.com/profile/16093495676685831039noreply@blogger.com1tag:blogger.com,1999:blog-3951843182804400580.post-59837426908203367052007-05-12T01:48:00.000-07:002007-05-12T18:01:18.981-07:00PROMELA WITH SPIN<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_MPtLox4vm-U/RkWDL0zUSzI/AAAAAAAAAAM/szlJt7gaOrM/s1600-h/promela.JPG"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp2.blogger.com/_MPtLox4vm-U/RkWDL0zUSzI/AAAAAAAAAAM/szlJt7gaOrM/s320/promela.JPG" alt="" id="BLOGGER_PHOTO_ID_5063597595223673650" border="0" /></a><br />PROMELA setauku merupakan bahasa permodelan untuk memodelkan kelakuan sebuah proses atau sistem. Biasanya interaksi antara manusia dan komputer, atau komputer dengan komputer itu enaknya di buat modelnya dulu kali yaaa ... lantas gimana dengan hubungan manusia dengan Tuhan, manusia dengan manusia, dan manusia dengan hewan .... perlu kali yaaaa<br /><br />Tugas Kuliah : Bikin permodelan TFTP menggunakan SPIN ....<br /><br /><br />Instalasi SPIN, mau make xspin gak? kalo mau make xspin kita harus donwload dulu cygwin, install dan sertakan library c compiler dan tcl interpreter. cygwin bisa di download pada url http://www.cygwin.com/, kemudian lakukan instalasi<br /><br />duh ... baiknya pelajari dulu dari contoh yang sudah ada. Vending Machine. Vending machine itu kayak mesin penyedia minuman gituh. Minuman yang di sediakan sesuai dengan coin yang di masukkan ke dalam mesin. Jadi misal kalo kita masukin coin 50 maka yang muncul itu teh, kalo kita masukin coin 100 yang muncul coffee. Di indonesia ada gak ya .... mesin beginian ... yang bisa ngeluarin es dawet basi, es cendol basi, Bakso gituhhh, tapi kalo di indonesia mungkin tanpa masukin coin pun udah ngocor sendiri ... hahaha<br /><br />So let's we start dari deskripsi vending machine di atas maka promela nya bisa seperti ini:<br /><br /><span style="font-style: italic; font-weight: bold;">mtype={coin50,coin100,tea,coffee}</span><br /><span style="font-style: italic; font-weight: bold;">chan coin_channel = [1] of {mtype}</span><br /><span style="font-style: italic; font-weight: bold;">chan drinks_channel = [1] of {mtype}</span><br /><br /><span style="font-style: italic; font-weight: bold;">proctype customer {</span><br /><span style="font-style: italic; font-weight: bold;">if</span><br /><span style="font-style: italic; font-weight: bold;"> :: coin_channel!coin50;drinks_channel?tea;</span><br /><span style="font-style: italic; font-weight: bold;"> :: coin_channel!coin100;drinks_channel?coffee;</span><br /><span style="font-style: italic; font-weight: bold;">fi</span><br /><span style="font-style: italic; font-weight: bold;">}</span><br /><br /><span style="font-style: italic; font-weight: bold;">proctype vender {</span><br /><span style="font-style: italic; font-weight: bold;">if</span><br /><span style="font-style: italic; font-weight: bold;"> ::coin_channel?coin50;drinks_channel!tea;</span><br /><span style="font-style: italic; font-weight: bold;"> ::coin_channel?coin100;drinks_channel!coffee;</span><br /><span style="font-style: italic; font-weight: bold;">fi</span><br /><span style="font-style: italic; font-weight: bold;">}</span><br /><br /><span style="font-style: italic; font-weight: bold;">init{run customer;run vender;}</span><br /><br />Kira kira promela di atas itu kalo di bahasa indonesiakan gini kali ya :<br /><ol><li>customer masukin coin5o => <span style="font-style: italic; font-weight: bold;">coin_channel!coin50</span></li><li>vending machine menerima coin50 => <span style="font-style: italic; font-weight: bold;">coin_channel?coin50</span></li><li>vending machine mengirim tea => <span style="font-style: italic; font-weight: bold;">drinks_channel!tea</span></li><li>customer menerima tea => <span style="font-style: italic; font-weight: bold;">drinks_channel?tea</span></li></ol>sampe sini sih paham .... tapi tugas aku itu TFTP , trivial file transfer protocol, jadi harus baca dulu dokumen rfc 1350. Intinya sih simple ya ada dua proses yaitu WRQ dan RRQ<br /><br />WRQ (Write Request)<br />Client mengirimkan wrq ke server , jika server mengizinkan maka server akan membalas nya dengan ack0, client kemudian akan membalasnya dengan mengirim data0, kemudian server mengirimkan ack1 yang artinya client bisa mengirimkan data1<br /><br />RRQ(Read Request)<br />Bedanya dengan WRQ, jika client mengirimkan RRQ maka server akan langsung memberikan data0<br /><br />Kira kira begitu .... nah gimana sekarang promela nya ... yang sederhana aja ah, kalo yang mendekati real komunikasi FTP nanti tanya ama mas yazid aja ... sekarang yang kira kira aja ....<br />loading dulu ...ahhhh<br /><br />Wah waktunya gak cukup buat loading terlalu lama, FSM nya gak kebayang .... daripada gak ngumpul tugas nih hahahha mendingan aku bikin kayak gini aja :<br /><br />RRQ nya jadi kayak gini<br /><br />Karena aku lom berhasil instalasi xspin , sebab install cygwin aja gagal terus ya terpaksa gak pake xspin<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_MPtLox4vm-U/RkZgEEzUS0I/AAAAAAAAAAU/F3h7Bf5tcM4/s1600-h/scrrrq.JPG"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 199px; height: 251px;" src="http://bp0.blogger.com/_MPtLox4vm-U/RkZgEEzUS0I/AAAAAAAAAAU/F3h7Bf5tcM4/s320/scrrrq.JPG" alt="" id="BLOGGER_PHOTO_ID_5063840454149425986" border="0" /></a><br /><span style="font-style: italic;">mtype = {D</span><span style="font-style: italic;">ATA0,DATA1,RRQ,ACK0,ACK1,DATAreq}</span> <span style="font-style: italic;"><br />chan ch_rrq = [1] of {mtype};</span> <span style="font-style: italic;">chan ch_data = </span><span style="font-style: italic;">[1] of {mtype};</span> <span style="font-style: italic;">chan ch_status = [1] of {mtype};</span> <span style="font-style: italic;">chan SAP1 = [1] of {mtype}; </span> <span style="font-style: italic;">proctype</span><span style="font-style: italic;"> client() {</span> <span style="font-style: italic;"><br />byte state;</span> <span style="font-style: italic;"><br />do</span><br /><span style="font-style: italic;"> ::SAP1?DATAreq;ch_rrq!RRQ;</span><br /> <span style="font-style: italic;">if</span><br /><span style="font-style: italic;"> ::ch_data?DATA0;ch_status!ACK0;</span> <span style="font-style: italic;"> ::ch_data?DATA1;ch_status!ACK1;<br /></span> <span style="font-style: italic;">fi</span> <span style="font-style: italic;"><br />od</span><br /><span style="font-style: italic;">}<br /><br /></span><span style="font-style: italic;">proctype server() {<br /></span><span style="font-style: italic;">do</span> <span style="font-style: italic;"> ::ch_rrq?RRQ->ch_data!DATA0;</span><br /><span style="font-style: italic;">if</span><br /><span style="font-style: italic;"> ::ch_status?ACK0 -> ch_data!DATA1;<br /></span><span style="font-style: italic;">::ch_status?ACK1 -> ch_data!DATA0;<br /></span> <span style="font-style: italic;">fi</span><br /><span style="font-style: italic;">od</span> <span style="font-style: italic;"><br />}</span> <br /><br /><span style="font-style: italic;">proctype user()</span> <span style="font-style: italic;">{</span><br /><span style="font-style: italic;">byte n=0;</span> <span style="font-style: italic;"><br />do<br /></span> <span style="font-style: italic;">::(n <>SAP1!DATAreq;n=n+1</span> <span style="font-style: italic;"><br />::n==10->break</span> <span style="font-style: italic;"><br />od</span><br /><span style="font-style: italic;">}<br /><br /></span> <span style="font-style: italic;">init {run user();run client(</span><span style="font-style: italic;">);run server();}<br /><span style="font-style: italic;"><br /></span></span><br />WRQ nya jadi kayak gini :<br /><br /><span style="font-style: italic;">mtype = {DATA0,DATA1,WRQ,ACK0,ACK1,DATAupload}</span> <span style="font-style: italic;"><br />chan ch_wrq = [1] of {mtype};</span><br /><span style="font-style: italic;">chan ch_data = [1] of {mtype};</span><br /><span style="font-style: italic;">chan ch_status = [1] of {mtype};</span> <span style="font-style: italic;"><br />chan SAP1 = [1] of {mtype}; <br /></span> <span style="font-style: italic;">proctype client() {</span><br /><span style="font-style: italic;">byte state;</span> <span style="font-style: italic;"><br />do</span><br /><span style="font-style: italic;"> ::SAP1?DATAupload</span><span style="font-style: italic;">;ch_wrq!WRQ;</span> <span style="font-style: italic;"> <br />if</span><br /><span style="font-style: italic;"> ::ch_status?ACK0;ch_data!DATA0;</span><br /><span style="font-style: italic;"> ::ch_status?ACK1;ch_data!DATA1;</span> <span style="font-style: italic;"> <br />fi</span><br /><span style="font-style: italic;">od</span> <span style="font-style: italic;"><br />}</span> <br /><br /><span style="font-style: italic;">proctype server() {</span><br /><span style="font-style: italic;">do</span><br /><span style="font-style: italic;"> ::ch_wrq?WRQ->ch_status!ACK0;</span><br /><span style="font-style: italic;">if</span> <span style="font-style: italic;"> <br />::ch_data?DATA0 -> ch_status!ACK1;</span><br /><span style="font-style: italic;"> ::ch_data?DATA1 -> ch_status!ACK0;</span><br /><span style="font-style: italic;">fi</span><br /><span style="font-style: italic;">od</span><br /><span style="font-style: italic;">}<br /><br /></span> <span style="font-style: italic;">proctype user()</span> <span style="font-style: italic;">{</span><br /> <span style="font-style: italic;">byte n=0;</span><br /><span style="font-style: italic;">do</span><br /><span style="font-style: italic;">::(n <>SAP1!DATAupload;n=n+1<br /></span><span style="font-style: italic;">::n==10->break</span> <span style="font-style: italic;"><br />od</span><br /><span style="font-style: italic;">}</span> <br /><br /><span style="font-style: italic;">init {run user();run client();run server();}<span style="font-style: italic;"><br /><br /><span style="font-style: italic;"></span></span></span><span><span>Benar tidaknya gak tau nih ... setidaknya aku sudah mencoba ... nanti kita minta punya mr yazid gimana ......<br />BAKAAAAAAAAAAAAAAAAAAAAAAA<br /></span></span><span style="font-style: italic;"><span style="font-style: italic;"><span style="font-style: italic;"></span><br /><br /></span></span>Pitrasacha Adytiahttp://www.blogger.com/profile/16093495676685831039noreply@blogger.com0tag:blogger.com,1999:blog-3951843182804400580.post-712245213604038522007-05-12T00:51:00.000-07:002007-05-12T00:57:06.572-07:00Securing Your PHP - Register Global Vulnerabilities<p><img src="http://www.capernaum.com.ar/images/php.png" mce_src="http://www.capernaum.com.ar/images/php.png" align="left" height="87" width="167" />Ada bener nya juga kali ya PHP itu singkatan dari <b><i>pretty hard to protect. </i></b>Karena mudah dan menyenangkan nya php untuk di pelajari dan di gunakan sehingga banyak programmer php melupakan keamanan aplikasi yang di buat nya .... sehingga jangan heran jika web berbasis php paling sering kena serangan hack </p><p>Bahkan ada nasihat dari pendekar php, untuk mengurangi agar aplikasi berbasis php itu aman adalah dengan memberikan pendidikan yang baik bagi programmer nya untuk mendesign sebuah aplikasi. Benar boroknya php lagi di bongkar dengan adanya <a href="http://www.php-security.org/" mce_href="http://www.php-security.org/"><b><i>php month of the bugs</i></b></a>, tapi tetep saja penyebab aplikasi terkena hack adalah masalah design aplikasi yang buruk. Apakah php aman untuk digunakan membuat sebuah aplikasi web jawabannya bisa ya , jika kita tepat dalam mengkonfigurasi dan mendesign aplikasi kita, jawabannya bisa tidak jika kita tidak bisa konfigurasi dengan baik dan buruk dalam mendesign aplikasi kita.</p><p>Beberapa hal yang perlu di perhatikan adalah :</p><ul><li>Input Validation</li><li>Cross-Site scripting prevention</li><li>SQL injection</li><li>Preventing code injection</li><li>Command injection</li><li>Session security<br /></li><li>Securing file access</li><li>The last is tips & trick to secure your application</li></ul>Kita coba mulai dari awal saja ahhh yaitu<br /><p><b>Register Globals</b><br /><br />Pada umumnya aplikasi berbasis web selalu menggunakan input data baik GET(via url) maupun POST(via form). Banyak para attacker memanfaatkan hal ini untuk niat niat jahatnya, dengan cara memasukkan inputan yang tidak wajar ...</p><p>Beberapa masalah dengan input di antaranya : </p><p>Bisanya programmer php pemula menggunakan settingan default register_global pada php.ini. Jika register global on artinya variabel yang kita lempar via url akan membuat sebuah variabel sekaligus meng-assign isi dari variabel itu. Sebagai contoh : script.php?mode=secure, maka secara otomatis akan terbentuk variabel $mode dengan value nya 'secure'</p><p>Masalah pertama yang timbul akibat register global ini adalah, <b>dapat terjadi konflik variabel</b> yang masuk. Value yang ada pada sebuah variabel dapat dari berbagai sources, mulai dari GET,POST, cookies, server environment variabel, dan system environment variabel. sebagai contoh, kita melempar variabel $id pada url, dan kita juga memiliki cookies $id, kondisi ini memaksa php melakukan merge, sehingga ada informasi yang hilang, value dari $id jadi bisa tidak valid, misal yang dari url assign $id = 3, sedang cookies mengatakan $id = 5, mana yang akan kita gunakan ???</p><p>Nah itu tampaknya tergantung dari setting gpc_order di php.ini ,gpc = menggambarkan urutan dari prioritas variabel , Get, Post dan Cookies, pada contoh diatas maka $id akan berisi 5, sebab cookies memiliki prioritas lebih tinggi di bandingkan Get ...</p><p>Solusi dari masalah di atas, mungkin dengan memberikan prefix untuk variabel, sebagai contoh variabel dari post kita kasih prefix p jadi $p_id, sedang untuk cookies kita kasih prefix c. Cara ini bisa di lakukan tapi tidak reliabel di terapkan untuk aplikasi yang kompleks dan menggunakan banyak variabel</p><p>Contoh berbahaya dengan membiarkan register_global on adalah script seperti berikut :</p><p><b><i>if (is_authorized_user()) {<br /> $auth = TRUE;<br />}</i></b></p><p><b><i>if ($auth) {<br /> /* display content intended only for authorized users */<br />}</i></b></p><p><br />Dengan memberikan variabel $auth dengan inputan apa pun baik get maupun post maka kita akan bisa masuk sebagai authorized user ... bisa dengan script.php?auth=true, atau dengan menyisipkan input form yang bernama auth dengan value true, contoh .....</p><p>ini sih terjadi karena php tidak bisa/susah mendetect uninitialized variabel. Satu satu nya jalan adalah dengan men-set erorr reporting E_ALL pada php.ini, itu pun dengan batasan akan mengeluarkan error jika php mengeksekusi uninitialized variabel itu.</p><p>OK kita berhasil mendetek uninitialized variabel, tapi itu pun belonnn cukupppp ... aduh capek ya !!! mau bukti lihat script di bawah ini ...</p><p><b><i>$del_user[] = “95”; // add the only desired value <br />foreach ($del_user as $v) { <br /> mysql_query(“DELETE FROM users WHERE id=”.(int)$v);<br />}</i></b></p><p>kita udah assign $del_user khan .... tapi apa yang terjadiii jika dari url kita panggil seperti ini script.php?del_user[]=1&del_user[]=2 ... hahah jadi hancurlah impian kita ... tuhh kannn , gimana menghindarinya sih? sebenarnya simple aja : dengan mendeklarasikan baris </p><p>$del_user =array();</p><p>setidaknya dengan deklarasi seperti itu menghindari injection .. </p><p>Sudah desperate dengan php? jangan dulu, sekarang kita coba solusinya dulu</p><p>An Alternative to Register Globals: Superglobals</p><p>Karena dengan membiar kan register_global aktif menimbulkan bahaya yang sangat mengerikan maka php 4.1 memperkenalkan super global variabel yang terdiri dari $_GET, $_POST, $_COOKIE, $_SERVER, $_ENV, nah silahkan disabled register global anda dan silahkan gunakan super global variabel</p><p>Alternatif lainnya dengan menggunakan constanta, ini bisa menghindari masalah register_global. Lihat contoh ini :</p><p><i><b>define(‘auth’, is_authorized_user());<br />if (auth) {<br /> /* display content intended only for authorized users */<br />}</b> </i></p><p>OK khan .... tapi ... pasti ada tapinya ... jangan pula kayak gini :</p><p><b><i>if (is_authorized_user())<br /> define(‘auth’, TRUE);<br />if (auth) // {<br />/* display content intended only for authorized users */} </i></b></p><p>Kenapa ... sok aja coba karena auth nya itu akan selalu bernilai TRUE, kondisional expression terhadap undefined constant di php itu akan menghasilkan nilai true ... SIAL!!!! masih ada yang sial juga ... nih :</p><p>The $_REQUEST Trojan Horse</p><p>Ok di atas di sebutkan dengan ada nya super global variabel bisa mengatasi masalah dengan register global.... tapi be aware dengan super global variabel yang bernama $_REQUEST ... ini mah sama aja dia gabungin variabel dari post , get dan cookie ....maksudnya sih biar simpel tapiii.... bahaya juga. Bisa aja sih digunakan dengan mengecek dulu variabel yang lainnya ... contoh skrip di bawah ini :</p><p><b><i>if (!empty($_REQUEST[‘id’]) && isset($_COOKIE[‘id’]))<br /> unset($_REQUEST[‘id’]);</i><br />}</b></p><p>Dari skrip di atas jadi di cek dulu $id di cookies ... tapi lieur juga oi aku , mendingan nih ya ... untuk safe nya gini aja lah udah :</p><p><i><b>if (!empty($_GET[‘id’]))<br /> $id = $_GET[‘id’];<br />else if (!empty($_POST[‘id’]))<br /> $id = $_POST[‘id’];<br />else<br /> $id = NULL;</b> </i></p><p>skrip di atas ini lebih secure ketimbang skrip di bawah ini : </p><p><i><b>if (!empty($_REQUEST[‘id’]))<br /> $id = $_REQUEST[‘id’];<br />}</b></i></p><p>OK ... sekarang udah makin berdebar debar ... ini baru secuil saja, tapi ini banyak kita jumpai terjadi pada php pemula ... khan? biasanya php pemula sudah cukup senang dengan jalannya program tapi melupakan hal hal di atas .... itu baru dikittt ... kita akan coba lanjutkan dengan bahasan lainnya .... jangan menyerah HIDUP PHP!!! hidup <b><i>pretty hard to protect </i></b>hahah ...</p><p>Next On Securing Your PHP : INPUT VALIDATION</p>Pitrasacha Adytiahttp://www.blogger.com/profile/16093495676685831039noreply@blogger.com1