<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4136058</id><updated>2011-10-02T18:41:40.357+07:00</updated><category term='music'/><category term='random'/><title type='text'>theWrittenOne</title><subtitle type='html'>-Yet Another Useless Blog-
Random thought, Java, and anything</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://monn.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://monn.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>monn</name><uri>http://www.blogger.com/profile/13979763502469183042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos.friendster.com/photos/34/80/5590843/6528433312778l.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>41</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4136058.post-2494611739209316663</id><published>2010-10-16T06:46:00.002+07:00</published><updated>2010-10-16T07:53:17.993+07:00</updated><title type='text'>Google and Haskell</title><content type='html'>One guy from Google presented something at ICFP10 about haskell usage in production system. Take a look at their &lt;a href="http://k1024.org/%7Eiusty/papers/icfp10-haskell-reagent.pdf"&gt;paper.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4136058-2494611739209316663?l=monn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://monn.blogspot.com/feeds/2494611739209316663/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4136058&amp;postID=2494611739209316663' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/2494611739209316663'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/2494611739209316663'/><link rel='alternate' type='text/html' href='http://monn.blogspot.com/2010/10/google-and-haskell.html' title='Google and Haskell'/><author><name>monn</name><uri>http://www.blogger.com/profile/13979763502469183042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos.friendster.com/photos/34/80/5590843/6528433312778l.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4136058.post-9133980477360576998</id><published>2010-09-08T03:49:00.000+07:00</published><updated>2010-09-08T03:50:43.179+07:00</updated><title type='text'>Numb3r</title><content type='html'>&lt;img src="http://dilbert.com/dyn/str_strip/000000000/00000000/0000000/000000/00000/5000/600/5652/5652.strip.gif" border="0" alt="Dilbert.com" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4136058-9133980477360576998?l=monn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://monn.blogspot.com/feeds/9133980477360576998/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4136058&amp;postID=9133980477360576998' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/9133980477360576998'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/9133980477360576998'/><link rel='alternate' type='text/html' href='http://monn.blogspot.com/2010/09/numb3r.html' title='Numb3r'/><author><name>monn</name><uri>http://www.blogger.com/profile/13979763502469183042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos.friendster.com/photos/34/80/5590843/6528433312778l.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4136058.post-9169028304141472867</id><published>2010-06-21T21:16:00.000+07:00</published><updated>2010-06-21T21:17:56.076+07:00</updated><title type='text'>What's the difference</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://asset.soup.io/asset/0434/5168_109e.jpeg"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 450px; height: 318px;" src="http://asset.soup.io/asset/0434/5168_109e.jpeg" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4136058-9169028304141472867?l=monn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://monn.blogspot.com/feeds/9169028304141472867/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4136058&amp;postID=9169028304141472867' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/9169028304141472867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/9169028304141472867'/><link rel='alternate' type='text/html' href='http://monn.blogspot.com/2010/06/whats-difference.html' title='What&apos;s the difference'/><author><name>monn</name><uri>http://www.blogger.com/profile/13979763502469183042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos.friendster.com/photos/34/80/5590843/6528433312778l.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4136058.post-286811891717046295</id><published>2010-06-21T01:18:00.000+07:00</published><updated>2010-06-21T01:18:15.799+07:00</updated><title type='text'>Greeneries</title><content type='html'>&lt;a href="http://picasaweb.google.com/monang/Greeneries?feat=blogger" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img src="http://lh4.ggpht.com/_utU71Ra7tFA/TB5ZaWL1EJE/AAAAAAAAAnc/hf1YDTLcZ1Y/s160-c/Greeneries.jpg" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4136058-286811891717046295?l=monn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://monn.blogspot.com/feeds/286811891717046295/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4136058&amp;postID=286811891717046295' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/286811891717046295'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/286811891717046295'/><link rel='alternate' type='text/html' href='http://monn.blogspot.com/2010/06/greeneries.html' title='Greeneries'/><author><name>monn</name><uri>http://www.blogger.com/profile/13979763502469183042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos.friendster.com/photos/34/80/5590843/6528433312778l.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_utU71Ra7tFA/TB5ZaWL1EJE/AAAAAAAAAnc/hf1YDTLcZ1Y/s72-c/Greeneries.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4136058.post-4637404164619977006</id><published>2010-06-13T01:20:00.000+07:00</published><updated>2010-06-21T01:20:55.833+07:00</updated><title type='text'>Camera Test</title><content type='html'>&lt;a href="http://picasaweb.google.com/monang/CameraTest?feat=blogger" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img src="http://lh3.ggpht.com/_utU71Ra7tFA/TBazaKpZVNE/AAAAAAAAAjE/tpjJKyDcnaY/s160-c/CameraTest.jpg" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4136058-4637404164619977006?l=monn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://monn.blogspot.com/feeds/4637404164619977006/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4136058&amp;postID=4637404164619977006' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/4637404164619977006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/4637404164619977006'/><link rel='alternate' type='text/html' href='http://monn.blogspot.com/2010/06/camera-test.html' title='Camera Test'/><author><name>monn</name><uri>http://www.blogger.com/profile/13979763502469183042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos.friendster.com/photos/34/80/5590843/6528433312778l.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_utU71Ra7tFA/TBazaKpZVNE/AAAAAAAAAjE/tpjJKyDcnaY/s72-c/CameraTest.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4136058.post-5625517630173223356</id><published>2007-12-17T18:10:00.000+07:00</published><updated>2007-12-17T18:22:11.744+07:00</updated><title type='text'>Cinta Membuat ...</title><content type='html'>&lt;p class="MsoNormal"&gt;&lt;span style="" lang="IN"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="" lang="IN"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="" lang="IN"&gt;Cinta..&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;br /&gt;&lt;span style="" lang="IN"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="IN"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="IN"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="IN"&gt;Membuatku tiba-tiba ingin membuat tulisan ini begitu terbangun dari tidurku...&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="IN"&gt;Membuat banyak hal-hal kecil yang ada di dunia ini menjadi indah...&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="IN"&gt;Membuatku sering tertawa dan tersenyum sendiri...&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="IN"&gt;Membuat sifat kekanakanku muncul dengan sendirinya, tanpa beban, tanpa takut...&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;br /&gt;&lt;span style="" lang="IN"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="IN"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="IN"&gt;Membuatku merasa kasihan pada manusia lain, karena mereka cuma bisa numpang di dunia yang sudah menjadi milik kami ini...&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="IN"&gt;Membuatku nggak bisa menilai perempuan lain secara obyektif, karena udah pasti dialah yang terbaik di mata dan hatiku...&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="IN"&gt;Membuat teman-temanku cemburu padanya, karena alokasi waktuku untuk mereka jadi berkurang...&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="IN"&gt;Membuat aku ngantor jam 4 sore gara-gara menulis ini dan mengacuhkan panggilan pak kosku yang teriak-teriak nanyain aku udah bangun atau belum...&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="IN"&gt;Membuatku bertanya, dia sedang melakukan apa sekarang, udah makan atau belum...&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="IN"&gt;Membuat laba Mobile-8 bertambah...&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;br /&gt;&lt;span style="" lang="IN"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="IN"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="IN"&gt;Membuatku malu...&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="IN"&gt;Mambuatku jadi tambah malu waktu dia bilang dia juga malu...&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="IN"&gt;Membuatku ketawa sendiri waktu menulis dua baris di atas...&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;br /&gt;&lt;span style="" lang="IN"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="IN"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="IN"&gt;Membuatku sadar, bahwa cinta itu terlalu indah untuk ditutup-tutupi...&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="IN"&gt;Membuatku berani membuka bagian hati yang tertutup selama ini...&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="IN"&gt;Membuat harga diriku yang sudah tidak ada sebelumnya, menjadi minus...&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="IN"&gt;Membuat rasa sayang mengalir dengan derasnya, tanpa ragu, tanpa takut melukai...&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="IN"&gt;Membuatku jadi tahu, bahwa banyak hal yang bekerja secara misterius di dunia ini...&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="IN"&gt;Membuatku tambah yakin akan setiap langkah yang kujalani...&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="IN"&gt;Membuatku tidak ingin jadi penghalang baginya untuk melakukan sesuatu yang diinginkannya...&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;br /&gt;&lt;span style="" lang="IN"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="IN"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="IN"&gt;Membuatku menambah beberapa kalimat dalam doaku...&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="IN"&gt;Membuatku semakin bersyukur pada-Nya...&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="IN"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="IN"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="" lang="IN"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="" lang="IN"&gt;Dan membuatku menulis ini dengan kesungguhan hati&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;br /&gt;&lt;span style="" lang="IN"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="IN"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;span style="" lang="IN"&gt;&lt;span style="font-style: italic;"&gt;Aku mencintaimu karena Allah...&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4136058-5625517630173223356?l=monn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://monn.blogspot.com/feeds/5625517630173223356/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4136058&amp;postID=5625517630173223356' title='45 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/5625517630173223356'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/5625517630173223356'/><link rel='alternate' type='text/html' href='http://monn.blogspot.com/2007/12/cinta-membuat.html' title='Cinta Membuat ...'/><author><name>monn</name><uri>http://www.blogger.com/profile/13979763502469183042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos.friendster.com/photos/34/80/5590843/6528433312778l.jpg'/></author><thr:total>45</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4136058.post-2311578478851142785</id><published>2007-10-30T22:40:00.000+07:00</published><updated>2007-10-31T10:33:04.132+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='music'/><title type='text'>about: music</title><content type='html'>&lt;p align="center"&gt;&lt;em&gt;Semakin banyak lagu yang anda dengar pada suatu rentang waktu, semakin sedikit kenikmatan mendengarkan musik yang anda peroleh – Monang's Fifth Theory of Scarcity Value&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Tulisan ini salah satunya ditujukan untuk anak temen saya Renee (who bragged a lot about how great her brand new 80GB iPod compared to my 1 year old 4GB nano with regard to the disk capacity. Thanks anyway for accompanying me that time. I'll ask your father to translate this entry for you). Dasar bule! Berhubung cakep dia saya maapin deh. Terima kasih juga buat mas Manteb yang bersedia memegang "janji antar lelaki"-nya.&lt;/p&gt;&lt;p&gt;Peringatan Pemerintah : Tulisan ini cukup panjang, penulis tidak bertanggung jawab atas segala efek samping yang muncul. Experience may change during reading. Persiapkan mental anda, secangkir minuman hangat, kotak P3K dan kantung plastik in case anda muntah, dan tomat/telur kalo-kalo anda ingin melempari monitor anda. Tarik nafas dalam-dalam, and say Bismillahirahmaanirahiim. Silakan mulai membaca.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;Saya masih ingat masa-masa baru kenalan dengan yang namanya ngedengerin musik secara serius. Kala itu saya masih duduk di bangku SMP (hmm, kok jadi keliatan udah tua ya). Saat itu media untuk memainkan musik masih berupa pita/kaset dan pemutarnya. Karena nggak ada dana untuk beli yang lebih high-end, maka seperangkat alat pemutarnya (berikut ampilfier dan salon/speaker) masih saya pakai sampai kuliah. Saya minta tolong ayah untuk dibawain dari Solo ke Bandung. Bayangkan, besar totalnya sekitar 0.5x1x1m, dan membutuhkan banyak tenaga untuk memindahkannya dari mobil ke kamar kos di lantai dua. Yang pernah main ke kamar kos saya waktu kuliah kebanyakan kagum melihat betapa kuno dan gigantic-nya alat tersebut, jika dibandingkan dengan tape-deck yang banyak dimiliki anak kos saat itu.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Album-album pertama yang saya denger saya embat dari koleksi sepupu saya. Saya masih inget kisahnya. Waktu berkunjung ke rumah sepupu, saya melihat banyak kaset beraliran musik cadas (rock). Saya ingin tahu mengapa banyak sekali teman yang suka mendengarkan musik barat, yang harga satu albumnya saya rasa cukup mahal (bila dibandingkan dengan album lokal). Apakah memang worth the price, atau cuma ikut-ikutan tren biar dibilang gaul, ataukah memang ada alasan lain. Oleh sepupu saya, saya dikasi pinjem Scorpions-The Best Rocker’s Ballads (mbak Nunung dan mbak Nana, you rocks guys!). Album itu memang bisa dibilang udah tua dibanding Crossroad-nya Bon Jovi atau MLTR pada waktu itu, dan saya masih inget nggak ada temen saya yang tahu/pernah denger album-album tersebut. Biarin deh, dibilang kuno dan nggak gaul juga gak ngepek (nggak ngefek ke saya). Yang penting bisa ngedengerin album gratisan, hehe.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Ketika pertama kali mendengarkan The Best Rocker's Ballads, telinga saya langsung bisa merasakan gejolak musik rock yang menghentak dan menggetarkan dada (haha, berlebihan banget yah). Efek metal gitar yang keren, suara pria yang melengking, beat drum yang cepat dan dinamis, langsung terasa catchy. Nuansa panggung rock yang penuh cahaya, ledakan, asap, dan penonton yang berjingkrak dan head-banging terbayang di benak saya. Yap, inilah musik yang bisa menyelamatkan dunia, begitu kata orang. &lt;/p&gt;&lt;p align="center"&gt;&lt;br /&gt;&lt;em&gt;------------------------------------------Break dulu aaaahhh--------------------------------------&lt;br /&gt;Betewe baswe, siapa sih yang pertama kali bilang "Only rock can save the world"? Berlebihan pisan euy. Jelas-jelas yang bisa menyelamatkan dunia itu cuma Piala Dunia. Looooh!!!?&lt;br /&gt;------------------------------------------Lanjuuuuuuuuuuut?--------------------------------------&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;Hebat yah musik itu, bisa membuat manusia yang mendengarnya berimajinasi dan bergaya seperti rocker di kamar yang sengaja ditutup karena malu kalo keliatan orang lain, hehehe. Sayang tidak ada sapu di kamar saya waktu itu, sehingga bantal gulingku tersayang yang jadi gitarnya. Saking senengnya ngedengerin musik, pemutar kaset yang seharusnya dipakai bersama oleh keluarga itu saya monopoli dan pindahin ke kamar saya. Seringkali saya harus rebutan pakai dengan adik saya (yang Slanker pisan waktu itu) dan angkat-angkat dari kamarnya ke kamar saya sampai akhirnya dia beli walkman, hehe.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Kembali ke album (bacanya gak usah pake intonasi ala Tukul yah, udah basi). Satu album itu terus saya putar berulang-ulang saking senengnya, sampai-sampai ada satu lirik lagu (Always Somewhere) yang hafal tanpa melihat cover albumnya. Saya masih inget ada temen yang menyanyikan lagu ini waktu ada tes nyanyi lagu barat untuk mata pelajaran Bahasa Inggris waktu SMP, dan saya ngebantu dia menghafalkan liriknya. Bener-bener aneh deh SMP-ku itu. FYI saya memilih menyanyikan "Happy Birthday" yang disambut ketawa dan cemoohan satu kelas, hehe (secara yang lain lagunya pada keren-keren semua, kaya’ lagu-lagunya Richard Marx atau Bon Jovi).&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Side story : entah sejak kapan, saya menganggap bagian vokal suatu lagu itu sama seperti alat musik lainnya, jadi udah gak peduli lirik lagu lagi. Saya baru sadar hal ini ketika ada temen yang nanyain arti lagu soundtrack Magic Knight Ray Earth-nya Animetal.&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Seiring dengan berlalunya masa, waktu itu saya bertanggungjawab atas lalu-lalang kaset/album dari temen-temen saya ke alat pemutar saya. Maklum, nggak punya banyak uang untuk beli banyak album, jadinya ya pinjem sana pinjem sini bajak sana bajak sini. BTW, saat itu membajak lagu dilakukan dengan menggunakan tape-player dual-head. Saya masih inget karena keterbatasan dana untuk hobi terkadang saya mengkopi lagu dari album yang saya pinjam ke kaset bekas.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Beberapa album yang mengesankan antara lain adalah Metallica-Black Album, The Best-nya Guns 'n' Roses, Surfing With Alien-nya om Joe Satriani (nemu di studio pas abis nge-band), beberapa album Queen, Dewa 19, dan Slank, What's The Story? Morning Glory-nya Oasis, dan beberapa album yang –maaf– tidak dapat saya sebutkan satu-persatu karena keterbatasan RAM di otak saya.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Inti dari beberapa paragraf terakhir ini adalah pengalaman mendengarkan musik yang hanya berupa beberapa album saat itu sangat-sangat mengesankan sekali. Mungkin karena usaha dan pengorbanan yang cukup besar untuk mendengarkan satu lagu atau album saja, alhasil kita sangat puas menikmati hasil usaha kita itu.&lt;/p&gt;&lt;p align="center"&gt;&lt;br /&gt;&lt;em&gt;--------------------------------------Time goes by, it was MP3 era------------------------------&lt;br /&gt;Q : Looooh? Harusnya era CD dulu kan?&lt;br /&gt;A : Sori, untuk menghemat BBM (yang digunakan sebagai bahan bakar pembangkit listrik, dimana listrik digunakan untuk membuat komputer anda bisa menampilkan tulisan ini, yang berarti semakin panjang tulisan semakin panjang waktu nyala komputer anda, sehingga semakin banyak BBM yang dibutuhkan) dan kurangnya pengalaman penulis di bidang per-CD-an, maka diputuskan untuk men-skip era CD.&lt;br /&gt;------------------------------------------Lanjuuuuuuuuuuut?--------------------------------------&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;Pernah mengalami era waktu MP3 pertama kali booming di lingkungan anda? Yang terbayang di otak adalah mengkopi lagu sebanyak-banyaknya begitu lihat komputer temen yang belum dijajah (belum dilihat-lihat koleksi lagu MP3-nya). Koleksi lagu yang menempati &gt;50% harddisk bukan hal yang langka ditemukan di komputer teman-teman saya. Saya selalu berpikir apa iya lagu sebanyak itu didengerin secara seksama? Atau cuma dikumpulin aja untuk menyediakan lapangan pekerjaan (kopi lagu –red) ke temen yang lagi berkunjung dan melihat isi harddisk komputernya. Saat itu banyak sekali lagu-lagu MP3 berkualitas rendah bertebaran dimana-mana. Perkiraan saya, untuk menghemat ongkos produksi, para pembajak tidak hanya menggunakan CD original sebagai sumber untuk dikopi, tapi juga kaset yang diputar dan direkam langsung menggunakan komputer, dengan media penghubung berkualitas rendah. Atau bahkan bukan kaset original, tapi kaset bajakan. Parah bener kan.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Saking boomingnya aktivitas mengkoleksi lagu MP3 waktu itu, di jaringan kampus ada yang membuat mesin pencari khusus MP3. Kalo tidak salah aplikasi itu sampai meng-indeks puluhan ribu lagu yang tersebar di mesin-mesin kampus, mulai dari lagu anak-anak sampai lagu keroncong, mulai dari lagu mellow sampai lagu hoek-hoek (trash metal, yang nyanyi kaya’ orang muntah), mulai dari lagu beraliran etnik sampai lagu beraliran orang-ngomong-terus-ada-musiknya-di-belakang (kaya’ Missy Elliot), mulai dari lagu dengan ukuran 40MB (ok, satu album sih) sampai cuplikan intro Warkop DKI berukuran 100KB (tapi saya nggak tau lagu kontroversial Indonesia Raya-nya om You-Know-Who itu ada atau tidak). Saya masih ingat, hampir setiap PC di lab yang penggunanya menggunakan headset salah satu window browsernya pasti sedang menampilkan aplikasi itu.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Saat itu, kaya’nya orang-orang lebih seneng ngumpulin lagu daripada ngedengerinnya. Kalaupun ngedengerin, paling cuma sekali aja karena banyaknya lagu lain yang ngantri didengerin di playlist winamp-nya. Saya pun juga seperti itu, setiap lagu cuma masuk telinga kiri keluar hidung kanan (saking gak berkesannya hingga otak gak nerusin ke telinga kanan, hehe). Alhasil kalau pergi menghabiskan suara ke karaoke, ya cuma nyanyiin sedikit bagian lagu, terus skip ke lagu selanjutnya. Kasian yah yang susah-susah menciptakan dan mengaransemen lagu, secara lagunya cuma digituin doang. Saya pernah baca di suatu artikel majalah musik, bahwa sebenarnya banyak musisi dan produser yang menyesalkan lagunya didengerin dalam bentuk MP3-nya. Bukan karena mudah dibajak saja, tapi juga karena usaha mereka yang berusaha menciptakan musik sesempurna mungkin jadi tercemari karena nature dari MPEG-1 yang merupakan lossy compression method (yang berarti kemungkinan besar akan ada bagian yang hilang pada saat kompresi dari file wav ke MP3). &lt;/p&gt;&lt;p&gt;Inti dari beberapa paragraf terakhir ini (dejavu yah) adalah mendengarkan banyak lagu yang kita peroleh secara mudah ini terasa kurang mengesankan, atau bahkan mendekati hambar.&lt;/p&gt;&lt;p align="center"&gt;&lt;br /&gt;&lt;em&gt;-----------------------------And there was portable MP3 player era---------------------------&lt;br /&gt;Did you know? MP3 itu cuma amplop, bukan format en/decoding. That's the reason why not every MP3 files can be played on your iPod or _put_your_player here_.&lt;br /&gt;------------------------------------------Lanjuuuuuuuuuuut?--------------------------------------&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;Tiba masa portable MP3 player bertebaran di dunia yang fana ini (naon sih). Ada temen saya yang bilang bahwa jenis portable player yang ada saat ini jumlahnya hampir melebihi jumlah lagu yang bisa diputarnya (gak mungkin banget yah, hehe). Bahkan ada yang berkelakar, saya lupa entah di slashdot atau di mana, bahwa jika saja semua gadget berprosesor bisa terhubung dengan internet, simulasi dan analisa protein folding (yang jadi tugas IBM's BlueGene) bisa selesai dalam waktu sehari saja. Sayang yah, banyak resource komputasi yang seharusnya bisa memberikan kontribusi berarti bagi umat manusia, just ended up for a little thing called entertainment machine (eh wajar ding, senang itu mahal). Loh kok jadi mikir-mikir menyimpang gini sih? Hehe maklum personality saya kan sebagian melancholic juga, wajar dong kalau banyak yang dipikirin.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Tanyakan pada diri anda atau teman anda yang pernah punya portable cassete player, portable CD player, dan portable MP3 player, saat-saat mendengarkan mana yang paling mengesankan? Saya yakin portable CD player lah jawabannya. Mengapa? Karena harga CD mahal dan kualitas lagu yang disimpannya paling bagus. Tapi mengapa kebanyakan orang lebih suka membeli portable MP3 player? Karena lebih bentuknya lebih kecil dan compact? Penampilan? Lagunya yang lebih murah? Mengikuti mode? Fungsinya yang bukan hanya sebagai player? (saya jadi teringat kolega kerja saya yang baru beli audio+video player+recorder+kamera+fm radio, sayang korek api gak included)&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Paragraf di atas terinspirasi dari seorang teman yang berprofesi sambilan sebagai musisi (kalo siang ngemis kalo malem ngamen, hehe becanda), dia masih memakai portable CD player kemana-mana. Tiap kali ditanyain atau disindir, dia selalu jawab "Aku memakai barang hanya karena kegunaannya, dan nggak mau mengorbankan kualitas musik (untuk alasan-alasan di atas)". Keren banget nggak sih? Jadi jika anda bertemu dengan orang yang anda anggap aneh karena memakai headset gede di angkutan umum ato di jalan, bisa jadi orang tersebut "sejenis" dengan teman saya itu.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Yah, nampaknya kita sudah sampai pada penghujung cerita saya kali ini. Tetaplah bersama saya untuk menantikan entri selanjutnya (huuuu), dan berdoalah semoga entri berikutnya tidak berbau komputer lagi (huuuu). Terima kasih atas waktunya, dan sampai jumpa! (sok presenter pisaaaan).&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4136058-2311578478851142785?l=monn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://monn.blogspot.com/feeds/2311578478851142785/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4136058&amp;postID=2311578478851142785' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/2311578478851142785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/2311578478851142785'/><link rel='alternate' type='text/html' href='http://monn.blogspot.com/2007/10/about-music.html' title='about: music'/><author><name>monn</name><uri>http://www.blogger.com/profile/13979763502469183042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos.friendster.com/photos/34/80/5590843/6528433312778l.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4136058.post-3481940474555602560</id><published>2007-09-12T20:25:00.000+07:00</published><updated>2007-09-15T23:02:10.143+07:00</updated><title type='text'>Who’s greatest? Newton or Einstein?</title><content type='html'>Hasil ngobrol dengan mas amdysmax (don’t know what his real name is) :&lt;br /&gt;&lt;br /&gt;amdysmax (2007/09/12 15:44:26): nang menurut loe. who is the greatest newton atau einstein&lt;br /&gt;Monang (2007/09/12 15:44:52): newton kali&lt;br /&gt;Monang (2007/09/12 15:45:08): dari nol soalnya, dari tiada menjadi ada&lt;br /&gt;amdysmax (2007/09/12 15:45:27): punya alasannya?&lt;br /&gt;Monang (2007/09/12 15:45:33): ya itu tadi&lt;br /&gt;amdysmax (2007/09/12 15:46:16): :&lt;br /&gt;Monang (2007/09/12 15:47:07): sama kaya' siapa yg lebih berpengaruh, alonzo church atau james gosling&lt;br /&gt;Monang (2007/09/12 15:47:48): yg satu peletak dasar, yg satu berdiri dan melompat di atas dasar tadi&lt;br /&gt;amdysmax (2007/09/12 15:48:29):  kamu pintar ya.&lt;br /&gt;Monang (2007/09/12 15:48:46): kok bisa?&lt;br /&gt;Monang (2007/09/12 15:49:16): saya mah gobloknya minta ampun, gak bisa dibandingin orang2 tadi &lt;br /&gt;amdysmax (2007/09/12 15:50:02): &lt;br /&gt;Monang (2007/09/12 15:50:16): lagi ngisi kuesioner yah?&lt;br /&gt;amdysmax (2007/09/12 15:51:18): gak.. g cuman kebetulan baca article tadi. ada poll untuk ilmuwan dan untuk public. &lt;br /&gt;amdysmax (2007/09/12 15:51:35): tentanh kontribusi keduanya kepada science dan ke human kind&lt;br /&gt;amdysmax (2007/09/12 15:51:45): dua2 nya di menangin newton. &lt;br /&gt;Monang (2007/09/12 15:51:56): ooh&lt;br /&gt;amdysmax (2007/09/12 15:52:10): agak telak sih... &lt;br /&gt;Monang (2007/09/12 15:52:20): oo&lt;br /&gt;Monang (2007/09/12 15:52:37): einstein dapet poin negatif karena bom atom kali, hehe&lt;br /&gt;amdysmax (2007/09/12 15:52:54): gak.. &lt;br /&gt;Monang (2007/09/12 15:53:02): hehe&lt;br /&gt;amdysmax (2007/09/12 15:53:24): alasannya hanmpoir sama dengan monang tadi &lt;br /&gt;amdysmax (2007/09/12 15:53:47): enstein udah ada dimasa science udah berkembang &lt;br /&gt;amdysmax (2007/09/12 15:54:08): pergerakan atom sendiri kan mengikuti newton. &lt;br /&gt;Monang (2007/09/12 15:54:16): oo&lt;br /&gt;Monang (2007/09/12 15:54:37): sip sip&lt;br /&gt;amdysmax (2007/09/12 15:56:14): coba loe tanya teman2 loe... kalo g semua newton. &lt;br /&gt;Monang (2007/09/12 15:56:34): oo hehe&lt;br /&gt;&lt;br /&gt;Karena gak ingin mati (sesuai peribahasa jawa kuno : curiosity kills the cat), saya coba google tentang artikel yang di-refer masnya tadi. It seems this one was : http://www.royalsoc.ac.uk/news.asp?id=3880&lt;br /&gt;&lt;br /&gt;Sebagai renungan (termasuk untuk saya sendiri). Terkadang di jaman yang sudah serba enak ini, kita melupakan jasa para pahlawan kita. &lt;br /&gt;&lt;br /&gt;Level 1 :&lt;br /&gt;Coba tanyain pada programmer terdekat dengan anda, pernahkah dia mendengar nama-nama seperti Kurt Godel, Alonzo Church, Haskell Curry, atau bahkan Alan Turing?&lt;br /&gt;&lt;br /&gt;Level 2 :&lt;br /&gt;Oke lah kalo gak tau, how ‘bout John Backus, Tony Hoare, Niklaus Wirth, Edsger Dijkstra, Thompson/Kernighan/Ritchie, James Gosling, Gerald Sussman, Guy Steele, Simon Peyton-Jones, Alan Kay, or Bertrand Meyer? &lt;br /&gt;&lt;br /&gt;Level 3 :&lt;br /&gt;Masih gak ada yang pernah denger? Wozniak? Bill Joy? JWZ? Pages n Brin?&lt;br /&gt;&lt;br /&gt;Level 4 :&lt;br /&gt;Kalo masih nggak ya paling-paling “cuma” Bill Gates ato Larry Ellison aja yang dia pernah denger namanya. Hehe.&lt;br /&gt;&lt;br /&gt;Kesimpulan&lt;br /&gt;Weird, isn’t? Nggak juga, karya seseorang lebih mudah diingat daripada namanya. Terima kasih buat mas amdysmax yang membuat saya jadi sadar untuk tidak menggunakan karya saya sebagai media narsisme. (Hehe, kaya’ ada karyanya ajah)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4136058-3481940474555602560?l=monn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://monn.blogspot.com/feeds/3481940474555602560/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4136058&amp;postID=3481940474555602560' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/3481940474555602560'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/3481940474555602560'/><link rel='alternate' type='text/html' href='http://monn.blogspot.com/2007/09/whos-greatest-newton-or-einstein.html' title='Who’s greatest? Newton or Einstein?'/><author><name>monn</name><uri>http://www.blogger.com/profile/13979763502469183042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos.friendster.com/photos/34/80/5590843/6528433312778l.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4136058.post-5339973063281027997</id><published>2007-01-13T22:37:00.000+07:00</published><updated>2007-09-15T23:13:40.878+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='random'/><title type='text'>Kafir</title><content type='html'>Ada hadis yang berbunyi "Man Kafara Muslimin Huwa Kafirun". Arti hadis tersebut adalah jika ada yang menuduh seorang muslim itu kafir, maka tuduhan itu akan berbalik padanya.&lt;br /&gt;&lt;br /&gt;Jika anda menuduh seseorang itu kafir, maka hanya ada dua kemungkinan :&lt;br /&gt;- Orang yang anda tuduh itu memang kafir&lt;br /&gt;- Anda sendiri yang kafir&lt;br /&gt;&lt;br /&gt;Kesimpulan dari tulisan di atas adalah :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Jika anda muslim, jangan pernah menuduh diri anda sendiri sebagai kafir, karena hanya satu kemungkinan yang ada.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Hehe, wagu tenan yoo... tulisan gak berguna.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4136058-5339973063281027997?l=monn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://monn.blogspot.com/feeds/5339973063281027997/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4136058&amp;postID=5339973063281027997' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/5339973063281027997'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/5339973063281027997'/><link rel='alternate' type='text/html' href='http://monn.blogspot.com/2007/01/kafir.html' title='Kafir'/><author><name>monn</name><uri>http://www.blogger.com/profile/13979763502469183042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos.friendster.com/photos/34/80/5590843/6528433312778l.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4136058.post-114078667295192425</id><published>2006-02-24T20:00:00.000+07:00</published><updated>2006-02-24T21:05:39.143+07:00</updated><title type='text'>How to load subclass(es) from your jar file</title><content type='html'>&lt;a href="http://endy.artivisi.com/"&gt;Mr. Endy Muhardin&lt;/a&gt; found problems in finding and loading classes when developing his opensource application. Hope this code will help him. Ganbatte Mas Endy!!&lt;br /&gt;&lt;br /&gt;Here is a simple code to illustrate how to load one or more subclass(es) from a jar file.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;/*&lt;br /&gt;* Created on Feb 24, 2006&lt;br /&gt;*&lt;br /&gt;*/&lt;br /&gt;package com.monn;&lt;br /&gt;&lt;br /&gt;import java.io.File;&lt;br /&gt;import java.net.JarURLConnection;&lt;br /&gt;import java.net.URL;&lt;br /&gt;import java.net.URLClassLoader;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;import java.util.Enumeration;&lt;br /&gt;import java.util.Iterator;&lt;br /&gt;import java.util.List;&lt;br /&gt;import java.util.jar.JarEntry;&lt;br /&gt;import java.util.jar.JarFile;&lt;br /&gt;&lt;br /&gt;import javax.swing.JFileChooser;&lt;br /&gt;import javax.swing.JOptionPane;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* @author Monang Setyawan&lt;br /&gt;*&lt;br /&gt;*/&lt;br /&gt;public class Executor {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public static void main(String[] args) throws Exception {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;new Executor().run();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.exit(0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public void run() throws Exception {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;JFileChooser chooser = new JFileChooser();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String parent;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ((parent = JOptionPane.showInputDialog(null,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"superclass/interface name")) != null) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;File file = chooser.getSelectedFile();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;URL jarUrl = new URL("jar:file:" + file.getAbsolutePath()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;+ "!/");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;JarFile jarFile = ((JarURLConnection) jarUrl.openConnection())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.getJarFile();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;URL[] urls = { file.toURL() };&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;URLClassLoader loader = URLClassLoader.newInstance(urls, Thread&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.currentThread().getContextClassLoader());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;List nameList = getClassNames(jarFile);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (Iterator iter = nameList.iterator(); iter.hasNext();) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String classname = (String) iter.next();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Class clazz = loader.loadClass(classname);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (Class.forName(parent).isAssignableFrom(clazz)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// you've got your class&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(clazz);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private List getClassNames(JarFile jarFile) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;List nameList = new ArrayList();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (Enumeration enum = jarFile.entries(); enum.hasMoreElements();) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;JarEntry entry = (JarEntry) enum.nextElement();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String entryName = entry.getName();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (entryName.endsWith(".class")) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int startPos = entryName.lastIndexOf('.');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String shortName = entryName.substring(0, startPos);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;shortName = shortName.replace('/', '.').replace('\\', '.');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nameList.add(shortName);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return nameList;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;For simple test, you can select any JDBC driver jar file and type in "java.sql.Connection". My code above will try to find any implementations of Connection interface in your jar file.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4136058-114078667295192425?l=monn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://monn.blogspot.com/feeds/114078667295192425/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4136058&amp;postID=114078667295192425' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/114078667295192425'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/114078667295192425'/><link rel='alternate' type='text/html' href='http://monn.blogspot.com/2006/02/how-to-load-subclasses-from-your-jar.html' title='How to load subclass(es) from your jar file'/><author><name>monn</name><uri>http://www.blogger.com/profile/13979763502469183042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos.friendster.com/photos/34/80/5590843/6528433312778l.jpg'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4136058.post-113704340475799062</id><published>2006-01-12T12:17:00.000+07:00</published><updated>2006-02-25T15:12:29.970+07:00</updated><title type='text'>Simple Steve vs Complicated Bill</title><content type='html'>Check out the &lt;a href="http://presentationzen.blogs.com/presentationzen/2005/11/the_zen_estheti.html"&gt;differences&lt;/a&gt; between Steve Jobs and Bill Gates presentation (or also their personality?)style.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4136058-113704340475799062?l=monn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://monn.blogspot.com/feeds/113704340475799062/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4136058&amp;postID=113704340475799062' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/113704340475799062'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/113704340475799062'/><link rel='alternate' type='text/html' href='http://monn.blogspot.com/2006/01/simple-steve-vs-complicated-bill.html' title='Simple Steve vs Complicated Bill'/><author><name>monn</name><uri>http://www.blogger.com/profile/13979763502469183042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos.friendster.com/photos/34/80/5590843/6528433312778l.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4136058.post-113453104407041698</id><published>2005-12-14T10:00:00.000+07:00</published><updated>2005-12-14T17:48:07.480+07:00</updated><title type='text'>Describe Your Instance</title><content type='html'>&lt;p class="MsoNormal"&gt;Although this is a trivial problem, in many situation, we found that it’s convenient to override toString() method and provide the meaningful textual representation of an object. This necessity often be found when we need to provide good logging and error handling facility to our application. Sometimes, we need the String returned by toString() method contains the object’s property (javabean convention). This is the common situation that we’ve often dealt with value objects.&lt;/p&gt;   &lt;p class="MsoNormal"&gt;If that situation occurs repeatedly, we can save our time (and stay in the DRY principle – Don’t Repeat Yourself) by creating a generic utility method that using javabean introspector so that it can be used by more than one classes.&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;Here is the utility class and the method that describe a class that conform javabean convention.&lt;/p&gt;&lt;!--  start of the source file  --&gt;&lt;br /&gt;&lt;pre&gt;&lt;tt class="ln"&gt; 1&lt;/tt&gt;  &lt;span class="key"&gt;package&lt;/span&gt; com&lt;b class="op"&gt;.&lt;/b&gt;monn;&lt;br /&gt;&lt;tt class="ln"&gt; 2&lt;/tt&gt;&lt;br /&gt;&lt;tt class="ln"&gt; 3&lt;/tt&gt;  &lt;span class="key"&gt;import&lt;/span&gt; java&lt;b class="op"&gt;.&lt;/b&gt;beans&lt;b class="op"&gt;.&lt;/b&gt;Introspector;&lt;br /&gt;&lt;tt class="ln"&gt; 4&lt;/tt&gt;  &lt;span class="key"&gt;import&lt;/span&gt; java&lt;b class="op"&gt;.&lt;/b&gt;beans&lt;b class="op"&gt;.&lt;/b&gt;PropertyDescriptor;&lt;br /&gt;&lt;tt class="ln"&gt; 5&lt;/tt&gt;&lt;br /&gt;&lt;tt class="ln"&gt; 6&lt;/tt&gt;  &lt;span class="key"&gt;public&lt;/span&gt; &lt;span class="key"&gt;class&lt;/span&gt; Utility &lt;span class="b1"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt; 7&lt;/tt&gt;&lt;br /&gt;&lt;tt class="ln"&gt; 8&lt;/tt&gt;    &lt;span class="key"&gt;public&lt;/span&gt; &lt;span class="key"&gt;static&lt;/span&gt; String describe&lt;span class="b2"&gt;(&lt;/span&gt;Object o&lt;span class="b2"&gt;)&lt;/span&gt; &lt;span class="b1"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt; 9&lt;/tt&gt;      StringBuffer buffer = &lt;span class="key"&gt;new&lt;/span&gt; StringBuffer&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt;10&lt;/tt&gt;      &lt;span class="key"&gt;try&lt;/span&gt; &lt;span class="b1"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;11&lt;/tt&gt;        Class c = o&lt;b class="op"&gt;.&lt;/b&gt;getClass&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt;12&lt;/tt&gt;&lt;br /&gt;&lt;tt class="ln"&gt;13&lt;/tt&gt;        PropertyDescriptor&lt;span class="b3"&gt;[&lt;/span&gt;&lt;span class="b3"&gt;]&lt;/span&gt; descriptors = Introspector&lt;b class="op"&gt;.&lt;/b&gt;getBeanInfo&lt;span class="b2"&gt;(&lt;/span&gt;c&lt;span class="b2"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;14&lt;/tt&gt;            .getPropertyDescriptors&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt;15&lt;/tt&gt;&lt;br /&gt;&lt;tt class="ln"&gt;16&lt;/tt&gt;        &lt;span class="key"&gt;for&lt;/span&gt; &lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="key"&gt;int&lt;/span&gt; i = &lt;span class="num"&gt;0&lt;/span&gt;; i &lt;b class="op"&gt;&amp;lt;&lt;/b&gt; descriptors&lt;b class="op"&gt;.&lt;/b&gt;length; i&lt;b class="op"&gt;+&lt;/b&gt;&lt;b class="op"&gt;+&lt;/b&gt;&lt;span class="b2"&gt;)&lt;/span&gt; &lt;span class="b1"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;17&lt;/tt&gt;          PropertyDescriptor descriptor = descriptors&lt;span class="b3"&gt;[&lt;/span&gt;i&lt;span class="b3"&gt;]&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt;18&lt;/tt&gt;          buffer&lt;b class="op"&gt;.&lt;/b&gt;append&lt;span class="b2"&gt;(&lt;/span&gt;descriptor&lt;b class="op"&gt;.&lt;/b&gt;getDisplayName&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt;19&lt;/tt&gt;          buffer&lt;b class="op"&gt;.&lt;/b&gt;append&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="str"&gt;" : "&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt;20&lt;/tt&gt;          buffer&lt;b class="op"&gt;.&lt;/b&gt;append&lt;span class="b2"&gt;(&lt;/span&gt;descriptor&lt;b class="op"&gt;.&lt;/b&gt;getReadMethod&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;.invoke&lt;span class="b2"&gt;(&lt;/span&gt;o, &lt;span class="key"&gt;null&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt;21&lt;/tt&gt;          buffer&lt;b class="op"&gt;.&lt;/b&gt;append&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="str"&gt;"\n"&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt;22&lt;/tt&gt;        &lt;span class="b1"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;23&lt;/tt&gt;&lt;br /&gt;&lt;tt class="ln"&gt;24&lt;/tt&gt;      &lt;span class="b1"&gt;}&lt;/span&gt; &lt;span class="key"&gt;catch&lt;/span&gt; &lt;span class="b2"&gt;(&lt;/span&gt;Exception e&lt;span class="b2"&gt;)&lt;/span&gt; &lt;span class="b1"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;25&lt;/tt&gt;        e&lt;b class="op"&gt;.&lt;/b&gt;printStackTrace&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt;26&lt;/tt&gt;      &lt;span class="b1"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;27&lt;/tt&gt;      &lt;span class="key"&gt;return&lt;/span&gt; buffer&lt;b class="op"&gt;.&lt;/b&gt;toString&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt;28&lt;/tt&gt;    &lt;span class="b1"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;29&lt;/tt&gt;&lt;br /&gt;&lt;tt class="ln"&gt;30&lt;/tt&gt;    &lt;span class="key"&gt;public&lt;/span&gt; &lt;span class="key"&gt;static&lt;/span&gt; &lt;span class="key"&gt;void&lt;/span&gt; main&lt;span class="b2"&gt;(&lt;/span&gt;String&lt;span class="b3"&gt;[&lt;/span&gt;&lt;span class="b3"&gt;]&lt;/span&gt; args&lt;span class="b2"&gt;)&lt;/span&gt; &lt;span class="b1"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;31&lt;/tt&gt;      Person p = &lt;span class="key"&gt;new&lt;/span&gt; Person&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt;32&lt;/tt&gt;      p&lt;b class="op"&gt;.&lt;/b&gt;setFirstName&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="str"&gt;"Monang"&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt;33&lt;/tt&gt;      p&lt;b class="op"&gt;.&lt;/b&gt;setLastName&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="str"&gt;"Setyawan"&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt;34&lt;/tt&gt;      System&lt;b class="op"&gt;.&lt;/b&gt;out&lt;b class="op"&gt;.&lt;/b&gt;println&lt;span class="b2"&gt;(&lt;/span&gt;p&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt;35&lt;/tt&gt;    &lt;span class="b1"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;36&lt;/tt&gt;&lt;br /&gt;&lt;tt class="ln"&gt;37&lt;/tt&gt;  &lt;span class="b1"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;!--  end of the source file  --&gt;&lt;/pre&gt;The source code for Person that uses our utility method.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;!--  start of the source file  --&gt;&lt;tt class="ln"&gt; 1&lt;/tt&gt;  &lt;span class="key"&gt;package&lt;/span&gt; com&lt;b class="op"&gt;.&lt;/b&gt;monn;&lt;br /&gt;&lt;tt class="ln"&gt; 2&lt;/tt&gt;&lt;br /&gt;&lt;tt class="ln"&gt; 3&lt;/tt&gt;  &lt;span class="key"&gt;public&lt;/span&gt; &lt;span class="key"&gt;class&lt;/span&gt; Person &lt;span class="b1"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt; 4&lt;/tt&gt;    &lt;span class="key"&gt;private&lt;/span&gt; String firstName;&lt;br /&gt;&lt;tt class="ln"&gt; 5&lt;/tt&gt;&lt;br /&gt;&lt;tt class="ln"&gt; 6&lt;/tt&gt;    &lt;span class="key"&gt;private&lt;/span&gt; String lastName;&lt;br /&gt;&lt;tt class="ln"&gt; 7&lt;/tt&gt;&lt;br /&gt;&lt;tt class="ln"&gt; 8&lt;/tt&gt;    &lt;span class="key"&gt;public&lt;/span&gt; String getFirstName&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt; &lt;span class="b1"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt; 9&lt;/tt&gt;      &lt;span class="key"&gt;return&lt;/span&gt; firstName;&lt;br /&gt;&lt;tt class="ln"&gt;10&lt;/tt&gt;    &lt;span class="b1"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;11&lt;/tt&gt;&lt;br /&gt;&lt;tt class="ln"&gt;12&lt;/tt&gt;    &lt;span class="key"&gt;public&lt;/span&gt; &lt;span class="key"&gt;void&lt;/span&gt; setFirstName&lt;span class="b2"&gt;(&lt;/span&gt;String firstName&lt;span class="b2"&gt;)&lt;/span&gt; &lt;span class="b1"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;13&lt;/tt&gt;      &lt;span class="key"&gt;this&lt;/span&gt;.firstName = firstName;&lt;br /&gt;&lt;tt class="ln"&gt;14&lt;/tt&gt;    &lt;span class="b1"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;15&lt;/tt&gt;&lt;br /&gt;&lt;tt class="ln"&gt;16&lt;/tt&gt;    &lt;span class="key"&gt;public&lt;/span&gt; String getLastName&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt; &lt;span class="b1"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;17&lt;/tt&gt;      &lt;span class="key"&gt;return&lt;/span&gt; lastName;&lt;br /&gt;&lt;tt class="ln"&gt;18&lt;/tt&gt;    &lt;span class="b1"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;19&lt;/tt&gt;&lt;br /&gt;&lt;tt class="ln"&gt;20&lt;/tt&gt;    &lt;span class="key"&gt;public&lt;/span&gt; &lt;span class="key"&gt;void&lt;/span&gt; setLastName&lt;span class="b2"&gt;(&lt;/span&gt;String lastName&lt;span class="b2"&gt;)&lt;/span&gt; &lt;span class="b1"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;21&lt;/tt&gt;      &lt;span class="key"&gt;this&lt;/span&gt;.lastName = lastName;&lt;br /&gt;&lt;tt class="ln"&gt;22&lt;/tt&gt;    &lt;span class="b1"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;23&lt;/tt&gt;&lt;br /&gt;&lt;tt class="ln"&gt;24&lt;/tt&gt;    &lt;span class="key"&gt;public&lt;/span&gt; String toString&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt; &lt;span class="b1"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;25&lt;/tt&gt;      &lt;span class="key"&gt;return&lt;/span&gt; Utility&lt;b class="op"&gt;.&lt;/b&gt;describe&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="key"&gt;this&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt;26&lt;/tt&gt;    &lt;span class="b1"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;27&lt;/tt&gt;  &lt;span class="b1"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The output when running Utility.class :&lt;br /&gt;&lt;br /&gt;&lt;!--  end of the source file  --&gt;class : class com.monn.Person&lt;br /&gt;firstName : Monang&lt;br /&gt;lastName : Setyawan&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4136058-113453104407041698?l=monn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://monn.blogspot.com/feeds/113453104407041698/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4136058&amp;postID=113453104407041698' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/113453104407041698'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/113453104407041698'/><link rel='alternate' type='text/html' href='http://monn.blogspot.com/2005/12/describe-your-instance.html' title='Describe Your Instance'/><author><name>monn</name><uri>http://www.blogger.com/profile/13979763502469183042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos.friendster.com/photos/34/80/5590843/6528433312778l.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4136058.post-113455885673233632</id><published>2005-11-20T17:55:00.000+07:00</published><updated>2005-12-14T18:26:00.016+07:00</updated><title type='text'>Tentang Adapter Pattern</title><content type='html'>&lt;p class="MsoNormal"&gt;Aspek OO yang didukung : reusability&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;Kondisi : &lt;/p&gt;   &lt;p class="MsoNormal"&gt;Kita mempunyai sebuah class dan sebuah client yang akan menggunakan class tersebut, tetapi tipe class yang akan kita pakai tersebut tidak cocok dengan tipe yang dibutuhkan oleh client*. Yang dimaksud dengan “tipe class tidak cocok “ di sini adalah bahwa class tersebut secara hierarki tidak bisa masuk ke tipe yang dibutuhkan client. (Di akhir tulisan ini disertakan sebuah contoh kasus)&lt;/p&gt;   &lt;p class="MsoNormal"&gt;* Sebagai contoh di Java, client di sini dapat berupa sebuah method yang mempunyai parameter bertipe tertentu. Tipe parameter inilah yang tidak sesuai dengan tipe class yang sudah ada.&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;Tujuan : &lt;/p&gt;   &lt;p class="MsoNormal"&gt;Mengubah kontrak dari suatu class sehingga dapat memenuhi kontrak dari client.&lt;/p&gt;   &lt;p class="MsoNormal"&gt;Kontrak** di sini adalah behavior yang harus dipunyai oleh suatu class. &lt;/p&gt;   &lt;p class="MsoNormal"&gt;**Di Java, kontrak bisa diimplementasikan sebagai interface, abstract class, atau bahkan concrete class. Tapi pada desain yang baik (prefer interface rather than implementation), kontrak biasa diimplementasikan sebagai interface.&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;Solusi : &lt;/p&gt;   &lt;p class="MsoNormal"&gt;Cara untuk mengatasi hal ini cukup mudah, yaitu tinggal membuat sebuah class baru yang memenuhi kontrak dari client.&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;Implementasi : &lt;/p&gt;   &lt;p class="MsoNormal"&gt;Secara intuitif, ada dua pendekatan solusi yang bisa kita lakukan, yaitu dengan inheritance dan dengan composition. Cara yang pertama dikenal sebagai class adapter dan cara kedua dikenal sebagai object adapter.&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;Sebagai contoh kasus, jika kita sudah punya definisi class sebagai berikut (existing classes).&lt;/p&gt;&lt;!--  start of the source file  --&gt;&lt;br /&gt;&lt;pre&gt;&lt;tt class="ln"&gt; 1&lt;/tt&gt;  &lt;span class="key"&gt;interface&lt;/span&gt; Animal &lt;span class="b1"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt; 2&lt;/tt&gt;      &lt;span class="key"&gt;public&lt;/span&gt; &lt;span class="key"&gt;void&lt;/span&gt; sleep&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt; 3&lt;/tt&gt;  &lt;span class="b1"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt; 4&lt;/tt&gt;&lt;br /&gt;&lt;tt class="ln"&gt; 5&lt;/tt&gt;  &lt;span class="key"&gt;class&lt;/span&gt; Cat &lt;span class="key"&gt;implements&lt;/span&gt; Animal &lt;span class="b1"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt; 6&lt;/tt&gt;      &lt;span class="key"&gt;public&lt;/span&gt; &lt;span class="key"&gt;void&lt;/span&gt; sleep&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt; &lt;span class="b1"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt; 7&lt;/tt&gt;          System&lt;b class="op"&gt;.&lt;/b&gt;out&lt;b class="op"&gt;.&lt;/b&gt;println&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="str"&gt;"I'm so sleeeepy.. Miauwww"&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt; 8&lt;/tt&gt;          System&lt;b class="op"&gt;.&lt;/b&gt;out&lt;b class="op"&gt;.&lt;/b&gt;println&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="str"&gt;"(Trying to find comfy place to sleep)"&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt; 9&lt;/tt&gt;          System&lt;b class="op"&gt;.&lt;/b&gt;out&lt;b class="op"&gt;.&lt;/b&gt;println&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="str"&gt;"(Find a place, and put its head on its hand)"&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt;10&lt;/tt&gt;      &lt;span class="b1"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;11&lt;/tt&gt;  &lt;span class="b1"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;12&lt;/tt&gt;&lt;br /&gt;&lt;tt class="ln"&gt;13&lt;/tt&gt;  &lt;span class="key"&gt;class&lt;/span&gt; Mouse &lt;span class="key"&gt;implements&lt;/span&gt; Animal &lt;span class="b1"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;14&lt;/tt&gt;      &lt;span class="key"&gt;public&lt;/span&gt; &lt;span class="key"&gt;void&lt;/span&gt; sleep&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt; &lt;span class="b1"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;15&lt;/tt&gt;          System&lt;b class="op"&gt;.&lt;/b&gt;out&lt;b class="op"&gt;.&lt;/b&gt;println&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="str"&gt;"Soo sleeepy.. cit cit"&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt;16&lt;/tt&gt;          System&lt;b class="op"&gt;.&lt;/b&gt;out&lt;b class="op"&gt;.&lt;/b&gt;println&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="str"&gt;"(Try to find a hole..)"&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt;17&lt;/tt&gt;          System&lt;b class="op"&gt;.&lt;/b&gt;out&lt;b class="op"&gt;.&lt;/b&gt;println&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="str"&gt;"(Can't find one..creating a new one)"&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt;18&lt;/tt&gt;          System&lt;b class="op"&gt;.&lt;/b&gt;out&lt;b class="op"&gt;.&lt;/b&gt;println&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="str"&gt;"Zzz..zzz.z"&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt;19&lt;/tt&gt;      &lt;span class="b1"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;20&lt;/tt&gt;  &lt;span class="b1"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;!--  end of the source file  --&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p class="MsoNormal"&gt;Permasalahan : kita harus menggunakan beberapa ekor binatang (Animal) sebagai pemeran (Actor) pada sebuah adegan film (MovieScene), karena skenario film tersebut membutuhkan adegan dimana beberapa ekor binatang akan tidur.&lt;/p&gt;&lt;!--  start of the source file  --&gt;&lt;br /&gt;&lt;pre&gt;&lt;tt class="ln"&gt; 1&lt;/tt&gt;  &lt;span class="key"&gt;class&lt;/span&gt; MovieScene &lt;span class="b1"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt; 2&lt;/tt&gt;&lt;br /&gt;&lt;tt class="ln"&gt; 3&lt;/tt&gt;      &lt;span class="key"&gt;private&lt;/span&gt; List actorList = &lt;span class="key"&gt;new&lt;/span&gt; ArrayList&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt; 4&lt;/tt&gt;&lt;br /&gt;&lt;tt class="ln"&gt; 5&lt;/tt&gt;      &lt;span class="key"&gt;public&lt;/span&gt; &lt;span class="key"&gt;void&lt;/span&gt; addActor&lt;span class="b2"&gt;(&lt;/span&gt;Actor actor&lt;span class="b2"&gt;)&lt;/span&gt; &lt;span class="b1"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt; 6&lt;/tt&gt;          &lt;span class="key"&gt;this&lt;/span&gt;.actorList&lt;b class="op"&gt;.&lt;/b&gt;add&lt;span class="b2"&gt;(&lt;/span&gt;actor&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt; 7&lt;/tt&gt;      &lt;span class="b1"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt; 8&lt;/tt&gt;&lt;br /&gt;&lt;tt class="ln"&gt; 9&lt;/tt&gt;      &lt;span class="key"&gt;public&lt;/span&gt; &lt;span class="key"&gt;void&lt;/span&gt; playScene&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt; &lt;span class="b1"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;10&lt;/tt&gt;          System&lt;b class="op"&gt;.&lt;/b&gt;out&lt;b class="op"&gt;.&lt;/b&gt;println&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="str"&gt;"--Begin the scene--"&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt;11&lt;/tt&gt;&lt;br /&gt;&lt;tt class="ln"&gt;12&lt;/tt&gt;          Actor actor;&lt;br /&gt;&lt;tt class="ln"&gt;13&lt;/tt&gt;          &lt;span class="key"&gt;for&lt;/span&gt; &lt;span class="b2"&gt;(&lt;/span&gt;Iterator iter = actorList&lt;b class="op"&gt;.&lt;/b&gt;iterator&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;; iter&lt;b class="op"&gt;.&lt;/b&gt;hasNext&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;span class="b2"&gt;)&lt;/span&gt; &lt;span class="b1"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;14&lt;/tt&gt;              actor = &lt;span class="b2"&gt;(&lt;/span&gt;Actor&lt;span class="b2"&gt;)&lt;/span&gt; iter&lt;b class="op"&gt;.&lt;/b&gt;next&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt;15&lt;/tt&gt;              actor&lt;b class="op"&gt;.&lt;/b&gt;act&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt;16&lt;/tt&gt;          &lt;span class="b1"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;17&lt;/tt&gt;&lt;br /&gt;&lt;tt class="ln"&gt;18&lt;/tt&gt;          System&lt;b class="op"&gt;.&lt;/b&gt;out&lt;b class="op"&gt;.&lt;/b&gt;println&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="str"&gt;"--End fo scene--"&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt;19&lt;/tt&gt;      &lt;span class="b1"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;20&lt;/tt&gt;&lt;br /&gt;&lt;tt class="ln"&gt;21&lt;/tt&gt;  &lt;span class="b1"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;22&lt;/tt&gt;&lt;br /&gt;&lt;tt class="ln"&gt;23&lt;/tt&gt;&lt;br /&gt;&lt;tt class="ln"&gt;24&lt;/tt&gt;  &lt;span class="key"&gt;interface&lt;/span&gt; Actor &lt;span class="b1"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;25&lt;/tt&gt;      &lt;span class="key"&gt;public&lt;/span&gt; &lt;span class="key"&gt;void&lt;/span&gt; act&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt;26&lt;/tt&gt;  &lt;span class="b1"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;27&lt;/tt&gt;&lt;br /&gt;&lt;tt class="ln"&gt;28&lt;/tt&gt;  &lt;span class="key"&gt;class&lt;/span&gt; HumanActor &lt;span class="key"&gt;implements&lt;/span&gt; Actor &lt;span class="b1"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;29&lt;/tt&gt;      &lt;span class="key"&gt;public&lt;/span&gt; &lt;span class="key"&gt;void&lt;/span&gt; act&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt; &lt;span class="b1"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;30&lt;/tt&gt;          System&lt;b class="op"&gt;.&lt;/b&gt;out&lt;b class="op"&gt;.&lt;/b&gt;println&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="str"&gt;"I'm an human actor and now doing my scenario script..."&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt;31&lt;/tt&gt;      &lt;span class="b1"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;32&lt;/tt&gt;  &lt;span class="b1"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;!--  end of the source file  --&gt;&lt;br /&gt;&lt;/pre&gt;Kita mempunyai sebuah permasalahan baru, di mana kita harus menggunakan class yang sudah ada sebelumya (Cat) di dalam solusi permasalahan baru kita.&lt;!--  start of the source file  --&gt;&lt;br /&gt;&lt;pre&gt;&lt;tt class="ln"&gt; 1&lt;/tt&gt;  &lt;span class="key"&gt;class&lt;/span&gt; Movie &lt;span class="b1"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt; 2&lt;/tt&gt;      &lt;span class="key"&gt;public&lt;/span&gt; &lt;span class="key"&gt;static&lt;/span&gt; &lt;span class="key"&gt;void&lt;/span&gt; main&lt;span class="b2"&gt;(&lt;/span&gt;String&lt;span class="b3"&gt;[&lt;/span&gt;&lt;span class="b3"&gt;]&lt;/span&gt; args&lt;span class="b2"&gt;)&lt;/span&gt; &lt;span class="b1"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt; 3&lt;/tt&gt;          MovieScene scene = &lt;span class="key"&gt;new&lt;/span&gt; MovieScene&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt; 4&lt;/tt&gt;          Actor bruceWillis = &lt;span class="key"&gt;new&lt;/span&gt; HumanActor&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt; 5&lt;/tt&gt;  &lt;br /&gt;&lt;tt class="ln"&gt; 6&lt;/tt&gt;          scene&lt;b class="op"&gt;.&lt;/b&gt;addActor&lt;span class="b2"&gt;(&lt;/span&gt;bruceWillis&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt; 7&lt;/tt&gt;  &lt;br /&gt;&lt;tt class="ln"&gt; 8&lt;/tt&gt;          Cat tom = &lt;span class="key"&gt;new&lt;/span&gt; Cat&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt; 9&lt;/tt&gt;          &lt;span class="comm"&gt;// Animal or Cat can't fit into Actor&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;10&lt;/tt&gt;          &lt;span class="comm"&gt;// so we can't use scene.addActor(Cat cat);&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;11&lt;/tt&gt;          &lt;span class="comm"&gt;// nor write Actor tom = new Cat() here&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;12&lt;/tt&gt;          &lt;span class="comm"&gt;// nor using scene.addActor(Animal a); if we declare tom as an Animal&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;13&lt;/tt&gt;  &lt;br /&gt;&lt;tt class="ln"&gt;14&lt;/tt&gt;          scene&lt;b class="op"&gt;.&lt;/b&gt;playScene&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt;15&lt;/tt&gt;      &lt;span class="b1"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;16&lt;/tt&gt;  &lt;span class="b1"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;!--  end of the source file  --&gt;&lt;br /&gt;&lt;/pre&gt; &lt;p class="MsoNormal"&gt;Untuk mengatasi hal ini, kita mengimplementasikan Adapter pattern, salah satu caranya yaitu dengan membuat sebuah class baru yang meng-implement interface yang dibutuhkan oleh MovieScene.addActor (yaitu Actor), dan menghubungkan method yang dibutuhkan oleh Actor dengan method yang disediakan oleh Animal.&lt;/p&gt;&lt;!--  start of the source file  --&gt;&lt;br /&gt;&lt;pre&gt;&lt;tt class="ln"&gt; 1&lt;/tt&gt;  &lt;span class="key"&gt;class&lt;/span&gt; AnimalActor &lt;span class="key"&gt;implements&lt;/span&gt; Actor&lt;span class="b1"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt; 2&lt;/tt&gt;&lt;br /&gt;&lt;tt class="ln"&gt; 3&lt;/tt&gt;      &lt;span class="key"&gt;private&lt;/span&gt; Animal animal;&lt;br /&gt;&lt;tt class="ln"&gt; 4&lt;/tt&gt;&lt;br /&gt;&lt;tt class="ln"&gt; 5&lt;/tt&gt;      &lt;span class="key"&gt;public&lt;/span&gt; AnimalActor&lt;span class="b2"&gt;(&lt;/span&gt;Animal animal&lt;span class="b2"&gt;)&lt;/span&gt;&lt;span class="b1"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt; 6&lt;/tt&gt;          &lt;span class="key"&gt;this&lt;/span&gt;.animal = animal;&lt;br /&gt;&lt;tt class="ln"&gt; 7&lt;/tt&gt;      &lt;span class="b1"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt; 8&lt;/tt&gt;&lt;br /&gt;&lt;tt class="ln"&gt; 9&lt;/tt&gt;      &lt;span class="key"&gt;public&lt;/span&gt; &lt;span class="key"&gt;void&lt;/span&gt; act&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt; &lt;span class="b1"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;10&lt;/tt&gt;          animal&lt;b class="op"&gt;.&lt;/b&gt;sleep&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt;11&lt;/tt&gt;      &lt;span class="b1"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;12&lt;/tt&gt;&lt;br /&gt;&lt;tt class="ln"&gt;13&lt;/tt&gt;  &lt;span class="b1"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;!--  end of the source file  --&gt;&lt;br /&gt;&lt;/pre&gt; &lt;p class="MsoNormal"&gt;Cara yang kedua adalah dengan melakukan composition antara subclass dari ActorAdapter berikut ini dengan Animal, dan meng-override method yang ada dengan pemanggilan method pada Animal.&lt;/p&gt;&lt;!--  start of the source file  --&gt;&lt;br /&gt;&lt;pre&gt;&lt;tt class="ln"&gt;1&lt;/tt&gt;  &lt;span class="key"&gt;class&lt;/span&gt; ActorAdapter &lt;span class="key"&gt;implements&lt;/span&gt; Actor&lt;span class="b1"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;2&lt;/tt&gt;      &lt;span class="key"&gt;public&lt;/span&gt; &lt;span class="key"&gt;void&lt;/span&gt; act&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt; &lt;span class="b1"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;3&lt;/tt&gt;          &lt;span class="comm"&gt;// do nothing..&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;4&lt;/tt&gt;      &lt;span class="b1"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;5&lt;/tt&gt;  &lt;span class="b1"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;!--  end of the source file  --&gt;&lt;/pre&gt;&lt;p class="MsoNormal"&gt;Sekarang kita bisa menggunakan dua binatang kita untuk ikut serta dalam film. &lt;/p&gt;&lt;!--  start of the source file  --&gt;&lt;br /&gt;&lt;pre&gt;&lt;tt class="ln"&gt; 1&lt;/tt&gt;  &lt;span class="key"&gt;class&lt;/span&gt; MouseActor &lt;span class="key"&gt;extends&lt;/span&gt; ActorAdapter&lt;span class="b1"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt; 2&lt;/tt&gt;    &lt;br /&gt;&lt;tt class="ln"&gt; 3&lt;/tt&gt;      &lt;span class="key"&gt;private&lt;/span&gt; Mouse mouse;&lt;br /&gt;&lt;tt class="ln"&gt; 4&lt;/tt&gt;    &lt;br /&gt;&lt;tt class="ln"&gt; 5&lt;/tt&gt;      &lt;span class="key"&gt;public&lt;/span&gt; MouseActor&lt;span class="b2"&gt;(&lt;/span&gt;Mouse mouse&lt;span class="b2"&gt;)&lt;/span&gt;&lt;span class="b1"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt; 6&lt;/tt&gt;          &lt;span class="key"&gt;this&lt;/span&gt;.mouse = mouse;&lt;br /&gt;&lt;tt class="ln"&gt; 7&lt;/tt&gt;      &lt;span class="b1"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt; 8&lt;/tt&gt;    &lt;br /&gt;&lt;tt class="ln"&gt; 9&lt;/tt&gt;      &lt;span class="key"&gt;public&lt;/span&gt; MouseActor&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;&lt;span class="b1"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;10&lt;/tt&gt;          mouse&lt;b class="op"&gt;.&lt;/b&gt;sleep&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt;11&lt;/tt&gt;      &lt;span class="b1"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;12&lt;/tt&gt;    &lt;br /&gt;&lt;tt class="ln"&gt;13&lt;/tt&gt;      &lt;span class="key"&gt;public&lt;/span&gt; &lt;span class="key"&gt;void&lt;/span&gt; act&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt; &lt;span class="b1"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;14&lt;/tt&gt;          &lt;span class="key"&gt;super&lt;/span&gt;.act&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt;15&lt;/tt&gt;      &lt;span class="b1"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;16&lt;/tt&gt;  &lt;span class="b1"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;17&lt;/tt&gt;&lt;br /&gt;&lt;tt class="ln"&gt;18&lt;/tt&gt;&lt;br /&gt;&lt;tt class="ln"&gt;19&lt;/tt&gt;  &lt;span class="key"&gt;class&lt;/span&gt; Movie &lt;span class="b1"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;20&lt;/tt&gt;      &lt;span class="key"&gt;public&lt;/span&gt; &lt;span class="key"&gt;static&lt;/span&gt; &lt;span class="key"&gt;void&lt;/span&gt; main&lt;span class="b2"&gt;(&lt;/span&gt;String&lt;span class="b3"&gt;[&lt;/span&gt;&lt;span class="b3"&gt;]&lt;/span&gt; args&lt;span class="b2"&gt;)&lt;/span&gt; &lt;span class="b1"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;21&lt;/tt&gt;          MovieScene scene = &lt;span class="key"&gt;new&lt;/span&gt; MovieScene&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt;22&lt;/tt&gt;          Actor bruceWillis = &lt;span class="key"&gt;new&lt;/span&gt; HumanActor&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt;23&lt;/tt&gt;&lt;br /&gt;&lt;tt class="ln"&gt;24&lt;/tt&gt;          Cat tom = &lt;span class="key"&gt;new&lt;/span&gt; Cat&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt;25&lt;/tt&gt;          Mouse jerry = &lt;span class="key"&gt;new&lt;/span&gt; Mouse&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt;26&lt;/tt&gt;        &lt;br /&gt;&lt;tt class="ln"&gt;27&lt;/tt&gt;          Actor adaptedTom = &lt;span class="key"&gt;new&lt;/span&gt; AnimalActor&lt;span class="b2"&gt;(&lt;/span&gt;tom&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt;28&lt;/tt&gt;          Actor adaptedJerry = &lt;span class="key"&gt;new&lt;/span&gt; MouseActor&lt;span class="b2"&gt;(&lt;/span&gt;jerry&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt;29&lt;/tt&gt;        &lt;br /&gt;&lt;tt class="ln"&gt;30&lt;/tt&gt;          scene&lt;b class="op"&gt;.&lt;/b&gt;addActor&lt;span class="b2"&gt;(&lt;/span&gt;bruceWillis&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt;31&lt;/tt&gt;          scene&lt;b class="op"&gt;.&lt;/b&gt;addActor&lt;span class="b2"&gt;(&lt;/span&gt;adaptedTom&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt;32&lt;/tt&gt;          scene&lt;b class="op"&gt;.&lt;/b&gt;addActor&lt;span class="b2"&gt;(&lt;/span&gt;adaptedJerry&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt;33&lt;/tt&gt;        &lt;br /&gt;&lt;tt class="ln"&gt;34&lt;/tt&gt;          &lt;span class="comm"&gt;// suppose that we want to create a new type of Actor and add it to the scene&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;35&lt;/tt&gt;          scene&lt;b class="op"&gt;.&lt;/b&gt;addActor&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="key"&gt;new&lt;/span&gt; ActorAdapter&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;&lt;span class="b1"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;36&lt;/tt&gt;              &lt;span class="key"&gt;public&lt;/span&gt; &lt;span class="key"&gt;void&lt;/span&gt; act&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt; &lt;span class="b1"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;37&lt;/tt&gt;                  System&lt;b class="op"&gt;.&lt;/b&gt;out&lt;b class="op"&gt;.&lt;/b&gt;println&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="str"&gt;"Simply do nothing.."&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt;38&lt;/tt&gt;                  &lt;span class="comm"&gt;// hey, this looks like how we add an adapter on Swing ;)&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;39&lt;/tt&gt;              &lt;span class="b1"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;40&lt;/tt&gt;          &lt;span class="b1"&gt;}&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt;41&lt;/tt&gt;        &lt;br /&gt;&lt;tt class="ln"&gt;42&lt;/tt&gt;          scene&lt;b class="op"&gt;.&lt;/b&gt;playScene&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;tt class="ln"&gt;43&lt;/tt&gt;      &lt;span class="b1"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;44&lt;/tt&gt;  &lt;span class="b1"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;!--  end of the source file  --&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4136058-113455885673233632?l=monn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://monn.blogspot.com/feeds/113455885673233632/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4136058&amp;postID=113455885673233632' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/113455885673233632'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/113455885673233632'/><link rel='alternate' type='text/html' href='http://monn.blogspot.com/2005/11/tentang-adapter-pattern.html' title='Tentang Adapter Pattern'/><author><name>monn</name><uri>http://www.blogger.com/profile/13979763502469183042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos.friendster.com/photos/34/80/5590843/6528433312778l.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4136058.post-113455918345388452</id><published>2005-11-12T18:15:00.000+07:00</published><updated>2005-12-14T18:28:48.120+07:00</updated><title type='text'>Programming language and scalability: are they related? Yes, but…</title><content type='html'>&lt;p class="MsoNormal"&gt;Menyimak thread “1 juta email” di milis teknologia yang menyimpang dari arah pembicaraan semula, saya ingin meluruskan beberapa anggapan yang seolah-olah menyatakan bahwa bahasa pemrograman adalah faktor paling utama yang menjadi kunci skalabilitas suatu aplikasi. Tentu saja ini diskusi antara kubu Java vs others. Entah sudah berapa kali diskusi seperti ini muncul (dan banyak di antaranya yang menjadi flame war). Dan entah pula mengapa masih juga banyak orang yang menanggapi dan memberikan tanggapan yang itu-itu saja (VM vs non-VM, perbedaan level abstraksi, perbedaan kemampuan programmer, dst). Seharusnya ada orang yang berbaik hati mau menyumbangkan waktunya untuk menulis katalog yang berisi tanggapan masing-masing kubu dan mungkin malah menerbitkannya sebagai buku, misalnya dengan judul “Reply Pattern, Element of Reusable Language Holy War”. Hehe.&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;Catatan : pernyataan yang menyebutkan bahwa sesuatu itu “lambat” adalah pernyataan yang salah. Yang benar adalah sesuatu itu “lebih lambat” dari sesuatu yang lain. (pelajaran teori relativitas waktu SMA dulu :)&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;Sebelumnya perlu untuk diketahui dulu bahwa jika pada suatu aplikasi, penggunaan kata skalabilitas dapat digunakan di dua konteks. Yang pertama adalah dari sisi user / request, yang menyatakan kemampuan aplikasi untuk melakukan sejumlah permintaan pemrosesan secara konkuren, pada kurun waktu tertentu. Yang kedua adalah dari sisi data, yang menyatakan kemampuan dari aplikasi (berikut infrastrukturnya, dalam hal ini adalah database). &lt;span style="" lang="NL-BE"&gt;Sisi yang kedua merupakan konteks yang tidak relevan dengan bahasa. Karena itu, konteks yang akan dipakai adalah skalabilitas dari sisi jumlah request yang dapat ditangani aplikasi.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="" lang="NL-BE"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="" lang="NL-BE"&gt;Bahasa (atau sebaiknya saya gunakan kata teknologi ya, karena Java bukan hanya sekedar bahasa) yang digunakan memang menentukan skalabilitas aplikasi. Source code yang ditulis dalam bahasa tertentu pasti akan dijalankan oleh prosesor sebagai seperangkat instruksi mesin. Tiap bahasa hampir pasti akan menghasilkan seperangkat instruksi yang berbeda (1) untuk sekumpulan ekspresi yang merupakan implementasi dari suatu algoritma. Selain itu, waktu yang dibutuhkan untuk menghasilkan dan pemanggilan instruksi tersebut juga pasti akan berbeda (2). Karena itulah bahasa yang digunakan pasti menentukan skalabilitas aplikasi. Tapi, berapa selisihnya?&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="" lang="NL-BE"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;T1 = I1 * E1 &lt;/p&gt;   &lt;p class="MsoNormal"&gt;T2 = I2 * E2 + G&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;T1 : total waktu eksekusi bahasa 1&lt;/p&gt;   &lt;p class="MsoNormal"&gt;I1 : jumlah instruksi yang dihasilkan oleh kompilasi bahasa 1&lt;/p&gt;   &lt;p class="MsoNormal"&gt;E1 : rata-rata waktu yang dibutuhkan untuk eksekusi satu instruksi oleh mesin)&lt;/p&gt;   &lt;p class="MsoNormal"&gt;T2 : total waktu eksekusi bahasa 2&lt;/p&gt;   &lt;p class="MsoNormal"&gt;I2 : jumlah opcode yang dihasilkan oleh kompilasi bahasa 2&lt;/p&gt;   &lt;p class="MsoNormal"&gt;E2 : rata-rata waktu yang dibutuhkan untuk eksekusi satu opcode oleh VM)&lt;/p&gt;   &lt;p class="MsoNormal"&gt;G : waktu untuk manajemen object (termasuk garbage collection)&lt;/p&gt;   &lt;p class="MsoNormal"&gt;Untuk mengetahui T2-T1 tentu saja sebelumnya kita harus memperoleh nilai I1,I2,E1, dam E2 terlebih dahulu. Untuk membuktikan bahwa selisih T2 dan T1 adalah nilai yang cukup besar, secara intuitif kita harus membuktikan bahwa selisih antara I2 dan I1 serta selisih antara E2 dan E1 cukup besar pula. Terus terang saya belum bisa memperkiraan selisih antara I2 dan I1, selain karena saya bukan pakar di bidang teknik kompilasi dan perancangan bahasa, juga hal yang tidak mudah untuk memperkirakan perbedaan implementasi suatu abstraksi (API / library) di masing-masing bahasa. Selain itu, perhitungan nilai G juga sangat kasuistik, karena itu walaupun dapat menentukan T2, saya terpaksa mengabaikannya.&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;Bahasa seperti C++ membutuhkan kompilasi untuk menerjemahkan source code menjadi sekumpulan instruksi yang akan dieksekusi langsung oleh mesin (saya mengabaikan teknik kompilasi ataupun linking secara statis di sini). Bahasa seperti Java akan dikompilasi menjadi sekumpulan instruksi bytecode (opcode) yang akan dieksekusi oleh VM. Karena itu selisih yang harus dicari adalah selisih antara waktu eksekusi instruksi oleh mesin (native) dan waktu eksekusi instruksi bytecode oleh VM.&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;Tentu saja waktu eksekusi yang dilakukan oleh VM akan lebih besar dari pada waktu eksekusi mesin, karena VM bertindak sebagai layer di atas OS. Tetapi waktu eksekusi tersebut bisa diperkecil dengan beberapa teknik seperti kompilasi JIT dan kompilasi adaptif (hampir semua JVM secara default menyediakan fasilitas ini). Karena itu, selisih antara E1 dan E2 tidaklah sangat mencolok untuk aplikasi yang berjalan lama.&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;Yah, hanya sampai sinilah pemikiran saya tentang selisih waktu eksekusi. Jika I1 dan I2 ternyata tidak mempunyai selisih yang besar, maka terbantahlah opini bahwa Java jauh lebih lambat daripada bahasa native.&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;Berikutnya, patutkah faktor bahasa yang dipersalahkan jika suatu aplikasi tidak scalable? Skalabilitas adalah salah satu dari non functional requirement. Skalabilitas biasanya diperhitungkan di fase architectural design pada OO software development lifecycle. Saya merasa bahwa keputusan-keputusan yang berkaitan dengan arsitektur akan jauh lebih mempengaruhi skalabilitas daripada sekedar pemilihan bahasa implementasi. Keputusan untuk menggunakan DNS load balancing untuk cluster misalnya, akan jauh lebih berpengaruh daripada memutuskan menggunakan C++ untuk menambah scalability. &lt;span style="" lang="NL-BE"&gt;Perbandingannya mungkin antara beberapa ratus/ribu persen melawan beberapa puluh persen saja. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;span style=";font-family:&amp;quot;;font-size:12;"  &gt;&lt;p class="MsoNormal"&gt;Beberapa puluh persen itu digunakan untuk membayar beberapa hal. Clustering di business logic tier? Hal yang mudah dilakukan di beberapa application server yang populer. Legacy connectivity? Ya, hal ini salah satu alasan dipilihnya teknologi Java untuk implementasi. Kemudahan mengimplementasikan transaksi yang kompleks? Banyak vendor Java yang memfasilitasi hal tersebut. &lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4136058-113455918345388452?l=monn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://monn.blogspot.com/feeds/113455918345388452/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4136058&amp;postID=113455918345388452' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/113455918345388452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/113455918345388452'/><link rel='alternate' type='text/html' href='http://monn.blogspot.com/2005/11/programming-language-and-scalability.html' title='Programming language and scalability: are they related? Yes, but…'/><author><name>monn</name><uri>http://www.blogger.com/profile/13979763502469183042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos.friendster.com/photos/34/80/5590843/6528433312778l.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4136058.post-112600794378122834</id><published>2005-09-06T18:57:00.000+07:00</published><updated>2005-09-06T20:16:32.810+07:00</updated><title type='text'>Some J2EE Development Best Practices</title><content type='html'>Seorang teman meminta saya untuk menulis apa yang saya tahu tentang J2EE dan best practices-nya. Beberapa hal yang tertulis di sini mungkin sudah terlalu umum dan kurang mendalam. Di waktu yang lain (jika ada), saya akan mencoba memaparkannya secara lebih jelas. Sebelum membaca tulisan ini, ada baiknya untuk membaca terlebih dahulu &lt;a href="http://blackbox.cs.fit.edu/blog/james/archives/000187.html"&gt;No Best Practices&lt;/a&gt;.&lt;a href="http://blackbox.cs.fit.edu/blog/james/archives/000187.html"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h3&gt;&lt;span style="font-size:85%;"&gt;General development best practices&lt;/span&gt;&lt;/h3&gt; Common OO development phases :   &lt;ol style="margin-top: 0in;" start="1" type="1"&gt; &lt;li class="MsoNormal" style=""&gt;Requirement      collecting and analysis&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Object      oriented analysis&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Architectural      design&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Object      oriented design&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Evaluation&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Coding,      testing, redesign cycle&lt;/li&gt; &lt;/ol&gt;   &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;Masing-masing metodologi mempunyai kekurangan dan kelebihannya masing-masing. Jika kita tidak wajib secara ketat untuk menggunakan suatu metodologi tertentu, pilihlah bagian-bagian tertentu dari suatu metodologi yang dianggap paling menguntungkan (manfaat vs effort). Sebagai contoh, kita bisa mengambil pendekatan TDD (Test Driven Development) pada saat siklus coding, testing, redesign.&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;Pada fase architectural design, developer akan dihadapkan pada permasalahan pemilihan teknologi. Banyak developer yang memilih teknologi berdasarkan popularitas atau tantangannya (misalnya Struts, EJB, Hibernate), bukan berdasarkan kebutuhannya. Pilihlah teknologi yang tepat untuk permasalahan yang ada. CV itu penting, tapi keberhasilan proyek (tepat waktu dan tepat budget) lebih penting lagi.&lt;/p&gt;   &lt;p class="MsoNormal"&gt;Bahan pertimbangan pemilihan arsitektur :&lt;/p&gt;   &lt;ol style="margin-top: 0in;" start="1" type="1"&gt; &lt;li class="MsoNormal" style=""&gt;Sistem      yang sudah ada / existing system&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Network      bandwidth&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Budget&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Kemampuan      developer&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Kebutuhan      non fungsional aplikasi (performance, scalability, availability, security,      maintainability)&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Kebutuhan      fungsional aplikasi&lt;/li&gt; &lt;/ol&gt;   &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;Development artefact (use case diagrams, class diagrams, interaction diagrams, dll yang dihasilkan selama development) hanya akan berguna jika artefact tersebut dapat digunakan sebagai alat komunikasi antar developer dan sinkron dengan kode yang dibuat. Jika kita tidak dapat menjaga kesesuaian antara diagram dan kode kita, sebaiknya buang saja diagram-diagram tersebut, karena selain kita sudah punya artefact paling penting (yaitu kode), diagram-diagram tersebut hanya akan menjadi beban tambahan saja (tidak mempunyai nilai tambah).&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;Rilislah software / protoptype (software dengan beberapa fitur yang sudah terimplementasi) secepat mungkin agar dapat sesegera mungkin mendapatkan feedback dari client. Semakin cepat feedback didapat, semakin cepat pula siklus code, test, dan redesign kita berputar.&lt;/p&gt;   &lt;p class="MsoNormal"&gt;Salah satu faktor yang menyebabkan cepatnya pengembangan software secara open source adalah cepatnya open issues (feedback dan feature request) diberikan oleh pengguna dan kontributor.&lt;/p&gt;   &lt;h3&gt;&lt;span style="font-size:85%;"&gt;Design level&lt;/span&gt;&lt;/h3&gt;   &lt;p class="MsoNormal"&gt;Common practices :&lt;/p&gt;   &lt;ol style="margin-top: 0in;" start="1" type="1"&gt; &lt;li class="MsoNormal" style=""&gt;Favor      object composition over class inheritance&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Don’t overuse design pattern. Design pattern is something that naturally come to our mind, not forced. Jangan pakai design pattern hanya supaya desain aplikasi kita terlihat cantik, karena memakai bermacam-macam design pattern.&lt;/li&gt; &lt;/ol&gt;   &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;Good architects keep the design simple, by removing everything until there is nothing left to remove. Make simple, but not simpler (Einstein). &lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;Technology driven vs problem driven :&lt;/p&gt;   &lt;p class="MsoNormal"&gt;Beberapa developer J2EE pada saat perancangan terkadang terpaku pada teknologi yang akan dipakai. Sebagai contoh pada saat kita sudah memilih EJB sebagai teknologi yang akan kita pakai, kita akan cenderung menyesuaikan desain OO kita supaya menuruti best practice yang dianjurkan. Misalnya dengan mengacu Sun’s Core J2EE Patterns, kita akan merancang model kita sebagai Composite Entity (minimizing JDBC call and container’s efforts to persist/load EJB’s state) dan menyertakan juga Transfer / Value Object (minimizing remote method call traffic). Hasilnya adalah desain yang rumit dan tightly coupled dengan EJB. Jika pada sebelumnya requirement awal kita tidak membutuhkan aplikasi kita untuk terdistribusi, sekarang muncul requirement baru yang diakibatkan karena kita menggunakan EJB.&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;Contoh kasus lain adalah pada saat mendesain persistent object. Jangan hanya karena kita menggunakan teknologi persistensi yang mewajibkan object kita mempunyai getter/setter, kita jadi menambahkan method-method tersebut pada object kita (yang sebenarnya pada requirement awal tidak dibutuhkan getter/setter method tersebut). Ilustrasinya diberikan sebagai berikut :&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;            &lt;/span&gt;Hasil analisis dari requirement :&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;&lt;pre&gt;&lt;!--  start of the source file  --&gt;&lt;br /&gt;&lt;tt class="ln"&gt; 1&lt;/tt&gt;  &lt;span class="key"&gt;public&lt;/span&gt; &lt;span class="key"&gt;class&lt;/span&gt; Account &lt;span class="b1"&gt;{&lt;/span&gt;  &lt;span class="comm"&gt;// immutable&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt; 2&lt;/tt&gt;    &lt;span class="key"&gt;private&lt;/span&gt; &lt;span class="key"&gt;double&lt;/span&gt; interest; &lt;span class="comm"&gt;// Att1&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt; 3&lt;/tt&gt;    &lt;span class="key"&gt;private&lt;/span&gt; &lt;span class="key"&gt;int&lt;/span&gt; numberOfMonthSinceRegistered; &lt;span class="comm"&gt;// Att2&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt; 4&lt;/tt&gt;    &lt;span class="key"&gt;private&lt;/span&gt; BigDecimal balance; &lt;span class="comm"&gt;// Att3&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt; 5&lt;/tt&gt;    &lt;span class="key"&gt;public&lt;/span&gt; Account&lt;span class="b2"&gt;(...&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;&lt;span class="b1"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt; 6&lt;/tt&gt;      ... &lt;span class="comm"&gt;// initialization&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt; 7&lt;/tt&gt;    &lt;span class="b1"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt; 8&lt;/tt&gt;    &lt;span class="key"&gt;public&lt;/span&gt; BigDecimal getBalance&lt;span class="b2"&gt;(&lt;/span&gt;&lt;span class="b2"&gt;)&lt;/span&gt;&lt;span class="b1"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt; 9&lt;/tt&gt;      &lt;span class="comm"&gt;// formulation using att1, att2, and balance&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;10&lt;/tt&gt;      BigDecimal returnedBalance = ...&lt;br /&gt;&lt;tt class="ln"&gt;11&lt;/tt&gt;      &lt;span class="key"&gt;return&lt;/span&gt; returnedBalance;&lt;br /&gt;&lt;tt class="ln"&gt;12&lt;/tt&gt;    &lt;span class="b1"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;13&lt;/tt&gt;  &lt;span class="b1"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;!--  end of the source file  --&gt;&lt;/pre&gt;&lt;p class="MsoNormal"&gt;&lt;span style=""&gt;            &lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style=""&gt;Att1, Att2, dan Att3 adalah attribute yang mewakili state dari Account, sehingga ketiganya merupakan persistent attributes. Hasil analisis menyebutkan bahwa Att1 dan Att2 tidak dapat diubah (aturan 1) dan dibaca (aturan 2) dari manapun di luar Account, dan Att3 hanya bisa dibaca saja (aturan 3).&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style=""&gt;Karena menggunakan suatu teknologi ORM yang mewajibkan kita menyediakan getter/setter untuk semua persistent attributes, kita harus menambahkan method-method berikut :&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;&lt;pre&gt;&lt;!--  start of the source file  --&gt;&lt;br /&gt;&lt;tt class="ln"&gt;1&lt;/tt&gt;  &lt;span class="key"&gt;public&lt;/span&gt; &lt;span class="key"&gt;class&lt;/span&gt; Account &lt;span class="b1"&gt;{&lt;/span&gt;  &lt;span class="comm"&gt;// should be immutable class&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;2&lt;/tt&gt;    ... &lt;span class="comm"&gt;// same code&lt;/span&gt;&lt;br /&gt;&lt;tt class="ln"&gt;3&lt;/tt&gt;    getter and setter &lt;span class="key"&gt;for&lt;/span&gt; interest&lt;br /&gt;&lt;tt class="ln"&gt;4&lt;/tt&gt;    getter and setter &lt;span class="key"&gt;for&lt;/span&gt; numberOfMonthSinceRegistered     &lt;br /&gt;&lt;tt class="ln"&gt;5&lt;/tt&gt;    setter &lt;span class="key"&gt;for&lt;/span&gt; balance&lt;br /&gt;&lt;tt class="ln"&gt;6&lt;/tt&gt;  &lt;span class="b1"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;!--  end of the source file  --&gt;&lt;br /&gt;&lt;/pre&gt;&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style=""&gt;Karena terpaksa menuruti kontrak yang diwajibkan teknologi ORM yang kita gunakan, kita terpaksa harus melanggar 3 aturan yang sudah ditetapkan sebelumnya.&lt;/p&gt;   &lt;p class="MsoNormal" style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style=""&gt;(Catatan : kasus di atas hanya contoh saja. Beberapa ORM tools yang populer tidak memerlukan kita melengkapi seluruh persistent atttibutes dari kelas kita dengan getter/setter-nya. Tool-tool tersebut bisa membaca dan mengubah nilai attribute dengan cara lain, misalnya bytecode enhancement, dynamic proxy, AOP, cglib, dll)&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;Jangan biarkan teknologi yang mengarahkan bagaimana kita merancang solusi kita.&lt;/p&gt;   &lt;h3 style="font-weight: bold;"&gt;&lt;span style="font-size:85%;"&gt;Code level&lt;/span&gt;&lt;/h3&gt;   &lt;p class="MsoNormal"&gt;Common practice : &lt;/p&gt;   &lt;ol style="margin-top: 0in;" start="1" type="1"&gt; &lt;li class="MsoNormal" style=""&gt;Program      to interface, not implementation (achieving loose coupling)&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Test,      refactor, test, refactor, test, dan refactor.&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Remove      code duplication.&lt;/li&gt; &lt;/ol&gt;   &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;Write “self documented” code dengan menggunakan nama class, attribute, dan method yang tepat (selain komentar dalam bentuk javadoc yang baik). Kode yang baik adalah kode yang benar logika (dapat menyelesaikan masalah), sintaks (lolos compile), dan semantiknya (readable and easy to maintain). Every programmer can write code that undestood by computer, but good programmer wrote code that understood by human.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4136058-112600794378122834?l=monn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://monn.blogspot.com/feeds/112600794378122834/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4136058&amp;postID=112600794378122834' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/112600794378122834'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/112600794378122834'/><link rel='alternate' type='text/html' href='http://monn.blogspot.com/2005/09/some-j2ee-development-best-practices.html' title='Some J2EE Development Best Practices'/><author><name>monn</name><uri>http://www.blogger.com/profile/13979763502469183042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos.friendster.com/photos/34/80/5590843/6528433312778l.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4136058.post-112551228279955772</id><published>2005-09-01T00:41:00.000+07:00</published><updated>2005-09-01T01:18:02.803+07:00</updated><title type='text'>Friend, fate, hope. Innalillahi Wa Inna Ilayhi Raaji'uun.</title><content type='html'>&lt;span style="font-size:85%;"&gt;monang_ok : jangan la congrats dulu&lt;br /&gt;monang_ok : lom 100% la&lt;br /&gt;Dy : hehe&lt;br /&gt;monang_ok : kalau mati pagi ni, tak kan jadi pergi hehe&lt;br /&gt;Dy : bila boleh congrats&lt;br /&gt;monang_ok : hehe tak perlu la&lt;br /&gt;monang_ok : nothing big&lt;br /&gt;Dy : hehe jgnlah ckp macam tu&lt;br /&gt;monang_ok : hehe, sorry&lt;br /&gt;Dy : so looking for american girl ke&lt;br /&gt;monang_ok : american girls like to be treated as a computer ke?&lt;br /&gt;monang_ok : hehe&lt;br /&gt;Dy : maybe&lt;br /&gt;monang_ok : hehe&lt;br /&gt;monang_ok : and how bout u?&lt;br /&gt;Dy : me?&lt;br /&gt;monang_ok : do u plan to going back to malaysia after got ur degree?&lt;br /&gt;Dy : stuck in ireland for 2-3 yrs&lt;br /&gt;monang_ok : plan untuk nanti la&lt;br /&gt;monang_ok : hehe, not now&lt;br /&gt;Dy : insyaallah&lt;br /&gt;monang_ok : oh great&lt;br /&gt;Dy : i want to serve to my country&lt;br /&gt;monang_ok : wow cool&lt;br /&gt;Dy : pray for my success&lt;br /&gt;monang_ok : eh&lt;br /&gt;monang_ok : i remember&lt;br /&gt;monang_ok : when i read a manga (comic)&lt;br /&gt;Dy : yup&lt;br /&gt;monang_ok : it says something about 'doctor without border' or somthin like that&lt;br /&gt;monang_ok : in europe&lt;br /&gt;monang_ok : is it for real?&lt;br /&gt;monang_ok : volunteering organization&lt;br /&gt;Dy : real&lt;br /&gt;Dy : y&lt;br /&gt;monang_ok : oh&lt;br /&gt;monang_ok : just curious&lt;br /&gt;monang_ok : cool&lt;br /&gt;monang_ok : haha&lt;br /&gt;monang_ok : don't be so cocky&lt;br /&gt;monang_ok : u even not been there yet hehe&lt;br /&gt;monang_ok : hehe&lt;br /&gt;Dy : ok monn i got to go, c ya next time ok&lt;br /&gt;&lt;br /&gt;See u later Dy.&lt;br /&gt;&lt;br /&gt;Allah's ideal ways may be different from ours. You haven't been a doctor yet. You haven't served your country yet. You haven't been Mrs. Ariff yet. But may be, it's His best for us.&lt;br /&gt;&lt;br /&gt;We might never meet in this real world, but  sure it's great to have a good friend like her. Hope you'll be in the best place after Him.&lt;br /&gt;&lt;br /&gt;Al Fatihah.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4136058-112551228279955772?l=monn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://monn.blogspot.com/feeds/112551228279955772/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4136058&amp;postID=112551228279955772' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/112551228279955772'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/112551228279955772'/><link rel='alternate' type='text/html' href='http://monn.blogspot.com/2005/09/friend-fate-hope-innalillahi-wa-inna.html' title='Friend, fate, hope. Innalillahi Wa Inna Ilayhi Raaji&apos;uun.'/><author><name>monn</name><uri>http://www.blogger.com/profile/13979763502469183042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos.friendster.com/photos/34/80/5590843/6528433312778l.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4136058.post-112076025784393753</id><published>2005-07-08T00:25:00.000+07:00</published><updated>2005-07-08T01:17:37.850+07:00</updated><title type='text'>Kritik untuk lowongan pekerjaan developer</title><content type='html'>Entah sudah berapa kali saya tersenyum sendiri sekaligus kasihan kepada penulis lowongan yang sedang membutuhkan superman dan isi lowongannya seperti showcase teknologi. Yah, daripada dipendam terus di dalam hati, lebih baik saya mencoba mengkritik salah satu lowongan yang muncul barusan (x-posting lagi..)&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;Java Programmer (1 orang)&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(0, 153, 0);"&gt;Spesifikasi:&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(0, 153, 0);"&gt;1. Pengalaman membuat aplikasi dengan J2EE platform, JSP, Servlet, dan EJB&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Seharusnya menuliskannya seperti ini :&lt;br /&gt;1. Pengalaman membuat aplikasi dengan J2EE (JSP, Servlet, dan EJB)&lt;br /&gt;Hubungan mereka bukan sederajat, tapi superset-subset.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;2. Mengerti aplikasi web services&lt;br /&gt;&lt;br /&gt; &lt;/span&gt;Aplikasi WS? Aplikasi apa yang dimaksud? WS application / application of WS?&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;2. Menguasai Application Server BEA WebLogic 7/8.1, Tomcat, IIS&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Selain korupsi nomor (seharusnya no 3), mengapa seorang Java programmer harus menguasai IIS?&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;3. Menguasai Database: Oracle, Microsoft Access, SQL Server&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Okay, programmer + super dba&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;4. Menguasai OS: Ms Windows (98/2000/XP/2003), Sun Solaris, Linux (Red Hat 9)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Okay, programmer + dba + super sysadmin&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;5. Menguasai teknologi XML (XSL/XSLT, XSD, DTD)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Fine..&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;6. Menguasai teknologi HTML, JavaScript, CSS&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(0, 153, 0);"&gt;7. Menguasai tools: Homesite, Dreamweaver MX, JBuilder-2005&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Okay, programmer + dba + sysadmin + super web designer. What's next?&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;8. Mampu bekerja dalam team, di bawah tekanan dgn jadual deadline yg ketat, dan mampu melakukan problem solving&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Okay, programmer + dba + sysadmin + web designer + romusha. Problem solver? Programmer adalah problem solver, mengapa harus ada duplikasi?&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;9. Memiliki keinginan yang kuat untuk mempelajari sesuatu yg baru (menjadi keutamaan)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Fine..&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;Tasks:&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(0, 153, 0);"&gt;1. Maintain aplikasi yang sudah ada (KF SCM, SCM Global, eXtreme Web Services)&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(0, 153, 0);"&gt;   - Melakukan modifikasi aplikasi (jika dibutuhkan)&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(0, 153, 0);"&gt;   - Melakukan dokumentasi atas modifikasi yg dilakukan&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Fine. Documentation? Good programmers write self explained codes. It's the best documentation ever.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;2. Membuat aplikasi (baru) berbasis J2EE (GP Farmasi,BPOM)&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(0, 153, 0);"&gt;   - Melakukan pembuatan, modifikasi, integrasi, dan test&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(0, 153, 0);"&gt;   - Melakukan pengumpulan kebutuhan user dan dokumentasi&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Jadi, mereka sedang membutuhkan programmer sekaligus dba sekaligus sysadmin sekaligus web designer sekaligus romusha sekaligus analyst.&lt;br /&gt;&lt;br /&gt;Dare to apply? Go for it superman :)&lt;br /&gt;&lt;br /&gt;Tips buat penulis lowongan :&lt;br /&gt;Menulis lowongan itu gampang, tinggal kopi paste dari yang sudah ada. Walaupun demikian, jika anda menulis lowongan, setidaknya minta seseorang untuk mereviewnya dulu daripada nanti malu2in perusahaan anda.&lt;br /&gt;&lt;br /&gt;Saya pernah melihat lowongan untuk programmer yang syaratnya cuma satu, yaitu :&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;Menguasai Java, J2EE, C, C++, VB, Delphi, Javascript, HTML, CSS, Oracle, MySQL, SQL Server, CORBA, dll.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Entah mau diapakan orang yang sedang mereka cari. Jika saya sekarang sedang butuh pekerjaan dan di dunia ini hanya ada dua lowongan, yang pertama yang di atas, dan yang kedua di bawah ini :&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;Menguasai Spaghetti.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;saya jelas-jelas akan memilih yang kedua, karena selain lebih menantang (Spaghetti adalah bahasa pemrograman esoterik yang nggak jelas), juga nggak akan membuat saya menjadi superman.&lt;br /&gt;&lt;br /&gt;:)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4136058-112076025784393753?l=monn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://monn.blogspot.com/feeds/112076025784393753/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4136058&amp;postID=112076025784393753' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/112076025784393753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/112076025784393753'/><link rel='alternate' type='text/html' href='http://monn.blogspot.com/2005/07/kritik-untuk-lowongan-pekerjaan.html' title='Kritik untuk lowongan pekerjaan developer'/><author><name>monn</name><uri>http://www.blogger.com/profile/13979763502469183042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos.friendster.com/photos/34/80/5590843/6528433312778l.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4136058.post-111306375199520826</id><published>2005-04-09T23:20:00.000+07:00</published><updated>2005-04-09T23:22:31.996+07:00</updated><title type='text'>Funny story</title><content type='html'>Check out this another &lt;a href="http://www.borrett.id.au/computing/petals-bg.htm"&gt;joke&lt;/a&gt; about Bill Gates.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4136058-111306375199520826?l=monn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://monn.blogspot.com/feeds/111306375199520826/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4136058&amp;postID=111306375199520826' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/111306375199520826'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/111306375199520826'/><link rel='alternate' type='text/html' href='http://monn.blogspot.com/2005/04/funny-story.html' title='Funny story'/><author><name>monn</name><uri>http://www.blogger.com/profile/13979763502469183042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos.friendster.com/photos/34/80/5590843/6528433312778l.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4136058.post-111309850860478655</id><published>2005-03-28T09:00:00.000+07:00</published><updated>2005-04-10T09:05:42.170+07:00</updated><title type='text'>Mencari Jarum di Lautan Bit : Curhat Sang Peselancar (Bagian 2)</title><content type='html'>Salah satu permasalahan yang muncul ketika seseorang mencari informasi di internet adalah "Lost in Hyperspace". Kita pasti pernah menelusuri halaman demi halaman web melalui link-link pada halaman-halaman tersebut, kemudian kita bingung di mana posisi kita sekarang, atau bagaimana kita bisa sampai ke posisi sekarang, atau mengapa kita bisa sampai ke halaman yang melenceng sangat jauh dari halaman yang kita maksudkan. Permasalahan ini hanya muncul pada kumpulan dokumen yang tidak terstruktur linier (berbeda dengan buku yang mempunyai struktur linier). Permasalahan ini pertama kali dikemukakan secara formal oleh &lt;a href="http://portal.acm.org/citation.cfm?id=29486"&gt;Conklin&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Ada beberapa solusi yang dapat digunakan manusia untuk mengatasi permasalahan ini. Solusi yang pertama (seperti yang muncul di otak &lt;a href="http://www.theatlantic.com/unbound/flashbks/computer/bushf.htm"&gt;Vannevar Bush&lt;/a&gt; tahun 1945 :) adalah dengan menggunakan &lt;em&gt;superlink&lt;/em&gt;, yaitu link khusus yang menghubungkan catatan pengalaman dari peselancar ketika mengunjungi halaman-halaman web. Kelemahan dari cara ini adalah kita lupa bahwa peselancar juga manusia, yang punya rasa dan punya hati (loh apa hubungannya :p). Peselancar adalah makhluk manja dan supersibuk yang tidak punya waktu hanya untuk sekedar memberikan catatan untuk tiap halaman yang dikunjunginya. (Fasilitas &lt;em&gt;bookmark&lt;/em&gt; juga merupakan suatu ide yang mirip, tetapi satu &lt;em&gt;bookmark&lt;/em&gt; tidak memiliki hubungan ke &lt;em&gt;bookmark&lt;/em&gt; lain)&lt;br /&gt;&lt;br /&gt;Cara yang kedua adalah dengan menggunakan fasilitas tombol &lt;em&gt;back&lt;/em&gt; atau fasilitas &lt;em&gt;history&lt;/em&gt; yang disediakan oleh browser. Apa kelemahan cara ini? Untuk tombol &lt;em&gt;back&lt;/em&gt;, kita hanya dapat berjalan mundur satu persatu. Browser seperti &lt;a href="http://ie.cathode-ray-coma.co.uk/index.php"&gt;IE&lt;/a&gt; malah tidak memungkinkan kita menekan tombol &lt;em&gt;back&lt;/em&gt; untuk window baru yang dibuka (misalnya dengan klik kanan pada suatu link dan tekan "Open in New Window"). Walaupun kelemahan ini bisa diatasi oleh fasilitas &lt;em&gt;history&lt;/em&gt;, tetap saja peselancar masih harus membuka beberapa halaman dulu untuk memastikan dia berada pada konteks (adalah status, situasi, dan kondisi yang membatasi seseorang ketika melakukan sesuatu :) yang benar.&lt;br /&gt;&lt;br /&gt;Cara yang ketiga adalah dengan menggunakan fasilitas &lt;em&gt;sitemap&lt;/em&gt;. Dengan menggunakan &lt;em&gt;sitemap&lt;/em&gt;, para peselancar dapat dengan cepat menemukan kembali tempat di mana dia bisa memulai melakukan penjelajahan sesuai dengan konteks mereka. Tetapi sayang fasilitas ini tidak dimiliki oleh semua situs (dan kebanyakan hanya dimiliki oleh situs yang memiliki konten sedikit dan tidak rumit). Furnas mengusulkan digunakannya &lt;a href="http://citeseer.ist.psu.edu/furnas81fisheye.html"&gt;Fisheye&lt;/a&gt; yang dapat menggantikan &lt;em&gt;sitemap&lt;/em&gt; dengan alasan manusia mempunyai aspek psikologis yang disebut &lt;em&gt;degree of interest function&lt;/em&gt;. (Maaf, untuk detilnya, silakan membaca paper yang diacu oleh &lt;em&gt;hyperlink&lt;/em&gt; di atas :)&lt;br /&gt;&lt;br /&gt;Cara selanjutnya? Kita patus berterima kasih pada Google dan ratusan search engine lainnya yang berusaha memudahkan kita mencari informasi yang sesuai dengan konteks kita. Pada awalnya, search engine hanya sebuah mesin sederhana yang menggunakan seekor &lt;a href="http://www.google.co.id/search?q=define%3Aspider&amp;amp;hl=id"&gt;spider&lt;/a&gt; untuk membangun &lt;a href="http://www.nist.gov/dads/HTML/invertedIndex.html"&gt;inverted index&lt;/a&gt; yang akan digunakan manusia dalam melakukan pencarian.&lt;br /&gt;&lt;br /&gt;Dengan demikian, bukan manusia saja yang mengalami permasalahan "Lost in Hyperspace" di atas. Mesin-mesin pencari juga ikut berdosa dengan memberikan informasi yang bertendensi menyebabkan permasalahan tersebut. Bagaimana solusi untuk mesin? Hmm, ini pertanyaan dengan jawaban yang rumit. (Akan diteruskan di bagian selanjutnya dari seri tulisan ini)&lt;br /&gt;&lt;br /&gt;Next : Search engines - Solution without problems?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4136058-111309850860478655?l=monn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://monn.blogspot.com/feeds/111309850860478655/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4136058&amp;postID=111309850860478655' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/111309850860478655'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/111309850860478655'/><link rel='alternate' type='text/html' href='http://monn.blogspot.com/2005/03/mencari-jarum-di-lautan-bit-curhat_28.html' title='Mencari Jarum di Lautan Bit : Curhat Sang Peselancar (Bagian 2)'/><author><name>monn</name><uri>http://www.blogger.com/profile/13979763502469183042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos.friendster.com/photos/34/80/5590843/6528433312778l.jpg'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4136058.post-111194772490177377</id><published>2005-03-27T22:21:00.000+07:00</published><updated>2005-04-10T08:59:29.626+07:00</updated><title type='text'>Mencari Jarum di Lautan Bit : Curhat Sang Peselancar (Bagian 1)</title><content type='html'>Seri tulisan ini bermaksud untuk mengeksplorasi apa saja yang telah dilakukan manusia untuk mengabadikan pengetahuannya dan membuatnya dapat digunakan oleh manusia lain. Selain itu, tulisan ini juga bermaksud untuk "memaksa" penulis belajar menggunakan Bahasa Indonesia secara baik dan benar (paling tidak, bisa dimengerti oleh nenek anda :)&lt;br /&gt;&lt;br /&gt;Seiring dengan semakin berkembangnya teknologi internet, manusia melihat WWW (World Wide Web) sebagai media baru yang dapat  digunakan untuk menggantikan kertas. Paper, jurnal, majalah, artikel, dan berbagai macam bentuk karya tulis lainnya mulai memenuhi internet dalam bentuk barunya sebagai hypertext (selanjutnya akan disebut dengan text). Dengan menggunakan bentuk ini, manusia dimanjakan dengan adanya fitur hyperlink (selanjutnya akan disebut dengan link), yang memudahkan pencari informasi (selanjutnya akan disebut dengan peselancar) untuk pindah dari satu text ke text lain hanya dengan sekali klik saja.&lt;br /&gt;&lt;br /&gt;Pada umumnya, jenis peselancar dapat dibagi menjadi dua tipe. Tipe yang pertama adalah pelancar yang menggunakan pendekatan eksploratif atau berusaha menemukan informasi yang diperlukannya dengan menggunakan link sebagai navigasi dari satu text ke text lainnya. Tipe yang kedua adalah peselancar yang menggunakan pendekatan pencarian (searching) untuk menemukan informasi yang diperlukannya. Tipe yang kedua ini kerapkali bergantung pada mesin pencari untuk memenuhi kebutuhannya.&lt;br /&gt;&lt;br /&gt;Pertumbuhan isi WWW yang eksponensial menimbulkan masalah baru bagi manusia. Pada cara pertukaran informasi yang tradisional, seleksi alam berlaku karena tulisan dapat tersaring oleh manusia itu sendiri. Sebagai contoh jika  sebuah paper yang oleh seorang profesor dinilai "tidak layak dipublikasikan", maka paper tersebut tidak akan muncul di peredaran. Begitu juga dengan majalah, jika ada artikel yang dinilai "tidak layak tampil" oleh redaksi, maka artikel tersebut akan hilang dengan sendirinya. Walaupun tingkat seleksi setiap orang berbeda, setidaknya dengan adanya seleksi alam tersebut, hanya tulisan-tulisan yang relatif bermutu yang dapat diakses oleh pencari informasi. Secara alamiah, profesor dan redaksi majalah di atas menjadi natural recommender system.&lt;br /&gt;&lt;br /&gt;Berbeda halnya dengan WWW, setiap orang dapat dengan bebas membuat text. Masalah muncul ketika sang pembuat text tersebut membubuhkan hyperlink untuk mengacu ke suatu text lain, atau menganjurkan peselancar untuk membaca suatu text. Penggunaan link yang tidak pada tempatnya menyebabkan peselancar tipe eksploratif kerapkali kehilangan arah dan posisi, serta tidak dapat menjangkau informasi yang dia perlukan (fenomena Lost in Hyperspace). Karena adanya link ini, kerapkali peselancar eksploratif ini tidak dapat menentukan di mana sebenarnya ruang lingkup pencariannya (sampai kapan dia harus mencari). Hal ini juga dihadapi oleh tipe peselancar kedua, karena mesin-mesin pencari pada umumnya menggunakan link sebagai cara pengumpulan text, tanpa memperhatikan kebutuhan peselancar. Hal ini merupakan jalan yang efisien bagi mesin pencari, karena selain untuk menghemat media penimpanan, kebutuhan pencari informasi baru bisa "dimengerti" pada saat pencari tersebut berinteraksi (misalnya pada saat mengetikkan keywords pencarian) dengan mesin pencari.&lt;br /&gt;&lt;br /&gt;Permasalahan Information Overload muncul pada kondisi di mana jumlah informasi yang tersedia terlalu banyak daripada yang diperlukan atau dapat dibaca atau dapat disaring oleh seseorang. Sebagai contoh, jika kita ingin tahu mengenai "Information Retrieval on Modern Systems", kita bisa menggunakan wikipedia untuk mendapatkan definisi tentang "Information Retrieval", dan kemudian mengikuti link-link eksternal yang tercantum di bagian bawah halaman untuk mencari tahu lebih lanjut. Misalnya ada 5 buah link eksternal yang mengacu ke text yang berbeda-beda, kita membuka kelima-limanya dan mendapatkan definisi mendalam yang berbeda-beda antara text satu dengan yang lainnya. Demikian seterusnya sampai kita mendapatkan suatu definisi yang relatif cocok dengan konteks kita ("on Modern Systems"). Jika kita menghitung perbandingan antara jumlah text yang relevan dengan yang menyimpang, kita akan mendapatkan rasio yang kecil. Permasalahan belum berhenti di sini. Jika kita menemukan 10 text yang relevan, kita tidak dapat dengan mudah menentukan yang mana di antara 10 text tersebut yang paling relevan. Hal ini disebabkan karena susahnya menentukan kriteria pembanding tingkat kerelevanan suatu informasi, jika si pencari bukanlah pakar yang terjun di bidang yang direprentasikan informasi tersebut (harap diingat bahwa si pencari pasti bukan seorang pakar). Hal ini juga yang menyebabkan seseorang merasa lebih baik bertanya ke pada temannya (yang dirasa lebih pakar di bidang informasi yang dia butuhkan) halaman mana yang seharusnya dia baca, daripada bertanya langsung ke Google.&lt;br /&gt;&lt;br /&gt;Contoh lain yang diakibatkan oleh permasalahan Information Overload terjadi pada seseorang yang ingin selalu up-to-date dengan informasi terkini. Sebagai contoh, jika seorang programmer Java ingin tahu tentang perkembangan teknologi J2EE, dia mungkin akan membuka theserverside.com dan kemudian terkejut karena begitu banyak frameworks dan tools baru yang muncul. Fenomena ini merupakan efek bola salju yang diakibatkan oleh WWW. Setiap orang dapat dengan mudah mempelajari ilmu baru dan kemudian meciptakan ilmu baru untuk kemudian dia tambahkan sebagai text baru di WWW. Karena adanya hal ini, si programer tadi terpaksa harus membaca dan mencoba membandingkan benda-benda baru tadi agar dapat mengambil keputusan benda mana yang dia perlukan atau akan dia pakai (dan bukan tidak mungkin kemudian si programmer tadi merasa dia perlu menciptakan benda baru, dan kemudian menginformasikannya ke theserverside.com, sehingga siklus tadi terulang kembali). Bagi sebagian orang, fenomena ini berdampak positif (misalnya bagi Sun yang dengan bangga menyebutkan "Java berkembang setiap milidetik"). Tetapi bagi sebagian yang lain, fenomena ini dapat menyebabkan tekanan yang berlebihan karena teknologi / techno-stress (misalnya bagi Tono yang baru belajar pemrograman Java, dan bingung bagian mana yang harus dia pelajari terlebih dahulu). Bahkan sebagian orang menganggap adanya Information Overload ini menjadikan manusia dikontrol oleh teknologi informasi (bukan malah terbantu dengan adanya teknologi informasi).&lt;br /&gt;&lt;br /&gt;Next : Lost in Hyperspace&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4136058-111194772490177377?l=monn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://monn.blogspot.com/feeds/111194772490177377/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4136058&amp;postID=111194772490177377' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/111194772490177377'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/111194772490177377'/><link rel='alternate' type='text/html' href='http://monn.blogspot.com/2005/03/mencari-jarum-di-lautan-bit-curhat.html' title='Mencari Jarum di Lautan Bit : Curhat Sang Peselancar (Bagian 1)'/><author><name>monn</name><uri>http://www.blogger.com/profile/13979763502469183042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos.friendster.com/photos/34/80/5590843/6528433312778l.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4136058.post-111158582599016499</id><published>2005-03-23T20:21:00.000+07:00</published><updated>2005-03-28T03:26:21.876+07:00</updated><title type='text'>JCC launching seminar</title><content type='html'>Sun and ITB (my current school) has launched Java Competency Center today. Here's a few summary of the technical presentation at the launching seminar.&lt;br /&gt;&lt;br /&gt;1. Solaris 10 by Ang Djok An&lt;br /&gt;Good and well structured material presented by this Sun's employee. Of course he didn't go into deep technical detail (he is absolutely the one of Sun's marketer). Many stuff like failover mechanism, system backup and restore, vertical scalability, wasn't covered up in his session. Sure it's a boring session.&lt;br /&gt;&lt;br /&gt;2. Java 5 Tiger by Eko Budhi S (another employee at Sun)&lt;br /&gt;Hmm, just that old hey-plz-welcome-Java-5-and-these-are-the-new-features. He miss that new Java 5 annotation thing. Another boring session.&lt;br /&gt;&lt;br /&gt;3. J2ME for Mobile Development by Beny Sutrisno&lt;br /&gt;Not interesting stuff at all. He just gave a overview of J2ME and a simple library he has done for it. The library is quite simple and easy to use so that we can use it to have a same application screen in every device (hey, why do we need that :p).&lt;br /&gt;&lt;br /&gt;4. Achieving Productivity Through Quality by Cokorda Raka&lt;br /&gt;Good idea with bad presentation. I think he needs more practice in explaning his idea to public and preparing good presentation.&lt;br /&gt;&lt;br /&gt;5. Java untuk Solusi Marketing by Frans Thamura&lt;br /&gt;I'm sure that everyone who attended this session agreed with me that the presenter should register as one of API (Audisi Pelawak tpI) participant. Quite entertaining session with all his bad explanation about Java and other stuffs, but I think everyone enjoyed his joke.&lt;br /&gt;&lt;br /&gt;6. Mobile and Java Strategies to Win Competition in Mobile Market&lt;br /&gt;Fall a sleep in the beginning of the session. Another boring presentation.&lt;br /&gt;&lt;br /&gt;I'm sure that I've wasted my time by attending a bad seminar today :( There is no 'techie' stuff, just a little technology overview and most marketing stuff.&lt;br /&gt;&lt;br /&gt;p.s. The food was bad too :(&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4136058-111158582599016499?l=monn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://monn.blogspot.com/feeds/111158582599016499/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4136058&amp;postID=111158582599016499' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/111158582599016499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/111158582599016499'/><link rel='alternate' type='text/html' href='http://monn.blogspot.com/2005/03/jcc-launching-seminar.html' title='JCC launching seminar'/><author><name>monn</name><uri>http://www.blogger.com/profile/13979763502469183042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos.friendster.com/photos/34/80/5590843/6528433312778l.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4136058.post-111195471624075460</id><published>2005-03-23T03:15:00.000+07:00</published><updated>2005-03-28T03:18:36.240+07:00</updated><title type='text'>Happy Birthday</title><content type='html'>Happy birthday Java!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4136058-111195471624075460?l=monn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://monn.blogspot.com/feeds/111195471624075460/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4136058&amp;postID=111195471624075460' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/111195471624075460'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/111195471624075460'/><link rel='alternate' type='text/html' href='http://monn.blogspot.com/2005/03/happy-birthday.html' title='Happy Birthday'/><author><name>monn</name><uri>http://www.blogger.com/profile/13979763502469183042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos.friendster.com/photos/34/80/5590843/6528433312778l.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4136058.post-111129210408575862</id><published>2005-03-20T11:03:00.000+07:00</published><updated>2005-03-28T03:09:25.826+07:00</updated><title type='text'>Building simple client side RSS aggregator using XMLHttpRequest</title><content type='html'>XmlHttpRequest enable us to request a web resource "on the fly" using Javascript. Here's my first XmlHttpRequest's hello world :)&lt;br /&gt;&lt;br /&gt;The first and only thing we need to accomplish the mission (WTF :p) is by writing a page contains below code. The page is really simple page that do nothing but fetching RSS feeds from various &lt;a href="http://slashdot.com"&gt;full-fluff-no-stuff&lt;/a&gt; sites. Here's the stupid code.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;A Very Stupid Page&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;style&amp;gt;&lt;br /&gt;span.hidden{&lt;br /&gt;    display: none;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;span.show{&lt;br /&gt;    display: inline;&lt;br /&gt;    color: black;&lt;br /&gt;    background-color: pink;&lt;br /&gt;}&lt;br /&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;script&amp;gt;&lt;br /&gt;var req;&lt;br /&gt;&lt;br /&gt;function loadDoc(url)&lt;br /&gt;{&lt;br /&gt;    output = document.getElementById('outputHolder');&lt;br /&gt;    output.innerHTML = "loading";&lt;br /&gt;    if (window.XMLHttpRequest) {&lt;br /&gt;        req = new XMLHttpRequest();&lt;br /&gt;        req.onreadystatechange = processReqChange;&lt;br /&gt;        req.open("GET", url, true);&lt;br /&gt;        req.send(null);&lt;br /&gt;    } else if (window.ActiveXObject) {&lt;br /&gt;        req = new ActiveXObject("Microsoft.XMLHTTP");&lt;br /&gt;        if (req) {&lt;br /&gt;            req.onreadystatechange = processReqChange;&lt;br /&gt;            req.open("GET", url, true);&lt;br /&gt;            req.send();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function processReqChange()&lt;br /&gt;{&lt;br /&gt;    if (req.readyState == 4) {&lt;br /&gt;        if (req.status == 200) {&lt;br /&gt;            response = req.responseXML;&lt;br /&gt;            str = "";&lt;br /&gt;           &lt;br /&gt;            items = response.getElementsByTagName('item');&lt;br /&gt;            for (i=0; i&amp;lt;items.length; i++) {&lt;br /&gt;                title = items[i].getElementsByTagName('title')[0].childNodes[0].nodeValue;&lt;br /&gt;                link = items[i].getElementsByTagName('link')[0].childNodes[0].nodeValue;&lt;br /&gt;                desc = items[i].getElementsByTagName('description')[0].childNodes[0].nodeValue;&lt;br /&gt;               &lt;br /&gt;                str += "&amp;lt;br&amp;gt;&amp;lt;a href="+link+"&amp;gt;"+title+"&amp;lt;a&amp;gt;&amp;lt;br&amp;gt;"+desc+"&amp;lt;br&amp;gt;";&lt;br /&gt;            }&lt;br /&gt;           &lt;br /&gt;            str = str.replace(/&amp;lt;img.*&amp;gt;/gi,"");&lt;br /&gt;            output = document.getElementById('outputHolder');&lt;br /&gt;            output.innerHTML = str;&lt;br /&gt;            output.className = 'show';&lt;br /&gt;           &lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;span onMouseOver="loadDoc('http://apple.slashdot.org/apple.rss','')"&amp;gt;&lt;br /&gt;&amp;lt;font color=green&amp;gt;Apple&amp;lt;/font&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;&amp;lt;span onMouseOver="loadDoc('http://books.slashdot.org/books.rss','')"&amp;gt;&lt;br /&gt;&amp;lt;font color=green&amp;gt;Books&amp;lt;/font&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;&amp;lt;span onMouseOver="loadDoc('http://bsd.slashdot.org/bsd.rss','')"&amp;gt;&lt;br /&gt;&amp;lt;font color=green&amp;gt;BSD&amp;lt;/font&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;&amp;lt;span onMouseOver="loadDoc('http://developers.slashdot.org/developers.rss','')"&amp;gt;&lt;br /&gt;&amp;lt;font color=green&amp;gt;Developers&amp;lt;/font&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;&amp;lt;span onMouseOver="loadDoc('http://interviews.slashdot.org/interviews.rss','')"&amp;gt;&lt;br /&gt;&amp;lt;font color=green&amp;gt;Interviews&amp;lt;/font&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;&amp;lt;span onMouseOver="loadDoc('http://it.slashdot.org/it.rss','')"&amp;gt;&lt;br /&gt;&amp;lt;font color=green&amp;gt;IT&amp;lt;/font&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;&amp;lt;span onMouseOver="loadDoc('http://linux.slashdot.org/linux.rss','')"&amp;gt;&lt;br /&gt;&amp;lt;font color=green&amp;gt;Linux&amp;lt;/font&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;&amp;lt;span onMouseOver="loadDoc('http://games.slashdot.org/games.rss','')"&amp;gt;&lt;br /&gt;&amp;lt;font color=green&amp;gt;Games&amp;lt;/font&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;&amp;lt;span onMouseOver="loadDoc('http://science.slashdot.org/science.rss','')"&amp;gt;&lt;br /&gt;&amp;lt;font color=green&amp;gt;Science&amp;lt;/font&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;&amp;lt;span onMouseOver="loadDoc('http://yro.slashdot.org/yro.rss','')"&amp;gt;&lt;br /&gt;&amp;lt;font color=green&amp;gt;YRO&amp;lt;/font&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;br&amp;gt;&lt;br /&gt;&amp;lt;div id="outputHolder" class="hidden" style="font-size: 10pt; width: 400; height: 300"/&amp;gt;&lt;br /&gt;&amp;lt;span&amp;gt;&lt;br /&gt;&amp;lt;/span&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Save it to whatever.html and open it using IE or Mozilla. U can check the result by mouseovering the words.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4136058-111129210408575862?l=monn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://monn.blogspot.com/feeds/111129210408575862/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4136058&amp;postID=111129210408575862' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/111129210408575862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/111129210408575862'/><link rel='alternate' type='text/html' href='http://monn.blogspot.com/2005/03/building-simple-client-side-rss.html' title='Building simple client side RSS aggregator using XMLHttpRequest'/><author><name>monn</name><uri>http://www.blogger.com/profile/13979763502469183042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos.friendster.com/photos/34/80/5590843/6528433312778l.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4136058.post-111125185049806387</id><published>2005-03-19T23:22:00.000+07:00</published><updated>2005-03-20T00:12:40.930+07:00</updated><title type='text'>Ajax</title><content type='html'>Have read James Garrett's essay which titled &lt;a href="Ajax:"&gt;Ajax : A New Approach to Web Apps&lt;/a&gt;. Someday, there will be bunch of MVC frameworks based on this approach. User actions will fire fine grained events as well as desktop application. Just wait and see ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4136058-111125185049806387?l=monn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://monn.blogspot.com/feeds/111125185049806387/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4136058&amp;postID=111125185049806387' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/111125185049806387'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/111125185049806387'/><link rel='alternate' type='text/html' href='http://monn.blogspot.com/2005/03/ajax.html' title='Ajax'/><author><name>monn</name><uri>http://www.blogger.com/profile/13979763502469183042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos.friendster.com/photos/34/80/5590843/6528433312778l.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4136058.post-110988256399497872</id><published>2005-03-04T03:38:00.000+07:00</published><updated>2005-03-04T03:43:17.426+07:00</updated><title type='text'>Journey to the (Revolutionary, Evil-Hating, Cash-Crazy, and Possibly Self-Destructive) Center of Google</title><content type='html'>You’ve heard the story. Larry and Sergey drop out of school, start a company in a garage, then become billionaires. But will Larry and Sergey ever grow up?&lt;br /&gt;Read the story at from &lt;a href="http://men.style.com/gq/features/full?id=content_422"&gt;men.style.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4136058-110988256399497872?l=monn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://monn.blogspot.com/feeds/110988256399497872/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4136058&amp;postID=110988256399497872' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/110988256399497872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/110988256399497872'/><link rel='alternate' type='text/html' href='http://monn.blogspot.com/2005/03/journey-to-revolutionary-evil-hating.html' title='Journey to the (Revolutionary, Evil-Hating, Cash-Crazy, and Possibly Self-Destructive) Center of Google'/><author><name>monn</name><uri>http://www.blogger.com/profile/13979763502469183042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos.friendster.com/photos/34/80/5590843/6528433312778l.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4136058.post-110976152472662291</id><published>2005-03-02T17:45:00.000+07:00</published><updated>2005-03-02T18:05:24.726+07:00</updated><title type='text'>Let a thousand flowers bloom</title><content type='html'>JDO passes the JCP EG re-voting, with the big-offense-team(IBM, Oracle, and JBoss) abstaining, and an empty vote by Apple. Thousands of thanks to the community who voices the support. Thanks to Craig Russel and Robin Roos, and others, for their tireless effort. Just show them, JCP is not about politics, money, etc. It's purely about technology.&lt;br /&gt;&lt;br /&gt;Now, we'll see how the two side (Hibernate+JBoss vs JDO) competes each other and merge one day. Competition always be a good thing. And time will tell.&lt;br /&gt;&lt;br /&gt;Well, I think I still keep on JDO side (I prefer spec which come from object oriented perspective, not from the relational one), ganbatte guys!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4136058-110976152472662291?l=monn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://monn.blogspot.com/feeds/110976152472662291/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4136058&amp;postID=110976152472662291' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/110976152472662291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/110976152472662291'/><link rel='alternate' type='text/html' href='http://monn.blogspot.com/2005/03/let-thousand-flowers-bloom.html' title='Let a thousand flowers bloom'/><author><name>monn</name><uri>http://www.blogger.com/profile/13979763502469183042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos.friendster.com/photos/34/80/5590843/6528433312778l.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4136058.post-110959984340588680</id><published>2005-02-28T20:39:00.000+07:00</published><updated>2005-02-28T21:10:43.410+07:00</updated><title type='text'>Those old good days</title><content type='html'>&lt;p&gt;When I was in my hometown (Solo, West Java)..&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Berbaring di rumput melihat langit biru, baju masih basah oleh keringat hasil berlarian mengejar bola. Terkadang bisa sampai tertidur pulas sampai azan maghrib membangunkan.&lt;/li&gt;&lt;li&gt;Bergantung di tepian pintu bis kota, berharap tidak ada orang yang naik lagi sehingga tidak terdesak untuk masuk ke dalam bis. Sangat mendebarkan jika bis yang ditumpangi sedang "Speed" mode, mendahului semua kendaraan di depannya.&lt;/li&gt;&lt;li&gt;Menumpang mobil pick-up yang dicegat di tengah jalan, saat berangkat melihat pertandingan bola, dan berupaya menerobos masuk ke stadion yang dijaga ketat oleh tentara (saya pernah ditodong senjata laras panjang asli). Tiket 15 ribu rupiah sangat mahal bagi saya.&lt;/li&gt;&lt;li&gt;Berlarian dikejar satpam seusai subuh, karena menyalakan petasan di tengah-tengah pemukiman penduduk. Sayang jaman sekarang sudah susah mencari petasan. Kasihan anak2 yang hidup di jaman sekarang.&lt;/li&gt;&lt;li&gt;Mencontek dengan meletakkan buku yang ditutupi tas di laci meja kelas, berharap tidak ketahuan guru yang patroli keliling. Selalu saja ada teman yang tahu dan malah 'nitip' nyontek.&lt;/li&gt;&lt;li&gt;Mencari aransemen yang sesuai untuk lagu baru yang akan dimainkan saat latihan band, yang ternyata hasilnya selalu jauh berbeda dengan lagu aslinya. Selalu saja bawain lagu-lagu GNR, Bon Jovi, Steel Heart, hanya sesekali saja lagu yang lain.&lt;/li&gt;&lt;li&gt;Membangunkan teman sekampung saat ada pertandingan sepakbola antar klub. Tiga kali bolak-balik untuk setiap rumah untuk memastikan orangnya sudah bangun dan siap berangkat.&lt;/li&gt;&lt;li&gt;Makan dan minum rame-rame di warung lesehan pinggir jalan (wedangan). Harga nasi+lauk+es teh kurang lebih hanya 1000 rupiah. Sayang sekarang sudah terlalu ramai.&lt;/li&gt;&lt;li&gt;Berkemah di tepi pantai, hampir salah pilih lokasi (kalau tetap di tempat yang salah itu, pasti sudah tenggelam di telan ombak saat pasang di malam hari). Kehabisan uang dan terpaksa menumpang truk yang memuat es balok saat pulangnya.&lt;/li&gt;&lt;li&gt;Ramai-ramai menumpang kereta barang ke Jogja. Melambai ke orang-orang yang sedang berhenti di pintu perlintasan kereta api. Sampai di tempat tujuan dengan wajah berlapis debu dan asap kereta.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Great memories, great friends.. Miss those old good days :(&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4136058-110959984340588680?l=monn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://monn.blogspot.com/feeds/110959984340588680/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4136058&amp;postID=110959984340588680' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/110959984340588680'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/110959984340588680'/><link rel='alternate' type='text/html' href='http://monn.blogspot.com/2005/02/those-old-good-days.html' title='Those old good days'/><author><name>monn</name><uri>http://www.blogger.com/profile/13979763502469183042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos.friendster.com/photos/34/80/5590843/6528433312778l.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4136058.post-110950090037509561</id><published>2005-02-27T16:57:00.000+07:00</published><updated>2005-02-27T17:41:40.376+07:00</updated><title type='text'>Another language-comparison debate :(</title><content type='html'>I've tried to answer many10x times how J2EE is very10x differ with scripting language called PHP. I've used to code in PHP about 3 yrs ago and please correct me if I'm wrong. I'll write it down here so if another friend of mine wants to compare them, he/she can just read it here.&lt;br /&gt;&lt;br /&gt;What you won't get on PHP :&lt;br /&gt;&lt;br /&gt;1. Transactional support&lt;br /&gt;It's a must in mission critical business application. Yes, you just can use your database's capability for this one. But, how about committing to different sources (no 3)?&lt;br /&gt;&lt;br /&gt;2. Security support&lt;br /&gt;Well, I mean implicit/container managed security. Have any?&lt;br /&gt;&lt;br /&gt;3. Multiple backends source integration support&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;4. Shared resource architecture&lt;br /&gt;&lt;br /&gt;5. Good ORM solution&lt;br /&gt;Please mention one if any exists.&lt;br /&gt;&lt;br /&gt;6. No distributed solution&lt;br /&gt;Hmm, off course u can afford this using lower level distribution (clustered OS etc).&lt;br /&gt;&lt;br /&gt;7. Multi-language in multi-machine&lt;br /&gt;U can use Java, Jython, Groovy, and even PHP (JSR#223) above the JVM.&lt;br /&gt;&lt;br /&gt;8. Multipurpose language&lt;br /&gt;U can only use PHP for web-scripting.&lt;br /&gt;&lt;br /&gt;What you won't get in J2EE :&lt;br /&gt;&lt;br /&gt;1. Ease of deployment and test/code cycle as in PHP :)&lt;br /&gt;2. Single vendor source :)&lt;br /&gt;&lt;br /&gt;Hm, I'm not to start a war here, just comment if u feel something wrong.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4136058-110950090037509561?l=monn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://monn.blogspot.com/feeds/110950090037509561/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4136058&amp;postID=110950090037509561' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/110950090037509561'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/110950090037509561'/><link rel='alternate' type='text/html' href='http://monn.blogspot.com/2005/02/another-language-comparison-debate.html' title='Another language-comparison debate :('/><author><name>monn</name><uri>http://www.blogger.com/profile/13979763502469183042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos.friendster.com/photos/34/80/5590843/6528433312778l.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4136058.post-110813682190892174</id><published>2005-02-11T22:41:00.000+07:00</published><updated>2005-03-20T11:02:28.273+07:00</updated><title type='text'>My First Mamba Page</title><content type='html'>Mamba (http://mamba.sf.org) is very simple application server that not intended to be standard Servlet container. The dynamic contents can be served by implementating Service object, using Velocity, or writing BeanShell scripts. By using this article, you can run Mamba on Windows and deploy your first simple application probably within 5 minutes.&lt;br /&gt;&lt;br /&gt;· If you’re a moslem, let’s begin by saying Bismillahirahmanirahim J (hehe, I need this step to comply a 10-step-tutorial).&lt;br /&gt;&lt;br /&gt;· &lt;strong&gt;Preparation &lt;/strong&gt;&lt;br /&gt;The very first thing we have to do is preparing our tools. They are J2SDK and Mamba distribution. I assume that you have your J2SDK installed and have Mamba distribution extracted to %MAMBA%. Currently I have mamba-1.1.tar.gz in my PC, and extract it to D:\Installer\Java\mamba\mamba-1.1. This path would be my %MAMBA%&lt;br /&gt;&lt;br /&gt;· &lt;strong&gt;Write a runner script&lt;/strong&gt;&lt;br /&gt;This is very straight forward. All we need is just include every jar in the %MAMBA% in our classpath. Our script should be something simple like this :&lt;br /&gt;&lt;br /&gt;cd ..&lt;br /&gt;set CLASSPATH=lib\simple-2.4.jar;lib\velocity-1.3.1.jar;lib\beanshell-2.0.jar;lib\mamba-1.1.jar&lt;br /&gt;&lt;br /&gt;java -Dserver.properties=server.properties mamba.serve.Server&lt;br /&gt;&lt;br /&gt;Put this script on %MAMBA%\bin folder as mamba.bat (or whatever you want).&lt;br /&gt;&lt;br /&gt;· &lt;strong&gt;Edit Mamba configuration&lt;br /&gt;&lt;/strong&gt;If you read the last line of our runner script, you should have knew that Mamba server configuration is placed in %MAMBA%\server.properties. All we have to do is to edit this properties file to be one that matched our need (request port, page/classes/log directory). Well, I’ll keep it unchanged this time.&lt;br /&gt;&lt;br /&gt;· &lt;strong&gt;Let Mamba speaks, baby&lt;/strong&gt;&lt;br /&gt;Just run the running script. For me, it’s just by simply type “mamba” on my DOS console. (Don’t forget that you have to change your current working directory to %MAMBA%\bin).&lt;br /&gt;Then we can run our browser and open &lt;a href="http://localhost/"&gt;http://localhost/&lt;/a&gt; to see our Mamba default page.&lt;br /&gt;&lt;br /&gt;· &lt;strong&gt;Our first html page&lt;/strong&gt;&lt;br /&gt;Next we will use that plain old Hello World as example use case to be implemented. Write a simple html page that contains a form with one textfield.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;html&gt;&lt;br /&gt;&amp;lt;head&gt;&lt;br /&gt;&amp;lt;title&gt;Hello&amp;lt;/title&gt;&lt;br /&gt;&amp;lt;head&gt;&lt;br /&gt;&amp;lt;body&gt;&lt;br /&gt;&amp;lt;form name="HelloForm" action="showme.plz"&gt;&lt;br /&gt;Your name : &amp;lt;input type="text" name="username"&gt;&lt;br /&gt;&amp;lt;input type="submit" value="Say Hello"&gt;&lt;br /&gt;&amp;lt;/form&gt;&lt;br /&gt;&amp;lt;/body&gt;&lt;br /&gt;&amp;lt;/html&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Save it as hello.html and place under %MAMBA%\html folder.&lt;br /&gt;&lt;br /&gt;· &lt;strong&gt;Our first service&lt;/strong&gt;&lt;br /&gt;The next code is a simple service that display a hello to our user.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;import java.awt.Color;&lt;br /&gt;import java.awt.Font;&lt;br /&gt;import java.awt.Graphics;&lt;br /&gt;import java.awt.image.BufferedImage;&lt;br /&gt;import java.io.OutputStream;&lt;br /&gt;import java.util.Random;&lt;br /&gt;&lt;br /&gt;import simple.http.Request;&lt;br /&gt;import simple.http.Response;&lt;br /&gt;import simple.http.load.BasicService;&lt;br /&gt;import simple.http.serve.Context;&lt;br /&gt;&lt;br /&gt;import com.sun.image.codec.jpeg.JPEGCodec;&lt;br /&gt;import com.sun.image.codec.jpeg.JPEGImageEncoder;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* @author Monang Setyawan&lt;br /&gt;*&lt;br /&gt;*/&lt;br /&gt;public class HelloService extends BasicService {&lt;br /&gt;    &lt;br /&gt;    public ImageService(Context ctx) {&lt;br /&gt;        super(ctx);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    protected void process(Request request, Response response) throws Exception {&lt;br /&gt;        response.set(&amp;quot;Content-Type&amp;quot;,&amp;quot;image/gif&amp;quot;);&lt;br /&gt;        OutputStream os = response.getOutputStream();&lt;br /&gt;        int width = 800, height = 600;&lt;br /&gt;        &lt;br /&gt;        String username = request.getParameter(&amp;quot;username&amp;quot;);&lt;br /&gt;        &lt;br /&gt;        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);&lt;br /&gt;        Graphics graphics = image.getGraphics();&lt;br /&gt;        &lt;br /&gt;        Random random = new Random();&lt;br /&gt;        int r,g,b;&lt;br /&gt;        for (int i = 0; i &amp;lt; height; i++) {&lt;br /&gt;            r = random.nextInt(256);&lt;br /&gt;            g = random.nextInt(256);&lt;br /&gt;            b = random.nextInt(256);&lt;br /&gt;            graphics.setColor(new Color(r,g,b));&lt;br /&gt;            graphics.drawLine(0,i,width,i);&lt;br /&gt;        }&lt;br /&gt;        graphics.setColor(Color.WHITE);&lt;br /&gt;        graphics.setFont(new Font(&amp;quot;Courier New&amp;quot;, Font.PLAIN, 48));&lt;br /&gt;        graphics.drawString(&amp;quot;Hello &amp;quot; + username, width/4, height/2);&lt;br /&gt;        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(os);&lt;br /&gt;        encoder.encode(image);&lt;br /&gt;        os.close();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Save it as HelloService.java and compile it. Then we need to put Hello.class under %MAMBA%\class.&lt;br /&gt;&lt;br /&gt;· &lt;strong&gt;Edit mapping&lt;/strong&gt;&lt;br /&gt;The next step is to configure our mapping. Add this line to mapper.properties in %MAMBA% folder.&lt;br /&gt;&lt;br /&gt;showme.plz=HelloService&lt;br /&gt;&lt;br /&gt;· &lt;strong&gt;Restart Mamba server&lt;/strong&gt;&lt;br /&gt;Shutdown Mamba by pressing Ctrl+C in console where we start it, and then run our running script again. (Yes, Mamba currently doesn’t support hot deployment)&lt;br /&gt;&lt;br /&gt;· &lt;strong&gt;Check the result&lt;/strong&gt;&lt;br /&gt;Open &lt;/span&gt;&lt;a href="http://localhost/hello.html"&gt;http://localhost/hello.html&lt;/a&gt; and type your name. Then click the button and see what will be displayed on your browser. That’s all, simple isn’t :)&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4136058-110813682190892174?l=monn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://monn.blogspot.com/feeds/110813682190892174/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4136058&amp;postID=110813682190892174' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/110813682190892174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/110813682190892174'/><link rel='alternate' type='text/html' href='http://monn.blogspot.com/2005/02/my-first-mamba-page.html' title='My First Mamba Page'/><author><name>monn</name><uri>http://www.blogger.com/profile/13979763502469183042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos.friendster.com/photos/34/80/5590843/6528433312778l.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4136058.post-110779723041182833</id><published>2005-02-07T23:40:00.000+07:00</published><updated>2005-02-19T02:33:44.026+07:00</updated><title type='text'>C or Java?</title><content type='html'>It's hard for me to decide between using C or using Java for doing my final project. At &lt;a href="mailto:beowulf@beowulf.org"&gt;Beowulf&lt;/a&gt;, they suggest me to use C, using the argument that C usually 5-10 times faster than Java in arithmetical exhaustive computations. According different sources (papers), many of them has conclusion that Java implementations of MPI (Message Passing Interface, a standard for performing parallel computation by exchanging message between nodes) aren't that bad.&lt;br /&gt;&lt;br /&gt;The other suggestion is to build a Java version of the solution first, and then once I feel that the implementation is quite slow, then I could change only the parallel part of the application. Then why don't I just write like that (C for parallel part, and Java for the other part) from the beginning.&lt;br /&gt;&lt;br /&gt;My final project application consist of three logical layer (presentation, logic, and parallel computing). If I took that scenario, then I need a simple application server like &lt;a href="http://mamba.sf.org"&gt;Mamba&lt;/a&gt; or &lt;a href="http://simple.sf.org"&gt;Simple&lt;/a&gt; for the presentation layer. The two of them don't use Servlet as web technology, but rather use their own request-response architecture implementation. By using one of them, I can do my test-design-code cycle easily.&lt;br /&gt;&lt;br /&gt;For logical layer, IMO Java is the best choice, since there are many models need to be implemented there. Java is elegant choice for this, when readability and maintainability aspect needed for this layer. And at last for parallel computing layer, I consider to use C and mpich with Java as a simple wrapper/adapter (this approach is different with using Java as wrapper for MPI implementation, like MPIJ) between this and previous layer.&lt;br /&gt;&lt;br /&gt;I hope this choices will be the best combination for the project.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4136058-110779723041182833?l=monn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://monn.blogspot.com/feeds/110779723041182833/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4136058&amp;postID=110779723041182833' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/110779723041182833'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/110779723041182833'/><link rel='alternate' type='text/html' href='http://monn.blogspot.com/2005/02/c-or-java.html' title='C or Java?'/><author><name>monn</name><uri>http://www.blogger.com/profile/13979763502469183042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos.friendster.com/photos/34/80/5590843/6528433312778l.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4136058.post-110753483674208199</id><published>2005-02-04T22:41:00.000+07:00</published><updated>2005-02-20T14:24:08.996+07:00</updated><title type='text'>Blog Berbahasa Indah</title><content type='html'>Baru saja saya mengunjungi salah satu blog (&lt;a href="http://coretmoret.web.id/"&gt;http://coretmoret.web.id/&lt;/a&gt;) yang menggunakan bahasa Indonesia yang sangat baik. Saya benar-benar kagum pada pemilik blog tersebut. Mr. Tulisan Ikhlasul Amal (yang ternyata mempunyai almamater yang sama dengan saya, IF-ITB) benar-benar memberikan perasaan yang berbeda kepada saya dibandingkan dengan saat membaca blog-blog berbahasa Indonesia lain.&lt;br /&gt;&lt;br /&gt;Saya teringat pada Mr.Rinaldi Munir, seorang dosen yang sangat menyukai penggunaan bahasa Indonesia (upss, seharusnya &lt;strong&gt;B&lt;/strong&gt;ahasa Indonesia) dalam penyampaian melalui ucapan maupun tulisan (mungkin Ikhlasul Amal ini terpengaruh oleh beliau :). Yang saya kurang sukai adalah penggunaan kata-kata terjemahan asing yang mungkin terlalu memaksa, seperti penggunaan "larik" untuk menggantikan "array", "kalang" untuk "loop", dan sebagainya. Untuk pemrogram, kata-kata seperti "array" dan "loop" terkadang sudah sangat susah untuk digantikan, mengingat kita sering kali harus membaca dan menulis istilah tersebut dalam bahasa (sorry, I mean &lt;strong&gt;B&lt;/strong&gt;ahasa) Inggris di milis-milis berbau komputer.&lt;br /&gt;&lt;br /&gt;Sebagai "lawan" yang sepadan untuk Ikhlasul Amal ini, yang paling pantas mungkin adalah mr. uknowwho&lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;. Benar-benar bagai bumi dengan langit. :) Sebagai salah satu penghargaan atas Ikhlasul Amal ini, saya mencantumkan URI (hmm, what is Indonesian phrase for URI?) ke bagian link di blog saya ini.&lt;br /&gt;&lt;br /&gt;Terima kasih Ikhlasul Amal, anda sangat memberi inspirasi buat kami dalam berbahasa.&lt;br /&gt;(tidak cukup hanya bahasa untuk menunjukkan bangsa ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4136058-110753483674208199?l=monn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://monn.blogspot.com/feeds/110753483674208199/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4136058&amp;postID=110753483674208199' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/110753483674208199'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/110753483674208199'/><link rel='alternate' type='text/html' href='http://monn.blogspot.com/2005/02/blog-berbahasa-indah.html' title='Blog Berbahasa Indah'/><author><name>monn</name><uri>http://www.blogger.com/profile/13979763502469183042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos.friendster.com/photos/34/80/5590843/6528433312778l.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4136058.post-110753155002890338</id><published>2005-02-04T22:16:00.000+07:00</published><updated>2005-03-23T20:52:05.673+07:00</updated><title type='text'>Why they hate Sun</title><content type='html'>I still don't know why many peoples hate Sun Microsystem for not "open"-ing Java. Their commitment to open source should be well appreciated. They have made Solaris open source and create many oppotunity for open source projects to exist. They also stop M$ from invading the whole world with Java, although it's "just" an open standard.&lt;br /&gt;&lt;br /&gt;Here, in Indonesia, there is a guy that want Java to become open source. In my opinion (based on his explanation and writing about the open source definition), he just treat open source product as "free beer", not like "free speech"/freedom to change. That's a bad understanding about open source software principle, and since he claimed his self for "leader" of Indonesian Java User Group, his speech for open source will be thought as voice of the majority of Indonesian Java developer. That's too bad.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4136058-110753155002890338?l=monn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://monn.blogspot.com/feeds/110753155002890338/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4136058&amp;postID=110753155002890338' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/110753155002890338'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/110753155002890338'/><link rel='alternate' type='text/html' href='http://monn.blogspot.com/2005/02/why-they-hate-sun.html' title='Why they hate Sun'/><author><name>monn</name><uri>http://www.blogger.com/profile/13979763502469183042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos.friendster.com/photos/34/80/5590843/6528433312778l.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4136058.post-110705487129641393</id><published>2005-01-30T09:23:00.000+07:00</published><updated>2005-02-19T02:29:23.216+07:00</updated><title type='text'>Useless Day</title><content type='html'>Saturday :&lt;br /&gt;07.30 : waked up by a phone call, my superordinate asked me if I can accompany him for a badminton game. But I continued my sleep (sorry guys).&lt;br /&gt;09.00 : watching Naruto at TV, followed by my favorite childhood anime, Atom Boy.&lt;br /&gt;10.00 : playing Warcraft 3 against my roommate. 3 times straight wins, many loses when play together against computer.&lt;br /&gt;20.00 : going to a game center, playing Counter Strike for 7 hours :(&lt;br /&gt;03.00 : sleep at office&lt;br /&gt;05.00 : wake up for praying and the sleep again&lt;br /&gt;07.00 : wake up and think, "How useless I am.."&lt;br /&gt;08.00 : sleep again&lt;br /&gt;&lt;br /&gt;huahmm...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4136058-110705487129641393?l=monn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://monn.blogspot.com/feeds/110705487129641393/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4136058&amp;postID=110705487129641393' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/110705487129641393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/110705487129641393'/><link rel='alternate' type='text/html' href='http://monn.blogspot.com/2005/01/useless-day.html' title='Useless Day'/><author><name>monn</name><uri>http://www.blogger.com/profile/13979763502469183042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos.friendster.com/photos/34/80/5590843/6528433312778l.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4136058.post-110683213386611831</id><published>2005-01-27T19:49:00.000+07:00</published><updated>2005-02-19T02:27:33.013+07:00</updated><title type='text'>It's happened again</title><content type='html'>Have you ever been in situation when you want to argue someone's opinion but you just can't?&lt;br /&gt;It's happened today (and it's not rarely happened in my life). My lecturer (someone who acted as my friend's final project reviewer) said that Google employs multi-agents to assist us when we search something. He said that when we submit the search button, the agents act at that time searching sites that match our keyword and send the results to us. It's (sorry..) stupid opinion huh. Well, I'm sure that the search mechanism is just not like that. Search engines are using agents (or I prefer to call it "spiders") to index all term (or word) while offline. I use the word "offline" here to represent the time when the user doesn't interact with the system. Just imagine if his scenario is really used by search engines. How long it takes to search the sufficient results? Not to mention the matching processes (query terms vs document terms), I'm sure that the time needed by the agent to read and parse a bunch of pages is more than the searching-time displayed in Google's result page.&lt;br /&gt;&lt;br /&gt;I can't just simply argue like that remembering I'm in the position that can't say or comment anything. If I do that, then I take a risk that the discussion will lead to non-constructive discussion (just one-by-one defensive fight). May be this situation occured in Indonesia only.&lt;br /&gt;&lt;br /&gt;The other time when I've faced the same situation before was when I try to argue my lecturer's opinion about the meaning of "materialized view" on data warehouse. I must keep myself calm when she said my English written paper grasping is bad, cause I didn't agree with her explanation for "materialized view". Well, she might be right about my English, but that's nothing to do with that. It's a general concept that programmer like me are likely to know about.&lt;br /&gt;&lt;br /&gt;Yes, I don't want to hurt other people's pride as being in higher position (lecturer, superordinate). But when the truth couldn't be said, soon the mistake will spread and spread wider (he/she simply will keep telling people the same wrong information).&lt;br /&gt;&lt;br /&gt;(hmm.. I'm really missing a fair discussion for both side.. hope this situation could be changed)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4136058-110683213386611831?l=monn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://monn.blogspot.com/feeds/110683213386611831/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4136058&amp;postID=110683213386611831' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/110683213386611831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/110683213386611831'/><link rel='alternate' type='text/html' href='http://monn.blogspot.com/2005/01/its-happened-again.html' title='It&apos;s happened again'/><author><name>monn</name><uri>http://www.blogger.com/profile/13979763502469183042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos.friendster.com/photos/34/80/5590843/6528433312778l.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4136058.post-110658681980274158</id><published>2005-01-24T22:48:00.000+07:00</published><updated>2005-02-19T02:24:15.190+07:00</updated><title type='text'>The show must go on</title><content type='html'>Tomorrow is user acceptance test for my current project. There are 324 classes and 54 pages already. Although there are still many errors everywhere, there's no way to delay the test. I really hope that we can pass the test, so I can concentrate to my study. It's my 5th year already :(, it's too long for an undergraduate student to finish his/her study.&lt;br /&gt;&lt;br /&gt;Although I'm working as part-time programmer, the job pressure absolutely push me toward to be a high-stressed people. Doing more than one task (work and doing my final project), make my sleep time decreased to just about 5 hours a day. Life is just like a circular-chain composed by sleeping, reading books, writing something to get my final project report done, and put buggy codes in my project's software (just to debug them later).&lt;br /&gt;&lt;br /&gt;Back to my project. The to-do list still contains about 100 items. The only way to fight them is to temporarily remove some buggy feature, and adding them as patch to the later on-production software. Telkom is a horrible place for testing. They don't permit us physically put our application into our IBM P650 hosted there. They just gave us VPN-based access with low bandwidth (24 kbps upstream). To deploy our application, we need to wait for about 30 minutes while uploading it to the server. Not to mention the total time required to do ongoing bug-fixing or patching :(&lt;br /&gt;&lt;br /&gt;Yeah.. That's a programmer life. Programmer is an artist, scientist, and also an engineer. You need to have an artist' right-side brain to write an elegant code. You need to calculate mathematically almost every aspect of your code, and proof it that it's the best solution ever. And also you need to wear an engineer-mask to do your software development lifecycle. But those three doesn't make the salary of a programmer is bigger three-fold than a normal administration job :(.&lt;br /&gt;&lt;br /&gt;Long live programmer!!&lt;br /&gt;&lt;br /&gt;wassalam.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4136058-110658681980274158?l=monn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://monn.blogspot.com/feeds/110658681980274158/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4136058&amp;postID=110658681980274158' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/110658681980274158'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/110658681980274158'/><link rel='alternate' type='text/html' href='http://monn.blogspot.com/2005/01/show-must-go-on.html' title='The show must go on'/><author><name>monn</name><uri>http://www.blogger.com/profile/13979763502469183042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos.friendster.com/photos/34/80/5590843/6528433312778l.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4136058.post-110590221303530866</id><published>2005-01-17T01:58:00.000+07:00</published><updated>2005-02-19T02:21:59.676+07:00</updated><title type='text'>She's in coma</title><content type='html'>Wish all the best for my friend Arfa Adriana that still in coma condition. May qjj give her a quick recovery, and be able to smile again.&lt;br /&gt;&lt;br /&gt;Allahumma 'aafiha fii badaniha. Allaahuma 'aafiha fi sam'iha. Allaahumma 'aafiha fii bashariha. Allaahumma inna na'uudzu bika minal kufri wal faqri. Allahumma inna na'uudzu bika min 'adzaabil qabri laa illaaha illaa anta.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4136058-110590221303530866?l=monn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://monn.blogspot.com/feeds/110590221303530866/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4136058&amp;postID=110590221303530866' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/110590221303530866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/110590221303530866'/><link rel='alternate' type='text/html' href='http://monn.blogspot.com/2005/01/shes-in-coma.html' title='She&apos;s in coma'/><author><name>monn</name><uri>http://www.blogger.com/profile/13979763502469183042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos.friendster.com/photos/34/80/5590843/6528433312778l.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4136058.post-110589780171878749</id><published>2005-01-17T01:09:00.000+07:00</published><updated>2005-02-19T02:19:46.886+07:00</updated><title type='text'>Do I need a blog?</title><content type='html'>Whenever I read someone's blog, I often ask myself that question. Thinking about my blog writing rate vs spare time comparison, the answer is yes. But these last months, I always end up playing PC game wasting my spare time. I know that it's a useless way to spend my time. But it's always easier to start gaming than writing.&lt;br /&gt;Why it always ends up like this.. Always come to my mind to update this blog, and that time never come. May be the key is "motivation". Just think blog is something to be written, not to be read. May be it's my case.&lt;br /&gt;&lt;br /&gt;But if there's no try to change, there is no gain I'll get. May this will change my personality into more bloggish one :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4136058-110589780171878749?l=monn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://monn.blogspot.com/feeds/110589780171878749/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4136058&amp;postID=110589780171878749' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/110589780171878749'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/110589780171878749'/><link rel='alternate' type='text/html' href='http://monn.blogspot.com/2005/01/do-i-need-blog.html' title='Do I need a blog?'/><author><name>monn</name><uri>http://www.blogger.com/profile/13979763502469183042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos.friendster.com/photos/34/80/5590843/6528433312778l.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4136058.post-110130053193414608</id><published>2004-11-24T19:38:00.000+07:00</published><updated>2005-02-19T02:16:49.933+07:00</updated><title type='text'>A bad code from Ted Husted?</title><content type='html'>&lt;span style="font-size:+0;"&gt;This source code is listed on Ted's site. I found this code when I was searching for a trick for automatic token checking in a Struts application. Although this is just a simple example, but it sure has bad coding practices that shouldn't be followed by newbie programmer (note that I am a newbie too).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;// Check for missing token&lt;br /&gt;forward = mapping.findForward("getToken");&lt;br /&gt;if ((null!=forward) &amp;&amp;amp; (!isTokenValid(request))) {&lt;br /&gt;// Post token error message&lt;br /&gt;ActionErrors errors = new ActionErrors();&lt;br /&gt;errors.add(ActionErrors.GLOBAL_ERROR, new ActionError("error.token"));&lt;br /&gt;saveErrors(request,errors);&lt;br /&gt;return (forward);&lt;br /&gt;}&lt;br /&gt;if (null!=forward) {&lt;br /&gt;// reset to guard against duplicate request&lt;br /&gt;resetToken(request);&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;The first code's flaw is, the code doesn't use single return style method.&lt;br /&gt;The second is, there is double variable checking, while a single if-else block could achieve the same goal.&lt;br /&gt;&lt;br /&gt;I rewrite above code become this :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;// Check for missing token&lt;br /&gt;forward = mapping.findForward("getToken");&lt;br /&gt;if (null!=forward) {&lt;br /&gt;// reset to guard against duplicate request&lt;br /&gt;resetToken(request);&lt;br /&gt;if(!isTokenValid(request)){&lt;br /&gt;// Post token error message&lt;br /&gt;ActionErrors errors = new ActionErrors();&lt;br /&gt;errors.add(ActionErrors.GLOBAL_ERROR, new ActionError("error.token"));&lt;br /&gt;saveErrors(request,errors);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Hey, where are the return statement?&lt;br /&gt;It's removed from the code since we actually didn't need to escape at that time. A better approach should be using a boolean variable that indicate whether the token is valid or not.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4136058-110130053193414608?l=monn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://monn.blogspot.com/feeds/110130053193414608/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4136058&amp;postID=110130053193414608' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/110130053193414608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/110130053193414608'/><link rel='alternate' type='text/html' href='http://monn.blogspot.com/2004/11/bad-code-from-ted-husted.html' title='A bad code from Ted Husted?'/><author><name>monn</name><uri>http://www.blogger.com/profile/13979763502469183042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos.friendster.com/photos/34/80/5590843/6528433312778l.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4136058.post-110112275176663614</id><published>2004-11-22T18:18:00.000+07:00</published><updated>2004-11-24T14:21:08.716+07:00</updated><title type='text'>API for Friendster/Multiply/Hi5</title><content type='html'>&lt;span style="font-size:85%;"&gt;Another invitation mail just arrive in mailbox. It's from &lt;/span&gt;&lt;a href="http://www.hi5.com/"&gt;&lt;span style="font-size:85%;"&gt;hi5&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;.&lt;br /&gt;When it comes like this, it just a matter of time when an software (like &lt;/span&gt;&lt;a href="http://gaim.sourceforge.net/"&gt;&lt;span style="font-size:85%;"&gt;Gaim&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;)/API (like &lt;/span&gt;&lt;a href="http://www.blogger.com/developers/api/1_docs/"&gt;&lt;span style="font-size:85%;"&gt;BloggerAPI&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;)/webservices that can bridging (built on a layer above these 'social net websites') sites like friendster/multiply/hi5/etc come, so anyone just need to have a single account.&lt;br /&gt;&lt;br /&gt;Has someone started an SF project for this one? If it hasn't, u s'd start a new one :)&lt;br /&gt;&lt;br /&gt;(Well, I wonder that Google will create one too. GNet? googlefriends? :p)&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4136058-110112275176663614?l=monn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/110112275176663614'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/110112275176663614'/><link rel='alternate' type='text/html' href='http://monn.blogspot.com/2004/11/api-for-friendstermultiplyhi5.html' title='API for Friendster/Multiply/Hi5'/><author><name>monn</name><uri>http://www.blogger.com/profile/13979763502469183042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos.friendster.com/photos/34/80/5590843/6528433312778l.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-4136058.post-110112223421007454</id><published>2004-11-22T18:11:00.000+07:00</published><updated>2005-01-17T01:52:23.933+07:00</updated><title type='text'>Xbeans </title><content type='html'>&lt;span&gt;I've found another xml library that has power on its simplicity. This lib has a really different idea about how to build xml-based application using a chained transformer (xbean). I like this approach, while the other lib seems to be full-bloated with all-future-xml-feature-that-yet-ready-to-use.&lt;br /&gt;&lt;br /&gt;It's &lt;a href="http://xbeans.org"&gt;Xbeans&lt;/a&gt;. And it's a real JavaBean (oops... I mean, it is a visual component/can be configured using IDE :) &lt;/span&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4136058-110112223421007454?l=monn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/110112223421007454'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/110112223421007454'/><link rel='alternate' type='text/html' href='http://monn.blogspot.com/2004/11/xbeans.html' title='Xbeans '/><author><name>monn</name><uri>http://www.blogger.com/profile/13979763502469183042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos.friendster.com/photos/34/80/5590843/6528433312778l.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-4136058.post-109898538402598548</id><published>2004-10-29T00:43:00.000+07:00</published><updated>2004-10-29T00:43:04.026+07:00</updated><title type='text'>Pindahan euy..</title><content type='html'>Setelah lama nggak corat-coret, akhirnya saya coba untuk ngeblog lagi. Kali ini saya pindah dari &lt;a href="http://jroller.com/page/monn" title="old blog" target="_blank"&gt;blog lama&lt;/a&gt; ke sini. Mulai sekarang, sedapat mungkin saya akan pakai bahasa Indonesia untuk ngeblog. Semoga tulisan saya jadi meningkat mutunya dan ada yang mau baca :p&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4136058-109898538402598548?l=monn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://monn.blogspot.com/feeds/109898538402598548/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4136058&amp;postID=109898538402598548' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/109898538402598548'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4136058/posts/default/109898538402598548'/><link rel='alternate' type='text/html' href='http://monn.blogspot.com/2004/10/pindahan-euy.html' title='Pindahan euy..'/><author><name>monn</name><uri>http://www.blogger.com/profile/13979763502469183042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos.friendster.com/photos/34/80/5590843/6528433312778l.jpg'/></author><thr:total>1</thr:total></entry></feed>
