<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;A0ADRHg_eip7ImA9WhRRFE4.&quot;"><id>tag:blogger.com,1999:blog-6639474468897837856</id><updated>2011-11-28T07:22:55.642+07:00</updated><category term="Python" /><category term="be wish" /><category term="technocrats" /><category term="my experience" /><category term="log harian" /><category term="my dream" /><category term="my feel" /><category term="Java Tech" /><category term="book for reading" /><category term="PLBOS" /><category term="hobiest" /><category term="games engineering" /><category term="OpenBSD" /><title>::rosyada {b}log::</title><subtitle type="html">amru rosyada blog, for sharing to every one</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://amrurosyada.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://amrurosyada.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>arros</name><uri>http://www.blogger.com/profile/15115335540591605422</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://1.bp.blogspot.com/_-cffNDQPfcc/ST9DFOnnX7I/AAAAAAAAAGY/hhLx1rQqh54/S220/1_998498248l-edit.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>54</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/Rosyadacode" /><feedburner:info uri="rosyadacode" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;DkAERX85eCp7ImA9WxBRFUo.&quot;"><id>tag:blogger.com,1999:blog-6639474468897837856.post-4371247829054568220</id><published>2010-01-04T10:11:00.000+07:00</published><updated>2010-01-04T10:11:44.120+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-04T10:11:44.120+07:00</app:edited><title>release chalinux-0.1-KK</title><content type="html">alhamdulillah akhirnya release juga &lt;a href="http://chalinux.org/"&gt;chalinux-0.1-KK&lt;/a&gt; (Karmic Koala), tapi tool untuk rendernya belum di embed didalemnya menyusul aja soalnya masih banyak bug nya. distro linux ini merupakan turunan ubuntu yang dikhususkan untuk desain grafis karena didalamnya sudah ada beberapa tools yang sering digunakan untuk desain grafis dan 3D modelling seperti &lt;a href="http://www.gimp.org/"&gt;gimp&lt;/a&gt;, &lt;a href="http://www.inkscape.org/"&gt;inkscape&lt;/a&gt;, &lt;a href="http://www.blender.org/"&gt;blender&lt;/a&gt;, dan &lt;a href="http://www.drqueue.org/"&gt;drqueue&lt;/a&gt;(distributed render queue). drqueue terinstall di /opt/drqueue tetapi belum ada setting yang berarti baru fresh install saja. untuk kedepannya kami akan menambahkan tools untuk rendering yang akan kami tanamkan kedalam distro ini selain itu juga akan membuat paket untuk installer untuk distribusi linux yang lain... status tools saat ini masih dalam tahap pengembangan. memang kalo di rasa2 memang terlalu muluk sih mimpinya... tapi cita2 itu kan harus tinggi hehehe...&lt;br /&gt;
goal dari project ini adalah membuat infrastruktur render farm agar lebih mudah digunakan di &lt;a href="http://linux.org/"&gt;linux&lt;/a&gt;, jadi user hanya sedikit menyentuh konsol atau bahkan tidak menyentuh konsol sama sekali hehehe.... &lt;br /&gt;
untuk pembuatan tools rendering kami menggunakan &lt;a href="http://python.org/"&gt;python&lt;/a&gt; sebagai bahasa pengembangannya karena memang lebih cepat untuk development... untuk lebih lanjut silahkan kunjungi offisial sitenya di &lt;a href="http://chalinux.org/"&gt;http://chalinux.org&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
screenshoot nye...&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_-cffNDQPfcc/S0FblxsrF-I/AAAAAAAAAQY/8rxHix6A1Ow/s1600-h/boot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_-cffNDQPfcc/S0FblxsrF-I/AAAAAAAAAQY/8rxHix6A1Ow/s320/boot.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;boot splash nye...&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt; &lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt; &lt;br /&gt;
&lt;a href="http://3.bp.blogspot.com/_-cffNDQPfcc/S0Fbs8nwZgI/AAAAAAAAAQg/x7lNxAj40vk/s1600-h/xsplash.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_-cffNDQPfcc/S0Fbs8nwZgI/AAAAAAAAAQg/x7lNxAj40vk/s320/xsplash.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;xsplash nye...&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&amp;nbsp;&lt;a href="http://1.bp.blogspot.com/_-cffNDQPfcc/S0Fbz0Amx8I/AAAAAAAAAQo/1QG-P7luNGs/s1600-h/desktop.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_-cffNDQPfcc/S0Fbz0Amx8I/AAAAAAAAAQo/1QG-P7luNGs/s320/desktop.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;desktop nye... &lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6639474468897837856-4371247829054568220?l=amrurosyada.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/jqiOPZj-oijhx6Hv4h7-nG7ibsQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jqiOPZj-oijhx6Hv4h7-nG7ibsQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/jqiOPZj-oijhx6Hv4h7-nG7ibsQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jqiOPZj-oijhx6Hv4h7-nG7ibsQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Rosyadacode/~4/jDRfWeOBSoA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://amrurosyada.blogspot.com/feeds/4371247829054568220/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://amrurosyada.blogspot.com/2010/01/release-chalinux-01-kk.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default/4371247829054568220?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default/4371247829054568220?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Rosyadacode/~3/jDRfWeOBSoA/release-chalinux-01-kk.html" title="release chalinux-0.1-KK" /><author><name>arros</name><uri>http://www.blogger.com/profile/15115335540591605422</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://1.bp.blogspot.com/_-cffNDQPfcc/ST9DFOnnX7I/AAAAAAAAAGY/hhLx1rQqh54/S220/1_998498248l-edit.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_-cffNDQPfcc/S0FblxsrF-I/AAAAAAAAAQY/8rxHix6A1Ow/s72-c/boot.png" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://amrurosyada.blogspot.com/2010/01/release-chalinux-01-kk.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0AFQn44fCp7ImA9WxNUFEU.&quot;"><id>tag:blogger.com,1999:blog-6639474468897837856.post-6897645299653217189</id><published>2009-11-06T11:00:00.001+07:00</published><updated>2009-11-06T13:41:53.034+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-06T13:41:53.034+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="my experience" /><category scheme="http://www.blogger.com/atom/ns#" term="technocrats" /><category scheme="http://www.blogger.com/atom/ns#" term="log harian" /><category scheme="http://www.blogger.com/atom/ns#" term="PLBOS" /><title>Masalah Samba Pada Ubuntu Karmic 9.10</title><content type="html">begini ceritanya, awalnya laptop saya terinstall &lt;a href="http://www.ubuntu.com/"&gt;ubuntu jaunty 9.04&lt;/a&gt; karena denger &lt;a href="http://www.ubuntu.com/"&gt;ubuntu versi karmic 9.10&lt;/a&gt; udah release, tiba2 muncul dorongan untuk upgrade ke versi terbaru. setelah ane setting repo dan segala macemnya, ane bukalah konsole dan ane ketikkan "apt-get dist-upgrade". awalnya sih berjalan dengan lancar tidak tau mengapa pada akhir process gagal untuk melakukan ugrade, alhasil setelah reboot ga bisa sama sekali masuk sistem operasi... (duh sudah mulai panic)&lt;br /&gt;
alhamdulillah ada cd linux live cd untuk recoveri dan mulai ane backup data2 project2 yang penting... wah prosesnya panjang tidak usah diceritakan nanti jadi bosen.&lt;br /&gt;
selesai backup data, akhirnya dengan berat hati ane eksekusi juga dengan install ulang pake ubuntu karmic, proses instalasi tidak usah diceritakan karena sangat mudah bahkan untuk para newbie sekalipun. langsung masuk saja pada masalah inti karena sistem operasi sudah oke jadi dan terinstall dengan benar, sekarang saatnya install service2 yang diperlukan kayak apache, mysql, samba ... dll. nah.. ini dia biang kerok si samba yang bikin agak puyeng habis diinstall kok servicenya ga bisa jalan waktu dijalankan malah muncul pesan:&lt;br /&gt;
&lt;blockquote&gt;Warning: Fake start-stop-daemon called. Doing nothin&lt;/blockquote&gt;doh kenapa ini (garuk2, newbie mode on), dengan sedikit bingung dan risau ane bukalah kamus solusi di mesin pencari yang tidak diragukan lagi, yes... you are right!!! it's &lt;a href="http://google.com"&gt;GOOGLE&lt;/a&gt; mantep to. akhirnya ketemu juga solusinya dan sangat simple.. cuman kayak gini ajah diketikin di konsole:&lt;br /&gt;
&lt;blockquote&gt;root@besmart:/home/amru# apt-get install dpkg --reinstall&lt;/blockquote&gt;selesai proses diatas baru jalankan samba servicenya lagi:&lt;br /&gt;
&lt;blockquote&gt;root@besmart:/home/amru# /etc/init.d/samba start&lt;br /&gt;
* Starting Samba daemons&lt;/blockquote&gt;&lt;br /&gt;
gampang to enak to :D.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6639474468897837856-6897645299653217189?l=amrurosyada.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/zK95AqRu7VUkLtHdCH2VTrs9Q_Y/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zK95AqRu7VUkLtHdCH2VTrs9Q_Y/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/zK95AqRu7VUkLtHdCH2VTrs9Q_Y/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zK95AqRu7VUkLtHdCH2VTrs9Q_Y/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Rosyadacode/~4/_wwjw2trnt8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://amrurosyada.blogspot.com/feeds/6897645299653217189/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://amrurosyada.blogspot.com/2009/11/masalah-samba-pada-ubuntu-karmic-910.html#comment-form" title="10 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default/6897645299653217189?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default/6897645299653217189?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Rosyadacode/~3/_wwjw2trnt8/masalah-samba-pada-ubuntu-karmic-910.html" title="Masalah Samba Pada Ubuntu Karmic 9.10" /><author><name>arros</name><uri>http://www.blogger.com/profile/15115335540591605422</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://1.bp.blogspot.com/_-cffNDQPfcc/ST9DFOnnX7I/AAAAAAAAAGY/hhLx1rQqh54/S220/1_998498248l-edit.jpg" /></author><thr:total>10</thr:total><feedburner:origLink>http://amrurosyada.blogspot.com/2009/11/masalah-samba-pada-ubuntu-karmic-910.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUEERn45fyp7ImA9WxNUEkw.&quot;"><id>tag:blogger.com,1999:blog-6639474468897837856.post-225945104655621100</id><published>2009-11-02T13:36:00.003+07:00</published><updated>2009-11-03T10:06:47.027+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-03T10:06:47.027+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="my experience" /><category scheme="http://www.blogger.com/atom/ns#" term="be wish" /><category scheme="http://www.blogger.com/atom/ns#" term="log harian" /><category scheme="http://www.blogger.com/atom/ns#" term="my feel" /><title>ketika tempat kerja menjadi membosankan?</title><content type="html">Banyak sekali orang2 dengan gigihnya berjuang memperoleh suatu perkerjaan mereka rela berdesak desakan saling sikut, saling tendang, saling silang, mungkin saya juga termasuk diantaranya. Pasti sangat bangga sekali ketika pekerjaan yang didamba dambakan itu sudah berada digenggaman tangan wow... so pasti kita akan berjalan dengan wajah yang sumringah dan wajah yang berseri bahkan baja pun akan meleleh dibuatnya.&lt;br /&gt;
Tapi seiring berjalannya waktu otak ini pasti akan merasa jenuh jika kegiatan yang sama diulang ulang apalagi kalo bos kita kurang kooperatif alias diktator alias apa yang dia katakan adalah yang paling benar... dan lagi jika umur kita masih relatif muda, jadi ingat ikan LA Light "YaNg MUda YanG Ga DipERcaYA".&lt;br /&gt;
&lt;span class="fullpost"&gt;&lt;br /&gt;
Dengan banyaknya permsalahan tidak sedikit orang yang sudah bekerja beberapa tahun mengalami depresi atau tekanan yang amat sangat disebabkan permasalahan dikantor + permasalahan luar kantor yang keduanya saling bertemu sehingga terjadi turbulensi antara keduanya sehingga menambah beban semakin berat, bahkan ketika kita berjalan diatas kepala kita akan muncul &lt;span id="goog_1257136313984"&gt;&lt;/span&gt;&lt;span id="goog_1257136313985"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_-cffNDQPfcc/Su53ed-iDII/AAAAAAAAAPM/RWLTFeJhoCE/s1600-h/images3.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_-cffNDQPfcc/Su53ed-iDII/AAAAAAAAAPM/RWLTFeJhoCE/s320/images3.jpeg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;b&gt;alias BoSEn&lt;/b&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;a href="http://3.bp.blogspot.com/_-cffNDQPfcc/Su530-WvUoI/AAAAAAAAAPU/3mYshv80oZA/s1600-h/images.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_-cffNDQPfcc/Su530-WvUoI/AAAAAAAAAPU/3mYshv80oZA/s320/images.jpeg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Kalo sudah seperti itu jangan pernah coba coba hal yang negatif apalagi mendekati yang satu ini BRO!!! JANGAN!!!&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;b&gt;Jangan Dekati ya BRO! PleaSE!! &lt;/b&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_-cffNDQPfcc/Su59W_PuRoI/AAAAAAAAAQE/eH6FjeVDNZo/s1600-h/Zina_Lucario___Digitally_Done_by_BlackDragonAJ89.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_-cffNDQPfcc/Su59W_PuRoI/AAAAAAAAAQE/eH6FjeVDNZo/s320/Zina_Lucario___Digitally_Done_by_BlackDragonAJ89.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Lalu bagai mana mengatasi rasa bosan seperti ini, rasa ini sering muncul juga pada diri ane, bahkan ketika membuka file file yang mempunya isi seperti ini&lt;br /&gt;
&lt;/div&gt;&lt;blockquote&gt;&amp;lt;? ?&amp;gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;atau&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;public class BosenLho{&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;}&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;atau&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;class Ini_Juga_mboseni(Bosen):&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; self.__init__(self):&lt;br /&gt;
&lt;/div&gt;&lt;/blockquote&gt;jadi apa solusinya untuk menghilangkan kebosanan yang amat sangat ??? apa obatnya akhi ??? what's the cure bro ???&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_-cffNDQPfcc/Su5509g49gI/AAAAAAAAAPc/WC9lrtsobrA/s1600-h/images2.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_-cffNDQPfcc/Su5509g49gI/AAAAAAAAAPc/WC9lrtsobrA/s320/images2.jpeg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;pertama wudhu&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_-cffNDQPfcc/Su56-_1a3uI/AAAAAAAAAPk/etkZJTq85OI/s1600-h/2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_-cffNDQPfcc/Su56-_1a3uI/AAAAAAAAAPk/etkZJTq85OI/s320/2.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;kedua ke masjid&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_-cffNDQPfcc/Su57Ha0xBZI/AAAAAAAAAPs/BoSB5qCv5FU/s1600-h/mosque.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_-cffNDQPfcc/Su57Ha0xBZI/AAAAAAAAAPs/BoSB5qCv5FU/s320/mosque.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div style="text-align: center;"&gt;ketiga sholat&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_-cffNDQPfcc/Su57YrAsW4I/AAAAAAAAAP0/J3O4kkIZTNI/s1600-h/shalat-2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_-cffNDQPfcc/Su57YrAsW4I/AAAAAAAAAP0/J3O4kkIZTNI/s320/shalat-2.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: center;"&gt;keempat tilawah&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_-cffNDQPfcc/Su57oXUUUBI/AAAAAAAAAP8/hUdWNFmPcy0/s1600-h/quran-o.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_-cffNDQPfcc/Su57oXUUUBI/AAAAAAAAAP8/hUdWNFmPcy0/s320/quran-o.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: left;"&gt;itu diantaranya&amp;nbsp; obat2 bosen yang sering ane gunakan soalnya sudah terbukti ampuh, karena ketika kita sudah jenuh dengan wilayah jasmani maka obatnya adalah dengan kita memasuki wilayah rohani, dengan cara bertobat dan beribadah mendekatkan diri kepada tuhan, Allah Subhanallahu Wata'ala. karena hanya Allah lah yang mampu memberikan ketenangan kepada hati kita dan hanya dengan dukungan faktor X (Allah) permasalahan permasalahan kita akan terpecahkan, insyaAllah ketika kita lebih mendekat kepada Allah maka Allah akan jauh lebih dekat kepada kita bahkan lebih dekat dari pada pembuluh darah dan urat nadi kita. Niscaya kita akan menjadi&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_-cffNDQPfcc/Su59tG_hUdI/AAAAAAAAAQM/N3w8NpfyXOM/s1600-h/anak_sholeh.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_-cffNDQPfcc/Su59tG_hUdI/AAAAAAAAAQM/N3w8NpfyXOM/s320/anak_sholeh.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;
**gambar gambar bukan asli bikinan saya tetapi sekedar googling saja, jadi yang merasa gambarnya saya catut boleh komplain kok, tapi ga pake royalti ya :D&lt;br /&gt;
&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6639474468897837856-225945104655621100?l=amrurosyada.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/8T_ECwGjKPZq8CjduUq2ErOXytE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8T_ECwGjKPZq8CjduUq2ErOXytE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/8T_ECwGjKPZq8CjduUq2ErOXytE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8T_ECwGjKPZq8CjduUq2ErOXytE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Rosyadacode/~4/mRy5ZxzZJi4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://amrurosyada.blogspot.com/feeds/225945104655621100/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://amrurosyada.blogspot.com/2009/11/ketika-tempat-kerja-menjadi-membosankan.html#comment-form" title="14 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default/225945104655621100?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default/225945104655621100?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Rosyadacode/~3/mRy5ZxzZJi4/ketika-tempat-kerja-menjadi-membosankan.html" title="ketika tempat kerja menjadi membosankan?" /><author><name>arros</name><uri>http://www.blogger.com/profile/15115335540591605422</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://1.bp.blogspot.com/_-cffNDQPfcc/ST9DFOnnX7I/AAAAAAAAAGY/hhLx1rQqh54/S220/1_998498248l-edit.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_-cffNDQPfcc/Su53ed-iDII/AAAAAAAAAPM/RWLTFeJhoCE/s72-c/images3.jpeg" height="72" width="72" /><thr:total>14</thr:total><feedburner:origLink>http://amrurosyada.blogspot.com/2009/11/ketika-tempat-kerja-menjadi-membosankan.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUECR3Y5eip7ImA9WxNUEkw.&quot;"><id>tag:blogger.com,1999:blog-6639474468897837856.post-4096887913151895227</id><published>2009-10-29T19:18:00.003+07:00</published><updated>2009-11-03T10:07:46.822+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-03T10:07:46.822+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="be wish" /><category scheme="http://www.blogger.com/atom/ns#" term="Java Tech" /><category scheme="http://www.blogger.com/atom/ns#" term="log harian" /><category scheme="http://www.blogger.com/atom/ns#" term="PLBOS" /><title>Menambahkan Offline Recitation pada Zekr</title><content type="html">Pada posting sebelumnya ane sudah membahas sekelumit tentang aplikasi zekr, lalu bagaimana jika kita ingin mendengarkan bacaan Al Qur'an sekaligus ingin menyimak ayat2 yang sedang dibacakan secara offline ??. tidak usah bingung karena dari developer zekr sudah menyediakan offline recitation kita tinggal download saja dari situs resmi &lt;a href="http://zekr.org/quran/en/recitations"&gt;zekr&lt;/a&gt;, di situs resminya sendiri tidak menyediakan keseluruhan recitation yang dicantumkan tetapi hanya beberapa saja yaitu dari &lt;a href="http://en.wikipedia.org/wiki/Qari%27"&gt;Al-Minshawi, Al-Ghamdi, Al-Huzaifi, dan Al-Afas&lt;/a&gt;. Hehe jujur saja kalo saya lebih cenderung download yang Al Afasi, tapi tergantung selera juga sih... lain ladang kan lain belalang. Lalu&amp;nbsp; pertanyaannya bagaimana menambahkan offline receitation-nya?? akhi, ukhti begini caranya..&lt;br /&gt;
&lt;span class="fullpost"&gt;&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;download recitation &lt;a href="http://zekr.org/quran/en/recitations"&gt;file audio dan file propertiesnya&lt;/a&gt;, misalnya ane ingin menambahkan Al Afasi maka ane download &lt;a href="http://downloads.sourceforge.net/zekr/afasy.zip"&gt;afasy.zip&lt;/a&gt; dan &lt;a href="http://zekr.org/download/recitation/afasy-offline.properties"&gt;afasy-offline.properties&lt;/a&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt; unzip afasy.zip ke &lt;tt&gt;[lokasi instalasi zekr]/res/audio/afasy&lt;/tt&gt; (sebagai contoh &lt;tt&gt;C:\Program Files\Zekr\res\audio\zekr&lt;/tt&gt; di Windows). Setelah langkah ini, maka akan didapatkan file *.mp3 didalam folder afasy;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;tambahkan &lt;tt&gt;afasy-offline.properties&lt;/tt&gt; melalui &lt;i&gt;Tools &amp;gt; Add &amp;gt; Recitation&lt;/i&gt;;&lt;/li&gt;
&lt;li&gt;restart Zekr dan akan ada tambahan item recitation baru dengan pengenal (offline) di menu  &lt;i&gt;Audio &amp;gt; Recitation menu&lt;/i&gt;.&lt;/li&gt;
&lt;/ol&gt;setelah ditambahkan tinggal dijalankan saja, pilih surah apa yang akan di baca dan klik 2 kali (pake mouse lho! :D).&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_-cffNDQPfcc/SumH3n6sLrI/AAAAAAAAAPE/OF0sSEnyJQM/s1600-h/text3166.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_-cffNDQPfcc/SumH3n6sLrI/AAAAAAAAAPE/OF0sSEnyJQM/s320/text3166.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;Panduan &lt;br /&gt;
&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6639474468897837856-4096887913151895227?l=amrurosyada.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/JgxaTt7t-mG0pfV0wJdgkfcHbnc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JgxaTt7t-mG0pfV0wJdgkfcHbnc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/JgxaTt7t-mG0pfV0wJdgkfcHbnc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JgxaTt7t-mG0pfV0wJdgkfcHbnc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Rosyadacode/~4/NPfuFfSADAI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://amrurosyada.blogspot.com/feeds/4096887913151895227/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://amrurosyada.blogspot.com/2009/10/menambahkan-offline-recitation-pada.html#comment-form" title="8 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default/4096887913151895227?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default/4096887913151895227?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Rosyadacode/~3/NPfuFfSADAI/menambahkan-offline-recitation-pada.html" title="Menambahkan Offline Recitation pada Zekr" /><author><name>arros</name><uri>http://www.blogger.com/profile/15115335540591605422</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://1.bp.blogspot.com/_-cffNDQPfcc/ST9DFOnnX7I/AAAAAAAAAGY/hhLx1rQqh54/S220/1_998498248l-edit.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_-cffNDQPfcc/SumH3n6sLrI/AAAAAAAAAPE/OF0sSEnyJQM/s72-c/text3166.png" height="72" width="72" /><thr:total>8</thr:total><feedburner:origLink>http://amrurosyada.blogspot.com/2009/10/menambahkan-offline-recitation-pada.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUAGR349fip7ImA9WxNUEkw.&quot;"><id>tag:blogger.com,1999:blog-6639474468897837856.post-4918093918492162583</id><published>2009-10-29T11:48:00.001+07:00</published><updated>2009-11-03T10:08:46.066+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-03T10:08:46.066+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="be wish" /><category scheme="http://www.blogger.com/atom/ns#" term="Java Tech" /><category scheme="http://www.blogger.com/atom/ns#" term="log harian" /><category scheme="http://www.blogger.com/atom/ns#" term="PLBOS" /><title>Zekr - Qur'an For Linux</title><content type="html">Mungkin sudah agak telat posting tentang aplikasi &lt;a href="http://zekr.org/"&gt;zekr&lt;/a&gt; karena aplikasi ini sudah ada secara default pada distribusi &lt;a href="http://www.sabily.org/"&gt;Ubuntu muslim edition (UbuntuME)&lt;/a&gt;, aplikasi ini merupakan aplikasi layaknya digital Al Qur'an lengkap dengan terjemahannya. Selain itu masih banyak lagi fungsionalitas dari aplikasi ini seperti fungsi pencarian, fungsi language translation, bahkan ada recitation (pembaca Al Qur'an) tergantung mau pilih siapa yang mau membawakan bisa online maupun offline, dan masih banyak lagi. so far sih aplikasi ini sangat membantu ketika ane lupa bawa mushaf. Silahkan saja download aplikasinya dari situs resminya &lt;a href="http://zekr.org/"&gt;disini&lt;/a&gt; atau yang sudah pake ubuntu tinggal pake perintah &lt;span class="fullpost"&gt;&lt;br /&gt;
&lt;blockquote&gt;sudo apt-get install zekr&lt;br /&gt;
&lt;/blockquote&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_-cffNDQPfcc/SukeBhoUHBI/AAAAAAAAAO0/6JCG-tsW9Ak/s1600-h/Screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_-cffNDQPfcc/SukeBhoUHBI/AAAAAAAAAO0/6JCG-tsW9Ak/s320/Screenshot.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;Splash screen saat loading&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;a href="http://4.bp.blogspot.com/_-cffNDQPfcc/SukeQcKjr2I/AAAAAAAAAO8/2CHv3x_taOw/s1600-h/text3162.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_-cffNDQPfcc/SukeQcKjr2I/AAAAAAAAAO8/2CHv3x_taOw/s320/text3162.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&amp;nbsp;Antarmuka Aplikasi&lt;br /&gt;
&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6639474468897837856-4918093918492162583?l=amrurosyada.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/hAIoXuUp-ORVd7iWGggp5Z2MWp0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hAIoXuUp-ORVd7iWGggp5Z2MWp0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/hAIoXuUp-ORVd7iWGggp5Z2MWp0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hAIoXuUp-ORVd7iWGggp5Z2MWp0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Rosyadacode/~4/XZNaiDlpBMM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://amrurosyada.blogspot.com/feeds/4918093918492162583/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://amrurosyada.blogspot.com/2009/10/zekr-quran-for-linux.html#comment-form" title="7 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default/4918093918492162583?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default/4918093918492162583?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Rosyadacode/~3/XZNaiDlpBMM/zekr-quran-for-linux.html" title="Zekr - Qur'an For Linux" /><author><name>arros</name><uri>http://www.blogger.com/profile/15115335540591605422</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://1.bp.blogspot.com/_-cffNDQPfcc/ST9DFOnnX7I/AAAAAAAAAGY/hhLx1rQqh54/S220/1_998498248l-edit.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_-cffNDQPfcc/SukeBhoUHBI/AAAAAAAAAO0/6JCG-tsW9Ak/s72-c/Screenshot.png" height="72" width="72" /><thr:total>7</thr:total><feedburner:origLink>http://amrurosyada.blogspot.com/2009/10/zekr-quran-for-linux.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0YNQ3cyeyp7ImA9WxNVF0U.&quot;"><id>tag:blogger.com,1999:blog-6639474468897837856.post-3313182242157601163</id><published>2009-10-10T23:04:00.009+07:00</published><updated>2009-10-29T11:06:32.993+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-29T11:06:32.993+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="technocrats" /><category scheme="http://www.blogger.com/atom/ns#" term="Java Tech" /><category scheme="http://www.blogger.com/atom/ns#" term="hobiest" /><title>render farm project on progress</title><content type="html">in this year i hope i can finish my study in Gadjah Mada University might be many people known as UGM where it place in Yogyakarta. my first project is create render farm, i initiate it as my final exam or in my university called TA (Tugas Akhir), i build it using java RMI collaborate with blender  render engine the idea is using java RMI for communicate between client and node through the server then the node will process render task from client using blender, in each node must have blender engine installed. there are three kind of application one will place in the client, second will place in the sever and third application will place in node, and i use master slave architecture for building the infrastructure.&lt;span class="fullpost"&gt;&lt;br /&gt;
&lt;br /&gt;
this is illustration of my idea, may be it familiar to you:&lt;br /&gt;
&lt;br /&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-cffNDQPfcc/StCw7Gv9nhI/AAAAAAAAAOE/aG0qBY6dooQ/s1600-h/arsitekturcpu.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 280px;" src="http://4.bp.blogspot.com/_-cffNDQPfcc/StCw7Gv9nhI/AAAAAAAAAOE/aG0qBY6dooQ/s400/arsitekturcpu.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5391003283433037330" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
there are three main application in the architecture picture AddJob class, JobManager class and JobProcessor class. Bellow picture will illustrate my final exam project work flow.&lt;br /&gt;
&lt;br /&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_-cffNDQPfcc/StCxP9KwwEI/AAAAAAAAAOM/f6pO8Roqdu8/s1600-h/renderfarmuml1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 352px; height: 382px;" src="http://2.bp.blogspot.com/_-cffNDQPfcc/StCxP9KwwEI/AAAAAAAAAOM/f6pO8Roqdu8/s400/renderfarmuml1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5391003641638338626" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_-cffNDQPfcc/StCz4tXh_yI/AAAAAAAAAOU/7SGxdqQOeYQ/s1600-h/renderfarmuml2.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 310px; height: 398px;" src="http://2.bp.blogspot.com/_-cffNDQPfcc/StCz4tXh_yI/AAAAAAAAAOU/7SGxdqQOeYQ/s400/renderfarmuml2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5391006540794822434" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_-cffNDQPfcc/StC0DEdTaJI/AAAAAAAAAOc/aNRxuSslEqY/s1600-h/renderfarmuml3.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 350px; height: 400px;" src="http://2.bp.blogspot.com/_-cffNDQPfcc/StC0DEdTaJI/AAAAAAAAAOc/aNRxuSslEqY/s400/renderfarmuml3.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5391006718791739538" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_-cffNDQPfcc/StC0M2jMmfI/AAAAAAAAAOk/Yn6YSiAiDwQ/s1600-h/renderfarmuml4.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 368px; height: 400px;" src="http://2.bp.blogspot.com/_-cffNDQPfcc/StC0M2jMmfI/AAAAAAAAAOk/Yn6YSiAiDwQ/s400/renderfarmuml4.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5391006886857054706" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-cffNDQPfcc/StC0WO-iI8I/AAAAAAAAAOs/GO9G7oEjXg0/s1600-h/arsistektursistem.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 380px;" src="http://1.bp.blogspot.com/_-cffNDQPfcc/StC0WO-iI8I/AAAAAAAAAOs/GO9G7oEjXg0/s400/arsistektursistem.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5391007048032986050" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
that’s my idea and had been implementing and work in progress. :D&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6639474468897837856-3313182242157601163?l=amrurosyada.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/LX0FegcTSs6P53cbFOguiWqi4Ug/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LX0FegcTSs6P53cbFOguiWqi4Ug/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/LX0FegcTSs6P53cbFOguiWqi4Ug/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LX0FegcTSs6P53cbFOguiWqi4Ug/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Rosyadacode/~4/O0NeAv2K0-w" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://amrurosyada.blogspot.com/feeds/3313182242157601163/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://amrurosyada.blogspot.com/2009/10/render-farm-project-on-progress.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default/3313182242157601163?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default/3313182242157601163?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Rosyadacode/~3/O0NeAv2K0-w/render-farm-project-on-progress.html" title="render farm project on progress" /><author><name>arros</name><uri>http://www.blogger.com/profile/15115335540591605422</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://1.bp.blogspot.com/_-cffNDQPfcc/ST9DFOnnX7I/AAAAAAAAAGY/hhLx1rQqh54/S220/1_998498248l-edit.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_-cffNDQPfcc/StCw7Gv9nhI/AAAAAAAAAOE/aG0qBY6dooQ/s72-c/arsitekturcpu.png" height="72" width="72" /><thr:total>3</thr:total><feedburner:origLink>http://amrurosyada.blogspot.com/2009/10/render-farm-project-on-progress.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkEFRng7eyp7ImA9WxNXGE0.&quot;"><id>tag:blogger.com,1999:blog-6639474468897837856.post-7138587608284348246</id><published>2009-10-06T10:38:00.003+07:00</published><updated>2009-10-06T10:43:37.603+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-06T10:43:37.603+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="log harian" /><title>one of my shares</title><content type="html">few day ago i just create new blog in &lt;a href="http://wordpress.com"&gt;wordpress.com&lt;/a&gt;. may be it contain like this one but no problem i just want to more and more share to every one. you can access my new knowledge shares facility in &lt;a href="http://ishares.wordpress.com"&gt;ishares&lt;/a&gt;. thanks you.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6639474468897837856-7138587608284348246?l=amrurosyada.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/dTTAR-y3fB5No_IlFsZNS5CXVjY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dTTAR-y3fB5No_IlFsZNS5CXVjY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/dTTAR-y3fB5No_IlFsZNS5CXVjY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dTTAR-y3fB5No_IlFsZNS5CXVjY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Rosyadacode/~4/8nEh4oILNBM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://amrurosyada.blogspot.com/feeds/7138587608284348246/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://amrurosyada.blogspot.com/2009/10/one-of-my-shares.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default/7138587608284348246?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default/7138587608284348246?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Rosyadacode/~3/8nEh4oILNBM/one-of-my-shares.html" title="one of my shares" /><author><name>arros</name><uri>http://www.blogger.com/profile/15115335540591605422</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://1.bp.blogspot.com/_-cffNDQPfcc/ST9DFOnnX7I/AAAAAAAAAGY/hhLx1rQqh54/S220/1_998498248l-edit.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://amrurosyada.blogspot.com/2009/10/one-of-my-shares.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0UHSX8yeCp7ImA9WxNUEk4.&quot;"><id>tag:blogger.com,1999:blog-6639474468897837856.post-8218707897057034110</id><published>2009-08-21T09:27:00.006+07:00</published><updated>2009-11-03T16:07:18.190+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-03T16:07:18.190+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="book for reading" /><title>recommended book for reading</title><content type="html">tak terasa sudah terdengar suara adzan asar dari sebuah masjid di kompleks UGM, ane pikir stop dulu deh kerjaannya sudah dipanggil sama yang maha pencipta untuk menunaikan kewajiban... tapi kalo dipikir pikir ibadah itu kan kita yang butuh... kalo pun seluruh dunia ini ga ada satupun cecurut yang ngibadah juga ga bakalan ngaruh sama Allah... toh juga tidak akan berkurang kemuliaanNYA.&lt;span class="fullpost"&gt;&lt;br /&gt;
jadilah ane berangkat menuju masjid kampus UGM yang megah itu dengan menaiki motor butut... tut.. tut.. tut.. setelah markir motor dan kaki mulai melangkah kedalam masjid, eh sekonyong konyong ane menengok kearah serambi melihat beberapa pedagang buku menjajakan dagangan mereka.. wah tak pikir nanti mampir ah ngliat2 buku lagian dah lama ga nambah koleksei pribadi dirumah.. ya wiss dah terdengar iqomah jadi ngibadah dulu ja.&lt;br /&gt;
mendoakan jemaah lain dengan menolehkan kepala kekanan dan kiri merupakan tanda akhir sholat, setelah sedikit berzikir akhirnya pandangan ini tertuju ketumpukan buku2 yang ada di serambi, langkah kaki pung menuntun kearah serambi. tak henti hentinya mata ini searching di tumpukan buku berharap menemukan judul yang bisa menggelitik respon syarat yang ada di otak... seeeet.. tuit.. tuit.. tuit.. radar telah berbunyi pertanda sudah ada buku yang judulnya mampu menggelitik dan membuat penasaran, ane raih buku itu dan melihat dengan seksama buku ber-title "AYO MENGINAP DI RUMAH NABI"&lt;br /&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_-cffNDQPfcc/So4RFyC2blI/AAAAAAAAANg/KoYw7SUa2iU/s1600-h/70438f830e871f9da824f26a62e2a417.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 300px;" src="http://2.bp.blogspot.com/_-cffNDQPfcc/So4RFyC2blI/AAAAAAAAANg/KoYw7SUa2iU/s400/70438f830e871f9da824f26a62e2a417.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5372250196530327122" /&gt;&lt;/a&gt;... ow ternyata merupakan kisah dari sahabat Ibnu Abbas RA, yang menginap di rumah beliau dan dengan tekad yang kuat ingin mengetahui bagaimana kehidupan Rasulullah SAW sebagai sauri tauladan dalam membagi waktunya dimalam hari. setelah membaca sedikit deskripsi dari buku itu akhirnya keluar juga sedikit uang dari dompet ane, murah lho cuman 20.000,- rupiah saja, beeh! ternya memang lagi ada diskon hehehe kalo orang bilang pucuk dicinta ulampun tiba!. beneran ga rugi kok beli nih buku, dalam buku diceritakan bagaimana Rosulullah SAW membagi waktunya untuk kehidupan dalam beribadah, keluarga, sanak saudara, dan dakwah... jadi tidak melulu dakwah dan melupakan kahidupan sosial. beli aja deh biar ga penasaran ato boleh minjem tapi ngantri ya!!!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6639474468897837856-8218707897057034110?l=amrurosyada.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/qp2k-3djMAtx5-cuLAE3Sz-Uaxs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qp2k-3djMAtx5-cuLAE3Sz-Uaxs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/qp2k-3djMAtx5-cuLAE3Sz-Uaxs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qp2k-3djMAtx5-cuLAE3Sz-Uaxs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Rosyadacode/~4/v6mToTmRq6k" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://amrurosyada.blogspot.com/feeds/8218707897057034110/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://amrurosyada.blogspot.com/2009/08/recommended-book-to-read.html#comment-form" title="11 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default/8218707897057034110?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default/8218707897057034110?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Rosyadacode/~3/v6mToTmRq6k/recommended-book-to-read.html" title="recommended book for reading" /><author><name>arros</name><uri>http://www.blogger.com/profile/15115335540591605422</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://1.bp.blogspot.com/_-cffNDQPfcc/ST9DFOnnX7I/AAAAAAAAAGY/hhLx1rQqh54/S220/1_998498248l-edit.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_-cffNDQPfcc/So4RFyC2blI/AAAAAAAAANg/KoYw7SUa2iU/s72-c/70438f830e871f9da824f26a62e2a417.jpg" height="72" width="72" /><thr:total>11</thr:total><feedburner:origLink>http://amrurosyada.blogspot.com/2009/08/recommended-book-to-read.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0UMSHg7eSp7ImA9WxNUEk4.&quot;"><id>tag:blogger.com,1999:blog-6639474468897837856.post-449007284418870661</id><published>2009-08-20T09:47:00.005+07:00</published><updated>2009-11-03T16:08:09.601+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-03T16:08:09.601+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="my experience" /><category scheme="http://www.blogger.com/atom/ns#" term="be wish" /><category scheme="http://www.blogger.com/atom/ns#" term="log harian" /><title>telat posting tujuh belas agustus</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-cffNDQPfcc/SozEttDwBWI/AAAAAAAAANY/se-BYfBFzwY/s1600-h/text2517.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 206px;" src="http://1.bp.blogspot.com/_-cffNDQPfcc/SozEttDwBWI/AAAAAAAAANY/se-BYfBFzwY/s320/text2517.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5371884745014642018" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
MERDEKA....! MERDEKA...! MERDEKA...!&lt;span class="fullpost"&gt; tujuh belas agustus 1945 merupakan hari yang bersejarah bagi bangsa ini (indonesia) seharusnya kita sebagai generasi penerus bangsa patut berbangga kepada perjuangan karena negara kita bisa merdeka dan berdiri tegak... tidak menjadi negara persemakmuran, tapi kok ane malah telat posting di hari yang bersejarah itu... (doh). bukan maksud hati untuk tidak menghargai jasa2 para simbah2 terdahulu yang sudah menumpahkan seluruh hidupnya demi membebaskan indonesia dan para calon2 penerus bangsa dari cengkraman para kolonial tapi karena sedang ada perjalanan dari jogja menuju jogja ... LHOOO klo diem dong jadinya... ga diem to yaa... maksudnya jogja-&gt;ngawi-&gt;madiun-&gt;wonogiri-&gt;jogja.&lt;br /&gt;
&lt;br /&gt;
start dari jogja hari minggu pagi mampir ngawi dulu bersapa ma ibu bapak... truss lanjut lagi dan akhirnya pas 17 agustus sedang ada di wonogiri klo ga salah daerahnya namanya giriwoyo... nah karena ga bawa peralatan jadinya ga bisa posting.. padahal logo banner sudah ane desain 3 hari sebelum berangkat. ya sudahlah... ga papa yang penting untuk generasi muda kayak ane ini adalah gimana cara memaknai 17 agustus... ya too.. enak to.. mantep to..MERDEKA !!!!&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;Kami bangsa Indonesia dengan ini menjatakan Kemerdekaan&lt;br /&gt;
Indonesia. Hal-hal jang mengenai pemindahan kekoeasaan dan lain-lain&lt;br /&gt;
diselenggarakan dengan tjara seksama dan dalam tempo jang&lt;br /&gt;
sesingkat-singkatnja.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Djakarta, 17 Agoestoes - 1945&lt;br /&gt;
Atas nama Bangsa Indonesia,&lt;br /&gt;
SOEKARNO - HATTA&lt;br /&gt;
&lt;/blockquote&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6639474468897837856-449007284418870661?l=amrurosyada.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/8jEsGYLPhAG-5W9-eLfLAEwgdMw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8jEsGYLPhAG-5W9-eLfLAEwgdMw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/8jEsGYLPhAG-5W9-eLfLAEwgdMw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8jEsGYLPhAG-5W9-eLfLAEwgdMw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Rosyadacode/~4/XE_MqzaUDYw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://amrurosyada.blogspot.com/feeds/449007284418870661/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://amrurosyada.blogspot.com/2009/08/telat-posting-tujuh-belas-agustus.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default/449007284418870661?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default/449007284418870661?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Rosyadacode/~3/XE_MqzaUDYw/telat-posting-tujuh-belas-agustus.html" title="telat posting tujuh belas agustus" /><author><name>arros</name><uri>http://www.blogger.com/profile/15115335540591605422</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://1.bp.blogspot.com/_-cffNDQPfcc/ST9DFOnnX7I/AAAAAAAAAGY/hhLx1rQqh54/S220/1_998498248l-edit.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_-cffNDQPfcc/SozEttDwBWI/AAAAAAAAANY/se-BYfBFzwY/s72-c/text2517.png" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://amrurosyada.blogspot.com/2009/08/telat-posting-tujuh-belas-agustus.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEIHRXs_fSp7ImA9WxJWFkk.&quot;"><id>tag:blogger.com,1999:blog-6639474468897837856.post-3518624425546463332</id><published>2009-06-22T08:46:00.004+07:00</published><updated>2009-06-22T11:55:34.545+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-22T11:55:34.545+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="PLBOS" /><title>Bergelut dengan Xorg.conf</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-cffNDQPfcc/Sj8OnbvOUGI/AAAAAAAAANM/ipV9otfIUro/s1600-h/Screenshot.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 200px;" src="http://1.bp.blogspot.com/_-cffNDQPfcc/Sj8OnbvOUGI/AAAAAAAAANM/ipV9otfIUro/s320/Screenshot.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5350010952962953314" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Setelah kemaren diinstall &lt;a href="http://openbsd.org"&gt;openbsd&lt;/a&gt; saatnya laptop untuk diinstall &lt;a href="http://debian.org"&gt;debian&lt;/a&gt; lenny 5.0 kenapa debian yang ane pilih... karena management paketnya enak dan sudah familiar dengan ane. Tapi sebenernya sama aja distro apapun yang dipake tergantung kebiasaan ajah... kalo orang jawa bilang "tresno jalaran soko kulino". Proses installasi sih oke2 saja tidak ada masalah sampai proses instalasi selesai dengan desktop yang saya pilih adalah &lt;a href="http://xfce.org"&gt;Xfce&lt;/a&gt; karena lebih ringan dan mudah digunakan.&lt;br /&gt;&lt;br /&gt;Semua device terdeteksi dengan baik bahkan xorg-server nya nampak oke2 saja karena resolusinya bisa sampai maksimal... tetapi setelah benchmark pada graphic devicenya yaitu &lt;span style="font-weight:bold;"&gt;"Intel Corporation Mobile GM965/GL960 Integrated Graphics Controller (rev 0c)"&lt;/span&gt; ternyata agak patah2 saat compositornya dijalankan bahkan saat game counter strike (favourite anak2 kantor) ga mau jalan di cedega nya... why???? ternyata setelah tanya2 sama rekan kerja, ada yang harus ditambahkan pada opsi xorg.conf pada bagian graphic cardnya, info yang ane dapatkan dari temen ane adalah menambahkan opsi berikut :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Section "Device"&lt;br /&gt;        Identifier      "Configured Video Device"&lt;br /&gt;        Option          "AccelMethod" "XAA"&lt;br /&gt;        Option          "XAANoOffscreenPixmaps" "true"&lt;br /&gt;        Option          "DPMS"&lt;br /&gt;EndSection&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;pada section device pada xorg.conf nya ditambahkan opsi diatas, setelah restart ane coba benchmark lagi dan wow... kompositor jalan dengan entengnya dan game counter strike bisa berjalan dengan lancar... setelah beberapa hari dipake ternyata terasa lagi kejanggalan pada saat menjalankan game counter strike yang kadang gamenya freeze saat dimainkan dan saat memutar video alias film terjadi pesan kesalahan "segmentation fault" ... how come...???&lt;br /&gt;&lt;br /&gt;Ternyata setelah bertanya kepada mbah google dapet juga jawabannya... karena opsi yang dimasukkan pada xorg.conf yang sebelumnya adalah untuk &lt;span style="font-weight:bold;"&gt;versi intel graphic yang versi 8xx dan bukan untuk yang versi 9xx&lt;/span&gt; sedangkan punya ane adalah versi "Intel Corporation Mobile GM965/GL960 Integrated Graphics Controller (rev 0c)" maka yang seharusnya ditambahkan pada xorg.conf adalah:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Section "Device"&lt;br /&gt;        Identifier      "Configured Video Device"&lt;br /&gt;        Option  "AccelMethod"   "exa"&lt;br /&gt;        Option  "MigrationHeuristic"    "greedy"&lt;br /&gt;        Option  "ExaNoComposite"        "false"&lt;br /&gt;        Option  "DPMS"&lt;br /&gt;EndSection&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;setelah diganti dengan opsi diatas maka ane restrart xorg-servernya dan wow.... alhamdulillah semuanya berjalan dengan baik termasuk games counter strike hanya dengan share memory 8MB bisa berjalan dengan baik :D bahkan 3d enginenya juga berjalan dengan konfigurasi diatas... hihihihi... good job linus torvald ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6639474468897837856-3518624425546463332?l=amrurosyada.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/9O5OZL-qYnxtbBVMlmdtuZZ1Yf0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9O5OZL-qYnxtbBVMlmdtuZZ1Yf0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/9O5OZL-qYnxtbBVMlmdtuZZ1Yf0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9O5OZL-qYnxtbBVMlmdtuZZ1Yf0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Rosyadacode/~4/fxtleR-ATwU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://amrurosyada.blogspot.com/feeds/3518624425546463332/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://amrurosyada.blogspot.com/2009/06/bergelut-dengan-xorgconf.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default/3518624425546463332?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default/3518624425546463332?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Rosyadacode/~3/fxtleR-ATwU/bergelut-dengan-xorgconf.html" title="Bergelut dengan Xorg.conf" /><author><name>arros</name><uri>http://www.blogger.com/profile/15115335540591605422</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://1.bp.blogspot.com/_-cffNDQPfcc/ST9DFOnnX7I/AAAAAAAAAGY/hhLx1rQqh54/S220/1_998498248l-edit.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_-cffNDQPfcc/Sj8OnbvOUGI/AAAAAAAAANM/ipV9otfIUro/s72-c/Screenshot.png" height="72" width="72" /><thr:total>4</thr:total><feedburner:origLink>http://amrurosyada.blogspot.com/2009/06/bergelut-dengan-xorgconf.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkIHQngycSp7ImA9WxJXFkw.&quot;"><id>tag:blogger.com,1999:blog-6639474468897837856.post-666506197951312394</id><published>2009-06-10T12:54:00.003+07:00</published><updated>2009-06-10T14:22:13.699+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-10T14:22:13.699+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="OpenBSD" /><title>OpenBSD di lappie baru saya...</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_-cffNDQPfcc/Si9ep1z2vgI/AAAAAAAAANE/f6UVvG8hNEE/s1600-h/image2447.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 228px;" src="http://3.bp.blogspot.com/_-cffNDQPfcc/Si9ep1z2vgI/AAAAAAAAANE/f6UVvG8hNEE/s320/image2447.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5345595355624291842" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Sudah sekian lama pengen beli lappie baru tapi ya... disesuai budget ajah... akhirnya pilihan jatuh ke dell vostro a840 yang harganya bisa dijangkau oleh saya :D&lt;br /&gt;&lt;br /&gt;sebenernya bingung mau diinstall distro linux apa... tapi nggak tau kok tiba2 dikepala kepikiran openbsd :p. tak perlu pikir panjang lagi langsung download dari repo andalan &lt;a href="ftp:repo.ugm.ac.id/openbsd/4.5/"&gt;ftp:repo.ugm.ac.id/openbsd/4.5/&lt;/a&gt; langsung nyoba install... tapi kok... textmod semua... hihihi... akhirnya instalasi harus dipandu oleh &lt;a href="http://www.openbsd.org/faq/faq4.html"&gt;openbsd.org&lt;/a&gt; dan tau sendiri alhasil instalasinya lama karena sambil baca documentasinya.. tapi proses instalasinya ternyata cepat euy... whuss.&lt;br /&gt;&lt;br /&gt;habis instalasi system minta reboot dan okelah saya turuti saja kemauannya, tapi setelah masuk sistem ternyata disuguhi command promt layaknya tampilan default linux awal2 tahun 90 an :D. akhirnya dengan sedikit bantuan dari googling dengan kata kunci "openbsd as desktop" ternyata dapet juga wiki dari &lt;a href="http://en.wikibooks.org/wiki/Guide_to_Unix/BSD/OpenBSD/As_a_Desktop"&gt;Guide to Unix/BSD/OpenBSD/As a Desktop&lt;/a&gt; untuk costumize openbsd jadi sebuah desktop yang oye...&lt;br /&gt;&lt;br /&gt;saya pilih pake xfce karena sudah familiar.. sebenarnya juga mendukung untuk desktop manager yang lain seper KDE, Gnome, Enlightenment, etc... paket yang lain untuk development juga bisa disedot via ftp dengan perintah pkg_add :D seru wiss pokoknya...&lt;br /&gt;&lt;br /&gt;tapi.... ada tapinya sebenaarnya semua hardware terdeteksi dengan baik.. tetapi ketika saya menjalankan perintah &lt;span style="font-weight:bold;"&gt;ifconfig ath0 scan&lt;/span&gt; kok malah ngefreeze alias ngehang... yah tapi itu bukan suatu masalah untuk teruss belajar make si OpenBSD :D&lt;br /&gt;ya itulah pengalaman make install openBSD untuk dijadiin desktop hehehehe... kurang kerjaan ajah ya open bsd dijadiin desktop... tapi tetep ajah asik... last tag Alhamdulillah...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6639474468897837856-666506197951312394?l=amrurosyada.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/c-s4VgVE5vYpEVeOp2fRkpqUYbY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/c-s4VgVE5vYpEVeOp2fRkpqUYbY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/c-s4VgVE5vYpEVeOp2fRkpqUYbY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/c-s4VgVE5vYpEVeOp2fRkpqUYbY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Rosyadacode/~4/LkMKlC9Tbdg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://amrurosyada.blogspot.com/feeds/666506197951312394/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://amrurosyada.blogspot.com/2009/06/openbsd-di-lappie-baru-saya.html#comment-form" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default/666506197951312394?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default/666506197951312394?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Rosyadacode/~3/LkMKlC9Tbdg/openbsd-di-lappie-baru-saya.html" title="OpenBSD di lappie baru saya..." /><author><name>arros</name><uri>http://www.blogger.com/profile/15115335540591605422</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://1.bp.blogspot.com/_-cffNDQPfcc/ST9DFOnnX7I/AAAAAAAAAGY/hhLx1rQqh54/S220/1_998498248l-edit.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_-cffNDQPfcc/Si9ep1z2vgI/AAAAAAAAANE/f6UVvG8hNEE/s72-c/image2447.png" height="72" width="72" /><thr:total>5</thr:total><feedburner:origLink>http://amrurosyada.blogspot.com/2009/06/openbsd-di-lappie-baru-saya.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0INRXk_fip7ImA9WxVXE08.&quot;"><id>tag:blogger.com,1999:blog-6639474468897837856.post-4877219839126267863</id><published>2009-02-11T07:27:00.004+07:00</published><updated>2009-02-11T10:06:34.746+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-11T10:06:34.746+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="be wish" /><title>Sebenarnya tidak mau disebut apesss lagi!</title><content type="html">Selasa malam, seperti biasa ane persiapan untuk battle maen futsal sama anak2 di gor bhineka tapi entah napa kok tiba2 ga da semangat yah. Yaudah deh akhirnya ane putuskan menutup mata sejenak untuk menambah energi setelah seharian bekerja. Eh... apa mau dikata terbangun dan waktu sudah menunjukkan 22.15 (berarti sudah telat 15 menit), tanpa basa basi lagi langsung cuci muka dan persiapan untuk berangkat. Walah ternyata yang dateng baru segelintir orang, emang dasar budaya jam karet yang belum bisa kami hilangkan.&lt;br /&gt;Pemanasan selesai team langsung dibagi menjadi 2 kelompok sisanya menunggu untuk gantian pertandingan berikutnya, sebenernya ane bermain cukup bagus tapi kok perasaan ini tidak enak ya... ada apakah gerangan??. Waktu terus berjalan mengiringi setiap passing, shooting, heading, fault, ... dan tibalah saat kita menikmati pertandingan yang terakhir, tak ada angin tak ada hujan datanglah seoorang asing dan terlihat petentang-petenteng kemudian menghampiri salah satu teman yang lagi kehabisan tenaga.&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Stranger : Mas, hmmm mas kristiannya ada?&lt;br /&gt;Teman : Wah ga kenal mas coba tanya yang sebelah sana.&lt;br /&gt;Stranger : Makasih mas...&lt;br /&gt;Stranger langsung berjalan tetapi masuknya ke kamar kecil.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Dari percakapan itu memang tidak ada yang mencurigakan, dan yang lain tetap maen bola termasuk ane. Adoooh kesleo!!! (me say), akhirnya ane gantian ma temen dan jadilah saya seorang keeper. Tapi anehnya orang tadi tetap petentang-petenteng dibelakang gawang yang ane jaga. Tanpa basa basi lagi si Stranger(orang asing) berjalan keluar melewati parkiran, yang tanpa kami sadari mengambil 2 helm yang berada disana, sebenarnya temenku sudah memperhatikan gerak-geriknya dan teriklah teman ane "Hoy bang itu orang yang ambil helm kemaren!!!", bubarlah kita dan menuju pakiran tetapi sayang kalah cepat dengan pencurinya ternyata sudah ada teman yang menunggu naik motor stanby kalo2 kepergok. YAAAH TELAT DAH....&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Teman 1 : Eh itu beneran orangnya?&lt;br /&gt;Teman 2 : Beneran bang, yah tadi sih tak perhatiin terus tapi tak liat2 kok ngambil helm putih, 2 helm yang diambil.&lt;br /&gt;Ane : Helm putih ????(dalam hati)&lt;br /&gt;Teman 3: Helm putih yang disini punya siapa ya?&lt;br /&gt;Ane : Dimana ? (dengan perasaan gusar), wah helmku kui... waduuuh... kok ilang!!&lt;br /&gt;Teman-Teman : !%@!#@^$#&amp;%$#^%$*&amp;^%*^&amp;$%@#$@%#@&amp;$*$*^$&amp;%#^$#@%#@%#&lt;br /&gt;*maaf untuk yang teman-teman disensor karena banyak sekali binatang2 yang disebut..!&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Yaa sudahlah ikhlaskan saja semoga orang yang ngambil cepet sadar dan berberkah hihihihihi, tapi permasalahannya bukan itu sih SAYA BESOK PAGI BERANGKAT KE KANTOR PAKE HELM SIAPA???? mana ada jam satu malem orang jualan helm. Kejadian juga paginya, sengaja memang mau berangkat pagi untuk menghindari polisi biasanya jam 07.00 polisi2 dah pada nongkrong. Putar otak lewat mana nih, oke akhirnya tanpa helm berangkat lewat gang2 kecil (sejauh ini berhasil), tapi jalan kekantor kan musti lewat perempatan (gpplah pikirku kan masih pagi). wewww lampuu merah berhentilah ane di barisan paling depan, tiba2 dari sebrang ada yang nyeletuk "Hoy mas2..!!!" langsung kutatap dengan tatapan tajam ...ENG ONG!!!! ... POLISI!!!!, best case-nya ane ga ditilang cuman diteriakin "BALIK2... PAKE HELMNYA!!!! =&gt; sambil nunjuk2 ke ane". Yaudah terpaksa puter balik lewat jalan tikus menuju kampus tercinta cuman buat nitipin motor, selebihnya jalan kaki kekantor wakakakakakakaka.....&lt;br /&gt;Besok kena apalagi yah, but it's fun =&gt; sebuah peringatan buat ane!&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/6639474468897837856-4877219839126267863?l=amrurosyada.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/2al4IQ7kbaP51vT1isAkbQNgwdQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2al4IQ7kbaP51vT1isAkbQNgwdQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/2al4IQ7kbaP51vT1isAkbQNgwdQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2al4IQ7kbaP51vT1isAkbQNgwdQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Rosyadacode/~4/24Yfrc7kTxE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://amrurosyada.blogspot.com/feeds/4877219839126267863/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://amrurosyada.blogspot.com/2009/02/sebenarnya-tidak-mau-disebut-apesss.html#comment-form" title="13 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default/4877219839126267863?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default/4877219839126267863?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Rosyadacode/~3/24Yfrc7kTxE/sebenarnya-tidak-mau-disebut-apesss.html" title="Sebenarnya tidak mau disebut apesss lagi!" /><author><name>arros</name><uri>http://www.blogger.com/profile/15115335540591605422</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://1.bp.blogspot.com/_-cffNDQPfcc/ST9DFOnnX7I/AAAAAAAAAGY/hhLx1rQqh54/S220/1_998498248l-edit.jpg" /></author><thr:total>13</thr:total><feedburner:origLink>http://amrurosyada.blogspot.com/2009/02/sebenarnya-tidak-mau-disebut-apesss.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0EGSXw6eip7ImA9WxVXEks.&quot;"><id>tag:blogger.com,1999:blog-6639474468897837856.post-3706043768349410301</id><published>2009-02-10T17:14:00.010+07:00</published><updated>2009-02-10T19:40:28.212+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-10T19:40:28.212+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java Tech" /><title>Setting Jasper Report on Eclipse then use it!</title><content type="html">JasperRepots merupakan project open source yang sangat powerfull untuk menampilkan rich content baik ke printer maupun kedalam bentuk file PDF, HTML, XLS, RTF, ODT, CSV, TXT dan XML. Oke tidak usah panjang lebar langsung saja download resourcenya dari official site-nya : &lt;a href="http://jasperforge.org/"&gt;http://jasperforge.org/&lt;/a&gt;, kemudian extract dan akan terdapat beberapa folder diantaranya :&lt;span style="font-weight:bold;"&gt;build, demo, dist, docs, lib,&lt;/span&gt; dan &lt;span style="font-weight:bold;"&gt;src&lt;/span&gt;.&lt;br /&gt;*untuk yang menggunakan netbeans, bisa langsung import project lalu buka folder yang memuat forlder diatas.&lt;br /&gt;&lt;br /&gt;Sebenarnya yang kita butuhkan untuk diimport kedalam classpathnya eclipse adalah yang berada didalam folder &lt;span style="font-weight:bold;"&gt;dist&lt;/span&gt; dan &lt;span style="font-weight:bold;"&gt;lib&lt;/span&gt;, untuk yang berada didalam folder dist yang digunakan adalah file &lt;span style="font-weight:bold;"&gt;jasperreports-3.1.3.jar&lt;/span&gt; sedangkan untuk yang didalam folder lib adalah &lt;span style="font-weight:bold;"&gt;commons-beanutils-1.7.jar, commons-collections-2.1.jar, commons-digester-1.7.jar, commons-javaflow-20060411.jar, commons-logging-1.0.2.jar,&lt;/span&gt; dan &lt;span style="font-weight:bold;"&gt;iText-2.1.0.jar&lt;/span&gt;.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;1.&lt;/span&gt; Buka editor eclipse lalu buat project java dengan nama jreport (File -&gt; New -&gt; Java Project)&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;2.&lt;/span&gt; Import file2 yang disebutkan diatas kedalam classpath project jreport dengan cara, klik kanan pada nama project pilih properties maka akan muncul jendela berikut :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-cffNDQPfcc/SZFubMcRBVI/AAAAAAAAALs/Q6TtVGujtis/s1600-h/Screenshot.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 258px;" src="http://1.bp.blogspot.com/_-cffNDQPfcc/SZFubMcRBVI/AAAAAAAAALs/Q6TtVGujtis/s320/Screenshot.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5301139649867089234" /&gt;&lt;/a&gt;&lt;br /&gt;untuk menambahkan classpath bisa langsung tekan tombol [Add External JARs], masukkan file2 jasperreports-3.1.3.jar, commons-beanutils-1.7.jar, commons-collections-2.1.jar, commons-digester-1.7.jar, commons-javaflow-20060411.jar, commons-logging-1.0.2.jar, dan iText-2.1.0.jar.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;3.&lt;/span&gt; Karena file2 yang dibutuhkan sudah masuk kedalam classpath project jreport, langkah selanjutnya adalah membuat code untuk melakukan test. Buat folder reports pada project jreport dengan cara klik kanan pada project jreport - &gt; new -&gt; folder.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-cffNDQPfcc/SZFxffkUpXI/AAAAAAAAAME/JzkS3nJXYmA/s1600-h/Screenshot-1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 284px; height: 320px;" src="http://1.bp.blogspot.com/_-cffNDQPfcc/SZFxffkUpXI/AAAAAAAAAME/JzkS3nJXYmA/s320/Screenshot-1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5301143022255514994" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;4.&lt;/span&gt; Buat java class pada jreport dan beri nama &lt;span style="font-weight:bold;"&gt;JasperReportsIntro.java&lt;/span&gt; dan isi dengan kode2 sebagai berikut :&lt;br /&gt;&lt;blockquote&gt;public class JasperReportsIntro&lt;br /&gt;{&lt;br /&gt;  public static void main(String[] args)&lt;br /&gt;  {&lt;br /&gt;    JasperReport jasperReport;&lt;br /&gt;    JasperPrint jasperPrint;&lt;br /&gt;    try&lt;br /&gt;    {&lt;br /&gt;      jasperReport = JasperCompileManager.compileReport(&lt;br /&gt;          "reports/jasperreports_demo.jrxml");&lt;br /&gt;      jasperPrint = JasperFillManager.fillReport(&lt;br /&gt;          jasperReport, new HashMap(), new JREmptyDataSource());&lt;br /&gt;      JasperExportManager.exportReportToPdfFile(&lt;br /&gt;          jasperPrint, "reports/simple_report.pdf");&lt;br /&gt;      System.out.println("Successfully created PDF file");&lt;br /&gt;    }&lt;br /&gt;    catch (JRException e)&lt;br /&gt;    {&lt;br /&gt;      e.printStackTrace();&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;lalu buat file didalam folder reports dengan nama &lt;span style="font-weight:bold;"&gt;jasperreports_demo.jrxml&lt;/span&gt; dan isikan kode berikut :&lt;br /&gt;&lt;blockquote&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-cffNDQPfcc/SZFzP4aNbwI/AAAAAAAAAMM/oKAw1GVDINw/s1600-h/Screenshot-2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 139px;" src="http://4.bp.blogspot.com/_-cffNDQPfcc/SZFzP4aNbwI/AAAAAAAAAMM/oKAw1GVDINw/s320/Screenshot-2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5301144953069334274" /&gt;&lt;/a&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;5.&lt;/span&gt; Jalankan file &lt;span style="font-weight:bold;"&gt;JasperReportsIntro.java&lt;/span&gt; (klik kanan -&gt; Run As -&gt; Java Application). Setelah proses selesai file pdf akan terbentuk didalam folder reports.&lt;br /&gt;&lt;br /&gt;Untuk melihat contoh2 penggunaan lainnya bisa dilihat dalam folder demo, didalamnya terdapat sample2 JasperReport yang siap dignakan.&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/6639474468897837856-3706043768349410301?l=amrurosyada.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/pM4WG1KJYQGLh3jRR2bandjiXqk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pM4WG1KJYQGLh3jRR2bandjiXqk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/pM4WG1KJYQGLh3jRR2bandjiXqk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pM4WG1KJYQGLh3jRR2bandjiXqk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Rosyadacode/~4/C9yEJgc-n0o" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://amrurosyada.blogspot.com/feeds/3706043768349410301/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://amrurosyada.blogspot.com/2009/02/setting-jasper-report-on-eclipse-then.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default/3706043768349410301?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default/3706043768349410301?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Rosyadacode/~3/C9yEJgc-n0o/setting-jasper-report-on-eclipse-then.html" title="Setting Jasper Report on Eclipse then use it!" /><author><name>arros</name><uri>http://www.blogger.com/profile/15115335540591605422</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://1.bp.blogspot.com/_-cffNDQPfcc/ST9DFOnnX7I/AAAAAAAAAGY/hhLx1rQqh54/S220/1_998498248l-edit.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_-cffNDQPfcc/SZFubMcRBVI/AAAAAAAAALs/Q6TtVGujtis/s72-c/Screenshot.png" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://amrurosyada.blogspot.com/2009/02/setting-jasper-report-on-eclipse-then.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEQER38-fyp7ImA9WxVXEUk.&quot;"><id>tag:blogger.com,1999:blog-6639474468897837856.post-5611547476213330873</id><published>2009-02-09T08:40:00.002+07:00</published><updated>2009-02-09T09:25:06.157+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-09T09:25:06.157+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="my experience" /><title>Memang lagi Apessss...</title><content type="html">Tepatnya tanggal 4 Februari 2009 ada event seminar di salah satu universitas swasta di jogja sebut saja &lt;a href="http://smile.amikom.ac.id/"&gt;amikom&lt;/a&gt;, kenapa ane bisa kesana ??? karena event ini juga ada workshop tentang java, omong punya omong dari amikom sendiri meminta bantuan dari &lt;a href="http://jug-joglosemar.org/"&gt;JUG-JogLoSemar&lt;/a&gt; untuk memberi materi workshop-nya, jadilah ane dengan teman saya (Faris) yang didelegasikan oleh JUG untuk memberi materi workshop. Workshop dimulai jam 1, jadi sebelum jam 1 ane dah stanby di tempat faris buat persiapan terakhir sebelum ke amikom, jam menunjukkan pukul 12.15 jadi kita sholat duhur dulu karena kamar kosnya kecil jadi mau g mau harus gantian sholatnya....&lt;br /&gt;Eh dah 12.45 cabut yuk ris (me says), awalnya kita berangkat naik motor sendiri2 tapi baru keluar gang motor faris bermasalah, rem depannya suka ngunci sendiri... jadilah kita memutuskan berangkat berboncengan dengan motor butut ane (biar butut tapi sejarahnya banyak). Memang ketika workshop berlangsung tidak ada masalah dan fine2 aja, semua peserta terlihat antusias mengikuti runtutan acara workshop sampai selesai.... kecuali yang tidak HUEHUEHUEHUE.... Akhirnya jam dikomputer menunjukkan pukul 16.15 WIB, waktu yang tepat untuk mengakhiri rentetan task2 workshop yang membuat peserta mengoptimalkan otak mereka.&lt;br /&gt;Selesai acara kita diberi amplop yang entah apa isinya tapi bukan itu yang dipermasalahkan, tapi pas baliknya karena dah sore bawaannya pengen cepet nyampe kos, akhirnya kita tancap gas... meski motor butut masih bisa kenceng lho!. Karena ane kudu nganter ni bocah (faris) akhirnya kita harus nyebrang per4tan, semua motor dah siap2 nunggu lampu ijo nyala.... counting down 5..4..3..2..1.. BROOOOM... BROOOOM.... motor dah pada jalan termasuk kita eh apa maudikata dari samping kanan tiba2 ada motor2 masuk, pengennya menghindari banting steer ke kiri eh malah dari belakang kiri ada truk GABRUSS... GABRUSSS akhirnyan kita jatuh dah nyium aspal kena bak bagian belakang truk. Untungnya ada orang yang nolongin... eh truknya nyelonong aja CKCKCKCKCKCK!!!!, dengan keadaan motor yang amburadul gini kita balik dan alhamdulillahnya masih bisa apme kos meski cmn bisa pake gigi 3 ajah. Yah kejadian ini menambah panjang catatan sejarah motor bututku ini mantaaaap. Untungnya tadi dikasih amaplop jadi servisnya tinggal buka amplop aja hhihihihihi + tambahan duit sendiri.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6639474468897837856-5611547476213330873?l=amrurosyada.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/st2Z-7LbliJnCn-QumcMVe8IZXs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/st2Z-7LbliJnCn-QumcMVe8IZXs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/st2Z-7LbliJnCn-QumcMVe8IZXs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/st2Z-7LbliJnCn-QumcMVe8IZXs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Rosyadacode/~4/ZDkrZztBbXU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://amrurosyada.blogspot.com/feeds/5611547476213330873/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://amrurosyada.blogspot.com/2009/02/memang-lagi-apessss.html#comment-form" title="7 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default/5611547476213330873?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default/5611547476213330873?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Rosyadacode/~3/ZDkrZztBbXU/memang-lagi-apessss.html" title="Memang lagi Apessss..." /><author><name>arros</name><uri>http://www.blogger.com/profile/15115335540591605422</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://1.bp.blogspot.com/_-cffNDQPfcc/ST9DFOnnX7I/AAAAAAAAAGY/hhLx1rQqh54/S220/1_998498248l-edit.jpg" /></author><thr:total>7</thr:total><feedburner:origLink>http://amrurosyada.blogspot.com/2009/02/memang-lagi-apessss.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0IMSHc4eip7ImA9WxVRE0g.&quot;"><id>tag:blogger.com,1999:blog-6639474468897837856.post-2320099460796272095</id><published>2009-01-19T15:42:00.006+07:00</published><updated>2009-01-19T15:59:49.932+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-19T15:59:49.932+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="games engineering" /><title>JAVA 2D Graphics dan Animation (Part 3) - Games Engineering</title><content type="html">&lt;span style="font-weight:bold;"&gt;Getting Rid of Flicker and Tearing&lt;/span&gt;&lt;br /&gt;Sekarang kita lanjutkan lagi pembahasan games engineering, pada tulisan sebelumnya animasi yang kita jalankan AnimationTest.java, berjalan dengan baik tapi kok flicker yah animasinya ngga smooth.&lt;br /&gt;Ini terjadi karena kita langsung drawing ke screen secara langsung dan terus menerus, jika kita analogikan seperti ketika kita menggambar pada sebuah kanvas, kemudian dihapus dilanjutkan dengan drawing dengan gambar selanjutnya.&lt;br /&gt;&lt;br /&gt;Lalu bagaimana solusinya? jawabannya adalah dengan double buffering.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Double Buffering&lt;/span&gt;&lt;br /&gt;Jadi begini dengan menggunakan double buffering kita membuat buffer terlebih dahulu kemudian baru ditampilkan ke screen disamping kita menggunakan direct drawing, maksudnya begini kita drawing pada buffer terlebih dahulu baru kemudian kita tampilkan duplikat dari buffer tadi ke screen, sehingga screen hanya akan terupdate sekali. berikut adalah gambar ilustrasinya :&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-cffNDQPfcc/SXQ_IBc93dI/AAAAAAAAALE/65X2EuGf6vc/s1600-h/double_buffer.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 149px;" src="http://4.bp.blogspot.com/_-cffNDQPfcc/SXQ_IBc93dI/AAAAAAAAALE/65X2EuGf6vc/s320/double_buffer.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5292924869128609234" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;Back buffer adalah sebuah class image juga. Kita bisa menggunakan method createImage(int w, int h) pada class Component untuk membuat back buffer. Sebagai contoh, jika kita ingin membuat double bufferring pada applet yang tidak menggunakan active rendering, kita lakukan override method update() untuk menggunakan double buffer dan memanggil methos paint() dengan konteks berupa double buffer:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;private Image doubleBuffer;&lt;br /&gt; ... &lt;br /&gt;public void update(Graphics g) { &lt;br /&gt;    Dimension size = getSize(); &lt;br /&gt;    if (doubleBuffer == null || &lt;br /&gt;        doubleBuffer.getWidth(this) != size.width || &lt;br /&gt;        doubleBuffer.getHeight(this) != size.height) &lt;br /&gt;    { &lt;br /&gt;        doubleBuffer = createImage(size.width, size.height); &lt;br /&gt;    } &lt;br /&gt;    if (doubleBuffer != null) { &lt;br /&gt;        // paint to double buffer &lt;br /&gt;        Graphics g2 = doubleBuffer.getGraphics(); &lt;br /&gt;        paint(g2); &lt;br /&gt;        g2.dispose(); &lt;br /&gt;        // copy double buffer to screen &lt;br /&gt;        g.drawImage(doubleBuffer, 0, 0, null); &lt;br /&gt;    } &lt;br /&gt;    else { &lt;br /&gt;        // couldn't create double buffer, just paint to screen &lt;br /&gt;        paint(g); &lt;br /&gt;    } &lt;br /&gt;} &lt;br /&gt;public void paint(Graphics g) { &lt;br /&gt;    // do drawing here &lt;br /&gt;    ... &lt;br /&gt;} &lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Page Flipping&lt;/span&gt;&lt;br /&gt;Ketika melakukan double buffer akan memakan beberapa saat untuk mengambil gambar dari buffer kemudian ditampilkan ke screen. Resolusi 800x600 dengan kedalaman bit 16 akan memanfaatkan 800x600 bytes, atau 938KB. Nilai tersebut mendekati 1Mb memory yang kemudian diacak untuk 30 frames per second (fps). Akan tetapi melkukan copy terhadap memory tersebut adalah sesuatu yang cukup cepat untuk kebanyakan games, bagaimana jika kita tidak membuat buffer sepenuhnya dan dapatkah secara instans membuat back buffer sebagai display buffer?&lt;br /&gt;Itu dapat dilakukan, teknik seperti ini disebut sebagai page flipping. Dengan page flipping, kita menggunakan 2 buffer, satu untuk back buffer dan satunya lagi untuk display buffer, berikut adalah ilustrasinya:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-cffNDQPfcc/SXQ_j-E7RZI/AAAAAAAAALM/8I5EO9nvCsI/s1600-h/flipp1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 244px;" src="http://1.bp.blogspot.com/_-cffNDQPfcc/SXQ_j-E7RZI/AAAAAAAAALM/8I5EO9nvCsI/s320/flipp1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5292925349258806674" /&gt;&lt;/a&gt;&lt;br /&gt;Display pointer akan menunjuk ke buffer yang sedang ditampilkan. Display pointer ini dapat dirubah pada kebanyakan sistem modern. Ketika kita selesai drawing pada back buffer, display pointer dapat dipindahkan dari display buffer saat ini ke back buffer yang lain, sebagai mana ditunjukkan pada gambar dibawah ini. Ketika pointer berubah, kemudian display buffer akan berubah menjadi back buffer, begitu juga sebaliknya.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-cffNDQPfcc/SXRAPDDa2yI/AAAAAAAAALU/1DYsJN6dOlk/s1600-h/flip2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 256px;" src="http://1.bp.blogspot.com/_-cffNDQPfcc/SXRAPDDa2yI/AAAAAAAAALU/1DYsJN6dOlk/s320/flip2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5292926089329040162" /&gt;&lt;/a&gt;&lt;br /&gt;Tentu saja, merubah pointer akan sangat lebih cepat dari pada melakukan duplikasi pada sebuah block memory, jadi dengan page flipping akan lebih cepat daripada double buffering.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;Monitor Refresh and Tearing&lt;/span&gt;&lt;br /&gt;Perlu diingat bahwa monitor mempunyai refresh rate. Refresh rate bisanya antara 75Hz, yang berarti monitor melakukan refreshing sebanyak 75 kali dalam satu detik. Tetapi apa yang terjadi ketika page flipping/double buffer terjadi ditengah2 dari refresh rate? ya, bisa kita tebak sebagian dari buffer yang lama akan ditampilkan bersamaan dengan sebagian dari buffer yang baru. Effek ini sama dengan flickering, sering disebut dengan tearing seperti yang ditunjukkan pada gambar dibaewah ini.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-cffNDQPfcc/SXRAldBhrEI/AAAAAAAAALc/uZfvKHcAFp4/s1600-h/refreshrate.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 221px; height: 212px;" src="http://1.bp.blogspot.com/_-cffNDQPfcc/SXRAldBhrEI/AAAAAAAAALc/uZfvKHcAFp4/s320/refreshrate.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5292926474257542210" /&gt;&lt;/a&gt;&lt;br /&gt;Untuk mengatasi masalah ini kita bisa cukup melakukan page flip tepat sebelum monitor melakukan refresh, kedengarannya sulit untuk dilakukan tetapi jangan khawatir java runtime telah melakukannya untuk kita, dengan menggunakan class BufferStrategy.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;BufferStrategy Class&lt;/span&gt;&lt;br /&gt;Double buffering, page flipping, dan menunggu refresh monitor semuanya telah ditangani oleh class BufferStrategy. BufferStrategy akan memilih metode buffering yang cocok sesuai dengan kemampuan sistem. Pertama, akan mencoba untuk menerapkan page flipping, jika tidak memungkinkan, akan mencoba dengan double buffering. Juga, menunggu sampai monitor refresh selesai sebelum melakukan page flip. Singkat kata, BufferStrategy akan melakukan hal2 tersebut untuk kita, tanpa kita harus susah payah untuk melakukannya.&lt;br /&gt;Sebagai catatan FPS(Frames Per Second) pada games ditentukan oleh refresh rate yang digunakan, jika monitor menggunakan 75Hz, maka games display maximum hanya mampu menampilkan 75 FPS. Ini berarti kita tidak bisa menggunakan FPS sebagai "BENCHMARK" seberapa cepat sistem berjalan.&lt;br /&gt;Tentu saja, bukanlah suatu masalah ketika suatu games berjalan pada 200 FPS kita akan melihatnya sesuai dengan kemapuan monitor. Tidak masalah secepat apa games tersebut berjalan, kita akan tetap melihatnya dalam 75 FPS pada monitor dengan refresh rate 75Hz.&lt;br /&gt;Canvas dan Window objek keduanya dapat diterapkan BufferStrategy. Gunakan method createBufferStrategy() untuk membuat BufferStrategy sesuai dengan jumlah buffer yang kita inginkan. Kita akan membutuhkan kurang lebih 2 buffer untuk double buffering dan page flipping. Sebaga contoh:&lt;br /&gt; &lt;blockquote&gt;frame.createBufferStrategy(2);&lt;/blockquote&gt;&lt;br /&gt;Setelah membuat BufferStrategy, kita bisa panggil method getBufferStrategy() untuk mereferensi ke buffer yang telah dibuat dan gunakan method getDrawGraphics() untuk mendapatkan graphic konteks untuk drawing buffer. Setelah selesai drawing, kita bisa panggil method show() untuk menampilkan graphic di buffer, berikut contohnya:&lt;br /&gt;&lt;blockquote&gt;BufferStrategy strategy = frame.getBufferStrategy();&lt;br /&gt;Graphics g = strategy.getDrawGraphics(); &lt;br /&gt;draw(g); &lt;br /&gt;g.dispose(); &lt;br /&gt;strategy.show();&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Membuat Screen Manager&lt;/span&gt;&lt;br /&gt;Oke sekarang kita akan update SimpleScreenManager pada tulisan sebelumnya dengan feature yang baru. Berikut ini yang akan ditambahkan:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Double buffering dan page flipping dengan membuat BufferStrategy&lt;/li&gt;&lt;br /&gt;&lt;li&gt;getGraphics(), yang akan mendapatkan graphic konteks untuk ditampilkan&lt;/li&gt;&lt;br /&gt;&lt;li&gt;update(), yang akan melakukan update ke display&lt;/li&gt;&lt;br /&gt;&lt;li&gt;getCompatibleDisplayModes(), yang akan mendapatkan list dari display mode&lt;/li&gt;&lt;br /&gt;&lt;li&gt;getCurrentDispalayMode(), yang akan mendapatkan display mode saat ini&lt;/li&gt;&lt;br /&gt;&lt;li&gt;findFirstCompatibleMode(), yang akan mendapatkan compatible mode yang pertama yang berada di list mode&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Sekarang kita akan melakukan active rendering, tidak membutuhkan JFrame untuk full-screen window untuk menerima paint event dari sistem operasi, jadi kita bisa matikan saja dengan:&lt;br /&gt;&lt;blockquote&gt;frame.ignoreRepaint(true);&lt;/blockquote&gt;&lt;br /&gt;Ini tidak akan mematikan normal repaint event. Memangil repaint() pada JFrame masih akan tetap bisa. Oke sekarang kita update SimpleScreenManager menjadi sebagai berikut:&lt;br /&gt;&lt;blockquote&gt;package brain.left.games;&lt;br /&gt;&lt;br /&gt;import java.awt.*;&lt;br /&gt;import java.awt.image.BufferStrategy;&lt;br /&gt;import java.awt.image.BufferedImage;&lt;br /&gt;&lt;br /&gt;import javax.swing.JFrame;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * The ScreenManager class manages initializing and displaying full screen&lt;br /&gt; * graphics modes.&lt;br /&gt; */&lt;br /&gt;public class ScreenManager {&lt;br /&gt; private GraphicsDevice device;&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Creates a new ScreenManager object.&lt;br /&gt;  */&lt;br /&gt; public ScreenManager() {&lt;br /&gt;  GraphicsEnvironment environment = GraphicsEnvironment&lt;br /&gt;    .getLocalGraphicsEnvironment();&lt;br /&gt;  device = environment.getDefaultScreenDevice();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Returns a list of compatible display modes for the default device on the&lt;br /&gt;  * system.&lt;br /&gt;  */&lt;br /&gt; public DisplayMode[] getCompatibleDisplayModes() {&lt;br /&gt;  return device.getDisplayModes();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Returns the first compatible mode in a list of modes. Returns null if no&lt;br /&gt;  * modes are compatible.&lt;br /&gt;  */&lt;br /&gt; public DisplayMode findFirstCompatibleMode(DisplayMode modes[]) {&lt;br /&gt;  DisplayMode goodModes[] = device.getDisplayModes();&lt;br /&gt;  for (int i = 0; i &lt; modes.length; i++) {&lt;br /&gt;   for (int j = 0; j &lt; goodModes.length; j++) {&lt;br /&gt;    if (displayModesMatch(modes[i], goodModes[j])) {&lt;br /&gt;     return modes[i];&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  return null;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Returns the current display mode.&lt;br /&gt;  */&lt;br /&gt; public DisplayMode getCurrentDisplayMode() {&lt;br /&gt;  return device.getDisplayMode();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Determines if two display modes "match". Two display modes match if they&lt;br /&gt;  * have the same resolution, bit depth, and refresh rate. The bit depth is&lt;br /&gt;  * ignored if one of the modes has a bit depth of&lt;br /&gt;  * DisplayMode.BIT_DEPTH_MULTI. Likewise, the refresh rate is ignored if one&lt;br /&gt;  * of the modes has a refresh rate of DisplayMode.REFRESH_RATE_UNKNOWN.&lt;br /&gt;  */&lt;br /&gt; public boolean displayModesMatch(DisplayMode mode1, DisplayMode mode2) {&lt;br /&gt;  if (mode1.getWidth() != mode2.getWidth()&lt;br /&gt;    || mode1.getHeight() != mode2.getHeight()) {&lt;br /&gt;   return false;&lt;br /&gt;  }&lt;br /&gt;  if (mode1.getBitDepth() != DisplayMode.BIT_DEPTH_MULTI&lt;br /&gt;    &amp;&amp; mode2.getBitDepth() != DisplayMode.BIT_DEPTH_MULTI&lt;br /&gt;    &amp;&amp; mode1.getBitDepth() != mode2.getBitDepth()) {&lt;br /&gt;   return false;&lt;br /&gt;  }&lt;br /&gt;  if (mode1.getRefreshRate() != DisplayMode.REFRESH_RATE_UNKNOWN&lt;br /&gt;    &amp;&amp; mode2.getRefreshRate() != DisplayMode.REFRESH_RATE_UNKNOWN&lt;br /&gt;    &amp;&amp; mode1.getRefreshRate() != mode2.getRefreshRate()) {&lt;br /&gt;   return false;&lt;br /&gt;  }&lt;br /&gt;  return true;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Enters full screen mode and changes the display mode. If the specified&lt;br /&gt;  * display mode is null or not compatible with this device, or if the&lt;br /&gt;  * display mode cannot be changed on this system, the current display mode&lt;br /&gt;  * is used.&lt;br /&gt;  * &lt;p&gt;&lt;br /&gt;  * The display uses a BufferStrategy with 2 buffers.&lt;br /&gt;  */&lt;br /&gt; public void setFullScreen(DisplayMode displayMode) {&lt;br /&gt;  JFrame frame = new JFrame();&lt;br /&gt;  frame.setUndecorated(true);&lt;br /&gt;  frame.setIgnoreRepaint(true);&lt;br /&gt;  frame.setResizable(false);&lt;br /&gt;  device.setFullScreenWindow(frame);&lt;br /&gt;  if (displayMode != null &amp;&amp; device.isDisplayChangeSupported()) {&lt;br /&gt;   try {&lt;br /&gt;    device.setDisplayMode(displayMode);&lt;br /&gt;   } catch (IllegalArgumentException ex) {&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  frame.createBufferStrategy(2);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Gets the graphics context for the display. The ScreenManager uses double&lt;br /&gt;  * buffering, so applications must call update() to show any graphics drawn.&lt;br /&gt;  * &lt;p&gt;&lt;br /&gt;  * The application must dispose of the graphics object.&lt;br /&gt;  */&lt;br /&gt; public Graphics2D getGraphics() {&lt;br /&gt;  Window window = device.getFullScreenWindow();&lt;br /&gt;  if (window != null) {&lt;br /&gt;   BufferStrategy strategy = window.getBufferStrategy();&lt;br /&gt;   return (Graphics2D) strategy.getDrawGraphics();&lt;br /&gt;  } else {&lt;br /&gt;   return null;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Updates the display.&lt;br /&gt;  */&lt;br /&gt; public void update() {&lt;br /&gt;  Window window = device.getFullScreenWindow();&lt;br /&gt;  if (window != null) {&lt;br /&gt;   BufferStrategy strategy = window.getBufferStrategy();&lt;br /&gt;   if (!strategy.contentsLost()) {&lt;br /&gt;    strategy.show();&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  // Sync the display on some systems.&lt;br /&gt;  // (on Linux, this fixes event queue problems)&lt;br /&gt;  Toolkit.getDefaultToolkit().sync();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Returns the window currently used in full screen mode. Returns null if&lt;br /&gt;  * the device is not in full screen mode.&lt;br /&gt;  */&lt;br /&gt; public Window getFullScreenWindow() {&lt;br /&gt;  return device.getFullScreenWindow();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Returns the width of the window currently used in full screen mode.&lt;br /&gt;  * Returns 0 if the device is not in full screen mode.&lt;br /&gt;  */&lt;br /&gt; public int getWidth() {&lt;br /&gt;  Window window = device.getFullScreenWindow();&lt;br /&gt;  if (window != null) {&lt;br /&gt;   return window.getWidth();&lt;br /&gt;  } else {&lt;br /&gt;   return 0;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Returns the height of the window currently used in full screen mode.&lt;br /&gt;  * Returns 0 if the device is not in full screen mode.&lt;br /&gt;  */&lt;br /&gt; public int getHeight() {&lt;br /&gt;  Window window = device.getFullScreenWindow();&lt;br /&gt;  if (window != null) {&lt;br /&gt;   return window.getHeight();&lt;br /&gt;  } else {&lt;br /&gt;   return 0;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Restores the screen's display mode.&lt;br /&gt;  */&lt;br /&gt; public void restoreScreen() {&lt;br /&gt;  Window window = device.getFullScreenWindow();&lt;br /&gt;  if (window != null) {&lt;br /&gt;   window.dispose();&lt;br /&gt;  }&lt;br /&gt;  device.setFullScreenWindow(null);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Creates an image compatible with the current display.&lt;br /&gt;  */&lt;br /&gt; public BufferedImage createCompatibleImage(int w, int h, int transparency) {&lt;br /&gt;  Window window = device.getFullScreenWindow();&lt;br /&gt;  if (window != null) {&lt;br /&gt;   GraphicsConfiguration gc = window.getGraphicsConfiguration();&lt;br /&gt;   return gc.createCompatibleImage(w, h, transparency);&lt;br /&gt;  }&lt;br /&gt;  return null;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Pada ScreenManager, kita berikan catatan tersendiri untuk line berikut pada methode update():&lt;br /&gt;&lt;blockquote&gt;Toolkit.getDefaultToolkit().sync();&lt;/blockquote&gt;&lt;br /&gt;Baris diatas akan memastikan bahwa display telah disinkronisasi dengan sistem window. Pada kebanyakan sistem, methos ini tidak berpengaruh, tetapi pada linux, memanggil method ini akan memperbaiki AWT event queue. Tanpa memanggil method ini, pada beberapa sistem linux akan menyebabkan terjadinya delay pada mouse dan keyboard event.&lt;br /&gt;&lt;br /&gt;Dua method baru yang perlu digaris bawahi pada class ScreenManager adalah displayModesMatch() dam createCompatibleImage().&lt;br /&gt;Method displayModesMatch() akan mengecek antara dua DisplayMode objek sama, yaitu dari sisi resolusi, kedalaman bit, dan refresh rate. Kedalaman bit dan refresh rate akan diabaikan jika jika ada salah satu saja yang tidak sama.&lt;br /&gt;Method createCompatibleImage() akan membuat image yang sesuai dengan display, image akan mempunyai kedalaman bit yang sama dan model warna yang sama dengan display. Kita memanfaatkan BufferedImage karena method ini berguna untuk membuat image transparent atau translucent karena method createImage() hanya akan membuat opaque image.&lt;br /&gt;&lt;br /&gt;Sekarang kita akan mengupdate AnimationTest1 pada tulisan sebelumnya menjadi AnimationTest2 dengan menggunakan ScreenManager yang telah kita tingkatkan kemampunannya, listing kodenya adalah sebagai berikut: HOOOREEEE ga ada flickering lagi!!&lt;br /&gt;&lt;blockquote&gt;package brain.left.games;&lt;br /&gt;&lt;br /&gt;import java.awt.*;&lt;br /&gt;import javax.swing.ImageIcon;&lt;br /&gt;&lt;br /&gt;public class AnimationTest2 {&lt;br /&gt; public static void main(String args[]) {&lt;br /&gt;  AnimationTest2 test = new AnimationTest2();&lt;br /&gt;  test.run();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; private static final DisplayMode POSSIBLE_MODES[] = {&lt;br /&gt;   new DisplayMode(800, 600, 32, 0), new DisplayMode(800, 600, 24, 0),&lt;br /&gt;   new DisplayMode(800, 600, 16, 0), new DisplayMode(640, 480, 32, 0),&lt;br /&gt;   new DisplayMode(640, 480, 24, 0), new DisplayMode(640, 480, 16, 0) };&lt;br /&gt; private static final long DEMO_TIME = 10000;&lt;br /&gt; private ScreenManager screen;&lt;br /&gt; private Image bgImage;&lt;br /&gt; private Animation anim;&lt;br /&gt;&lt;br /&gt; public void loadImages() {&lt;br /&gt;  // load images&lt;br /&gt;  bgImage = loadImage("images/tile-games/background.jpg");&lt;br /&gt;  Image player1 = loadImage("images/tile-games/hero1.png");&lt;br /&gt;  Image player2 = loadImage("images/tile-games/hero2.png");&lt;br /&gt;  Image player3 = loadImage("images/tile-games/hero3.png");&lt;br /&gt;  // create animation&lt;br /&gt;  anim = new Animation();&lt;br /&gt;  anim.addFrame(player1, 250);&lt;br /&gt;  anim.addFrame(player2, 150);&lt;br /&gt;  anim.addFrame(player1, 150);&lt;br /&gt;  anim.addFrame(player2, 150);&lt;br /&gt;  anim.addFrame(player3, 200);&lt;br /&gt;  anim.addFrame(player2, 150);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; private Image loadImage(String fileName) {&lt;br /&gt;  return new ImageIcon(fileName).getImage();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void run() {&lt;br /&gt;  screen = new ScreenManager();&lt;br /&gt;  try {&lt;br /&gt;   DisplayMode displayMode = screen&lt;br /&gt;     .findFirstCompatibleMode(POSSIBLE_MODES);&lt;br /&gt;   screen.setFullScreen(displayMode);&lt;br /&gt;   loadImages();&lt;br /&gt;   animationLoop();&lt;br /&gt;  } finally {&lt;br /&gt;   screen.restoreScreen();&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void animationLoop() {&lt;br /&gt;  long startTime = System.currentTimeMillis();&lt;br /&gt;  long currTime = startTime;&lt;br /&gt;  while (currTime - startTime &lt; DEMO_TIME) {&lt;br /&gt;   long elapsedTime = System.currentTimeMillis() - currTime;&lt;br /&gt;   currTime += elapsedTime;&lt;br /&gt;   // update animation&lt;br /&gt;   anim.update(elapsedTime);&lt;br /&gt;   // draw and update screen&lt;br /&gt;   Graphics2D g = screen.getGraphics();&lt;br /&gt;   draw(g);&lt;br /&gt;   g.dispose();&lt;br /&gt;   screen.update();&lt;br /&gt;   // take a nap&lt;br /&gt;   try {&lt;br /&gt;    Thread.sleep(20);&lt;br /&gt;   } catch (InterruptedException ex) {&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void draw(Graphics g) {&lt;br /&gt;  // draw background&lt;br /&gt;  g.drawImage(bgImage, 0, 0, null);&lt;br /&gt;  // draw image&lt;br /&gt;  g.drawImage(anim.getImage(), 0, 0, null);&lt;br /&gt; }&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;Tidak banyak yang berubah dari kode sebelumnya. Satu hal yang berubah adalah cara AnimationTest2 dalam memilih display mode. AnimationTest2 menggunakan ScreenManager untuk mendapatkan list display mode yang compatible, dan ScreenManager memilih list pertama.&lt;br /&gt;ScreenManager membuat JFrame sendiri, jadi AnimationTeast2 tidak ada hubungannya dengan pembuatan JFrame untuk full-screen mode.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Sprites&lt;/span&gt;&lt;br /&gt;Animation sekarang berjalan dengan smooth, tetapi tidak menarik jika kita membuat animasi hanya ditempat. Sekarang kita akan membuat sprite.&lt;br /&gt;Sprite adalah graphic yang bergerak secara independen pada screen. Pada kasus ini, sprite akan dianimasikan dan bergerak pada suatu waktu.&lt;br /&gt;Berdasarkan sebuah animasi, sprite akan disusun dari dua hal: posisi dan velocity. Jika kita mau mengingat kembali tentang velocity sewaktu kita disekolah, velocity adalah kecepatan(misal 22mph) dan arah(misal utara). Pada kasus ini, kita akan membagi percepatan kedalam dua bagian yaitu komponen horizontal dan vertical. Kita tidak menggunakan miles per jam atau meters per detik, tetapi kita akan menggunakan pixel per milidetik.&lt;br /&gt;Kita mungkin bertanya-tanya, "Mengapa kita menggunakan velocity? Mengapa tidak hanya update posisi sprite pada beberapa frame?" Oke, jika ada pertanyaan seperti itu, sprite akan bergerak pada kecepatan yang berbeda tergantung dari kecepatan mesin. Lebih besar frame rate berarti kecepatan sprite akan lebih cepat juga. Sprite akan bergerak berubah secara real time karena sprite bergerak dengan pace yang konsisten, apakah waktu antara frames pendek atau panjang.&lt;br /&gt;Sprite class pada listing program dibawah ini akan dianimasikan posisi dan velocity-nya.&lt;br /&gt;Kita dapat mendefinisikan posisi sprite dalam integer, tetapi bagaimana jika sprite bergerak lambat? Sebagai contoh, bayangkan sebuah sprite bergerak pada pixel kesepuluh setiap kali diupdate. Ini berarti bahwa akan ada 9 gerakan tak terlihat dari 10 gerakan saat diupdate. Jika posisi sprite dalam integer, sprite tidak akan pernah bergerak karena hasilnya tidak akan dibulatkan setiap waktu.&lt;br /&gt;Jika posisi sprite dalam floating point, posisi sprite dapat mengincrement pergerakan yang tidak terlihat, dan sprite akan bergerak 1 pixel pada setiap memanggil update() kesepuluh. Berikut adalah listing program Sprite.java&lt;br /&gt;&lt;blockquote&gt;package brain.left.games;&lt;br /&gt;&lt;br /&gt;import java.awt.Image;&lt;br /&gt;&lt;br /&gt;public class Sprite {&lt;br /&gt; private Animation anim;&lt;br /&gt; // position (pixels)&lt;br /&gt; private float x;&lt;br /&gt; private float y;&lt;br /&gt; // velocity (pixels per millisecond)&lt;br /&gt; private float dx;&lt;br /&gt; private float dy;&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Creates a new Sprite object with the specified Animation.&lt;br /&gt;  */&lt;br /&gt; public Sprite(Animation anim) {&lt;br /&gt;  this.anim = anim;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Updates this Sprite's Animation and its position based on the velocity.&lt;br /&gt;  */&lt;br /&gt; public void update(long elapsedTime) {&lt;br /&gt;  x += dx * elapsedTime;&lt;br /&gt;  y += dy * elapsedTime;&lt;br /&gt;  anim.update(elapsedTime);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Gets this Sprite's current x position.&lt;br /&gt;  */&lt;br /&gt; public float getX() {&lt;br /&gt;  return x;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Gets this Sprite's current y position.&lt;br /&gt;  */&lt;br /&gt; public float getY() {&lt;br /&gt;  return y;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Sets this Sprite's current x position.&lt;br /&gt;  */&lt;br /&gt; public void setX(float x) {&lt;br /&gt;  this.x = x;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Sets this Sprite's current y position.&lt;br /&gt;  */&lt;br /&gt; public void setY(float y) {&lt;br /&gt;  this.y = y;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Gets this Sprite's width, based on the size of the current image.&lt;br /&gt;  */&lt;br /&gt; public int getWidth() {&lt;br /&gt;  return anim.getImage().getWidth(null);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Gets this Sprite's height, based on the size of the current image.&lt;br /&gt;  */&lt;br /&gt; public int getHeight() {&lt;br /&gt;  return anim.getImage().getHeight(null);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Gets the horizontal velocity of this Sprite in pixels per millisecond.&lt;br /&gt;  */&lt;br /&gt; public float getVelocityX() {&lt;br /&gt;  return dx;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Gets the vertical velocity of this Sprite in pixels per millisecond.&lt;br /&gt;  */&lt;br /&gt; public float getVelocityY() {&lt;br /&gt;  return dy;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Sets the horizontal velocity of this Sprite in pixels per millisecond.&lt;br /&gt;  */&lt;br /&gt; public void setVelocityX(float dx) {&lt;br /&gt;  this.dx = dx;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Sets the vertical velocity of this Sprite in pixels per millisecond.&lt;br /&gt;  */&lt;br /&gt; public void setVelocityY(float dy) {&lt;br /&gt;  this.dy = dy;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Gets this Sprite's current image.&lt;br /&gt;  */&lt;br /&gt; public Image getImage() {&lt;br /&gt;  return anim.getImage();&lt;br /&gt; }&lt;br /&gt;} &lt;/blockquote&gt;&lt;br /&gt;Class sprite sangatlah simpel. Kebanyakan terdiri dari get dan set method. Semuanya akan diakhiri dengan method update(), yang akan mengupdate posisi dari sprite berdasarkan velocity dan banyaknya waktu yang tersedia.&lt;br /&gt;Sekarang kita bersenang-senang dengan menggunakan class Sprite yang telah kita buat sebelumnya, kita akan membuat karakter memantul-mantul pada screen, berikut adalah listing program SpriteTest1 :&lt;br /&gt;&lt;blockquote&gt;package brain.left.games;&lt;br /&gt;&lt;br /&gt;import java.awt.*;&lt;br /&gt;import javax.swing.ImageIcon;&lt;br /&gt;&lt;br /&gt;public class SpriteTest1 {&lt;br /&gt; public static void main(String args[]) {&lt;br /&gt;  SpriteTest1 test = new SpriteTest1();&lt;br /&gt;  test.run();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; private static final DisplayMode POSSIBLE_MODES[] = {&lt;br /&gt;   new DisplayMode(800, 600, 32, 0), new DisplayMode(800, 600, 24, 0),&lt;br /&gt;   new DisplayMode(800, 600, 16, 0), new DisplayMode(640, 480, 32, 0),&lt;br /&gt;   new DisplayMode(640, 480, 24, 0), new DisplayMode(640, 480, 16, 0) };&lt;br /&gt; private static final long DEMO_TIME = 10000;&lt;br /&gt; private ScreenManager screen;&lt;br /&gt; private Image bgImage;&lt;br /&gt; private Sprite sprite;&lt;br /&gt;&lt;br /&gt; public void loadImages() {&lt;br /&gt;  // load images&lt;br /&gt;  bgImage = loadImage("images/tile-games/background.jpg");&lt;br /&gt;  Image player1 = loadImage("images/tile-games/hero1.png");&lt;br /&gt;  Image player2 = loadImage("images/tile-games/hero2.png");&lt;br /&gt;  Image player3 = loadImage("images/tile-games/hero3.png");&lt;br /&gt;  // create sprite&lt;br /&gt;  Animation anim = new Animation();&lt;br /&gt;  anim.addFrame(player1, 250);&lt;br /&gt;  anim.addFrame(player2, 150);&lt;br /&gt;  anim.addFrame(player1, 150);&lt;br /&gt;  anim.addFrame(player2, 150);&lt;br /&gt;  anim.addFrame(player3, 200);&lt;br /&gt;  anim.addFrame(player2, 150);&lt;br /&gt;  sprite = new Sprite(anim);&lt;br /&gt;  // start the sprite off moving down and to the right&lt;br /&gt;  sprite.setVelocityX(0.2f);&lt;br /&gt;  sprite.setVelocityY(0.2f);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; private Image loadImage(String fileName) {&lt;br /&gt;  return new ImageIcon(fileName).getImage();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void run() {&lt;br /&gt;  screen = new ScreenManager();&lt;br /&gt;  try {&lt;br /&gt;   DisplayMode displayMode = screen&lt;br /&gt;     .findFirstCompatibleMode(POSSIBLE_MODES);&lt;br /&gt;   screen.setFullScreen(displayMode);&lt;br /&gt;   loadImages();&lt;br /&gt;   animationLoop();&lt;br /&gt;  } finally {&lt;br /&gt;   screen.restoreScreen();&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void animationLoop() {&lt;br /&gt;  long startTime = System.currentTimeMillis();&lt;br /&gt;  long currTime = startTime;&lt;br /&gt;  while (currTime - startTime &lt; DEMO_TIME) {&lt;br /&gt;   long elapsedTime = System.currentTimeMillis() - currTime;&lt;br /&gt;   currTime += elapsedTime;&lt;br /&gt;   // update the sprites&lt;br /&gt;   update(elapsedTime);&lt;br /&gt;   // draw and update the screen&lt;br /&gt;   Graphics2D g = screen.getGraphics();&lt;br /&gt;   draw(g);&lt;br /&gt;   g.dispose();&lt;br /&gt;   screen.update();&lt;br /&gt;   // take a nap&lt;br /&gt;   try {&lt;br /&gt;    Thread.sleep(20);&lt;br /&gt;   } catch (InterruptedException ex) {&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void update(long elapsedTime) {&lt;br /&gt;  // check sprite bounds&lt;br /&gt;  if (sprite.getX() &lt; 0) {&lt;br /&gt;   sprite.setVelocityX(Math.abs(sprite.getVelocityX()));&lt;br /&gt;  } else if (sprite.getX() + sprite.getWidth() &gt;= screen.getWidth()) {&lt;br /&gt;   sprite.setVelocityX(-Math.abs(sprite.getVelocityX()));&lt;br /&gt;  }&lt;br /&gt;  if (sprite.getY() &lt; 0) {&lt;br /&gt;   sprite.setVelocityY(Math.abs(sprite.getVelocityY()));&lt;br /&gt;  } else if (sprite.getY() + sprite.getHeight() &gt;= screen.getHeight()) {&lt;br /&gt;   sprite.setVelocityY(-Math.abs(sprite.getVelocityY()));&lt;br /&gt;  }&lt;br /&gt;  // update sprite&lt;br /&gt;  sprite.update(elapsedTime);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void draw(Graphics g) {&lt;br /&gt;  // draw background&lt;br /&gt;  g.drawImage(bgImage, 0, 0, null);&lt;br /&gt;  // draw sprite&lt;br /&gt;  g.drawImage(sprite.getImage(), Math.round(sprite.getX()), Math&lt;br /&gt;    .round(sprite.getY()), null);&lt;br /&gt; }&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;Karena Sprite objek mengontrol gerakannya sendiri, pada kelas SpriteTest1 tidak akan berubah banyak dibandingkan dengan AnimationTest2. Hal yang beru adalah method update(), yang menyebabkan sprite memantul ketika membentur batas screen. Jika sprite membentur batas kiri atau kanan, horizontal velocity akan dibalik. Jika sprite membentur batas atas atau bawah vertical velocity akan dibalik.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6639474468897837856-2320099460796272095?l=amrurosyada.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/G_yiBUL1_nB6vUxO7bN0go_iUOk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/G_yiBUL1_nB6vUxO7bN0go_iUOk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/G_yiBUL1_nB6vUxO7bN0go_iUOk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/G_yiBUL1_nB6vUxO7bN0go_iUOk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Rosyadacode/~4/k9U7nC6Nd1U" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://amrurosyada.blogspot.com/feeds/2320099460796272095/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://amrurosyada.blogspot.com/2009/01/java-2d-graphics-dan-animation-part-3.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default/2320099460796272095?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default/2320099460796272095?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Rosyadacode/~3/k9U7nC6Nd1U/java-2d-graphics-dan-animation-part-3.html" title="JAVA 2D Graphics dan Animation (Part 3) - Games Engineering" /><author><name>arros</name><uri>http://www.blogger.com/profile/15115335540591605422</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://1.bp.blogspot.com/_-cffNDQPfcc/ST9DFOnnX7I/AAAAAAAAAGY/hhLx1rQqh54/S220/1_998498248l-edit.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_-cffNDQPfcc/SXQ_IBc93dI/AAAAAAAAALE/65X2EuGf6vc/s72-c/double_buffer.png" height="72" width="72" /><thr:total>3</thr:total><feedburner:origLink>http://amrurosyada.blogspot.com/2009/01/java-2d-graphics-dan-animation-part-3.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkANR3s8fip7ImA9WxVSGEw.&quot;"><id>tag:blogger.com,1999:blog-6639474468897837856.post-2353907354322761028</id><published>2009-01-13T07:28:00.007+07:00</published><updated>2009-01-13T09:46:36.576+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-13T09:46:36.576+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java Tech" /><title>Swing Layout in Action</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-cffNDQPfcc/SWvvqFt-LfI/AAAAAAAAAK4/YNInG2qUAUk/s1600-h/java.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 256px; height: 256px;" src="http://4.bp.blogspot.com/_-cffNDQPfcc/SWvvqFt-LfI/AAAAAAAAAK4/YNInG2qUAUk/s320/java.png" alt="" id="BLOGGER_PHOTO_ID_5290585693645319666" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://files.digitalcitizen.info/logos/java/java.png"&gt;original image link here&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Rehat dulu ah dari bahas games engineering, capek... refreshing dulu..., kemaren lagi iseng2 main2 layout swing sambil nginget2 sama mau optimasi dengan layout2 yang ada di java, enaknya sih emang klo kita pake visual swing desainer kayak punyanya &lt;a href="http://netbeans.org"&gt;netbeans&lt;/a&gt; tiggal drag n drop (what you see is what you get) tapi ga papalah buat iseng2 main2 layout biar ngerti konsep layout. sebenarnya java awt punya beberapa layout sebagai berikut:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;CardLayout ---&gt; Merupakan model seperti stack kartu yang dapat ditampilkan secara berurutan biasanya diaplikasikan pada waktu kita ingin membuat model interface seperti wizard2 atau model interface seperti kalo kita menginstall applikasi dengan next/previous.&lt;/li&gt;&lt;li&gt;BorderLayout ---&gt; Akan membagi area menjadi 5 wilayah yaitu North, West, East, South, dan Center.&lt;/li&gt;&lt;li&gt;FlowLayout ---&gt; FlowLayout merupakan default layout yang digunakan oleh swing, layout ini akan menampilkan komponen secara berurutan dari kiri ke kanan.&lt;/li&gt;&lt;li&gt;GridLayout ---&gt; GridLayout merupakan layout yang akan membagi sebuah frama/panel kedalam baris dan kolom dengan ukuran yang sama. Misalnya ketika kita ingin membuat tombol2 kalkulator dengan ukuran tombol yang sama.&lt;/li&gt;&lt;li&gt;GridBagLayout ---&gt; Layout yang sangat fleksibel yang akan membagi area menjadi grid2 sehingga komponen dapat ditempatkan secara fleksibel, dalam tulisan ini kita akan memanfaatkan layout ini.&lt;/li&gt;&lt;li&gt;GroupLayout ---&gt; Layout yang fleksibel yang dipakai oleh netbeans dan dikembangkan oleh third party yaitu apache.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Oke dalam tulisan ini akan dibatasi untuk membahas GridbagLayout, karena layout ini cukup menarik untuk dibahas sedangkan untuk layout2 yang lain bisa tutorialnya di situs resminya &lt;a href="http://www.blogger.com/java.sun.com/docs/books/tutorial/uiswing/"&gt;java&lt;/a&gt; atau &lt;a href="http://www.blogger.com/www.javabeginner.com/java-swing-tutorial.htm"&gt;resource2&lt;/a&gt; yang lain.&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;Untuk membuat layout ini cukup simple kita bisa mengkonstruksi dengan :&lt;br /&gt;&lt;blockquote&gt;GridBagLayout gbl = new GridBagLayout();&lt;/blockquote&gt;kemudian dari situ kita bisa melakukan set layout pada JFrame/JPanel yang akan kita gunakan cukup menambahkan object gbl pada parameter, misalnya:&lt;br /&gt;&lt;blockquote&gt;JFrame frame = new JFrame(); // jika layout diimplementasikan pada JFrame&lt;br /&gt;frame.serLayout(gbl);&lt;br /&gt;JPanel panel = new JPanel(); // jika layout diimplementasikan pada JPanel&lt;br /&gt;panel.setLayout(gbl);&lt;/blockquote&gt;Untuk mengatur tataletak komponen tadi pada frame/panel kita memanfaatkan GridBagConstraints, class ini mempunyai properti2 yang penting untuk mengatur tataletak sebagai berikut :&lt;br /&gt;*Note: properti dibawah ini diassignkan dengan nilai defaultnya&lt;br /&gt;&lt;ul&gt;&lt;li&gt;fill = GridBagConstrains.NONE; ----&gt; properti ini digunakan untuk setting arah resize dari komponen, Nilainya bisa GridBagConstrains.NONE, GridBagConstrains.HORIZONTAL, dan GridBagConstrains.VERTICAL&lt;/li&gt;&lt;li&gt;gridx = GridBagConstrains.CENTER; ----&gt; untuk meletakkan komponen pada grid tertentu terhadap posisi x&lt;/li&gt;&lt;li&gt;gridy = GridBagConstrains.RELATIVE; ----&gt; untuk meletakkan komponen pada grid tertentu pada posisi y&lt;/li&gt;&lt;li&gt;gridheight = 1; ----&gt; untuk menentukan span yang digunakan oleh komponen, misalkan kita isi dengan nilai 2 berarti komponen akan menempati area sebesar 2 grid searah sumbu y&lt;/li&gt;&lt;li&gt;gridwidth = 1; ----&gt; sama seperti gridheight hanya saja span gridnya searah sumbu x&lt;/li&gt;&lt;li&gt;insets = new Insets(0, 0, 0, 0); ----&gt; digunakan untuk menentukan jarak antar komponen Insets(top, left, bottom, right)&lt;/li&gt;&lt;li&gt;ipadx = 0; ----&gt; digunakan untuk menentukan padding dari dalam komponen  searah sumbu x&lt;/li&gt;&lt;li&gt;ipady = 0; ----&gt; digunakan untuk menentukan padding dari dalam komponen  searah sumbu y&lt;/li&gt;&lt;li&gt;weightx = 0; ----&gt; digunakan untuk menentukan ukuran maksimum resize dari komponen searah sumbu x&lt;/li&gt;&lt;li&gt;weighty = 0; ----&gt; digunakan untuk menentukan ukuran maksimum resize dari komponen searah sumbu x&lt;/li&gt;&lt;li&gt;anchor = GridBagConstrains.CENTER; digunakan untuk menentukan perataan letak komponen, bisa CENTER, EAST, WEST, SOUTH, NORTH ...&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Untuk memyederhanakan dalam pembuatan GridBagConstrains yang digunakan, saya membuat class GBCHelper.java yang merupakan subclass dari GridBagCondtrains sehingga kita cukup menggunaka sekali konstruksi object GridBagConstrains untuk semua komponen, listing programnya sebagai berikut:&lt;br /&gt;&lt;blockquote&gt;package brain.left.swingtest;&lt;br /&gt;&lt;br /&gt;import java.awt.GridBagConstraints;&lt;br /&gt;import java.awt.Insets;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* This class for simplifies using GridbagConstrains copyleft by amru rosyada,&lt;br /&gt;* you can redistribute with any change to this code license GPLV3&lt;br /&gt;*&lt;br /&gt;* @version = 1.00 12 Jan 2009&lt;br /&gt;* @author amru rosyada, amrurosyada.blogspot.com, taka86[AT]gmail.com&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;public class GBCHelper extends GridBagConstraints {&lt;br /&gt;private static final long serialVersionUID = 582260222458228387L;&lt;br /&gt;&lt;br /&gt;public GBCHelper() {&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * Set GridbagConstrains to default value&lt;br /&gt; */&lt;br /&gt;public GBCHelper clear() {&lt;br /&gt; this.fill = GBCHelper.NONE;&lt;br /&gt; this.gridx = GBCHelper.CENTER;&lt;br /&gt; this.gridy = GBCHelper.RELATIVE;&lt;br /&gt; this.gridheight = 1;&lt;br /&gt; this.gridwidth = 1;&lt;br /&gt; this.insets = new Insets(0, 0, 0, 0);&lt;br /&gt; this.ipadx = 0;&lt;br /&gt; this.ipady = 0;&lt;br /&gt; this.weightx = 0;&lt;br /&gt; this.weighty = 0;&lt;br /&gt; this.anchor = GBCHelper.CENTER;&lt;br /&gt; return this;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * set gridy gridx position&lt;br /&gt; *&lt;br /&gt; * @param gridx&lt;br /&gt; *            set gridx position&lt;br /&gt; * @param gridy&lt;br /&gt; *            set gridy position&lt;br /&gt; */&lt;br /&gt;public GBCHelper setGrid(int gridx, int gridy) {&lt;br /&gt; this.gridx = gridx;&lt;br /&gt; this.gridy = gridy;&lt;br /&gt; return this;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * Sets the fill direction.&lt;br /&gt; *&lt;br /&gt; * @param fill&lt;br /&gt; *            the fill direction&lt;br /&gt; * @return this object for further modification&lt;br /&gt; */&lt;br /&gt;public GBCHelper setFill(int fill) {&lt;br /&gt; this.fill = fill;&lt;br /&gt; return this;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * set value for gridx, gridy, gridwidth, gridheight&lt;br /&gt; *&lt;br /&gt; * @param gridx&lt;br /&gt; *            the gridx position&lt;br /&gt; * @param gridy&lt;br /&gt; *            the gridy position&lt;br /&gt; * @param gridwidth&lt;br /&gt; *            the cell span in x-direction&lt;br /&gt; * @param gridheight&lt;br /&gt; *            the cell span in y-direction&lt;br /&gt; */&lt;br /&gt;public GBCHelper setGrid(int gridx, int gridy, int gridwidth, int gridheight) {&lt;br /&gt; this.gridx = gridx;&lt;br /&gt; this.gridy = gridy;&lt;br /&gt; this.gridwidth = gridwidth;&lt;br /&gt; this.gridheight = gridheight;&lt;br /&gt; return this;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * Sets the insets of this cell.&lt;br /&gt; *&lt;br /&gt; * @param distance&lt;br /&gt; *            the spacing to use in all directions&lt;br /&gt; * @return this object for further modification&lt;br /&gt; */&lt;br /&gt;public GBCHelper setInsets(int distance) {&lt;br /&gt; this.insets = new Insets(distance, distance, distance, distance);&lt;br /&gt; return this;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * Sets the insets of this cell.&lt;br /&gt; *&lt;br /&gt; * @param top&lt;br /&gt; *            the spacing to use on top&lt;br /&gt; * @param left&lt;br /&gt; *            the spacing to use to the left&lt;br /&gt; * @param bottom&lt;br /&gt; *            the spacing to use on the bottom&lt;br /&gt; * @param right&lt;br /&gt; *            the spacing to use to the right&lt;br /&gt; * @return this object for further modification&lt;br /&gt; */&lt;br /&gt;public GBCHelper setInsets(int top, int left, int bottom, int right) {&lt;br /&gt; this.insets = new Insets(top, left, bottom, right);&lt;br /&gt; return this;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * Sets the internal padding&lt;br /&gt; *&lt;br /&gt; * @param ipadx&lt;br /&gt; *            the internal padding in x-direction&lt;br /&gt; * @param ipady&lt;br /&gt; *            the internal padding in y-direction&lt;br /&gt; * @return this object for further modification&lt;br /&gt; */&lt;br /&gt;public GBCHelper setIpad(int ipadx, int ipady) {&lt;br /&gt; this.ipadx = ipadx;&lt;br /&gt; this.ipady = ipady;&lt;br /&gt; return this;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * Sets the anchor.&lt;br /&gt; *&lt;br /&gt; * @param anchor&lt;br /&gt; *            the anchor value&lt;br /&gt; * @return this object for further modification&lt;br /&gt; */&lt;br /&gt;public GBCHelper setAnchor(int anchor) {&lt;br /&gt; this.anchor = anchor;&lt;br /&gt; return this;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * Sets the cell weights.&lt;br /&gt; *&lt;br /&gt; * @param weightx&lt;br /&gt; *            the cell weight in x-direction&lt;br /&gt; * @param weighty&lt;br /&gt; *            the cell weight in y-direction&lt;br /&gt; * @return this object for further modification&lt;br /&gt; */&lt;br /&gt;public GBCHelper setWeight(double weightx, double weighty) {&lt;br /&gt; this.weightx = weightx;&lt;br /&gt; this.weighty = weighty;&lt;br /&gt; return this;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Pada listing GBCHelper diatas telah terdokumentasikan setiap methodnya, perlu dicatat untuk setiap kali kita akan menggunakan kembali object ini harus memanggil terlebih dahulu method clear() sebelum method yang lain, sekarang kita akan buat class GridBagTester.java untuk melakukan tes menggunakan class GBCHelper. Listing programnya sebagai berikut :&lt;br /&gt;&lt;blockquote&gt;package brain.left.swingtest;&lt;br /&gt;&lt;br /&gt;import java.awt.EventQueue;&lt;br /&gt;import java.awt.GridBagLayout;&lt;br /&gt;&lt;br /&gt;import javax.swing.BorderFactory;&lt;br /&gt;import javax.swing.JButton;&lt;br /&gt;import javax.swing.JFrame;&lt;br /&gt;import javax.swing.JLabel;&lt;br /&gt;import javax.swing.JPanel;&lt;br /&gt;import javax.swing.JScrollPane;&lt;br /&gt;import javax.swing.JTextArea;&lt;br /&gt;import javax.swing.JTextField;&lt;br /&gt;import javax.swing.border.Border;&lt;br /&gt;import javax.swing.border.SoftBevelBorder;&lt;br /&gt;&lt;br /&gt;public class GridbagTester extends JFrame {&lt;br /&gt;/**&lt;br /&gt; *&lt;br /&gt; */&lt;br /&gt;private static final long serialVersionUID = -2094745569627207471L;&lt;br /&gt;private JPanel panel = new JPanel();&lt;br /&gt;private JLabel label1 = new JLabel("Label 1");&lt;br /&gt;private JTextField jtext1 = new JTextField(20);&lt;br /&gt;private JLabel label2 = new JLabel("Label 2");&lt;br /&gt;private JTextField jtext2 = new JTextField(20);&lt;br /&gt;private JButton button1 = new JButton("Tombol 1");&lt;br /&gt;private GBCHelper GBCH = new GBCHelper();&lt;br /&gt;private JTextArea jta = new JTextArea();&lt;br /&gt;JScrollPane pane = new JScrollPane(jta);&lt;br /&gt;&lt;br /&gt;public GridbagTester() {&lt;br /&gt; jta.setRows(5);&lt;br /&gt; Border br = BorderFactory.createBevelBorder(SoftBevelBorder.LOWERED);&lt;br /&gt; panel.setBorder(br);&lt;br /&gt; panel.setLayout(new GridBagLayout());&lt;br /&gt; //menambahkan komponen pada layout&lt;br /&gt; //jangan lupa untuk memanggil method clear sebelum method2 yang lain&lt;br /&gt; panel.add(label1, GBCH.clear().setGrid(0, 0).setAnchor(GBCHelper.EAST));&lt;br /&gt; panel.add(jtext1, GBCH.clear().setGrid(1, 0).setFill(&lt;br /&gt;   GBCHelper.HORIZONTAL).setInsets(1, 5, 2, 1));&lt;br /&gt; panel.add(label2, GBCH.clear().setGrid(0, 1).setAnchor(GBCHelper.EAST));&lt;br /&gt; panel.add(jtext2, GBCH.clear().setGrid(1, 1).setFill(&lt;br /&gt;   GBCHelper.HORIZONTAL).setInsets(1, 5, 2, 1));&lt;br /&gt; panel.add(pane, GBCH.clear().setGrid(0, 3, 4, 1).setAnchor(&lt;br /&gt;   GBCHelper.WEST).setFill(GBCHelper.BOTH));&lt;br /&gt; panel.add(button1, GBCH.clear().setGrid(1, 4).setAnchor(GBCHelper.EAST)&lt;br /&gt;   .setInsets(10, 1, 5, 2));&lt;br /&gt; setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);&lt;br /&gt; add(panel);&lt;br /&gt; pack();&lt;br /&gt; setVisible(true);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public static void main(String[] args) {&lt;br /&gt; EventQueue.invokeLater(new Runnable() {&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  public void run() {&lt;br /&gt;   new GridbagTester();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt; });&lt;br /&gt;}&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;screenshoot hasil running programmnya sebagai berikut :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-cffNDQPfcc/SWvjaI8uGzI/AAAAAAAAAKw/vustlC30eYQ/s1600-h/Screenshot.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 291px; height: 320px;" src="http://4.bp.blogspot.com/_-cffNDQPfcc/SWvjaI8uGzI/AAAAAAAAAKw/vustlC30eYQ/s320/Screenshot.png" alt="" id="BLOGGER_PHOTO_ID_5290572225495046962" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;oke done!&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/6639474468897837856-2353907354322761028?l=amrurosyada.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/81pSHlz2WbXppr2V9m8GgWF0z1g/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/81pSHlz2WbXppr2V9m8GgWF0z1g/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/81pSHlz2WbXppr2V9m8GgWF0z1g/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/81pSHlz2WbXppr2V9m8GgWF0z1g/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Rosyadacode/~4/jUouXddcj4o" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://amrurosyada.blogspot.com/feeds/2353907354322761028/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://amrurosyada.blogspot.com/2009/01/swing-layout-in-action.html#comment-form" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default/2353907354322761028?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default/2353907354322761028?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Rosyadacode/~3/jUouXddcj4o/swing-layout-in-action.html" title="Swing Layout in Action" /><author><name>arros</name><uri>http://www.blogger.com/profile/15115335540591605422</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://1.bp.blogspot.com/_-cffNDQPfcc/ST9DFOnnX7I/AAAAAAAAAGY/hhLx1rQqh54/S220/1_998498248l-edit.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_-cffNDQPfcc/SWvvqFt-LfI/AAAAAAAAAK4/YNInG2qUAUk/s72-c/java.png" height="72" width="72" /><thr:total>6</thr:total><feedburner:origLink>http://amrurosyada.blogspot.com/2009/01/swing-layout-in-action.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkYEQn46fip7ImA9WxVSFk8.&quot;"><id>tag:blogger.com,1999:blog-6639474468897837856.post-2466950878944008839</id><published>2009-01-11T05:04:00.011+07:00</published><updated>2009-01-11T05:55:03.016+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-11T05:55:03.016+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="games engineering" /><title>JAVA 2D Graphics dan Animation (Part 2) - Games Engineering</title><content type="html">&lt;span style="font-weight:bold;"&gt;Images&lt;/span&gt;&lt;br /&gt;Menggambar text pada screen pada tulisan sebelumnya adalah sesuatu yang menyenangkan, tetapi akan sangat menyenangkan ketika kita bisa menambahkan image pada game yang kita develop, bener ga? bener!. Sebelum memulai menggambarkan image pada screen ada baiknya jika kita mempelajari beberapa hal fundamental yang berkaitan dengan image, seperti tipe transparansi dan format file.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Transparensi&lt;/span&gt;&lt;br /&gt;Oke sekarang bayangkan kita punya gambar seperti di bawah ini :&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_-cffNDQPfcc/SWkl_ziIrII/AAAAAAAAAKY/-FwxB4HZBzo/s1600-h/head.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 187px; height: 149px;" src="http://3.bp.blogspot.com/_-cffNDQPfcc/SWkl_ziIrII/AAAAAAAAAKY/-FwxB4HZBzo/s320/head.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5289801015418727554" /&gt;&lt;/a&gt;&lt;br /&gt;gambar image di atas mempunyi backgroun berwarna putih, tetapi perlu diingat bahwa background adalah bagian dari image juga, dan apakah background tersebut akan ditampilkan juga? tergantung dari transparansi image. Kita bisa menggunakan tiga tipe image tranparansi: opaque, transparent, dan translucent.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Opaque: Setiap pixel pada image akan ditampilkan.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Transparent: Setiap image juga akan ditampilakan, tetapi background putih akan dibuat transparan.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Translucent: Pixel dapat ditransparansi secara terpisah, seperti ketika ingin menampilkan effect ghost/hantu.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;File Format&lt;/span&gt;&lt;br /&gt;Ada dua tipe format dasar image yaitu raster dan vector. Raster image format akan ditampilkan sesuai dengan ukuran kedalaman pixel, jika diperbesar image akan pecah. Vector image akan ditampilakan secara geometri dan dapat diresize tanpa mengurangi kualitas image.&lt;span class="fullpost"&gt;&lt;br /&gt;Java API tidak mempunyai built in vector format, maka kita akan memfokuskan pada raster image, jika ingin mengetahui manipulasi tentang vector image bisa memanfaatkan SVG punya apache yang disebut batik http://xml.apache.org/batik/.&lt;br /&gt;&lt;br /&gt;Java runtime mempuyai tiga format file raster yang berbeda yaitu GIF, PNG, dan JPEG:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;GIF, GIF image bisa opaque atau transparent, dan dapat mempunyai warna 8 bit atau bahkan kurang. Saat kita sudah mengenal format PNG dan mempunyai kemampuan seperti GIF, sehingga disarankan menggunakan PNG.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;PNG, PNG image mempunyai semua tipe transparansi: opaque, transparent, atau translucent. PNG image bisa mempunyai kedalaman warna sampai 24 bit.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;JPEG, JPEG image hanya bersifat 24 bit opaque. JPEG mempunyai kompresi yang tinggi untuk fotografi, tetapi bersifat lossy commpression, jadi image tidak akan sama persis dengan replika.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Membaca Image&lt;/span&gt;&lt;br /&gt;Jadi bagaimana kita mentranslate GIF, PNG, atau JPEG file kedalam sesuatu yang dapat kita tampilkan? Dengan memanfaatkan API java Toolkit kita bisa memanggil method getImage(), yang akan memparsing file image dan akan mengembalikan image object. Contohnya sebagai berikut:&lt;br /&gt;&lt;blockquote&gt;Toolkit toolkit = Toolkit.getDefaultToolkit();&lt;br /&gt;Image image = toolkit.getImage(fileName);&lt;/blockquote&gt;&lt;br /&gt;Dengan kode diata sebernarnya image belum benar2 diload karena image akan diload pada thread yang lain, jika kita langsung menampilakan image tersebut dan image belum selesai diload maka hanya sebagian image saja yang akan ditampilkan atau malah tidak sama sekali.&lt;br /&gt;Untuk mengatasi hal tersebut kita bisa memanfaatkan MediaTracker object untuk melihat apakah image sudah selesai diload, tetapi ada cara yang lebih mudah yaitu memanfaatkan ImageIcon class yang akan secara otomatis menggunkan MediaTracker dan menunggu sampai proses loading selesai. ImageIcon class di package javax.swing akan melakukan load pada image menggunakan Toolkit kemudian akan menunggu sampai proses loading selesai. Sebagai contoh sebagai berikut:&lt;br /&gt;&lt;blockquote&gt;ImageIcon icon = new ImageIcon(fileName);&lt;br /&gt;Image image = icon.getImage();&lt;/blockquote&gt;&lt;br /&gt;Oke, sekarang kita bisa mencona untuk menampilkan image dengan full-screen dengan memanfaatkan SimpleClassManager yang telah kita bahas pada key topic Full-Screen Graphics. Sekarang kita akan buat ImageTest.java dengan listing sebagai berikut:&lt;br /&gt;&lt;blockquote&gt;package brain.left.games;&lt;br /&gt;&lt;br /&gt;import java.awt.*;&lt;br /&gt;import javax.swing.ImageIcon;&lt;br /&gt;import javax.swing.JFrame;&lt;br /&gt;&lt;br /&gt;public class ImageTest extends JFrame {&lt;br /&gt; /**&lt;br /&gt;  * &lt;br /&gt;  */&lt;br /&gt; private static final long serialVersionUID = -4134922005163510957L;&lt;br /&gt;&lt;br /&gt; public static void main(String[] args) {&lt;br /&gt;  DisplayMode displayMode;&lt;br /&gt;  if (args.length == 3) {&lt;br /&gt;   displayMode = new DisplayMode(Integer.parseInt(args[0]), Integer&lt;br /&gt;     .parseInt(args[1]), Integer.parseInt(args[2]),&lt;br /&gt;     DisplayMode.REFRESH_RATE_UNKNOWN);&lt;br /&gt;  } else {&lt;br /&gt;   displayMode = new DisplayMode(800, 600, 16,&lt;br /&gt;     DisplayMode.REFRESH_RATE_UNKNOWN);&lt;br /&gt;  }&lt;br /&gt;  ImageTest test = new ImageTest();&lt;br /&gt;  test.run(displayMode);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; private static final int FONT_SIZE = 24;&lt;br /&gt; private static final long DEMO_TIME = 10000;&lt;br /&gt; private SimpleScreenManager screen;&lt;br /&gt; private Image bgImage;&lt;br /&gt; private Image opaqueImage;&lt;br /&gt; private Image transparentImage;&lt;br /&gt; private Image translucentImage;&lt;br /&gt; private Image antiAliasedImage;&lt;br /&gt; private boolean imagesLoaded;&lt;br /&gt;&lt;br /&gt; public void run(DisplayMode displayMode) {&lt;br /&gt;  setBackground(Color.blue);&lt;br /&gt;  setForeground(Color.white);&lt;br /&gt;  setFont(new Font("Dialog", Font.PLAIN, FONT_SIZE));&lt;br /&gt;  imagesLoaded = false;&lt;br /&gt;  screen = new SimpleScreenManager();&lt;br /&gt;  try {&lt;br /&gt;   screen.setFullScreen(displayMode, this);&lt;br /&gt;   loadImages();&lt;br /&gt;   try {&lt;br /&gt;    Thread.sleep(DEMO_TIME);&lt;br /&gt;   } catch (InterruptedException ex) {&lt;br /&gt;   }&lt;br /&gt;  } finally {&lt;br /&gt;   screen.restoreScreen();&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void loadImages() {&lt;br /&gt;  bgImage = loadImage("images/tile-games/background.jpg");&lt;br /&gt;  opaqueImage = loadImage("images/tile-games/opaque.png");&lt;br /&gt;  transparentImage = loadImage("images/tile-games/transparent.png");&lt;br /&gt;  translucentImage = loadImage("images/tile-games/translucent.png");&lt;br /&gt;  antiAliasedImage = loadImage("images/tile-games/antialiased.png");&lt;br /&gt;  imagesLoaded = true;&lt;br /&gt;  // signal to AWT to repaint this window&lt;br /&gt;  repaint();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; private Image loadImage(String fileName) {&lt;br /&gt;  return new ImageIcon(fileName).getImage();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void paint(Graphics g) {&lt;br /&gt;  // set text anti-aliasing&lt;br /&gt;  if (g instanceof Graphics2D) {&lt;br /&gt;   Graphics2D g2 = (Graphics2D) g;&lt;br /&gt;   g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,&lt;br /&gt;     RenderingHints.VALUE_TEXT_ANTIALIAS_ON);&lt;br /&gt;  }&lt;br /&gt;  // draw images&lt;br /&gt;  if (imagesLoaded) {&lt;br /&gt;   g.drawImage(bgImage, 0, 0, null);&lt;br /&gt;   drawImage(g, opaqueImage, 0, 0, "Opaque");&lt;br /&gt;   drawImage(g, transparentImage, 320, 0, "Transparent");&lt;br /&gt;   drawImage(g, translucentImage, 0, 300, "Translucent");&lt;br /&gt;   drawImage(g, antiAliasedImage, 320, 300,&lt;br /&gt;     "Translucent (Anti-Aliased)");&lt;br /&gt;  } else {&lt;br /&gt;   g.drawString("Loading Images...", 5, FONT_SIZE);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void drawImage(Graphics g, Image image, int x, int y, String caption) {&lt;br /&gt;  g.drawImage(image, x, y, null);&lt;br /&gt;  g.drawString(caption, x + 5, y + FONT_SIZE + image.getHeight(null));&lt;br /&gt; }&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Benchmarking pada Image-Drawing&lt;/span&gt;&lt;br /&gt;Oke kita akan lakukan benchmarking pada kecepatan image drawing, kita akan memodifikasi pada listing program sebelumnya menjadi ImageSpeedTest.java, idenya adalah sebagai berikut kita akan melakukan drawing secara berulang dengan periode waktu sebesar 1500 milidetik dan kemudian menghitung berapa kali image akan ditampilkan setiap second.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;PERHTIAN!&lt;/span&gt;&lt;br /&gt;Oke sebagai peringatan saja jangan lakukan hal semacam ini pada pembuatan game yang sesungguhnya, karena ini tidak akan bekerja. AWT event dispacth thread memanggil method paint(), tetapi disamping itu AWT event juga menangani keyboard, mouse dan masih banyak lagi event yang ditangani. Kita akan membahas hal ini pada pembuatan animasi.&lt;br /&gt;&lt;br /&gt;listing ImageSpeesTest.java :&lt;br /&gt;&lt;blockquote&gt;package brain.left.games;&lt;br /&gt;&lt;br /&gt;import java.awt.*;&lt;br /&gt;import javax.swing.ImageIcon;&lt;br /&gt;import javax.swing.JFrame;&lt;br /&gt;&lt;br /&gt;public class ImageSpeedTest extends JFrame {&lt;br /&gt; private static final long serialVersionUID = -223039028953577654L;&lt;br /&gt;&lt;br /&gt; public static void main(String args[]) {&lt;br /&gt;  DisplayMode displayMode;&lt;br /&gt;  if (args.length == 3) {&lt;br /&gt;   displayMode = new DisplayMode(Integer.parseInt(args[0]), Integer&lt;br /&gt;     .parseInt(args[1]), Integer.parseInt(args[2]),&lt;br /&gt;     DisplayMode.REFRESH_RATE_UNKNOWN);&lt;br /&gt;  } else {&lt;br /&gt;   displayMode = new DisplayMode(800, 600, 16,&lt;br /&gt;     DisplayMode.REFRESH_RATE_UNKNOWN);&lt;br /&gt;  }&lt;br /&gt;  ImageSpeedTest test = new ImageSpeedTest();&lt;br /&gt;  test.run(displayMode);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; private static final int FONT_SIZE = 24;&lt;br /&gt; private static final long TIME_PER_IMAGE = 1500;&lt;br /&gt; private SimpleScreenManager screen;&lt;br /&gt; private Image bgImage;&lt;br /&gt; private Image opaqueImage;&lt;br /&gt; private Image transparentImage;&lt;br /&gt; private Image translucentImage;&lt;br /&gt; private Image antiAliasedImage;&lt;br /&gt; private boolean imagesLoaded;&lt;br /&gt;&lt;br /&gt; public void run(DisplayMode displayMode) {&lt;br /&gt;  setBackground(Color.blue);&lt;br /&gt;  setForeground(Color.white);&lt;br /&gt;  setFont(new Font("Dialog", Font.PLAIN, FONT_SIZE));&lt;br /&gt;  imagesLoaded = false;&lt;br /&gt;  screen = new SimpleScreenManager();&lt;br /&gt;  try {&lt;br /&gt;   screen.setFullScreen(displayMode, this);&lt;br /&gt;   synchronized (this) {&lt;br /&gt;    loadImages();&lt;br /&gt;    // wait for test to complete&lt;br /&gt;    try {&lt;br /&gt;     wait();&lt;br /&gt;    } catch (InterruptedException ex) {&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;  } finally {&lt;br /&gt;   screen.restoreScreen();&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void loadImages() {&lt;br /&gt;  bgImage = loadImage("images/tile-games/background.jpg");&lt;br /&gt;  opaqueImage = loadImage("images/tile-games/opaque.png");&lt;br /&gt;  transparentImage = loadImage("images/tile-games/transparent.png");&lt;br /&gt;  translucentImage = loadImage("images/tile-games/translucent.png");&lt;br /&gt;  antiAliasedImage = loadImage("images/tile-games/antialiased.png");&lt;br /&gt;  imagesLoaded = true;&lt;br /&gt;  // signal to AWT to repaint this window&lt;br /&gt;  repaint();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; private final Image loadImage(String fileName) {&lt;br /&gt;  return new ImageIcon(fileName).getImage();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void paint(Graphics g) {&lt;br /&gt;  // set text anti-aliasing&lt;br /&gt;  if (g instanceof Graphics2D) {&lt;br /&gt;   Graphics2D g2 = (Graphics2D) g;&lt;br /&gt;   g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,&lt;br /&gt;     RenderingHints.VALUE_TEXT_ANTIALIAS_ON);&lt;br /&gt;  }&lt;br /&gt;  // draw images&lt;br /&gt;  if (imagesLoaded) {&lt;br /&gt;   drawImage(g, opaqueImage, "Opaque");&lt;br /&gt;   drawImage(g, transparentImage, "Transparent");&lt;br /&gt;   drawImage(g, translucentImage, "Translucent");&lt;br /&gt;   drawImage(g, antiAliasedImage, "Translucent (Anti-Aliased)");&lt;br /&gt;   // notify that the test is complete&lt;br /&gt;   synchronized (this) {&lt;br /&gt;    notify();&lt;br /&gt;   }&lt;br /&gt;  } else {&lt;br /&gt;   g.drawString("Loading Images...", 5, FONT_SIZE);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void drawImage(Graphics g, Image image, String name) {&lt;br /&gt;  int width = screen.getFullScreenWindow().getWidth()&lt;br /&gt;    - image.getWidth(null);&lt;br /&gt;  int height = screen.getFullScreenWindow().getHeight()&lt;br /&gt;    - image.getHeight(null);&lt;br /&gt;  int numImages = 0;&lt;br /&gt;  g.drawImage(bgImage, 0, 0, null);&lt;br /&gt;  long startTime = System.currentTimeMillis();&lt;br /&gt;  while (System.currentTimeMillis() - startTime &lt; TIME_PER_IMAGE) {&lt;br /&gt;   int x = Math.round((float) Math.random() * width);&lt;br /&gt;   int y = Math.round((float) Math.random() * height);&lt;br /&gt;   g.drawImage(image, x, y, null);&lt;br /&gt;   numImages++;&lt;br /&gt;  }&lt;br /&gt;  long time = System.currentTimeMillis() - startTime;&lt;br /&gt;  float speed = numImages * 1000f / time;&lt;br /&gt;  System.out.println(name + ": " + speed + " images/sec");&lt;br /&gt; }&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;Program ini tidaklah menjadi patokan, karena semuanya tergantung dari jenis image yang digunakan serta spesifikasi komputer yang digunakan. Pada saat pembuatan program ini saya menggunakan komputer dengan spesifikasi processor Intel Centrino 1.7G, VGA Intel 64M, Resolusi layar 800x600 dan kedalaman bit 16, hasilnya adalah sebagai berikut:&lt;br /&gt;&lt;blockquote&gt;Opaque: 10985.074 images/sec&lt;br /&gt;Transparent: 239.68042 images/sec&lt;br /&gt;Translucent: 260.98535 images/sec&lt;br /&gt;Translucent (Anti-Aliased): 264.31424 images/sec&lt;/blockquote&gt;&lt;br /&gt;Dapat disimpulkan dari hasil benchmarking bahwa image dengan opaque paling cepat..!!, siip saatnya sekarang melangkah lebih lanjut kita akan membahas tentang animasi.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Animation&lt;/span&gt;&lt;br /&gt;Animasi yang pertama adalah cartoon-style animation. Animasi jenis ini akan menampilkan urutan gambar secara bergantian. Sebagai contoh kita akan buat animasi dengan urutan sebagai berikut :&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_-cffNDQPfcc/SWkmE7IXqBI/AAAAAAAAAKg/rdyMFnsIBwE/s1600-h/animation-head.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 93px;" src="http://2.bp.blogspot.com/_-cffNDQPfcc/SWkmE7IXqBI/AAAAAAAAAKg/rdyMFnsIBwE/s320/animation-head.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5289801103357487122" /&gt;&lt;/a&gt;&lt;br /&gt;Urutan tersebut kita analogikan sebagai urutan frame, setiap frames akan ditampilkan dengan waktu tertentu, tetapi frame akan ditampilakan dengan waktu yang berbeda-beda. Sebagai contoh, misal frame pertama ditampilkan selama 200milisecond, frame kedua akan ditampilkan 75milisecond, dan seterusnya.&lt;br /&gt;Kita akan menampilkan dengan urutan sebagai berikut :&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_-cffNDQPfcc/SWkmH_Vk5QI/AAAAAAAAAKo/zFDhBogxvjY/s1600-h/animation-sequence.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 64px;" src="http://3.bp.blogspot.com/_-cffNDQPfcc/SWkmH_Vk5QI/AAAAAAAAAKo/zFDhBogxvjY/s320/animation-sequence.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5289801156026230018" /&gt;&lt;/a&gt;&lt;br /&gt;Oke sekarang kita implementasikan urutan animasi tersebut pada programming. Sekarang kita akan membuat class Animation yang mempunyai tiga method penting: addFrame(), update(), dan getImage(). Method addFrame digunakan untuk menambahkan image kedalam animasi dengan waktu dalam milisecond. Method update() akan memberitahukan bahwa bahwa waktu penampilan telah selesai. Yang terakhir getImage() digunakan untuk mendapatkan image yang seharusnya akan ditampilakan setelah suatu waktu terlewati.&lt;br /&gt;Listing Animation.java adalah sebagai berikut:&lt;br /&gt;&lt;blockquote&gt;package brain.left.games;&lt;br /&gt;&lt;br /&gt;import java.awt.Image;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * Animation class digunakan untuk menangani urutan image yang akan&lt;br /&gt; * ditampilakan pada frame untuk waktu tertentu.&lt;br /&gt; */&lt;br /&gt;public class Animation {&lt;br /&gt; private ArrayList&lt;AnimFrame&gt; frames;&lt;br /&gt; private int currFrameIndex;&lt;br /&gt; private long animTime;&lt;br /&gt; private long totalDuration;&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Konstruktor untuk Animasi.&lt;br /&gt;  */&lt;br /&gt; public Animation() {&lt;br /&gt;  frames = new ArrayList&lt;AnimFrame&gt;();&lt;br /&gt;  totalDuration = 0;&lt;br /&gt;  start();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Menambahkan image ke frame dengan waktu tertentu&lt;br /&gt;  */&lt;br /&gt; public synchronized void addFrame(Image image, long duration) {&lt;br /&gt;  totalDuration += duration;&lt;br /&gt;  frames.add(new AnimFrame(image, totalDuration));&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Memulai animasi mulai dari awal frame.&lt;br /&gt;  */&lt;br /&gt; public synchronized void start() {&lt;br /&gt;  animTime = 0;&lt;br /&gt;  currFrameIndex = 0;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Melakukan update pada image pada animasi.&lt;br /&gt;  */&lt;br /&gt; public synchronized void update(long elapsedTime) {&lt;br /&gt;  if (frames.size() &gt; 1) {&lt;br /&gt;   animTime += elapsedTime;&lt;br /&gt;   if (animTime &gt;= totalDuration) {&lt;br /&gt;    animTime = animTime % totalDuration;&lt;br /&gt;    currFrameIndex = 0;&lt;br /&gt;   }&lt;br /&gt;   while (animTime &gt; getFrame(currFrameIndex).endTime) {&lt;br /&gt;    currFrameIndex++;&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Mendapatkan image yang sedang ditampilkan pada animasi yang sedang berlangsung,&lt;br /&gt;  * akan mengembalikan nilai null jika image tidak ada&lt;br /&gt;  */&lt;br /&gt; public synchronized Image getImage() {&lt;br /&gt;  if (frames.size() == 0) {&lt;br /&gt;   return null;&lt;br /&gt;  } else {&lt;br /&gt;   return getFrame(currFrameIndex).image;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; private AnimFrame getFrame(int i) {&lt;br /&gt;  return frames.get(i);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; private class AnimFrame {&lt;br /&gt;  Image image;&lt;br /&gt;  long endTime;&lt;br /&gt;&lt;br /&gt;  public AnimFrame(Image image, long endTime) {&lt;br /&gt;   this.image = image;&lt;br /&gt;   this.endTime = endTime;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Active Rendering&lt;/span&gt;&lt;br /&gt;Untuk mengimplementasikan animation, kita harus secara terus-menerus melakukan update secara eficient. Sebelum melakukan rendering dengan memanggil paint(), kita harus memanggil method repaint() terlebih dahulu untuk memberikan signal AWT event dispatch thread untuk me-repaint screen, tetapi ini akan menyebabkan delay karena AWT thread mungkin sedang melakukan hal lain.&lt;br /&gt;Cara lain untuk melakukan active rendering, active rendering akan melakukan drawing secara langsung pada screen di main thread. Dengan cara ini kita dapat mengkontrol yang sedang digambarkan pada screen saat ini, dan lebih mempersingkat kode.&lt;br /&gt;Untuk menggunakan teknik active rendering, kita gunakan method getGraphic() dari class Componen untuk mendapatkan graphic contex.&lt;br /&gt;&lt;blockquote&gt;Graphics g = screen.getFullScreenWindow().getGraphics();&lt;br /&gt;draw(g); &lt;br /&gt;g.dispose();&lt;/blockquote&gt;&lt;br /&gt;Simplekan ???, jangan lupa untuk memnggil dispose() setelah selesai melakukan draw(g), karena dengan memanggil dispose() akan melepaskan resourse yang sudah tidak dipakai.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Animasi Loop&lt;/span&gt;&lt;br /&gt;Sekarang kita akan gunakan active rendering untuk melakukan draw pada sebuah loop. Animasi loop mempunyai step sebagai berikut:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Melakukan update pada animasi&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Melakukan draw pada screen&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Pilihan optional bisa menggunakan sleep untuk periode tertentu&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Mulai dari step pertama kembali&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;jika dikodingkan maka loop akan menjadi sebagai berikut:&lt;br /&gt;&lt;blockquote&gt;while (true) {     &lt;br /&gt;  // Melakukan update pada animasi &lt;br /&gt;    updateAnimations(); &lt;br /&gt;    // Melakukan draw pada screen&lt;br /&gt;    Graphics g = screen.getFullScreenWindow().getGraphics(); &lt;br /&gt;    draw(g); &lt;br /&gt;    g.dispose(); &lt;br /&gt;    // Optionl ---&gt; melakukan sleep pada periode tertentu&lt;br /&gt;    try { &lt;br /&gt;        Thread.sleep(20); &lt;br /&gt;    } &lt;br /&gt;    catch (InterruptedException ex) { } &lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;Pada kenyataannya loop pada animasi tidak akan berkjalan secara terus menerus, pada contoh yang akan kita buat kali ini, animasi akan berhenti setelah beberapa detik.&lt;br /&gt;Listing program AnimationTest sebagai berikut:&lt;br /&gt;&lt;blockquote&gt;package brain.left.games;&lt;br /&gt;&lt;br /&gt;import java.awt.*;&lt;br /&gt;import javax.swing.ImageIcon;&lt;br /&gt;import javax.swing.JFrame;&lt;br /&gt;&lt;br /&gt;public class AnimationTest1 {&lt;br /&gt; public static void main(String args[]) {&lt;br /&gt;  DisplayMode displayMode;&lt;br /&gt;  if (args.length == 3) {&lt;br /&gt;   displayMode = new DisplayMode(Integer.parseInt(args[0]), Integer&lt;br /&gt;     .parseInt(args[1]), Integer.parseInt(args[2]),&lt;br /&gt;     DisplayMode.REFRESH_RATE_UNKNOWN);&lt;br /&gt;  } else {&lt;br /&gt;   displayMode = new DisplayMode(800, 600, 16,&lt;br /&gt;     DisplayMode.REFRESH_RATE_UNKNOWN);&lt;br /&gt;  }&lt;br /&gt;  AnimationTest1 test = new AnimationTest1();&lt;br /&gt;  test.run(displayMode);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; private static final long DEMO_TIME = 5000;&lt;br /&gt; private SimpleScreenManager screen;&lt;br /&gt; private Image bgImage;&lt;br /&gt; private Animation anim;&lt;br /&gt;&lt;br /&gt; public void loadImages() {&lt;br /&gt;  // load images&lt;br /&gt;  bgImage = loadImage("images/tile-games/background.jpg");&lt;br /&gt;  Image player1 = loadImage("images/tile-games/hero1.png");&lt;br /&gt;  Image player2 = loadImage("images/tile-games/hero2.png");&lt;br /&gt;  Image player3 = loadImage("images/tile-games/hero3.png");&lt;br /&gt;  // create animation&lt;br /&gt;  anim = new Animation();&lt;br /&gt;  anim.addFrame(player1, 250);&lt;br /&gt;  anim.addFrame(player2, 150);&lt;br /&gt;  anim.addFrame(player1, 150);&lt;br /&gt;  anim.addFrame(player2, 150);&lt;br /&gt;  anim.addFrame(player3, 200);&lt;br /&gt;  anim.addFrame(player2, 150);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; private Image loadImage(String fileName) {&lt;br /&gt;  return new ImageIcon(fileName).getImage();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void run(DisplayMode displayMode) {&lt;br /&gt;  screen = new SimpleScreenManager();&lt;br /&gt;  try {&lt;br /&gt;   screen.setFullScreen(displayMode, new JFrame());&lt;br /&gt;   loadImages();&lt;br /&gt;   animationLoop();&lt;br /&gt;  } finally {&lt;br /&gt;   screen.restoreScreen();&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void animationLoop() {&lt;br /&gt;  long startTime = System.currentTimeMillis();&lt;br /&gt;  long currTime = startTime;&lt;br /&gt;  while (currTime - startTime &lt; DEMO_TIME) {&lt;br /&gt;   long elapsedTime = System.currentTimeMillis() - currTime;&lt;br /&gt;   currTime += elapsedTime;&lt;br /&gt;   // update animation&lt;br /&gt;   anim.update(elapsedTime);&lt;br /&gt;   // draw to screen&lt;br /&gt;   Graphics g = screen.getFullScreenWindow().getGraphics();&lt;br /&gt;   draw(g);&lt;br /&gt;   g.dispose();&lt;br /&gt;   // take a nap&lt;br /&gt;   try {&lt;br /&gt;    Thread.sleep(20);&lt;br /&gt;   } catch (InterruptedException ex) {&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void draw(Graphics g) {&lt;br /&gt;  // draw background&lt;br /&gt;  g.drawImage(bgImage, 0, 0, null);&lt;br /&gt;  // draw image&lt;br /&gt;  g.drawImage(anim.getImage(), 0, 0, null);&lt;br /&gt; }&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;Pada contoh program diatas animasi akan berjalan tetapi akan kelihatan ficker pada animasi, untuk mengatasi masalah ini maka akan dibahas pada Get Rid of Flicker and Tearing.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6639474468897837856-2466950878944008839?l=amrurosyada.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/3CvvvOz9nheT2mjdxy8F3KMsBc0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3CvvvOz9nheT2mjdxy8F3KMsBc0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/3CvvvOz9nheT2mjdxy8F3KMsBc0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3CvvvOz9nheT2mjdxy8F3KMsBc0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Rosyadacode/~4/grl6IzIyOUI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://amrurosyada.blogspot.com/feeds/2466950878944008839/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://amrurosyada.blogspot.com/2009/01/java-2d-graphics-dan-animation-part-2.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default/2466950878944008839?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default/2466950878944008839?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Rosyadacode/~3/grl6IzIyOUI/java-2d-graphics-dan-animation-part-2.html" title="JAVA 2D Graphics dan Animation (Part 2) - Games Engineering" /><author><name>arros</name><uri>http://www.blogger.com/profile/15115335540591605422</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://1.bp.blogspot.com/_-cffNDQPfcc/ST9DFOnnX7I/AAAAAAAAAGY/hhLx1rQqh54/S220/1_998498248l-edit.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_-cffNDQPfcc/SWkl_ziIrII/AAAAAAAAAKY/-FwxB4HZBzo/s72-c/head.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://amrurosyada.blogspot.com/2009/01/java-2d-graphics-dan-animation-part-2.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUUDQnk4eCp7ImA9WxVSFEo.&quot;"><id>tag:blogger.com,1999:blog-6639474468897837856.post-3157110760317334283</id><published>2009-01-09T09:22:00.011+07:00</published><updated>2009-01-09T10:54:33.730+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-09T10:54:33.730+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java Tech" /><category scheme="http://www.blogger.com/atom/ns#" term="games engineering" /><title>JAVA 2D Graphics dan Animation (Part 1) - Games Engineering</title><content type="html">&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-cffNDQPfcc/SWa7mAagNNI/AAAAAAAAAJQ/Cmql_vpE0PY/s1600-h/monitor.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 262px;" src="http://1.bp.blogspot.com/_-cffNDQPfcc/SWa7mAagNNI/AAAAAAAAAJQ/Cmql_vpE0PY/s320/monitor.gif" alt="" id="BLOGGER_PHOTO_ID_5289121074013811922" border="0" /&gt;&lt;/a&gt;&lt;a href="http://school.discoveryeducation.com/clipart/images/monitor.gif"&gt;image original link&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-weight: bold;"&gt;Key topics pada pembahasan:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Full-screen Graphics&lt;/li&gt;&lt;li&gt;Images&lt;/li&gt;&lt;li&gt;Getting Rid of Flicker and Tearing&lt;/li&gt;&lt;li&gt;Simple Effects&lt;/li&gt;&lt;li&gt;Summary&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Full-screen Graphics&lt;/span&gt;&lt;br /&gt;Pembuatan games akan lebih interaktif dan menarik ketika kita menambahkan adanya user interface(graphic) dan animation. Tetapi dalam pembuatannya kita perlu membuat spesifikasi2 seperti berapa resolusi yang digunakan dan juga jangan sampai mengabaikan masalah refresh rate pada monitor.&lt;br /&gt;Oke sekarang kita akan langsung melihat bagaimana hardware displai bekerja sebelum menginjak ke masalah programming. Secara garis besar ada dua bagian pada display hardware : video card dan monitor. Video card merepresentasikan apa yang ada di memorinya dan mempunyai fungsi2 untuk melakukan modifikasi pada apa yang ditampilkan. Memori card juga bekerja dibackground untuk mempush memorinya ke monitor. Sedangkan monitor akan menampilkan informasi yang diberikan oleh video card.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Screen Layout&lt;/span&gt;&lt;br /&gt;Screen pada monitor sebenarnya akan dibagi dalan pixel warna kecil2 yang mempunyai ukuran sama. Perkalian dari pixel horizontal dan vertikal akan membuat sebuah ukuran screen yang kita sebut sebagai resolusi.&lt;br /&gt;Screen akan dimulai dari pojok kiri atas, yang diperlihatkan pada gambar 1 dibawah ini. Pixel akan dimasukkan mulai dari pojok kiri atas, kemudian ke kanan dan seterusnya samapi ke pojok paling kiri bawah. Area pada screen bisa kita akses perdasarkan posisi koordinat (x, y), x merepresentasikan horizontal pixel dan y merepresentasikan vertical pixel.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-cffNDQPfcc/SWa3mhoqLjI/AAAAAAAAAJA/4DI5Q4pHf5Q/s1600-h/Screen.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 177px;" src="http://1.bp.blogspot.com/_-cffNDQPfcc/SWa3mhoqLjI/AAAAAAAAAJA/4DI5Q4pHf5Q/s320/Screen.png" alt="" id="BLOGGER_PHOTO_ID_5289116684885044786" border="0" /&gt;&lt;/a&gt;gambar 1 ilustrasi pixel dalam screen 800x600.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;Resolusi yang kita manipulasi sangat bergantung pada kemampuan video card dan monitor. Umumnya resolusi yang sering di pakai adalah 640x480, 800x600, 1024x768, 1280x1024.&lt;br /&gt;Secara umum monitor dan televisi mempunyai size ratio 4:3. Yang berarti tinggi dari monitor adalah 3/4 dari ukuran lebarnya. Beberapa monitor yang baru dibuat dalam wides creen dengan display size retio 3:2 atau 16:10 dan 16:9(untuk wide screen movie).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Warna Pixel dan Kedalaman Bit&lt;/span&gt;&lt;br /&gt;Warna primer ada tiga merah, kuning, dan biru. Mungkin kita masih ingat dengan percampuran warna, "kuning + biru = hijau." Idenya adalah kita bisa memanipulasi warna-warna tersebut menjadi warna yang lain yang kita inginkan. Model semacam ini sering disebut sebagai subtractive color model, dan percampuran semua warna akan mejadi putih.&lt;br /&gt;Ini sama sebagaimana monitor komputer dan televisi bekerja. Monitor mengkombinasikan merah, biru dan hijau untuk membuat banyak warna lain.&lt;br /&gt;Warna2 pada monitor dapat ditampilkan tergantung pada kedalaman bit-nya. Secara umum kedalaman bit yang sering digunakan adalah 8,15, 16, 24, dan 32 bit.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Warna 8-bit mempunyai 2^8=256 warna. Hanya 256 warna yang bisa ditampilkan pada suatu waktu.&lt;/li&gt;&lt;li&gt;Warna 15-bit mempunyai 5 bit untuk merah, biru dan hijau, totalnya ada 2^15=32,768 warna.&lt;/li&gt;&lt;li&gt;Warna 16-bit mempunyai 5 bit untuk merah dan biru, dan 6 bit untuk hijau, totalnya ada 2^16=65,536 warna.&lt;/li&gt;&lt;li&gt;Waran 24-bit mempunyai 8 bit untuk merah, hijau dan biru, total ada 2^24=16,777,216 warna.&lt;/li&gt;&lt;li&gt;Warna 32-bit mempunyai warna sama dengan 24 bit, tetapi ditambah dengan extra 8 bit sebagai padding.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Video card saat ini sudah mendukung 8-, 16-, dan 32-bit. Karena disesuikan dengan mata manusia dapat melihat sampai 10 miliar warna, 24-bit ideal digunakan. 16-bit sedikit lebih cepat dari pada 24-bit karena data yang ditransfer juga lebih sedikit, tetapi kualitas warnanya tidak akurat.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Refresh Rate&lt;/span&gt;&lt;br /&gt;Bagaimana monitor bisa menampilkan pixel seperti gambar beneran ?, sebenarnya setiap pixel akan menghilang setelah beberapa milisecond. Untuk tetap menjaga agar bisa tetap ditampilkan, maka monitor akan secara berkelanjutan melakukan refresh pada display biar tidak menghilang. Kecepatan melakukan refresh ini yang disebut sebagai refresh rate. Refresh rate mempunyai satuan Hertz (Hz), yang berarti cycles per second. Refresh rate antara 75Hz dan 85Hz sesuai  untuk mata manusia.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Switching Display ke Mode Full-Screen&lt;/span&gt;&lt;br /&gt;Sekarang kita sudah mengetahui tentang konsep resolusi, kedalaman warna, dan refresh rate, sekarang tinggal masuk koding. Di dalam java kita membutuhkan beberapa object untuk merubah ke mode full-screen, sebagai berikut:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Window object. Window object adalah abstraksi dari apa yang ditampilkan ke layar, anggaplah sebuah kanvas untuk menggambar. Kita akan memanfaatkan JFrame, yang merupakan subclass dari Windows class dan dapat juga digunakan untuk membuat applikasi windowed.&lt;/li&gt;&lt;li&gt;DisplayMode object. DisplayMode object digunakan untuk spesifikasi resolusi, kedalaman bit, dan refresh rate untuk switch display.&lt;/li&gt;&lt;li&gt;GraphicsDisplay object. GraphicsDislay object digunakan untuk merubah display mode dan melihat display properti. Bayangkan saja ini sebagai video card. GraphicsDisplay object diperoleh dari GraphicsEnvironment object.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Berikut adalah contoh untuk melakukan switch ke mode full-screen:&lt;br /&gt;&lt;blockquote&gt;JFrame window = new JFrame();&lt;br /&gt;DisplayMode displayMode = new DisplayMode(800, 600, 16, 75);&lt;br /&gt;&lt;br /&gt;// mendapatkan GraphicsDevice&lt;br /&gt;GraphicsEnvironment environment = GraphicsEnvironment.getLocalGraphicsEnvironment();&lt;br /&gt;GraphicsDevice device = environment.getDefaultScreenDevice();&lt;br /&gt;// menggunakan JFrame untuk full screen window&lt;br /&gt;device.setFullScreenWindow(window);&lt;br /&gt;// mengubah display mode&lt;br /&gt;device.setDisplayMode(displayMode);&lt;br /&gt;&lt;/blockquote&gt;Setelah itu jika ingin mengembalikan pada resolusi semula, set full-screen window dengan nilai null:&lt;br /&gt;&lt;blockquote&gt;device.setFullScreenWindow(null);&lt;/blockquote&gt;Kadang pada sistem tertentu tidak mengijinkan kita untuk mengubah mode display, dan saat kita melakukan pemanggilan pada setDisplayMode() akan menampilakan IllegalArgumentException.&lt;br /&gt;&lt;br /&gt;Oke sekarang kita akan membuat class wrapper untuk memudahkan dalam pembuatan mode full-screen simpan dengan nama SimpleScreenManager.java, listing programmnya sebagai berikut:&lt;br /&gt;&lt;blockquote&gt;import java.awt.*;&lt;br /&gt;import javax.swing.JFrame;&lt;br /&gt;/**&lt;br /&gt;SimpleScreenManager class menangani inisialisasi dan&lt;br /&gt;menampilkan mode full-screen.&lt;br /&gt;*/&lt;br /&gt;public class SimpleScreenManager {&lt;br /&gt;private GraphicsDevice device;&lt;br /&gt;/**&lt;br /&gt;Membuat SimpleScreenManager object.&lt;br /&gt;*/&lt;br /&gt;public SimpleScreenManager() {&lt;br /&gt;GraphicsEnvironment environment =&lt;br /&gt;    GraphicsEnvironment.getLocalGraphicsEnvironment();&lt;br /&gt;device = environment.getDefaultScreenDevice();&lt;br /&gt;}&lt;br /&gt;/**&lt;br /&gt;Memasukkan full screen mode and mengubah display mode.&lt;br /&gt;*/&lt;br /&gt;public void setFullScreen(DisplayMode displayMode,&lt;br /&gt;JFrame window)&lt;br /&gt;{&lt;br /&gt;window.setUndecorated(true); // menghilangkan border&lt;br /&gt;window.setResizable(false);&lt;br /&gt;device.setFullScreenWindow(window);&lt;br /&gt;if (displayMode != null &amp;amp;&amp;amp;&lt;br /&gt;    device.isDisplayChangeSupported())&lt;br /&gt;{&lt;br /&gt;    try {&lt;br /&gt;        device.setDisplayMode(displayMode);&lt;br /&gt;    }&lt;br /&gt;    catch (IllegalArgumentException ex) {&lt;br /&gt;        // illegal mode untuk device&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;/**&lt;br /&gt;Mengembalikan window yang sedang digunakan pada full screen mode.&lt;br /&gt;*/&lt;br /&gt;public Window getFullScreenWindow() {&lt;br /&gt;return device.getFullScreenWindow();&lt;br /&gt;}&lt;br /&gt;/**&lt;br /&gt;Mengembalikan display mode semula.&lt;br /&gt;*/&lt;br /&gt;public void restoreScreen() {&lt;br /&gt;Window window = device.getFullScreenWindow();&lt;br /&gt;if (window != null) {&lt;br /&gt;    window.dispose();&lt;br /&gt;}&lt;br /&gt;device.setFullScreenWindow(null);&lt;br /&gt;}&lt;br /&gt;}&lt;/blockquote&gt;Selanjutnya kita akan membuat kode untuk melakukan test menggunakan SimpleScreenManager, yang menerima parameter berupa ukuran resolusi yang digunakan dan kedalaman bit. Untuk menjalankannya dengan cara sebagai berikut :&lt;br /&gt;&lt;blockquote&gt;java FullScreenTest 1024 768 32   ------&gt; berarti merubah ke fullscreen mode menjadi 1024x768 dengan kedalaman bit 32-bit.&lt;/blockquote&gt;&lt;br /&gt;Perlu diingat jangan menggunakan resolusi yang tidak disupport oleh system, karen program tidak akan jalan. Berikut adalah kode program untuk melakukan test FullScreenTest.java :&lt;br /&gt;&lt;blockquote&gt;import java.awt.*;&lt;br /&gt;import javax.swing.JFrame;&lt;br /&gt;public class FullScreenTest extends JFrame {&lt;br /&gt;public static void main(String[] args) {&lt;br /&gt;DisplayMode displayMode;&lt;br /&gt;if (args.length == 3) {&lt;br /&gt;    displayMode = new DisplayMode(&lt;br /&gt;        Integer.parseInt(args[0]),&lt;br /&gt;        Integer.parseInt(args[1]),&lt;br /&gt;        Integer.parseInt(args[2]),&lt;br /&gt;        DisplayMode.REFRESH_RATE_UNKNOWN);&lt;br /&gt;}&lt;br /&gt;else {&lt;br /&gt;    displayMode = new DisplayMode(800, 600, 16,&lt;br /&gt;        DisplayMode.REFRESH_RATE_UNKNOWN);&lt;br /&gt;}&lt;br /&gt;FullScreenTest test = new FullScreenTest();&lt;br /&gt;test.run(displayMode);&lt;br /&gt;}&lt;br /&gt;private static final long DEMO_TIME = 5000;&lt;br /&gt;public void run(DisplayMode displayMode) {&lt;br /&gt;setBackground(Color.blue);&lt;br /&gt;setForeground(Color.white);&lt;br /&gt;setFont(new Font("Dialog", Font.PLAIN, 24));&lt;br /&gt;SimpleScreenManager screen = new SimpleScreenManager();&lt;br /&gt;try {&lt;br /&gt;    screen.setFullScreen(displayMode, this);&lt;br /&gt;    try {&lt;br /&gt;        Thread.sleep(DEMO_TIME);&lt;br /&gt;    }&lt;br /&gt;    catch (InterruptedException ex) { }&lt;br /&gt;}&lt;br /&gt;finally {&lt;br /&gt;     screen.restoreScreen();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;public void paint(Graphics g) {&lt;br /&gt;g.drawString("Hello World!", 20, 50);&lt;br /&gt;}&lt;br /&gt;}&lt;/blockquote&gt;Berikut adalah hasil screenshot running programnya :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_-cffNDQPfcc/SWa6PuGQxZI/AAAAAAAAAJI/wGB_69cVw4g/s1600-h/snap15.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://3.bp.blogspot.com/_-cffNDQPfcc/SWa6PuGQxZI/AAAAAAAAAJI/wGB_69cVw4g/s320/snap15.png" alt="" id="BLOGGER_PHOTO_ID_5289119591628326290" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Anti Aliasing&lt;/span&gt;&lt;br /&gt;Kita bisa memanfaatkan anti aliasing untuk membuat tulisan "Hello World!" menjadi lebih smooth, karena dengan anti aliasing kita bisa melakukan blending antara text dengan background. Ubah kode menjadi sebagai berikut:&lt;br /&gt;&lt;blockquote&gt;public void paint(Graphics g) {&lt;br /&gt;if (g instanceof Graphics2D) {&lt;br /&gt;Graphics2D g2 = (Graphics2D)g;&lt;br /&gt;g2.setRenderingHint(&lt;br /&gt;    RenderingHints.KEY_TEXT_ANTIALIASING,&lt;br /&gt;    RenderingHints.VALUE_TEXT_ANTIALIAS_ON);&lt;br /&gt;}&lt;br /&gt;g.drawString("Hello World!", 20, 50);&lt;br /&gt;}&lt;/blockquote&gt;Mode Mana yang Sebaiknya digunakan?&lt;br /&gt;Banyak pilihan resolusi yang dapat digunakan, tetapi yang mana yang seharusnya digunakan untuk running game yang kita buat?&lt;br /&gt;Oke, sebaiknya game yang kita develop berjalan minimal pada dua resolusi, sehingga player akan menentukan sendiri resolusi mana yang cocok digunakan.&lt;br /&gt;Jika memungkinkan, inisialisasi game yang kita develop sesuai dengan resolusi monitor yang digunakan, sehingga game display akan ditampilkan dengan bagus. Penggunaan kedalaman warna 16-, 24-, atau 32-bit warna adalah ide yang bagus. 16-bit warna akan berjalan sedikit lebih cepat, tetapi gunakanlah resolusi yang lebih besar jika menginginkan representasi warna yang akurat. Gunakan refresh rate antara 75Hz dan 85Hz karena sesuai dengan mata manusia.&lt;br /&gt;&lt;br /&gt;Reference :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://java.sun.com/"&gt;http://java.sun.com&lt;/a&gt;&lt;/li&gt;&lt;li&gt;David Brackeen, Bret Barker, Laurence Vanhelsuwé, Developing Games in Java, 2003, New Riders Publishing&lt;br /&gt;&lt;/li&gt;&lt;/ul&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/6639474468897837856-3157110760317334283?l=amrurosyada.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/XUMIprkMfGoasaIp3LklFFX_S9k/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XUMIprkMfGoasaIp3LklFFX_S9k/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/XUMIprkMfGoasaIp3LklFFX_S9k/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XUMIprkMfGoasaIp3LklFFX_S9k/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Rosyadacode/~4/EFtLVN2kDMk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://amrurosyada.blogspot.com/feeds/3157110760317334283/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://amrurosyada.blogspot.com/2009/01/java-2d-graphics-dan-animation-part-1.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default/3157110760317334283?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default/3157110760317334283?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Rosyadacode/~3/EFtLVN2kDMk/java-2d-graphics-dan-animation-part-1.html" title="JAVA 2D Graphics dan Animation (Part 1) - Games Engineering" /><author><name>arros</name><uri>http://www.blogger.com/profile/15115335540591605422</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://1.bp.blogspot.com/_-cffNDQPfcc/ST9DFOnnX7I/AAAAAAAAAGY/hhLx1rQqh54/S220/1_998498248l-edit.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_-cffNDQPfcc/SWa7mAagNNI/AAAAAAAAAJQ/Cmql_vpE0PY/s72-c/monitor.gif" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://amrurosyada.blogspot.com/2009/01/java-2d-graphics-dan-animation-part-1.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUUNR3YycSp7ImA9WxVSFEo.&quot;"><id>tag:blogger.com,1999:blog-6639474468897837856.post-6599883794854198972</id><published>2009-01-07T08:25:00.005+07:00</published><updated>2009-01-09T10:54:56.899+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-09T10:54:56.899+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java Tech" /><category scheme="http://www.blogger.com/atom/ns#" term="games engineering" /><title>Java Thread - Games Engineering</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-cffNDQPfcc/SWQN48vP7jI/AAAAAAAAAI4/JB-sodFMqqg/s1600-h/best-games-never-made-6.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 251px;" src="http://1.bp.blogspot.com/_-cffNDQPfcc/SWQN48vP7jI/AAAAAAAAAI4/JB-sodFMqqg/s320/best-games-never-made-6.jpg" alt="" id="BLOGGER_PHOTO_ID_5288367134467943986" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;original image link &lt;a href="http://static.howstuffworks.com/gif/best-games-never-made-6.jpg"&gt;http://static.howstuffworks.com/gif/best-games-never-made-6.jpg&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Games engineering sangatlah menarik untuk dibahas, karena dalam pembuatan games sendiri diperlukan gabungan dari berbagai disiplin ilmu mulai dari aspek sosial sampai aspek eksak. Multithreading sangat diperlukan dalam games engineering, karena dalam sebuah games diperlukan adanya pemrosesan yang berjalan bersama2 misalnya ketika kita membuat games realtime strategi seperti red alert, berapa banyak thread yang dibutuhkan ??, apalagi kalo membuat games seperti football manager (my favourite) dimana setiap club bahkan setiap pemain akan mempunyai perubahan perilaku, skill, usia, mood, technique dll dalam siklus tertentu. Dalam dunia nyata-pun tak dapat dipisahkan, simpelnya saja nih ... ketika kita browsing browser membuka banyak tab dan tiap2 tab mengkses halaman web yang berbeda itu juga merupakan proses multithreading, sedangkan disisi server seperti webserver akan membuat thread jika ada request yang masuk.&lt;br /&gt;Dalam java untuk membuat thread ada 3 cara :&lt;br /&gt;&lt;br /&gt; 1. Menurunkan class Thread (Extends)&lt;br /&gt; 2. Mengimplementasikan interface Runnable&lt;br /&gt; 3. Menggunakan anonymous inner class&lt;br /&gt;&lt;br /&gt;Download &lt;a href="http://ilmukomputer.org/wp-content/uploads/2009/01/amru-thread_games.pdf"&gt;artikel dalam pdf&lt;/a&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Sekarang kita akan bahas satu persatu bagaimana ketiga cara itu digunakan :&lt;br /&gt;ex, dengan menurunkan class thread :&lt;br /&gt;        &lt;br /&gt;&lt;blockquote&gt;public class MyThread extends Thread {      &lt;br /&gt;      public void run() {                  System.out.println("Ini threading lho !!!");     &lt;br /&gt;      }          &lt;br /&gt;}          &lt;br /&gt;Thread mythread = new MyThread();       &lt;br /&gt;mythread.start(); &lt;/blockquote&gt;        &lt;br /&gt;        &lt;br /&gt;ex, dengan mengimplementasikan interface Runnable:&lt;br /&gt;dengan menggunakan cara ini mempunyai keuntungan class yang kita buat masih bisa menurunkan class yang lain, karena java tidak mengijinkan multiple inharitance&lt;br /&gt;&lt;blockquote&gt;public class MyThread extends SomeOthersClass implements Runnable {   &lt;br /&gt;public MyThread() {       &lt;br /&gt;                   &lt;br /&gt;      }          &lt;br /&gt;      public void run() {        &lt;br /&gt;       System.out.println("threading pake implementd Runnable");   &lt;br /&gt;      }          &lt;br /&gt;}          &lt;br /&gt;        &lt;br /&gt;Thread mythread = new Thread(new MyThread);     &lt;br /&gt;mythread.start();&lt;/blockquote&gt;         &lt;br /&gt;        &lt;br /&gt;ex, menggunakan anonymous class:&lt;br /&gt;dengan ini kita tidak perlu untuk menurunkan class Thread dan mengimplementasikan interface Runnable.&lt;br /&gt;        &lt;br /&gt;&lt;blockquote&gt;new Thread() {         &lt;br /&gt;public void run() {        &lt;br /&gt;       System.out.println("menggunakan anonymous class");    &lt;br /&gt;      }          &lt;br /&gt;}.start();&lt;/blockquote&gt;         &lt;br /&gt;        &lt;br /&gt;kerugian menggunakan cara ini adalah membuat code yang kita bikin menjadi sulit untuk dibaca dan dipahami.&lt;br /&gt;gunakan method join agar thread yang kita gunakan masuk keantrian dan mengunggu sampai thread yang lain selesai.&lt;br /&gt;        &lt;br /&gt;   &lt;blockquote&gt;myhtread.join();&lt;/blockquote&gt;                &lt;br /&gt;method ini sangat berguna ketika kita membuat games dan player ingin keluar dari permainan, untuk memastikan bahwa semua thread telah selesai sebelum menjalankan cleanup. Kita juga melakukan sleep untuk thread yang sedang berjalan dengan presisi waktu dalam milidetik.       &lt;br /&gt;   &lt;blockquote&gt;mythread.sleep(1000);&lt;/blockquote&gt;   &lt;br /&gt;        &lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Sinkronisasi&lt;/span&gt;&lt;br /&gt;Misalkan kita mau membuat maze game (games untuk mencari jalan keluar). Thread manapun bisa mengubah posisi pemain/player, dan thread manapun bisa melakukan pemeriksaan apakah ada pemain yang sudah menemukan pintu keluar. Untuk mempermudah mari kita lihat pada ilustrasi berikut, kita asumsikan bahwa jalan keluar/exit berada di x=0, y=0 :&lt;br /&gt;&lt;blockquote&gt;public class Maze {        &lt;br /&gt;private int playerX;       &lt;br /&gt;      private int playerY;        &lt;br /&gt;        &lt;br /&gt;      public boolean isAtExit() {       &lt;br /&gt;       return (playerX==0 &amp;amp;&amp;amp; playerY==0);     &lt;br /&gt;      }          &lt;br /&gt;        &lt;br /&gt;      public void setPosition(int x, int y) {      &lt;br /&gt;       playerX=x;        &lt;br /&gt;              playerY=y;        &lt;br /&gt;      }          &lt;br /&gt;} &lt;/blockquote&gt;        &lt;br /&gt;secara garis besar code diatas tidak akan bermasalah, tapi bagai mana jika terjadi preemtive (banyak thread yang mengakses dan mana yang didahulukan untuk dapat mengubah resource). Misalkan kita ambil sekenario sebagai berikut, pamain berpindah tempat dari (1,0) ke (0,1):&lt;br /&gt;1.Dimulai dari posisi (1,0), variabel playerX=1 dan playerY=0&lt;br /&gt;2.Thread A memanggil setPosition(0,1)&lt;br /&gt;3.Ketika line playerX=x dieksekusi maka playerX bernilai 0&lt;br /&gt;4.Tiba-tiba Thread B melakukan pengecekan pada isAtExit() sebelum A sempat mengubah nilai playerY maka B akan mendapatkan kembalian bernilai true, karena playerX dan playerY sedang dalam keadaan yang sama yaitu bernilai 0.&lt;br /&gt;&lt;br /&gt;sekarang kita akan melakukan sinkronisasi untuk mencegah terjadinya hal diatas. Kodenya akan berubah menjadi sebagai berikut :&lt;br /&gt;        &lt;br /&gt;&lt;blockquote&gt;public class Maze {        &lt;br /&gt;private int playerX;       &lt;br /&gt;      private int playerY;        &lt;br /&gt;      public synchronized boolean isAtExit() {      &lt;br /&gt;       return (playerX == 0 &amp;amp;&amp;amp; playerY == 0);     &lt;br /&gt;      }          &lt;br /&gt;      public synchronized void setPosition(int x, int y) {     &lt;br /&gt;       playerX = x;        &lt;br /&gt;              playerY = y;        &lt;br /&gt;      }          &lt;br /&gt;} &lt;/blockquote&gt;                   &lt;br /&gt;ketika JVM mengeksekusi method yang beratribut sinchronized, maka akan terjadi ackquire lock pada method tersebut dan hanya akan mengijinkan untuk dieksekusi oleh satu object pada suatu waktu.&lt;br /&gt;Jadi jika suatu sinchronized method belum selesai dieksekusi maka method sinchronized lain tidak akan bisa dieksekusi.&lt;br /&gt;        &lt;br /&gt;&lt;blockquote&gt;public synchronized void setPosition(int x, int y) {     &lt;br /&gt;playerX = x;        &lt;br /&gt;      playerY = y;         &lt;br /&gt;}&lt;/blockquote&gt;          &lt;br /&gt;        &lt;br /&gt;code diatas bisa juga ditulis dalam bentuk berikut:&lt;br /&gt;&lt;blockquote&gt;public void setPosition(int x, int y) {       &lt;br /&gt;synchronized(this) {       &lt;br /&gt;       playerX = x;        &lt;br /&gt;              playerY = y;        &lt;br /&gt;      }          &lt;br /&gt;} &lt;/blockquote&gt;         &lt;br /&gt;        &lt;br /&gt;pada code mempunyai jumlah bytecode yang lebih banyak. Sinkronisasi object seperti kode kedua diatas berguna jika kita mengijinkan lebih dari satu lock, dan tidak membutuhkan untuk sinkronisasi untuk methodnya.&lt;br /&gt;&lt;br /&gt;Lock bisa dilakukan pada object apapun kecuali pada tipe primitive, berikut adalah contoh bagaimana lock dilakukan pada object :&lt;br /&gt;        &lt;br /&gt;&lt;blockquote&gt;Object myLock = new Object();       &lt;br /&gt;...         &lt;br /&gt;synchronized (myLock) {        &lt;br /&gt;...         &lt;br /&gt;} &lt;/blockquote&gt;         &lt;br /&gt;        &lt;br /&gt;Saat bagaimanakah diperlukan sinkronisasi ?&lt;br /&gt;Jawabannya adalah setiap waktu ketika ada dua atau lebih thread melakukan akses pada suatu object/field.&lt;br /&gt;&lt;br /&gt;Hal yang perlu diingat jangan pernah melakukan oversinkronisasi (melakukan sinkronisasi pada object/method/field yang telah disinkronisasi). Sebagai contoh jangan lakukan sinkronisasi pada sebuah method jika hanya field tertentu saja yang akan disinkronisasi dalam method tersebut. Sebagai contoh method berikut, lakukan sinkronisasi pada block yang diperlukan saja.&lt;br /&gt;        &lt;br /&gt;&lt;blockquote&gt;public void myMethod() {           &lt;br /&gt;synchronized(this) {       &lt;br /&gt; // code that needs to be synchronized     &lt;br /&gt;}         &lt;br /&gt;    // code that is already thread-safe     &lt;br /&gt;} &lt;/blockquote&gt;         &lt;br /&gt;        &lt;br /&gt;jangan lakukan sinkronisasi pada method yang hanya menggunakan local variable, karena local variable akan ditaruh di stack, sedangkan thread punya stack untuk tiap2 thread, jadi tidak perlu untuk dilakukan sinkronisasi. Berikut adalah contoh method yang tidak perlu dilakukan sinkronisasi karena hanya menggunakan variable local.&lt;br /&gt;        &lt;br /&gt;&lt;blockquote&gt;public int square(int n) {        &lt;br /&gt;int s = n * n;        &lt;br /&gt;   return s;         &lt;br /&gt;} &lt;/blockquote&gt;         &lt;br /&gt;        &lt;br /&gt;jika kita tidak yakin thread mana yang sedang mengakses kode kita, kita bisa mendapatkan nama dari thread tersebut dengan :&lt;br /&gt;&lt;blockquote&gt;   Thread.currentThread().getName();     &lt;/blockquote&gt;&lt;br /&gt;Perlu diwaspadai juga adanya deadlock, deadlock adalah adanya thread yang tidak bisa melanjutkan proses karena thread saling menunggu thread lain sampai melepaskan resource. Misalkan pada contoh berikut :&lt;br /&gt;1. Thread A acquire lock 1.&lt;br /&gt;2. Thread B acquire lock 2.&lt;br /&gt;3. Thread B menunggu sampai lock 1 dilepaskan.&lt;br /&gt;4. Thread A menunggu sampai lock 2 dilepaskan.&lt;br /&gt;&lt;br /&gt;Dapat kita lihat dari process diatas kedua thread saling menunggu samapai suatu waktu yang tidak bisa ditentukan. Kita bisa mengatasinya dengan cara melakukan sinkronisasi yang tepat sesuai dengan urutannya.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Menggunakan wait() dan notify() &lt;/span&gt;&lt;br /&gt;Misalkan kita ambil sekenario sebagai berikut, ada dua thread yang akan saling berkomunikasi satu sama lain, sebagai contoh ada thread A menunggu sampai thread B mengirimkan pesan :&lt;br /&gt;        &lt;br /&gt;&lt;blockquote&gt;// Thread A         &lt;br /&gt;public void waitForMessage() {       &lt;br /&gt;while (hasMessage == false) {      &lt;br /&gt;       Thread.sleep(100);       &lt;br /&gt;   }         &lt;br /&gt;}          &lt;br /&gt;// Thread B         &lt;br /&gt;public void setMessage(String message) {      &lt;br /&gt;   ...         &lt;br /&gt;   hasMessage = true;       &lt;br /&gt;}   &lt;/blockquote&gt;       &lt;br /&gt;        &lt;br /&gt;kode diatas bukan suatu contoh yang baik, karena thread A melakukan pengecekan setiap 100 milisecond atau 10 kali dalam satu detik. Thread A dapat oversleep dan terlambat dalam mendapatkan pesan.&lt;br /&gt;Alangkah lebih baik jika A idle sampai ada notifikasi dari B bahwa pesan sudah bisa dikonsumsi, dan ini bisa dilakukan dengan pasangan method wait() dan notify().&lt;br /&gt;&lt;br /&gt;Method wait() digunakan didalam blok synchronized. Ketika method wait() dieksekusi, lock akan dilepaskan dan menunggu sampai ada notifikasi.&lt;br /&gt;Method notify() juga digunakan didalam block synchronized. Method notify akan memberikan notifikasi pada thread yang menunggu pada lock yang sama. Jika ada banyak thread yang menunggu maka hanya akan ada satu notifikasi dan akan dipilih satu thread secara acak. Berikut adalah kode yang telah diperbaiki :&lt;br /&gt;        &lt;br /&gt;&lt;blockquote&gt;// Thread A         &lt;br /&gt;public synchronized void waitForMessage() {      &lt;br /&gt;   try {         &lt;br /&gt;       wait();         &lt;br /&gt;   }         &lt;br /&gt;   catch (InterruptedException ex) { }      &lt;br /&gt;}         &lt;br /&gt;// Thread B        &lt;br /&gt;public synchronized void setMessage(String message) {     &lt;br /&gt;   ...         &lt;br /&gt;   notify();         &lt;br /&gt;}  &lt;/blockquote&gt;&lt;br /&gt;jika kita ingin memberika notifikasi untuk semua thread yang sendang menunggu kita bisa menggunakan notifyAll(), method wait() juga menerima parameter dalam milisecond sebagai waktu tunggu, misalnya kita ingin memberikan timeout sampai 100milisecond maka kita bisa menggunakan wait(100).&lt;br /&gt;Method wait(), notify(), dan notifyAll() merupakan method dari class object, sehingga semua java object mempunyai method2 tersebut.&lt;br /&gt;&lt;br /&gt;Kapan kita seharusnya menggunakan thread ?&lt;br /&gt;Jadi begini dari pendekatan games, ketika games play loading untuk kenyamanan pengguna sebaiknya ketika loading dibuatkan thread sendiri sehingga player tidak menyangka bahwa gamesnya sedang ngehang. Kalo dari pendekatan lain sebenarnya juga untuk kenyamanan dan optimasi, nyaman untuk pengguna karena pengguna merasa menggunakan program yang cepet loadingnya (tricky), optimal karena bisa memanfaatkan resource CPU yang belum termanfaatkan.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Sum it up &lt;/span&gt;&lt;br /&gt;Oke dengan informasi thread yang telah dibahas sebelumnya, mari kita buat sesuatu yang berguna yaitu thread pool. Thread pool merupakan sebuah group dari thread yang didesain untuk mengeksekursi tugas yang bermacam-macam. Pada thread pool kita bisa memilih jumlah dari thread didalam pool dan menjalankan task yang didefinisikan sebagai Runnable. Berikut adalah contoh menggunakan ThreadPool dengan membuat 8 thread dalam pool, menjalankan task sederhana dan kemudian menunggu samapai task selesai dijalankan.&lt;br /&gt;        &lt;br /&gt;&lt;blockquote&gt;ThreadPool myThreadPool = new ThreadPool(8); myThreadPool.runTask(new Runnable() { &lt;br /&gt;   public void run() {       &lt;br /&gt;       System.out.println("Do something cool here.");    &lt;br /&gt;   }         &lt;br /&gt;});          &lt;br /&gt;myThreadPool.join(); &lt;/blockquote&gt;       &lt;br /&gt;        &lt;br /&gt;Method runTask() akan dijalankan. Jika semua thread di dalam pool sedang sibuk menproses task, ketika memanggil runTask() akan memasukkan task kedalam antrian sampai ada thread yang mengeksekusinya. Berikut adalah kode ThreadPool.java :&lt;br /&gt;        &lt;br /&gt;&lt;blockquote&gt;import java.util.LinkedList;        &lt;br /&gt;/**          &lt;br /&gt;A thread pool is a group of a limited number of threads that are used to execute tasks. &lt;br /&gt;*/          &lt;br /&gt;        &lt;br /&gt;public class ThreadPool extends ThreadGroup {     &lt;br /&gt;   private boolean isAlive;       &lt;br /&gt;   private LinkedList taskQueue;      &lt;br /&gt;   private int threadID;       &lt;br /&gt;   private static int threadPoolID;      &lt;br /&gt;           &lt;br /&gt;/**         &lt;br /&gt;       Creates a new ThreadPool.       &lt;br /&gt;       @param numThreads The number of threads in the pool.   &lt;br /&gt;   */         &lt;br /&gt;           &lt;br /&gt;public ThreadPool(int numThreads) {     &lt;br /&gt;        super("ThreadPool-" + (threadPoolID++));    &lt;br /&gt;        setDaemon(true);       &lt;br /&gt;        isAlive = true;       &lt;br /&gt;        taskQueue = new LinkedList();     &lt;br /&gt;        for (int i=0; i&lt;numthreads; requests="" a="" new="" to="" method="" returns="" and="" task="" executes="" on="" the="" next="" available="" idle="" thread="" in="" this=""&gt;&lt;p&gt;Tasks start execution in the order they are received.    &lt;br /&gt;       @param task The task to run. If null, no action is taken.    &lt;br /&gt;       @throws IllegalStateException if this ThreadPool is already closed.  &lt;br /&gt;   */         &lt;br /&gt;           &lt;br /&gt;public synchronized void runTask(Runnable task) {    &lt;br /&gt;        if (!isAlive) {       &lt;br /&gt;             throw new IllegalStateException();    &lt;br /&gt;        }        &lt;br /&gt;        if (task != null) {       &lt;br /&gt;             taskQueue.add(task);     &lt;br /&gt;             notify();       &lt;br /&gt;        }        &lt;br /&gt;   }         &lt;br /&gt;           &lt;br /&gt;protected synchronized Runnable getTask() throws InterruptedException  &lt;br /&gt;   {         &lt;br /&gt;        while (taskQueue.size() == 0) {     &lt;br /&gt;             if (!isAlive) {      &lt;br /&gt;                 return null;     &lt;br /&gt;             }       &lt;br /&gt;             wait();       &lt;br /&gt;        }        &lt;br /&gt;        return (Runnable)taskQueue.removeFirst();    &lt;br /&gt;   }         &lt;br /&gt;           &lt;br /&gt;/**         &lt;br /&gt;       Closes this ThreadPool and returns immediately.    &lt;br /&gt;All threads are stopped, and any waiting tasks are not executed.   &lt;br /&gt;Once a ThreadPool is closed, no more tasks can be run on this ThreadPool.  &lt;br /&gt;   */         &lt;br /&gt;           &lt;br /&gt;public synchronized void close() {      &lt;br /&gt;        if (isAlive) {       &lt;br /&gt;             isAlive = false;      &lt;br /&gt;             taskQueue.clear();      &lt;br /&gt;             interrupt();      &lt;br /&gt;        }        &lt;br /&gt;   }         &lt;br /&gt;           &lt;br /&gt;/**         &lt;br /&gt;       Closes this ThreadPool and waits for all running threads to finish.   &lt;br /&gt;Any waiting tasks are executed.      &lt;br /&gt;   */         &lt;br /&gt;           &lt;br /&gt;public void join() {       &lt;br /&gt;        // notify all waiting threads that this ThreadPool is no   &lt;br /&gt;        // longer alive       &lt;br /&gt;        synchronized (this) {      &lt;br /&gt;             isAlive = false;      &lt;br /&gt;             notifyAll();      &lt;br /&gt;        }        &lt;br /&gt;               &lt;br /&gt; // wait for all threads to finish     &lt;br /&gt;        Thread[] threads = new Thread[activeCount()];   &lt;br /&gt;        int count = enumerate(threads);     &lt;br /&gt;        for (int i=0; i&lt;count; is="" in="" threadpool="" designed="" tasks="" private="" class="" pooledthread="" extends="" public="" void="" while="" get="" a="" to="" runnable="" interruptedexception="" returned="" null="" or="" was="" close="" this="" thread="" by="" if="" task="" run="" the="" and="" eat="" any="" exceptions="" it="" throws="" try="" catch="" throwable=""&gt;&lt;/count;&gt;&lt;/p&gt;&lt;/numthreads;&gt;&lt;/blockquote&gt;         &lt;br /&gt;        &lt;br /&gt;Sekarang kita akan mencoba untuk melakukan test pada ThreadPool class, berikut adalah kode untuk melakukan test yaitu ThreadPoolTest class.&lt;br /&gt;Berikut adalah cara untuku menjalankan ThreadPoolTest :&lt;br /&gt;java ThreadPoolTest 8 4&lt;br /&gt;&lt;br /&gt;8 merupakan jumlah task yang akan dijalankan, 4 adalah jumlah thread yang akan dijalankan. Berikut kode ThreadPoolTest.java :&lt;br /&gt;        &lt;br /&gt;&lt;blockquote&gt;public class ThreadPoolTest {       &lt;br /&gt;public static void main(String[] args) {     &lt;br /&gt; if (args.length != 2) {      &lt;br /&gt;             System.out.println("Tests the ThreadPool task.");  &lt;br /&gt;             System.out.println(     &lt;br /&gt;                "Usage: java ThreadPoolTest numTasks numThreads");  &lt;br /&gt;             System.out.println(     &lt;br /&gt;                "  numTasks - integer: number of task to run.");  &lt;br /&gt;             System.out.println(     &lt;br /&gt;                "  numThreads - integer: number of threads " +   &lt;br /&gt;                "in the thread pool.");     &lt;br /&gt;             return;       &lt;br /&gt;        }        &lt;br /&gt;        int numTasks = Integer.parseInt(args[0]);    &lt;br /&gt;        int numThreads = Integer.parseInt(args[1]);    &lt;br /&gt;        // create the thread pool      &lt;br /&gt;        ThreadPool threadPool = new ThreadPool(numThreads);  &lt;br /&gt;        // run example tasks      &lt;br /&gt;        for (int i=0; i&lt;numtasks; close="" pool="" and="" wait="" for="" all="" tasks="" to="" creates="" simple="" that="" an="" waits="" 500="" then="" prints="" the="" id="" private="" static="" runnable="" final="" int="" return="" new="" public="" void="" start="" simulate="" a="" running="" try="" catch="" interruptedexception="" task="" taskid="" end=""&gt;&lt;/numtasks;&gt;&lt;/blockquote&gt;      &lt;br /&gt;&lt;br /&gt;oke all thing are finished.&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/6639474468897837856-6599883794854198972?l=amrurosyada.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/oU5fpa3--OjYmbpxReY0nwkzmUQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/oU5fpa3--OjYmbpxReY0nwkzmUQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/oU5fpa3--OjYmbpxReY0nwkzmUQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/oU5fpa3--OjYmbpxReY0nwkzmUQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Rosyadacode/~4/Vd4yeL-5k48" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://amrurosyada.blogspot.com/feeds/6599883794854198972/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://amrurosyada.blogspot.com/2009/01/java-thread-games-engineering.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default/6599883794854198972?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default/6599883794854198972?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Rosyadacode/~3/Vd4yeL-5k48/java-thread-games-engineering.html" title="Java Thread - Games Engineering" /><author><name>arros</name><uri>http://www.blogger.com/profile/15115335540591605422</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://1.bp.blogspot.com/_-cffNDQPfcc/ST9DFOnnX7I/AAAAAAAAAGY/hhLx1rQqh54/S220/1_998498248l-edit.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_-cffNDQPfcc/SWQN48vP7jI/AAAAAAAAAI4/JB-sodFMqqg/s72-c/best-games-never-made-6.jpg" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://amrurosyada.blogspot.com/2009/01/java-thread-games-engineering.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUUBQX87cCp7ImA9WxVSFEo.&quot;"><id>tag:blogger.com,1999:blog-6639474468897837856.post-1688254128854457479</id><published>2008-12-30T07:23:00.004+07:00</published><updated>2009-01-09T10:54:10.108+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-09T10:54:10.108+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java Tech" /><title>Java Regular Expressions</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-cffNDQPfcc/SVltW-vuioI/AAAAAAAAAIw/gsubNLPgUPY/s1600-h/fts-regex-front.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 190px;" src="http://1.bp.blogspot.com/_-cffNDQPfcc/SVltW-vuioI/AAAAAAAAAIw/gsubNLPgUPY/s320/fts-regex-front.jpg" alt="" id="BLOGGER_PHOTO_ID_5285375879263718018" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Huehuehue ... kalo denger regex(regular expression) jadi inget sama matakuliah teori bahasa dan automata yang bahas2 regular expression dan berkutat pada NDFA, DFA, NFA, PDA, !@#^$#*&amp;amp;^!*&amp;amp;@%*@^# gak ngertilah pokoknya cukup bikin kita pusing, yah lupain dulu deh masalah kuliah ... now lets focus to java regex. Regular expression tak lain adalah cara untuk mendeskripsikan suatu set string berdasarkan karakteristik tertentu. Regex dapat dimanfaatkan untuk melakukan search, edit atau manipulasi text/data. Regex di java hampir mirip dengan regex di perl tidak hanya java/perl hampir semua bahasa mempunyai regex untuk pengolahan text/data. Jadi apapun bahasanya minumnya tetep teh botol sossro.&lt;br /&gt;&lt;span class="fullpost"&gt;Java regex sebenarnya cuman berkutat pada package java.util.regex yang mempunyai tiga class yaitu Pattern, Matcher dan PatternSintaxException. Object Pattern mempunyai dua method utama untuk melakukan manipulsi text/data yaitu compile dan matcher, compile digunakan untuk menerima masukan pattern dari regex sedangkan matcher digunakan untuk menerima masukan berupa string yang akan dicocokkan berdasarkan karakteristik regex yang dimasukkan pada method compile.&lt;br /&gt;&lt;br /&gt;contoh penggunaan Class Pattern pada java, kode berikut akan digunakan untuk percobaan-percobaan regex pada tulisan ini :&lt;br /&gt;&lt;blockquote&gt;/*&lt;br /&gt;* Copyright (c) 1995 - 2008 Sun Microsystems, Inc.  All rights reserved.&lt;br /&gt;*&lt;br /&gt;* Redistribution and use in source and binary forms, with or without&lt;br /&gt;* modification, are permitted provided that the following conditions&lt;br /&gt;* are met:&lt;br /&gt;*&lt;br /&gt;*   - Redistributions of source code must retain the above copyright&lt;br /&gt;*     notice, this list of conditions and the following disclaimer.&lt;br /&gt;*&lt;br /&gt;*   - Redistributions in binary form must reproduce the above copyright&lt;br /&gt;*     notice, this list of conditions and the following disclaimer in the&lt;br /&gt;*     documentation and/or other materials provided with the distribution.&lt;br /&gt;*&lt;br /&gt;*   - Neither the name of Sun Microsystems nor the names of its&lt;br /&gt;*     contributors may be used to endorse or promote products derived&lt;br /&gt;*     from this software without specific prior written permission.&lt;br /&gt;*&lt;br /&gt;* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS&lt;br /&gt;* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,&lt;br /&gt;* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR&lt;br /&gt;* PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR&lt;br /&gt;* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,&lt;br /&gt;* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,&lt;br /&gt;* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR&lt;br /&gt;* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF&lt;br /&gt;* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING&lt;br /&gt;* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS&lt;br /&gt;* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;import java.io.Console;&lt;br /&gt;import java.util.regex.Pattern;&lt;br /&gt;import java.util.regex.Matcher;&lt;br /&gt;&lt;br /&gt;public class RegexTestHarness {&lt;br /&gt;&lt;br /&gt;   public static void main(String[] args){&lt;br /&gt;       Console console = System.console();&lt;br /&gt;       if (console == null) {&lt;br /&gt;           System.err.println("No console.");&lt;br /&gt;           System.exit(1);&lt;br /&gt;       }&lt;br /&gt;       while (true) {&lt;br /&gt;&lt;br /&gt;           Pattern pattern =&lt;br /&gt;           Pattern.compile(console.readLine("%nEnter your regex: "));&lt;br /&gt;&lt;br /&gt;           Matcher matcher =&lt;br /&gt;           pattern.matcher(console.readLine("Enter input string to search: "));&lt;br /&gt;&lt;br /&gt;           boolean found = false;&lt;br /&gt;           while (matcher.find()) {&lt;br /&gt;               console.format("I found the text \"%s\" starting at " +&lt;br /&gt;                  "index %d and ending at index %d.%n",&lt;br /&gt;                   matcher.group(), matcher.start(), matcher.end());&lt;br /&gt;               found = true;&lt;br /&gt;           }&lt;br /&gt;           if(!found){&lt;br /&gt;               console.format("No match found.%n");&lt;br /&gt;           }&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Setelah compile dan jalankan program untuk melakukan test regex pada posting ini.&lt;br /&gt;&lt;blockquote&gt;amru@bl4ckcub3:~/MyJava/learn/regex$ javac RegexTestHarness.java&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;jalankan program&lt;br /&gt;&lt;blockquote&gt;amru@bl4ckcub3:~/MyJava/learn/regex$ java RegexTestHarness&lt;br /&gt;&lt;br /&gt;Enter your regex:&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;jika program dijalankan akan muncul promt yang meminta kita untuk memasukkan regex. Contoh sederhana dalam menggunakan program adalah untuk mencari kata dalam sebuah kalimat sebagai berikut :&lt;br /&gt;&lt;blockquote&gt;Enter your regex: foo&lt;br /&gt;Enter input string to search: foo bukanlah bar&lt;br /&gt;I found the text "foo" starting at index 0 and ending at index 3.&lt;br /&gt;&lt;br /&gt;Enter your regex:&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Dari spesifikasi class Pattern dapat rangkum dalam tabel berikut regular expression yang digunakan pada java.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Character Classes&lt;br /&gt;[abc]  a, b, atau c (simple class)&lt;br /&gt;[^abc]  Semua karakter a, b, atau c (negation)&lt;br /&gt;[a-zA-Z]  a sampai z, atau A sampai Z, inclusive (range)&lt;br /&gt;[a-d[m-p]]  a sampai d, atau m sampai p: [a-dm-p] (union)&lt;br /&gt;[a-z&amp;amp;&amp;amp;[def]]  d, e, atau f (intersection)&lt;br /&gt;[a-z&amp;amp;&amp;amp;[^bc]]  a sampai z, kecuali untuk b dan c: [ad-z] (subtraction)&lt;br /&gt;[a-z&amp;amp;&amp;amp;[^m-p]]  a sampai z, dan tidak m sampai p: [a-lq-z] (subtraction)&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Berikut adalah penjelasan dari table diatas pada applikasinya :&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Simple class&lt;/span&gt; digunakan untuk melakukan pencocokan satu persatu dari karakter yang ada didalam tandakurung, misal [bcr]at, maka regex tersebut akan cocok dengan pattern berikut "bat", "cat" dan "rat". Dapat dilihat bahwa regex tersebut akan menerima semua urutan karakter dengan awalan karakter "b","c" dan "r" serta diakhiri dengan pattern "at".&lt;br /&gt;ex :&lt;br /&gt;&lt;blockquote&gt;amru@bl4ckcub3:~/MyJava/learn/regex$ java RegexTestHarness&lt;br /&gt;&lt;br /&gt;Enter your regex: [bcr]at&lt;br /&gt;Enter input string to search: bat&lt;br /&gt;I found the text "bat" starting at index 0 and ending at index 3.&lt;br /&gt;&lt;br /&gt;Enter your regex: [bcr]at&lt;br /&gt;Enter input string to search: cat&lt;br /&gt;I found the text "cat" starting at index 0 and ending at index 3.&lt;br /&gt;&lt;br /&gt;Enter your regex: [bcr]at&lt;br /&gt;Enter input string to search: rat&lt;br /&gt;I found the text "rat" starting at index 0 and ending at index 3.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Negation&lt;/span&gt;&lt;br /&gt;Digunakan untuk mencocokkan semua karakter kecuali yang ada didalam tandakurung ditandai dengan "^", misal [^bcr]at akan mencari pattern untuk semua karakter kecuali yang diawali dengan karakter "b", "c" dan "r".&lt;br /&gt;ex :&lt;br /&gt;&lt;blockquote&gt;amru@bl4ckcub3:~/MyJava/learn/regex$ java RegexTestHarness&lt;br /&gt;&lt;br /&gt;Enter your regex: [^bcr]at&lt;br /&gt;Enter input string to search: bat&lt;br /&gt;No match found.&lt;br /&gt;&lt;br /&gt;Enter your regex: [^bcr]at&lt;br /&gt;Enter input string to search: cat&lt;br /&gt;No match found.&lt;br /&gt;&lt;br /&gt;Enter your regex: [^bcr]at&lt;br /&gt;Enter input string to search: rat&lt;br /&gt;No match found.&lt;br /&gt;&lt;br /&gt;Enter your regex: [^bcr]at&lt;br /&gt;Enter input string to search: hat&lt;br /&gt;I found the text "hat" starting at index 0 and ending at index 3.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ranges&lt;/span&gt;&lt;br /&gt;Untuk menampilkan range pada suatu pattern tertentu ditandai dengan "-". Misal untuk mengenali pattern "a" sampai "c" maka bisa kita gunakan expresi sebagai berikut [a-b].&lt;br /&gt;ex :&lt;br /&gt;&lt;blockquote&gt;amru@bl4ckcub3:~/MyJava/learn/regex$ java RegexTestHarness&lt;br /&gt;&lt;br /&gt;Enter your regex: [a-c]&lt;br /&gt;Enter input string to search: a&lt;br /&gt;I found the text "a" starting at index 0 and ending at index 1.&lt;br /&gt;&lt;br /&gt;Enter your regex: [a-c]&lt;br /&gt;Enter input string to search: b&lt;br /&gt;I found the text "b" starting at index 0 and ending at index 1.&lt;br /&gt;&lt;br /&gt;Enter your regex: [a-c]&lt;br /&gt;Enter input string to search: c&lt;br /&gt;I found the text "c" starting at index 0 and ending at index 1.&lt;br /&gt;&lt;br /&gt;Enter your regex: [a-c]&lt;br /&gt;Enter input string to search: d&lt;br /&gt;No match found.&lt;br /&gt;&lt;br /&gt;Enter your regex: foo[1-5]&lt;br /&gt;Enter input string to search: foo1&lt;br /&gt;I found the text "foo1" starting at index 0 and ending at index 4.&lt;br /&gt;&lt;br /&gt;Enter your regex: foo[1-5]&lt;br /&gt;Enter input string to search: foo5&lt;br /&gt;I found the text "foo5" starting at index 0 and ending at index 4.&lt;br /&gt;&lt;br /&gt;Enter your regex: foo[1-5]&lt;br /&gt;Enter input string to search: foo6&lt;br /&gt;No match found.&lt;br /&gt;&lt;br /&gt;Enter your regex: foo[^1-5]&lt;br /&gt;Enter input string to search: foo1&lt;br /&gt;No match found.&lt;br /&gt;&lt;br /&gt;Enter your regex: foo[^1-5]&lt;br /&gt;Enter input string to search: foo6&lt;br /&gt;I found the text "foo6" starting at index 0 and ending at index 4.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Union&lt;/span&gt;&lt;br /&gt;Misalnya kita akan melakukan pengenalan pattern gabungan antara 0 sampai 4 dan 6 sampai 8 bisa kita lakukan dengan cara [0-4[6-8]], maka selain dari union/gabungan range antara 0 sampai 4 dan 6 sampai 8 tidak akan dikenali.&lt;br /&gt;Ex:&lt;br /&gt;&lt;blockquote&gt;amru@bl4ckcub3:~/MyJava/learn/regex$ java RegexTestHarness&lt;br /&gt;&lt;br /&gt;Enter your regex: [0-4[6-8]]&lt;br /&gt;Enter input string to search: 0&lt;br /&gt;I found the text "0" starting at index 0 and ending at index 1.&lt;br /&gt;&lt;br /&gt;Enter your regex: [0-4[6-8]]&lt;br /&gt;Enter input string to search: 5&lt;br /&gt;No match found.&lt;br /&gt;&lt;br /&gt;Enter your regex: [0-4[6-8]]&lt;br /&gt;Enter input string to search: 6&lt;br /&gt;I found the text "6" starting at index 0 and ending at index 1.&lt;br /&gt;&lt;br /&gt;Enter your regex: [0-4[6-8]]&lt;br /&gt;Enter input string to search: 8&lt;br /&gt;I found the text "8" starting at index 0 and ending at index 1.&lt;br /&gt;&lt;br /&gt;Enter your regex: [0-4[6-8]]&lt;br /&gt;Enter input string to search: 9&lt;br /&gt;No match found.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Intersection&lt;/span&gt;&lt;br /&gt;Digunakan untuk melakukan pengenalan pattern yang berupa irisan atau ingin mengenali suatu pattern pada range tertentu, bisa menggunakan key &amp;amp;&amp;amp;. Misal ingin mengenali pattern 3, 4 dan 5 pada range 0 sampai 9 maka bisa kita kontruksi regex sebagai berikut [0-9&amp;amp;&amp;amp;[345]]&lt;br /&gt;Ex :&lt;br /&gt;&lt;blockquote&gt;amru@bl4ckcub3:~/MyJava/learn/regex$ java RegexTestHarness&lt;br /&gt;&lt;br /&gt;Enter your regex: [0-9&amp;amp;&amp;amp;[345]]&lt;br /&gt;Enter input string to search: 3&lt;br /&gt;I found the text "3" starting at index 0 and ending at index 1.&lt;br /&gt;&lt;br /&gt;Enter your regex: [0-9&amp;amp;&amp;amp;[345]]&lt;br /&gt;Enter input string to search: 4&lt;br /&gt;I found the text "4" starting at index 0 and ending at index 1.&lt;br /&gt;&lt;br /&gt;Enter your regex: [0-9&amp;amp;&amp;amp;[345]]&lt;br /&gt;Enter input string to search: 5&lt;br /&gt;I found the text "5" starting at index 0 and ending at index 1.&lt;br /&gt;&lt;br /&gt;Enter your regex: [0-9&amp;amp;&amp;amp;[345]]&lt;br /&gt;Enter input string to search: 2&lt;br /&gt;No match found.&lt;br /&gt;&lt;br /&gt;Enter your regex: [0-9&amp;amp;&amp;amp;[345]]&lt;br /&gt;Enter input string to search: 6&lt;br /&gt;No match found.&lt;br /&gt;&lt;br /&gt;Enter your regex: [2-8&amp;amp;&amp;amp;[4-6]]&lt;br /&gt;Enter input string to search: 3&lt;br /&gt;No match found.&lt;br /&gt;&lt;br /&gt;Enter your regex: [2-8&amp;amp;&amp;amp;[4-6]]&lt;br /&gt;Enter input string to search: 4&lt;br /&gt;I found the text "4" starting at index 0 and ending at index 1.&lt;br /&gt;&lt;br /&gt;Enter your regex: [2-8&amp;amp;&amp;amp;[4-6]]&lt;br /&gt;Enter input string to search: 5&lt;br /&gt;I found the text "5" starting at index 0 and ending at index 1.&lt;br /&gt;&lt;br /&gt;Enter your regex: [2-8&amp;amp;&amp;amp;[4-6]]&lt;br /&gt;Enter input string to search: 6&lt;br /&gt;I found the text "6" starting at index 0 and ending at index 1.&lt;br /&gt;&lt;br /&gt;Enter your regex: [2-8&amp;amp;&amp;amp;[4-6]]&lt;br /&gt;Enter input string to search: 7&lt;br /&gt;No match found.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Substraction&lt;/span&gt;&lt;br /&gt;Digunakan untuk melakukan pengenalan pada negasi yang berada pada karakter yang bersarang, misal [0-9&amp;amp;&amp;amp;[^345]] berarti melakukan pencarian pada range 0 sampai 9 kecuali 3, 4 dan 5.&lt;br /&gt;&lt;br /&gt;Oke lanjut, setelah kita melakukan percobaan pada class2 karakter ada baiknya jika kita kenali juga predifined charakter class, class Pattern telah mendefinisikan pattern2 diatas sehingga kita bisa memanfaatkannya sebagai shorthands.&lt;br /&gt;&lt;blockquote&gt;Predefined Character Classes&lt;br /&gt;.  cocok dengan karakter apapun (may or may not match line terminators)&lt;br /&gt;\d  digit: [0-9]&lt;br /&gt;\D  non digit: [^0-9]&lt;br /&gt;\s  karakter whitespace: [ \t\n\x0B\f\r]&lt;br /&gt;\S  karakter non-whitespace: [^\s]&lt;br /&gt;\w  karakter kata: [a-zA-Z_0-9]&lt;br /&gt;\W  karakter non-word: [^\w]&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;ex:&lt;br /&gt;&lt;blockquote&gt;amru@bl4ckcub3:~/MyJava/learn/regex$ java RegexTestHarness&lt;br /&gt;&lt;br /&gt;Enter your regex: .&lt;br /&gt;Enter input string to search: @&lt;br /&gt;I found the text "@" starting at index 0 and ending at index 1.&lt;br /&gt;&lt;br /&gt;Enter your regex: .&lt;br /&gt;Enter input string to search: 1&lt;br /&gt;I found the text "1" starting at index 0 and ending at index 1.&lt;br /&gt;&lt;br /&gt;Enter your regex: .&lt;br /&gt;Enter input string to search: a&lt;br /&gt;I found the text "a" starting at index 0 and ending at index 1.&lt;br /&gt;&lt;br /&gt;Enter your regex: \d&lt;br /&gt;Enter input string to search: 1&lt;br /&gt;I found the text "1" starting at index 0 and ending at index 1.&lt;br /&gt;&lt;br /&gt;Enter your regex: \d&lt;br /&gt;Enter input string to search: a&lt;br /&gt;No match found.&lt;br /&gt;&lt;br /&gt;Enter your regex: \D&lt;br /&gt;Enter input string to search: 1&lt;br /&gt;No match found.&lt;br /&gt;&lt;br /&gt;Enter your regex: \D&lt;br /&gt;Enter input string to search: a&lt;br /&gt;I found the text "a" starting at index 0 and ending at index 1.&lt;br /&gt;&lt;br /&gt;Enter your regex: \s&lt;br /&gt;Enter input string to search: &lt;br /&gt;I found the text " " starting at index 0 and ending at index 1.&lt;br /&gt;&lt;br /&gt;Enter your regex: \s&lt;br /&gt;Enter input string to search: a&lt;br /&gt;No match found.&lt;br /&gt;&lt;br /&gt;Enter your regex: \S&lt;br /&gt;Enter input string to search: &lt;br /&gt;No match found.&lt;br /&gt;&lt;br /&gt;Enter your regex: \S&lt;br /&gt;Enter input string to search: a&lt;br /&gt;I found the text "a" starting at index 0 and ending at index 1.&lt;br /&gt;&lt;br /&gt;Enter your regex: \w&lt;br /&gt;Enter input string to search: a&lt;br /&gt;I found the text "a" starting at index 0 and ending at index 1.&lt;br /&gt;&lt;br /&gt;Enter your regex: \w&lt;br /&gt;Enter input string to search: !&lt;br /&gt;No match found.&lt;br /&gt;&lt;br /&gt;Enter your regex: \W&lt;br /&gt;Enter input string to search: a&lt;br /&gt;No match found.&lt;br /&gt;&lt;br /&gt;Enter your regex: \W&lt;br /&gt;Enter input string to search: !&lt;br /&gt;I found the text "!" starting at index 0 and ending at index 1.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Oke dari predifined class bisa kita simpulkan :&lt;br /&gt;Huruf bukan kapital berarti :&lt;br /&gt;\d cocok untuk semua digit&lt;br /&gt;\s cocok untuk whitespace&lt;br /&gt;\w cocok untuk semua karakter penyusun kata&lt;br /&gt;&lt;br /&gt;Sedangkan hurus kapital :&lt;br /&gt;&lt;br /&gt;\D cocok untuk non-digits&lt;br /&gt;\S cocok untuk non-spaces&lt;br /&gt;\W cocok untuk semua non karakter penyusun kata&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Quantifiers&lt;/span&gt;&lt;br /&gt;Dengan menggunakan quantifiers kita bisa melakukan pencocokan berdasarkan berapa kali kita akan melakukan pengenalan pattern pada suatu urutan karakter, spesifikasi class Pattern mempunyai 3 quantifiers yaitu greedy, Reluctant dan Possessive. Berikut adalah tabel quantifiers :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Quantifiers&lt;br /&gt;     Meaning&lt;br /&gt;Greedy  Reluctant Possessive&lt;br /&gt;X?  X??   X?+   X, once or not at all&lt;br /&gt;X*  X*?   X*+   X, zero or more times&lt;br /&gt;X+  X+?   X++   X, one or more times&lt;br /&gt;X{n}   X{n}?    X{n}+    X, exactly n times&lt;br /&gt;X{n,}  X{n,}?   X{n,}+   X, at least n times&lt;br /&gt;X{n,m}  X{n,m}? X{n,m}+   X, at least n but not more than m times &lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Sekarang kita akan melakukan percobaan dengan quantifiers greedy menggunakan huruf "a" dengan diikuti ?, *, + kita akan lihat perbedaannya. Input yang digunakan adalah string kosong "".&lt;br /&gt;ex :&lt;br /&gt;&lt;blockquote&gt;amru@bl4ckcub3:~/MyJava/learn/regex$ java RegexTestHarness&lt;br /&gt;&lt;br /&gt;Enter your regex: a?&lt;br /&gt;Enter input string to search:&lt;br /&gt;I found the text "" starting at index 0 and ending at index 0.&lt;br /&gt;&lt;br /&gt;Enter your regex: a*&lt;br /&gt;Enter input string to search:&lt;br /&gt;I found the text "" starting at index 0 and ending at index 0.&lt;br /&gt;&lt;br /&gt;Enter your regex: a+&lt;br /&gt;Enter input string to search:&lt;br /&gt;No match found.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Pada contoh diatas untuk a? dan a* akan mengijinkan adanya pattern "", karena pattern "" ada pada input string kosong, awal dari input string, akhir dari input string atau diantara huruf pada input string.&lt;br /&gt;&lt;br /&gt;kita lakukan percobaan lagi untuk melihat perbedaan dari ketiganya dengan memberikan input masukan berupa karakter "a":&lt;br /&gt;ex :&lt;br /&gt;&lt;blockquote&gt;amru@bl4ckcub3:~/MyJava/learn/regex$ java RegexTestHarness&lt;br /&gt;&lt;br /&gt;Enter your regex: a?&lt;br /&gt;Enter input string to search: a&lt;br /&gt;I found the text "a" starting at index 0 and ending at index 1.&lt;br /&gt;I found the text "" starting at index 1 and ending at index 1.&lt;br /&gt;&lt;br /&gt;Enter your regex: a*&lt;br /&gt;Enter input string to search: a&lt;br /&gt;I found the text "a" starting at index 0 and ending at index 1.&lt;br /&gt;I found the text "" starting at index 1 and ending at index 1.&lt;br /&gt;&lt;br /&gt;Enter your regex: a+&lt;br /&gt;Enter input string to search: a&lt;br /&gt;I found the text "a" starting at index 0 and ending at index 1.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;dari hasil diatas dapat kita lihat bahwa pada a? dan a* tetap menemukan pattern "" pada akhir karakter, karena pada index 0 ditempati oleh karakter "a" sedang pattern "" akan dikenali pada index ke 1 dan diakhiri pada index 1 juga.&lt;br /&gt;&lt;br /&gt;oke sekarang kita coba lagi bagaimana jika masukannya berupa string "aaaaa" ?&lt;br /&gt;ex :&lt;br /&gt;amru@bl4ckcub3:~/MyJava/learn/regex$ java RegexTestHarness&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Enter your regex: a?&lt;br /&gt;Enter input string to search: aaaaa&lt;br /&gt;I found the text "a" starting at index 0 and ending at index 1.&lt;br /&gt;I found the text "a" starting at index 1 and ending at index 2.&lt;br /&gt;I found the text "a" starting at index 2 and ending at index 3.&lt;br /&gt;I found the text "a" starting at index 3 and ending at index 4.&lt;br /&gt;I found the text "a" starting at index 4 and ending at index 5.&lt;br /&gt;I found the text "" starting at index 5 and ending at index 5.&lt;br /&gt;&lt;br /&gt;Enter your regex: a*&lt;br /&gt;Enter input string to search: aaaaa&lt;br /&gt;I found the text "aaaaa" starting at index 0 and ending at index 5.&lt;br /&gt;I found the text "" starting at index 5 and ending at index 5.&lt;br /&gt;&lt;br /&gt;Enter your regex: a+&lt;br /&gt;Enter input string to search: aaaaa&lt;br /&gt;I found the text "aaaaa" starting at index 0 and ending at index 5.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Nah sekarang dah katahuan kan bedanya huehuehue ..., tapi kita akan coba sekali lagi untuk memastikannya dengan mengubah string masukan menjadi "ababaaaab".&lt;br /&gt;ex :&lt;br /&gt;&lt;blockquote&gt;amru@bl4ckcub3:~/MyJava/learn/regex$ java RegexTestHarness&lt;br /&gt;&lt;br /&gt;Enter your regex: a?&lt;br /&gt;Enter input string to search: ababaaaab&lt;br /&gt;I found the text "a" starting at index 0 and ending at index 1.&lt;br /&gt;I found the text "" starting at index 1 and ending at index 1.&lt;br /&gt;I found the text "a" starting at index 2 and ending at index 3.&lt;br /&gt;I found the text "" starting at index 3 and ending at index 3.&lt;br /&gt;I found the text "a" starting at index 4 and ending at index 5.&lt;br /&gt;I found the text "a" starting at index 5 and ending at index 6.&lt;br /&gt;I found the text "a" starting at index 6 and ending at index 7.&lt;br /&gt;I found the text "a" starting at index 7 and ending at index 8.&lt;br /&gt;I found the text "" starting at index 8 and ending at index 8.&lt;br /&gt;I found the text "" starting at index 9 and ending at index 9.&lt;br /&gt;&lt;br /&gt;Enter your regex: a*&lt;br /&gt;Enter input string to search: ababaaaab&lt;br /&gt;I found the text "a" starting at index 0 and ending at index 1.&lt;br /&gt;I found the text "" starting at index 1 and ending at index 1.&lt;br /&gt;I found the text "a" starting at index 2 and ending at index 3.&lt;br /&gt;I found the text "" starting at index 3 and ending at index 3.&lt;br /&gt;I found the text "aaaa" starting at index 4 and ending at index 8.&lt;br /&gt;I found the text "" starting at index 8 and ending at index 8.&lt;br /&gt;I found the text "" starting at index 9 and ending at index 9.&lt;br /&gt;&lt;br /&gt;Enter your regex: a+&lt;br /&gt;Enter input string to search: ababaaaab&lt;br /&gt;I found the text "a" starting at index 0 and ending at index 1.&lt;br /&gt;I found the text "a" starting at index 2 and ending at index 3.&lt;br /&gt;I found the text "aaaa" starting at index 4 and ending at index 8.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;oke jadi kesimpulannya begini untuk a? akan melakukan pencocokan karakter satu persatu dan akan menggantikan pattern yang tidak cocok dengan ""(string kosong), a* akan melakukan pencocokan karakter yang sama dengan a tetapi tidak satu persatu karakter tapi jika ada pattern yang sama misalnya "aaaa" akan dianggap sebagai sebuah kesatuan dan aka mengganti pattern yang tidak sama dengan "" dan pada a+ bertindak seperti a* tetapi langsung mengabaikan pattern yang tidak cocok.&lt;br /&gt;&lt;br /&gt;lalu bagaimana jika kita ingin mencocokkan pattern karakter dengan jumlah tertentu ??, the answer is use the curly braces {n} oke!!&lt;br /&gt;ex :&lt;br /&gt;&lt;blockquote&gt;Enter your regex: a{3}&lt;br /&gt;Enter input string to search: aa&lt;br /&gt;No match found.&lt;br /&gt;&lt;br /&gt;Enter your regex: a{3}&lt;br /&gt;Enter input string to search: aaa&lt;br /&gt;I found the text "aaa" starting at index 0 and ending at index 3.&lt;br /&gt;&lt;br /&gt;Enter your regex: a{3}&lt;br /&gt;Enter input string to search: aaaa&lt;br /&gt;I found the text "aaa" starting at index 0 and ending at index 3.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;dari contoh diatas dapat dilihat pemanfaatan dari {n}, n adalah jumlah karakter yang akan dicocokkan.Tapi kenapa yang pertama gagal ?? itu karena string yang dicocokkan jumlahnya lebih sedikit jika dibadingkan dengan jumlah regex yang akan dikenali meskipun string inputnya sama yaitu "aa". Nah kita lanjut lagi masih seputar {n}, lets look bellow :&lt;br /&gt;Ex :&lt;br /&gt;&lt;blockquote&gt;amru@bl4ckcub3:~/MyJava/learn/regex$ java RegexTestHarness&lt;br /&gt;&lt;br /&gt;Enter your regex: a{3}&lt;br /&gt;Enter input string to search: aaaaaaaaa&lt;br /&gt;I found the text "aaa" starting at index 0 and ending at index 3.&lt;br /&gt;I found the text "aaa" starting at index 3 and ending at index 6.&lt;br /&gt;I found the text "aaa" starting at index 6 and ending at index 9.&lt;br /&gt;&lt;br /&gt;Enter your regex: a{3,}&lt;br /&gt;Enter input string to search: aaaaaaaaa&lt;br /&gt;I found the text "aaaaaaaaa" starting at index 0 and ending at index 9.&lt;br /&gt;&lt;br /&gt;Enter your regex: a{3,6}&lt;br /&gt;Enter input string to search: aaaaaaaaa&lt;br /&gt;I found the text "aaaaaa" starting at index 0 and ending at index 6.&lt;br /&gt;I found the text "aaa" starting at index 6 and ending at index 9.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;oke penjelasan untuk output diatas adalah sebagai berikut, untuk yang pertama dengan a{3} akan mengenali 3 kali karena input string "aaaaaaaaa" sejumlah 3 kali pattern a{3}, untuk yang kedua dengan {3,} maksudnya akan mengenali pattern minimal dengan panjang karakter "aaa" dengan pangjang maksimal tak terbatas, untuk yang terakhir dengan {3,6} sebenarnya sama dengan yang kedua hanya bedanya ada batas pengenalan panjang pattern yaitu sepanjang 6 karakter.&lt;br /&gt;&lt;br /&gt;Sekarang perbadaan antara regex (dog){3} dengan dog{3} ??, look bellow agains ...&lt;br /&gt;Ex :&lt;br /&gt;&lt;blockquote&gt;amru@bl4ckcub3:~/MyJava/learn/regex$ java RegexTestHarness&lt;br /&gt;&lt;br /&gt;Enter your regex: (dog){3}&lt;br /&gt;Enter input string to search: dogdogdogdogdogdog&lt;br /&gt;I found the text "dogdogdog" starting at index 0 and ending at index 9.&lt;br /&gt;I found the text "dogdogdog" starting at index 9 and ending at index 18.&lt;br /&gt;&lt;br /&gt;Enter your regex: dog{3}&lt;br /&gt;Enter input string to search: dogdogdogdogdogdog&lt;br /&gt;No match found.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;terlihat bahwa yang pertama akan mengenali pattern berupa group karakter yaitu "dog" dengan panjang 3, sedangkan yang kedua hanya akan mengenali "dog" dimana yang dihitung jumlahnya bukan "dog" tetapi karakter "g". Untuk melakukan grouping seperti (dog){3} tetapi tidak mementingkan urutan bisa kita gunakan pattern [x]{n}, contoh :&lt;br /&gt;&lt;blockquote&gt;amru@bl4ckcub3:~/MyJava/learn/regex$ java RegexTestHarness&lt;br /&gt;&lt;br /&gt;Enter your regex: [abc]{3}&lt;br /&gt;Enter input string to search: abccabaaaccbbbc&lt;br /&gt;I found the text "abc" starting at index 0 and ending at index 3.&lt;br /&gt;I found the text "cab" starting at index 3 and ending at index 6.&lt;br /&gt;I found the text "aaa" starting at index 6 and ending at index 9.&lt;br /&gt;I found the text "ccb" starting at index 9 and ending at index 12.&lt;br /&gt;I found the text "bbc" starting at index 12 and ending at index 15.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Perbedaan antara greedy, reluctant dan possessive ??, okeh kita lihat saja contoh berikut ini :&lt;br /&gt;&lt;blockquote&gt;amru@bl4ckcub3:~/MyJava/learn/regex$ java RegexTestHarness&lt;br /&gt;&lt;br /&gt;Enter your regex: .*foo  // greedy quantifier&lt;br /&gt;Enter input string to search: xfooxxxxxxfoo&lt;br /&gt;I found the text "xfooxxxxxxfoo" starting at index 0 and ending at index 13.&lt;br /&gt;&lt;br /&gt;Enter your regex: .*?foo  // reluctant quantifier&lt;br /&gt;Enter input string to search: xfooxxxxxxfoo&lt;br /&gt;I found the text "xfoo" starting at index 0 and ending at index 4.&lt;br /&gt;I found the text "xxxxxxfoo" starting at index 4 and ending at index 13.&lt;br /&gt;&lt;br /&gt;Enter your regex: .*+foo // possessive quantifier&lt;br /&gt;Enter input string to search: xfooxxxxxxfoo&lt;br /&gt;No match found.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;proses pada gredy adalah pertama dia akan mengkonsumsi semua input dengan menggunakan (.*) termasuk pattern "foo" yang terakhir, perlu diingat pencocokan pada gredy dimulai dari belakang sampai diketemukan pattern "foo" yang terakhir. Itulah kenapa setelah diketemukan pattern "foo" yang terakhir pencocokan akan berhenti.&lt;br /&gt;proses pada reluctant adalah pertama dia tidak akan mengkonsumsi apapun dari input, pencocokannya akan dilakukan dari depan dengan mencocokkan satu persatu sampai diketemukan pattern "foo", jika diketemukan maka akan menghentikan pencocokan dan memulai kembali pencocokan dari index dimana dia berhenti.&lt;br /&gt;proses pada possessive sama dengan greedy tetapi dia tidak akan mengulang lagi jika tidak diketemukan, pencocokan hanya dilakukan sekali saja.&lt;br /&gt;&lt;br /&gt;reference : &lt;a href="http://java.sun.com/docs/books/tutorial"&gt;http://java.sun.com/docs/books/tutorial&lt;/a&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/6639474468897837856-1688254128854457479?l=amrurosyada.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Ck8sxWeG-jawDB7SZiemsatd7PU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Ck8sxWeG-jawDB7SZiemsatd7PU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Ck8sxWeG-jawDB7SZiemsatd7PU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Ck8sxWeG-jawDB7SZiemsatd7PU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Rosyadacode/~4/FkYZJgBKmp4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://amrurosyada.blogspot.com/feeds/1688254128854457479/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://amrurosyada.blogspot.com/2008/12/java-regular-expressions.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default/1688254128854457479?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default/1688254128854457479?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Rosyadacode/~3/FkYZJgBKmp4/java-regular-expressions.html" title="Java Regular Expressions" /><author><name>arros</name><uri>http://www.blogger.com/profile/15115335540591605422</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://1.bp.blogspot.com/_-cffNDQPfcc/ST9DFOnnX7I/AAAAAAAAAGY/hhLx1rQqh54/S220/1_998498248l-edit.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_-cffNDQPfcc/SVltW-vuioI/AAAAAAAAAIw/gsubNLPgUPY/s72-c/fts-regex-front.jpg" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://amrurosyada.blogspot.com/2008/12/java-regular-expressions.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUQBRHk6eip7ImA9WxVSFEo.&quot;"><id>tag:blogger.com,1999:blog-6639474468897837856.post-2779252182451636616</id><published>2008-12-15T12:40:00.005+07:00</published><updated>2009-01-09T10:55:55.712+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-09T10:55:55.712+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java Tech" /><title>Mengenal Tipe Enum</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_-cffNDQPfcc/SUXwdTzxYAI/AAAAAAAAAIo/e9lIWh6A9rc/s1600-h/tux-Java-t2.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 224px;" src="http://2.bp.blogspot.com/_-cffNDQPfcc/SUXwdTzxYAI/AAAAAAAAAIo/e9lIWh6A9rc/s320/tux-Java-t2.gif" alt="" id="BLOGGER_PHOTO_ID_5279890524486066178" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Definisi : Tipe enum merupakan tipe yang terdiri dari sekumpulan field constan. Misalkan bisa saja digunakan untuk mendefinisikan empat arah mata angin (NORTH, SOUTH, EAST, dan WEST) atau bisa jug digunakan untuk menyimpan nilai hari-hari dalam seminggu.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Note : enum sendiri mulai ada pada Java 1.5&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;pada java kita bisa menggunakan keyword enum untuk mendefinisikan tipe enum, contoh pada kode berikut :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;/*&lt;br /&gt;* Copyright (c) 1995 - 2008 Sun Microsystems, Inc.  All rights reserved.&lt;br /&gt;*&lt;br /&gt;* Redistribution and use in source and binary forms, with or without&lt;br /&gt;* modification, are permitted provided that the following conditions&lt;br /&gt;* are met:&lt;br /&gt;*&lt;br /&gt;*   - Redistributions of source code must retain the above copyright&lt;br /&gt;*     notice, this list of conditions and the following disclaimer.&lt;br /&gt;*&lt;br /&gt;*   - Redistributions in binary form must reproduce the above copyright&lt;br /&gt;*     notice, this list of conditions and the following disclaimer in the&lt;br /&gt;*     documentation and/or other materials provided with the distribution.&lt;br /&gt;*&lt;br /&gt;*   - Neither the name of Sun Microsystems nor the names of its&lt;br /&gt;*     contributors may be used to endorse or promote products derived&lt;br /&gt;*     from this software without specific prior written permission.&lt;br /&gt;*&lt;br /&gt;* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS&lt;br /&gt;* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,&lt;br /&gt;* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR&lt;br /&gt;* PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR&lt;br /&gt;* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,&lt;br /&gt;* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,&lt;br /&gt;* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR&lt;br /&gt;* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF&lt;br /&gt;* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING&lt;br /&gt;* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS&lt;br /&gt;* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;public enum Day {&lt;br /&gt;   SUNDAY, MONDAY, TUESDAY, WEDNESDAY,&lt;br /&gt;   THURSDAY, FRIDAY, SATURDAY&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Kapan enum cocok untuk digunakan ?, ketika kita ingin merepresentasikan set konstanta yang tetap. Misalkan saja kita ingin merepresentasikan data set planet yang ada pada susunan tatasurya kita (ya kalo ngga ditemukan planet baru hehehe...).&lt;br /&gt;&lt;br /&gt;Kode program di bawah ini merupakan contoh penggunaan tipe enum Day yang telah kita buat sebelumnya.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;/*&lt;br /&gt;* Copyright (c) 1995 - 2008 Sun Microsystems, Inc.  All rights reserved.&lt;br /&gt;*&lt;br /&gt;* Redistribution and use in source and binary forms, with or without&lt;br /&gt;* modification, are permitted provided that the following conditions&lt;br /&gt;* are met:&lt;br /&gt;*&lt;br /&gt;*   - Redistributions of source code must retain the above copyright&lt;br /&gt;*     notice, this list of conditions and the following disclaimer.&lt;br /&gt;*&lt;br /&gt;*   - Redistributions in binary form must reproduce the above copyright&lt;br /&gt;*     notice, this list of conditions and the following disclaimer in the&lt;br /&gt;*     documentation and/or other materials provided with the distribution.&lt;br /&gt;*&lt;br /&gt;*   - Neither the name of Sun Microsystems nor the names of its&lt;br /&gt;*     contributors may be used to endorse or promote products derived&lt;br /&gt;*     from this software without specific prior written permission.&lt;br /&gt;*&lt;br /&gt;* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS&lt;br /&gt;* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,&lt;br /&gt;* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR&lt;br /&gt;* PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR&lt;br /&gt;* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,&lt;br /&gt;* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,&lt;br /&gt;* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR&lt;br /&gt;* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF&lt;br /&gt;* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING&lt;br /&gt;* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS&lt;br /&gt;* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;public class EnumTest {&lt;br /&gt;Day day;&lt;br /&gt;&lt;br /&gt;public EnumTest(Day day) {&lt;br /&gt; this.day = day;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void tellItLikeItIs() {&lt;br /&gt; switch (day) {&lt;br /&gt;  case MONDAY: System.out.println("Mondays are bad.");&lt;br /&gt;         break;&lt;br /&gt;   &lt;br /&gt;  case FRIDAY: System.out.println("Fridays are better.");&lt;br /&gt;         break;&lt;br /&gt;        &lt;br /&gt;  case SATURDAY:&lt;br /&gt;  case SUNDAY: System.out.println("Weekends are best.");&lt;br /&gt;         break;&lt;br /&gt;        &lt;br /&gt;  default:  System.out.println("Midweek days are so-so.");&lt;br /&gt;         break;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public static void main(String[] args) {&lt;br /&gt; EnumTest firstDay = new EnumTest(Day.MONDAY);&lt;br /&gt; firstDay.tellItLikeItIs();&lt;br /&gt; EnumTest thirdDay = new EnumTest(Day.WEDNESDAY);&lt;br /&gt; thirdDay.tellItLikeItIs();&lt;br /&gt; EnumTest fifthDay = new EnumTest(Day.FRIDAY);&lt;br /&gt; fifthDay.tellItLikeItIs();&lt;br /&gt; EnumTest sixthDay = new EnumTest(Day.SATURDAY);&lt;br /&gt; sixthDay.tellItLikeItIs();&lt;br /&gt; EnumTest seventhDay = new EnumTest(Day.SUNDAY);&lt;br /&gt; seventhDay.tellItLikeItIs();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Output program :&lt;br /&gt;&lt;blockquote&gt;Mondays are bad.&lt;br /&gt;Midweek days are so-so.&lt;br /&gt;Fridays are better.&lt;br /&gt;Weekends are best.&lt;br /&gt;Weekends are best.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Tipe enum tidak hanya bisa menyimpan konstanta saja, tetapi juga bisa mempunyai konstruktor dan juga field2 inilah yang membuat tipe enum menjadi powerfull. Untuk melakukan iterasi pada tipe enum kita bisa memanfaatkan for-each loop pada java :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;for (Planet p : Planet.values()) {&lt;br /&gt;   System.out.printf("Your weight on %s is %f%n",&lt;br /&gt;                         p, p.surfaceWeight(mass));&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Note : ketika kita mendefinisikan tipe enum secara otomatis akan menurunkan class java.lang.Enum. Karena java tidak mengijinkan multiple inheritance sehingga tipe enum tidak bisa menurunkan/extends dari class lain.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Tipe enum dapat mempunyai parameter, yang akan dilewatkan pada konstruktornya ketika konstruktor dipanggil. Berikut adalah contoh kode enum yang merepresentasikan planet dalam susunan tatasurya kita, yang outputnya akan menghitung bobot kita di planet2 yang lain.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;* Copyright (c) 1995 - 2008 Sun Microsystems, Inc.  All rights reserved.&lt;br /&gt;*&lt;br /&gt;* Redistribution and use in source and binary forms, with or without&lt;br /&gt;* modification, are permitted provided that the following conditions&lt;br /&gt;* are met:&lt;br /&gt;*&lt;br /&gt;*   - Redistributions of source code must retain the above copyright&lt;br /&gt;*     notice, this list of conditions and the following disclaimer.&lt;br /&gt;*&lt;br /&gt;*   - Redistributions in binary form must reproduce the above copyright&lt;br /&gt;*     notice, this list of conditions and the following disclaimer in the&lt;br /&gt;*     documentation and/or other materials provided with the distribution.&lt;br /&gt;*&lt;br /&gt;*   - Neither the name of Sun Microsystems nor the names of its&lt;br /&gt;*     contributors may be used to endorse or promote products derived&lt;br /&gt;*     from this software without specific prior written permission.&lt;br /&gt;*&lt;br /&gt;* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS&lt;br /&gt;* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,&lt;br /&gt;* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR&lt;br /&gt;* PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR&lt;br /&gt;* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,&lt;br /&gt;* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,&lt;br /&gt;* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR&lt;br /&gt;* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF&lt;br /&gt;* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING&lt;br /&gt;* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS&lt;br /&gt;* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;public enum Planet {&lt;br /&gt;   MERCURY (3.303e+23, 2.4397e6),&lt;br /&gt;   VENUS   (4.869e+24, 6.0518e6),&lt;br /&gt;   EARTH   (5.976e+24, 6.37814e6),&lt;br /&gt;   MARS    (6.421e+23, 3.3972e6),&lt;br /&gt;   JUPITER (1.9e+27,   7.1492e7),&lt;br /&gt;   SATURN  (5.688e+26, 6.0268e7),&lt;br /&gt;   URANUS  (8.686e+25, 2.5559e7),&lt;br /&gt;   NEPTUNE (1.024e+26, 2.4746e7);&lt;br /&gt;&lt;br /&gt;   private final double mass;   // in kilograms&lt;br /&gt;   private final double radius; // in meters&lt;br /&gt;   Planet(double mass, double radius) {&lt;br /&gt;       this.mass = mass;&lt;br /&gt;       this.radius = radius;&lt;br /&gt;   }&lt;br /&gt;   private double mass()   { return mass; }&lt;br /&gt;   private double radius() { return radius; }&lt;br /&gt;&lt;br /&gt;   // universal gravitational constant  (m3 kg-1 s-2)&lt;br /&gt;   public static final double G = 6.67300E-11;&lt;br /&gt;&lt;br /&gt;   double surfaceGravity() {&lt;br /&gt;       return G * mass / (radius * radius);&lt;br /&gt;   }&lt;br /&gt;   double surfaceWeight(double otherMass) {&lt;br /&gt;       return otherMass * surfaceGravity();&lt;br /&gt;   }&lt;br /&gt;   public static void main(String[] args) {&lt;br /&gt;       double earthWeight = Double.parseDouble(args[0]);&lt;br /&gt;       double mass = earthWeight/EARTH.surfaceGravity();&lt;br /&gt;       for (Planet p : Planet.values())&lt;br /&gt;          System.out.printf("Your weight on %s is %f%n",&lt;br /&gt;                            p, p.surfaceWeight(mass));&lt;br /&gt;   }&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Output program (dimana program menerima parameter masukan berupa bobot kita) :&lt;br /&gt;&lt;blockquote&gt;$ java Planet 175&lt;br /&gt;Your weight on MERCURY is 66.107583&lt;br /&gt;Your weight on VENUS is 158.374842&lt;br /&gt;Your weight on EARTH is 175.000000&lt;br /&gt;Your weight on MARS is 66.279007&lt;br /&gt;Your weight on JUPITER is 442.847567&lt;br /&gt;Your weight on SATURN is 186.552719&lt;br /&gt;Your weight on URANUS is 158.397260&lt;br /&gt;Your weight on NEPTUNE is 199.207413&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;referensi :&lt;br /&gt;&lt;a href="http://java.sun.com/docs/books/tutorial"&gt;http://java.sun.com/docs/books/tutorial&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6639474468897837856-2779252182451636616?l=amrurosyada.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/jKTmUnnvxhp44eUzOko4l3Wjei8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jKTmUnnvxhp44eUzOko4l3Wjei8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/jKTmUnnvxhp44eUzOko4l3Wjei8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jKTmUnnvxhp44eUzOko4l3Wjei8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Rosyadacode/~4/xSCYXsJXksY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://amrurosyada.blogspot.com/feeds/2779252182451636616/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://amrurosyada.blogspot.com/2008/12/mengenal-tipe-enum.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default/2779252182451636616?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default/2779252182451636616?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Rosyadacode/~3/xSCYXsJXksY/mengenal-tipe-enum.html" title="Mengenal Tipe Enum" /><author><name>arros</name><uri>http://www.blogger.com/profile/15115335540591605422</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://1.bp.blogspot.com/_-cffNDQPfcc/ST9DFOnnX7I/AAAAAAAAAGY/hhLx1rQqh54/S220/1_998498248l-edit.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_-cffNDQPfcc/SUXwdTzxYAI/AAAAAAAAAIo/e9lIWh6A9rc/s72-c/tux-Java-t2.gif" height="72" width="72" /><thr:total>4</thr:total><feedburner:origLink>http://amrurosyada.blogspot.com/2008/12/mengenal-tipe-enum.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUQDRX07fyp7ImA9WxVSFEo.&quot;"><id>tag:blogger.com,1999:blog-6639474468897837856.post-747037191116107982</id><published>2008-12-15T08:16:00.005+07:00</published><updated>2009-01-09T10:56:14.307+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-09T10:56:14.307+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="be wish" /><title>Thinking .... ???</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_-cffNDQPfcc/SUWyBaJOQhI/AAAAAAAAAIg/57QNV6_49tI/s1600-h/boy_desk_thinking.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 232px; height: 320px;" src="http://3.bp.blogspot.com/_-cffNDQPfcc/SUWyBaJOQhI/AAAAAAAAAIg/57QNV6_49tI/s320/boy_desk_thinking.jpg" alt="" id="BLOGGER_PHOTO_ID_5279821875429392914" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Image from : &lt;a href="http://www.suzannesutton.com/_borders/boy_desk_thinking.jpg"&gt;http://www.suzannesutton.com/_borders/boy_desk_thinking.jpg&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;(Yaitu) orang-orang yang mengingat Allah sambil berdiri atau duduk atau dalam keadaan berbaring dan mereka memikirkan tentang penciptaan langit dan bumi (seraya berkata):&lt;br /&gt;Ya Tuhan kami, tiadalah Engkau menciptakan ini dengan sia-sia. Maha Suci Engkau, maka perihalah kami dari siksa neraka.&lt;br /&gt;(Ali Imron, 3:191)&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;Pernahkah kita memikirkan bahwa kita tidak ada sebelum dilahirkan ke dunia; dan kita telah diciptakan dari sebuah ketiadaan ?&lt;br /&gt;&lt;br /&gt;Pernahkah kita berfikir bagaimana bunga yang setiap hari kita lihat, yang tumbuh dari tanah yang hitam, ternyata memiliki bau yang harum serta berwarna-warni?&lt;br /&gt;&lt;br /&gt;Pernahkah kita memikirkan seekor nyamuk, yang sangat mengganggu ketika terbang mengitari kita, mengepakkan sayapnya dengan kecepatan yang sedemikian tinggi sehingga kita tidak mampu melihatnya ?&lt;br /&gt;&lt;br /&gt;Pernahkah kita berpikir bahwa gempa bumi mungkin saja datang secara tiba-tiba ketika anda sedang tidur, yang menghancur luluhkan rumah, kantor dan kota hingga rata dengan tanah sehingga dalam tempo beberapa detik saja kita pun kehilangan segala sesuatu yang kita miliki di dunia ini ?&lt;br /&gt;&lt;br /&gt;Pernahkah kita berfikir bahwa kehidupan kita berlalu dengan sangat cepat, kita pun menjadi semakin tua dan lemah, dan lambat laun kehilangan ketampanan atau kecantikan, kesehatan dan kekuatan kita ?&lt;br /&gt;&lt;br /&gt;Pernahkah kita memikirkan bahwa suatu hari nanti, malaikat maut yang diutus oleh Allah akan menjemput untuk membawa kita meninggalkan dunia ini ?&lt;br /&gt;&lt;br /&gt;Jika demikian, pernahkah kita berfikir mengapa manusia demikian terbelenggu oleh kehidupan dunia yang sebentar akan kita tinggalkan dan yang seharusya kita jadikan sebagai tempat untuk bekerja keras dalam meraih kebahagiaan hidup di akhirat ?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;From---Bagaimana Seorang Muslim Berfikir---Harun Yahya Series---&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6639474468897837856-747037191116107982?l=amrurosyada.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/yUtc2ihziwZCJUppEjQyLw1Icvc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/yUtc2ihziwZCJUppEjQyLw1Icvc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/yUtc2ihziwZCJUppEjQyLw1Icvc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/yUtc2ihziwZCJUppEjQyLw1Icvc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Rosyadacode/~4/_Hbcj0bgEGk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://amrurosyada.blogspot.com/feeds/747037191116107982/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://amrurosyada.blogspot.com/2008/12/thinking.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default/747037191116107982?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default/747037191116107982?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Rosyadacode/~3/_Hbcj0bgEGk/thinking.html" title="Thinking .... ???" /><author><name>arros</name><uri>http://www.blogger.com/profile/15115335540591605422</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://1.bp.blogspot.com/_-cffNDQPfcc/ST9DFOnnX7I/AAAAAAAAAGY/hhLx1rQqh54/S220/1_998498248l-edit.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_-cffNDQPfcc/SUWyBaJOQhI/AAAAAAAAAIg/57QNV6_49tI/s72-c/boy_desk_thinking.jpg" height="72" width="72" /><thr:total>4</thr:total><feedburner:origLink>http://amrurosyada.blogspot.com/2008/12/thinking.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUMASHs8eyp7ImA9WxVSFEo.&quot;"><id>tag:blogger.com,1999:blog-6639474468897837856.post-7539681806883083914</id><published>2008-12-10T11:19:00.008+07:00</published><updated>2009-01-09T10:57:29.573+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-09T10:57:29.573+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java Tech" /><title>Koneksi Sang Gajah dengan Sang Kopi pada Pinguin</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-cffNDQPfcc/ST9L5xcrRSI/AAAAAAAAAGw/Kt04yyf0xo4/s1600-h/twa0143l.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 278px; height: 320px;" src="http://4.bp.blogspot.com/_-cffNDQPfcc/ST9L5xcrRSI/AAAAAAAAAGw/Kt04yyf0xo4/s320/twa0143l.jpg" alt="" id="BLOGGER_PHOTO_ID_5278020744199750946" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Dari judulnya koneksi Sang Gadjah dengan Sang Kopi apa yang akan terlintas dalam pikiran kita, gimana ya caranya ??? trus ngapain juga ngurusin gajah sama kopi ??? kok ada pinguin juga sih???. Kalo kita bisa melakukannya akan sangat menyenangkan dan akan memberikan hasil yang sangat powerfull... tau sendiri kan tenaga gajah yang kuat didukung bentuknya yang gede ditambah dengan nikmatnya rasa kopi yang nikmat pluss-pluss kemampuan pinguin dalam bermigrasi pada jarak yang sangat jauh. Jadinya pinguin gendong gajah yang kuat dan ngga ngantuk-an hehe... so powerfull..&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;Oke langsung saja yah disini kita mau mengkoneksikan &lt;a href="http://postgresql.org/"&gt;PosgreSQL&lt;/a&gt; dengan &lt;a href="http://java.sun.com/"&gt;Java&lt;/a&gt;. Truss hubungannnya apa sama gajah, kopi ma pinguin ??? ya secara gituloh logonya Postgre kan gajah trademarknya Java kan make logo Secangkir kopi dan tau sendiri logonya sang jawara kita &lt;a href="http://linux.org/"&gt;Linux&lt;/a&gt; kan pinguin... jadinya ya ngga pa kan klo dianalogikan sabagai gajah, kopi dan pinguin...&lt;br /&gt;&lt;br /&gt;Yuuk lanjut...&lt;br /&gt;&lt;br /&gt;JDBC Driver untuk postgreSQL dapat didownload dari &lt;a href="http://jdbc.postgresql.org/"&gt;http://jdbc.postgresql.org/&lt;/a&gt;.&lt;br /&gt;Jangan lupa download drivernya dan sesuaikan dengan versi JDK yang digunakan, atau bisa dibuild sendiri menggunakan ant, untuk mem-build dibutuhkan ant versi 1.5 atau versi yang lebih tinggi. Ant sendiri merupakan tool untuk building Java-based package, ant tool dapat diperoleh melalui &lt;a href="http://ant.apache.org/index.html"&gt;http://ant.apache.org/index.html&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Installasi Ant&lt;/span&gt;&lt;br /&gt;Setelah didownload tinggal diekstrak tanpa ada kompilasi ulang karena merupakan program java tinggal dijalankan saja. Lalu bagaimana cara menggunakannya ???, Ant didesain agar mudah digunakan. Direktori /bin berisi file executable bernama ant yang digunakan untuk menjalankan ant. Kita dapat menjalankan ant dengan cara memanggilnya dengan cara ./ant atau $ANT_HOME/bin/ant atau /ant_direktori/bin/ant. Secara default ant akan menggunakan dimana ant berada dan akan mencoba untuk mencari file build.xml. Berikut ini adalah contoh untuk file build.xml yang bisa digunakan untuk build driver :&lt;/span&gt;&lt;span class="fullpost"&gt;&lt;span style="font-family:monospace;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-cffNDQPfcc/SUC8ogE429I/AAAAAAAAAHA/diVq7tDIO80/s1600-h/build-xml.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 370px; height: 252px;" src="http://1.bp.blogspot.com/_-cffNDQPfcc/SUC8ogE429I/AAAAAAAAAHA/diVq7tDIO80/s400/build-xml.png" alt="" id="BLOGGER_PHOTO_ID_5278426167269448658" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Jika driver dibuild dari source akan menghasilkan file dengan format postgresql-[server version].[buildnumber].jdbc[JDBC version].jar, sebagai contoh postgresql-8.0-310.jdbc3.jar. Jangan lupa untuk menambahkannya kedalam classpath. Sebagai berikut :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;pada unix/linux =&gt; export CLASSPATH=/direktori_tempat_driver/nama_driver.jar&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Karena Java tidak mensupport menggunakan unix socket jadi PostgreSQL harus dikonfigurasi terlebih dahulu agar bisa menerima koneksi dari TCP/IP. Untuk Postgre versi 8.0 mengijinkan koneksi dari localhost. Agar koneksi dari luar localhost diijinkan maka perlu memodifikasi file postgresql.conf pada bagian listen_addresses setting.&lt;br /&gt;&lt;br /&gt;untuk server versi 8.0 jangan lupa untuk set tcpip_socket = true di file postgresql.conf, dalam pembuatan artikel ini ane menggunakan versi 8.3 tanpa modifikasi pada file postgresql.conf sedikitpun dan secara default TCP/IP dan listen_address setting sudah default mendengarkan localhost.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-weight: bold;"&gt;Note :&lt;/span&gt; Proses instalasi PostgreSQL bisa dilihat di http://postgresql.org, ada dua jenis instalasi bisa dari source maupun binari. Keduanya sama2 enak kok... easy to learn lah pokoknya.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Lanjut lagi yuuk..&lt;br /&gt;&lt;br /&gt;Asumsi Postgre sudah terinstall dan bisa berjalan dengan baik. Buat user baru dengan nama "learn" dan passwordnya "learn", Pada instalasi Postgre secara default akan mempunyai user postgres sebagai superuser, melalui user ini kita bisa membuat user baru dan database baru.&lt;br /&gt;&lt;br /&gt;Masuk menggunakan user postgres, sbb :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;amru@blackcube:/opt/PostgreSQL/8.3/bin$ ./psql -U postgres -W&lt;br /&gt;Password for user postgres:&lt;br /&gt;Welcome to psql 8.3.4, the PostgreSQL interactive terminal.&lt;br /&gt;&lt;br /&gt;Type:  \copyright for distribution terms&lt;br /&gt; \h for help with SQL commands&lt;br /&gt; \? for help with psql commands&lt;br /&gt; \g or terminate with semicolon to execute query&lt;br /&gt; \q to quit&lt;br /&gt;&lt;br /&gt;postgres=#&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Buat user baru "learn" menggunakan pasword "learn" :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;postgres=# CREATE USER learn WITH PASSWORD 'learn';   &lt;br /&gt;CREATE ROLE&lt;br /&gt;postgres=#&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Buat database baru "learn" sebagai percobaan :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;postgres=# CREATE DATABASE learn;&lt;br /&gt;CREATE DATABASE&lt;br /&gt;postgres=#&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Keluar dari user postgres dan login sebagai user learn untuk memastikan bahwa user bisa login dan menggunakan database learn :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;postgres=# \q&lt;br /&gt;amru@blackcube:/opt/PostgreSQL/8.3/bin$&lt;br /&gt;amru@blackcube:/opt/PostgreSQL/8.3/bin$ ./psql -U learn -d learn -W&lt;br /&gt;Password for user learn:&lt;br /&gt;Welcome to psql 8.3.4, the PostgreSQL interactive terminal.&lt;br /&gt;&lt;br /&gt;Type:  \copyright for distribution terms&lt;br /&gt; \h for help with SQL commands&lt;br /&gt; \? for help with psql commands&lt;br /&gt; \g or terminate with semicolon to execute query&lt;br /&gt; \q to quit&lt;br /&gt;&lt;br /&gt;learn=&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Oke setelah user bisa login dan bisa menggunakan database learn, selanjutnya kita coba untuk langsung mencoba menggunakan JDBC. Yuuuk!!!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Importing JDBC&lt;/span&gt;&lt;br /&gt;Setiap source yang menggunakan JDBC harus melakukan import pada paket java.sql, sbb:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;import java.sql.*;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Loading The Driver&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sebelum melakukan koneksi ke database, kita harus load driver terlebih dahulu. Ada dua cara untuk load driver, terserah mau pake yang mana tergantung selera dalam coding antum2 sekalian.&lt;br /&gt;Metode yang pertama, secara implisit kita load driver menggunakan method Class.forName(). untuk PostgreSQL :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Class.forName("org.postgresql.Driver");&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Metod diatas akan melakukan load pada driver, dan ketika loading, driver secara otomatis akan melakukan register dengan JDBC. Metod forName() akan menghasilkan ClassNotFoundException jika driver tidak diketemukan.&lt;br /&gt;Metode loading yang kedua dengan cara melewatkan driver sebagai parameter ke JVM pada waktu akan menjalankan program, dengan menggunakan -D argument. Contoh :&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;java -Djdbc.drivers=org.postgresql.Driver contoh.ProgramJDBC&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;dengan metode melewatkan parameter diatas kita bisa mengubah driver tanpa harus melakukan komilasi ulang tinggal mengubah nama driver yang dilewatkan pada saat runtime.&lt;br /&gt;&lt;br /&gt;Ketika kita mencoba untuk melakukan koneksi dan tiba2 terjadi kesalahan misalnya, driver tidak diketemukan SQLException akan muncul, ini dimungkinkan karena driver tidak berada pada classpath, atau nilai yang dilewatkan pada parameter tidak tepat.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Connecting to the Database&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Dengan menggunakan JDBC, database direpresentasikan dengan menggunakan URL(Uniform Resource Locator). Untuk PostgreSQL URL akan didapatkan sbb :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;-jdbc:postgresql:database&lt;br /&gt;-jdbc:postgresql://host/database&lt;br /&gt;-jdbc:postgresql://host:port/database&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Oke setelah itu kita masuk ke koding ya!!!&lt;br /&gt;Pada contoh dibawah ini kita akan melakukan koneksi ke database kemudian akan membuat temporary table geomtest, selanjutnya akan melakukan insert kedalam table tersebut.. dan kita tampilkan isi dari table tersebut.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;//Import JDBC&lt;br /&gt;import java.sql.*;&lt;br /&gt;&lt;br /&gt;//Import tipe data PGpoint dan PGcircle, akan kita&lt;br /&gt;import org.postgresql.geometric.PGpoint;&lt;br /&gt;import org.postgresql.geometric.PGcircle;&lt;br /&gt;&lt;br /&gt;public class GeometricTest {&lt;br /&gt;&lt;br /&gt;public static void main(String args[]) throws Exception {&lt;br /&gt;//load driver&lt;br /&gt;Class.forName("org.postgresql.Driver");&lt;br /&gt;//learn pada url merupakan nama database&lt;br /&gt;String url = "jdbc:postgresql://localhost:5432/learn";&lt;br /&gt;//melakukan koneksi ke databse menggunakan Class Connection, dengan parameter sbb :&lt;br /&gt;//url merupakan url database&lt;br /&gt;//learn yang pertama merupakan username&lt;br /&gt;//learn yang kedua merupakan password&lt;br /&gt;Connection conn = DriverManager.getConnection(url, "learn", "learn");&lt;br /&gt;&lt;br /&gt;//Class statement digunakan untuk memasukkan tag DML, DDL&lt;br /&gt;Statement stmt = conn.createStatement();&lt;br /&gt;stmt.execute("CREATE TEMP TABLE geomtest(mycirc circle)");&lt;br /&gt;stmt.close();&lt;br /&gt;&lt;br /&gt;insertCircle(conn);&lt;br /&gt;retrieveCircle(conn);&lt;br /&gt;conn.close();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//metod digunakan untuk melakukan insert kedalam table&lt;br /&gt;private static void insertCircle(Connection conn) throws SQLException {&lt;br /&gt;&lt;br /&gt;PGpoint center = new PGpoint(1, 2.5);&lt;br /&gt;double radius = 4;&lt;br /&gt;PGcircle circle = new PGcircle(center, radius);&lt;br /&gt;&lt;br /&gt;//PreparedStatement digunakan untuk melakukan perubahan pada statemen sebelumnya&lt;br /&gt;//atau kita bisa membuat statement baru dengan menggunakan conn.createStatement()&lt;br /&gt;PreparedStatement ps = conn&lt;br /&gt;.prepareStatement("INSERT INTO geomtest(mycirc) VALUES (?)");&lt;br /&gt;ps.setObject(1, circle);&lt;br /&gt;ps.executeUpdate();&lt;br /&gt;ps.close();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private static void retrieveCircle(Connection conn) throws SQLException {&lt;br /&gt;Statement stmt = conn.createStatement();&lt;br /&gt;ResultSet rs = stmt&lt;br /&gt;.executeQuery("SELECT mycirc, area(mycirc) FROM geomtest");&lt;br /&gt;rs.next();&lt;br /&gt;PGcircle circle = (PGcircle) rs.getObject(1);&lt;br /&gt;double area = rs.getDouble(2);&lt;br /&gt;&lt;br /&gt;PGpoint center = circle.center;&lt;br /&gt;double radius = circle.radius;&lt;br /&gt;&lt;br /&gt;System.out.println("Center (X, Y) = (" + center.x + ", " + center.y&lt;br /&gt;+ ")");&lt;br /&gt;System.out.println("Radius = " + radius);&lt;br /&gt;System.out.println("Area = " + area);&lt;br /&gt;}&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Kemudian compile program dengan cara :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;amru@blackcube:~/MyJava$ javac -classpath /media/sda7/Java/JDBC/postgresql-8.3-604.jdbc4.jar GeometricTest.java&lt;br /&gt;amru@blackcube:~/MyJava$&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Jalankan program dengan cara :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;amru@blackcube:~/MyJava$ java GeometricTest&lt;br /&gt;Center (X, Y) = (1.0, 2.5)&lt;br /&gt;Radius = 4.0&lt;br /&gt;Area = 50.26548245743669&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Kelar dah...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Untuk download resource dan dokumentasi kunjungin aja situsnya..&lt;br /&gt;Referensi :&lt;br /&gt;http://jdbc.postgresql.org/&lt;br /&gt;http://ant.apache.org/index.html&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/6639474468897837856-7539681806883083914?l=amrurosyada.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/20Kmc273eMbuTOLSmsCptoJ4Iew/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/20Kmc273eMbuTOLSmsCptoJ4Iew/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/20Kmc273eMbuTOLSmsCptoJ4Iew/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/20Kmc273eMbuTOLSmsCptoJ4Iew/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Rosyadacode/~4/hd9sdtmGYqQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://amrurosyada.blogspot.com/feeds/7539681806883083914/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://amrurosyada.blogspot.com/2008/12/koneksi-sang-gajah-dengan-sang-kopi.html#comment-form" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default/7539681806883083914?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default/7539681806883083914?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Rosyadacode/~3/hd9sdtmGYqQ/koneksi-sang-gajah-dengan-sang-kopi.html" title="Koneksi Sang Gajah dengan Sang Kopi pada Pinguin" /><author><name>arros</name><uri>http://www.blogger.com/profile/15115335540591605422</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://1.bp.blogspot.com/_-cffNDQPfcc/ST9DFOnnX7I/AAAAAAAAAGY/hhLx1rQqh54/S220/1_998498248l-edit.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_-cffNDQPfcc/ST9L5xcrRSI/AAAAAAAAAGw/Kt04yyf0xo4/s72-c/twa0143l.jpg" height="72" width="72" /><thr:total>5</thr:total><feedburner:origLink>http://amrurosyada.blogspot.com/2008/12/koneksi-sang-gajah-dengan-sang-kopi.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0AARHY8cCp7ImA9WxVSFEo.&quot;"><id>tag:blogger.com,1999:blog-6639474468897837856.post-2996709751439111383</id><published>2008-12-06T16:37:00.009+07:00</published><updated>2009-01-09T11:35:45.878+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-09T11:35:45.878+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java Tech" /><title>Mengenal Annotation pada Java Programing</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_-cffNDQPfcc/STpPn1oeFvI/AAAAAAAAAFY/ms--ceuzn_s/s1600-h/Misc+Coffee+Cup.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_-cffNDQPfcc/STpPn1oeFvI/AAAAAAAAAFY/ms--ceuzn_s/s320/Misc+Coffee+Cup.JPG" alt="" id="BLOGGER_PHOTO_ID_5276617459248273138" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Assalamu'alaikum... dah lama ternyata ngga ngpost di blog kesayanganku ini, dari pada ngga posting2 mending ngeshare ilmu aja deh... ini tentang Annotation tapi bukan tentang &lt;a href="http://klik.annots.com/"&gt;annots&lt;/a&gt; yang ini.&lt;br /&gt;Pengennya mau gesend artikelnya ke &lt;a href="http://ilmukomputer.com/"&gt;ilmukomputer.com&lt;/a&gt;, tapi ngga tau kok tiba2 usernya ngga bisa kepake, hilang kali ya gara2 dihack kemaren.&lt;br /&gt;&lt;br /&gt;yowislah langsung aja..&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Annotation&lt;/span&gt; merupakan informasi data tentang kode program tetapi tidak akan berdampak secara langsung pada kode, atau lebih dikenal dengan nama meta tag.&lt;br /&gt;Lalu apa kegunaan dari annotation ?&lt;br /&gt;1.Memberikan informasi kepada compiler - Annotation dapat digunakan oleh compiler untuk mendeteksi error atau suppress warning.&lt;br /&gt;2.Compiler-time dan deployment-time processing - Software tools dapat memproses informasi dari annotation untuk men-generate code, XML file, dan masih banyak lagi.&lt;br /&gt;3.Runtime processing - Beberapa annotation akan diperiksa pada waktu runtime.&lt;br /&gt;&lt;br /&gt;Annotation dapat diaplikasikan pada class, field, method, dan elemen program yang lain.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Annotation sering berdiri sendiri,dan mempunyai elemen baik dengan nama ataupun tidak :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt; @Author(&lt;br /&gt; name = "Benjamin Franklin",&lt;br /&gt; date = "3/27/2003"&lt;br /&gt;)&lt;br /&gt;class MyClass() { }&lt;br /&gt;&lt;br /&gt;  atau&lt;br /&gt;&lt;br /&gt;@SuppressWarnings(value="unchecked")&lt;br /&gt;void myMethod() { } &lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Jika hanya ada satu elemen saja bernama "value," maka nama dapat dihilangkan, sbb :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt; @SuppressWarnings("unchecked")&lt;br /&gt;void myMethod() { }&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Begitu juga jika annotation tidak mempunyai elemen, tanda kurung dapat dihilangkan, sbb :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt; @Override&lt;br /&gt;void myMethod() { }&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Documentation&lt;br /&gt;Annotation sering digunakan untuk menggantikan komentar pada program.&lt;br /&gt;Pada program biasanya menambahkan komentar pada program untuk memberikan informasi2 yang penting, sbb :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt; public class Generation3List extends Generation2List {&lt;br /&gt;&lt;br /&gt; // Author: John Doe&lt;br /&gt; // Date: 3/17/2002&lt;br /&gt; // Current revision: 6&lt;br /&gt; // Last modified: 4/12/2004&lt;br /&gt;  // By: Jane Doe&lt;br /&gt;    // Reviewers: Alice, Bill, Cindy&lt;br /&gt;&lt;br /&gt;    // class code goes here&lt;br /&gt;&lt;br /&gt;} &lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Untuk menambahkan dengan annotation seperti pada komentar pada class Generation3List diatas, kita harus mendefinisikan tipe annotation. Sintaknya sebagai berikut :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;@interface ClassPreamble {&lt;br /&gt;    String author();&lt;br /&gt;    String date();&lt;br /&gt;    int currentRevision() default 1;&lt;br /&gt;    String lastModified() default "N/A";&lt;br /&gt;    String lastModifiedBy() default "N/A";&lt;br /&gt;    String[] reviewers();  // Note use of array&lt;br /&gt;} &lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;jika dilihat sekilas pendefinisian tipe annotation mirip dengan pendefinisian interface, bedanya pada tipe annotation didahului dengan karakter @ (@ = "AT" sebagai tipe Annotation) dan bisa diberi nilai default.&lt;br /&gt;&lt;br /&gt;Kemudian kita bisa mendefinisikan tipe annotation pada class Generation3List, sbb :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;@ClassPreamble (&lt;br /&gt;    author = "John Doe",&lt;br /&gt;    date = "3/17/2002",&lt;br /&gt;    currentRevision = 6,&lt;br /&gt;    lastModified = "4/12/2004",&lt;br /&gt;    lastModifiedBy = "Jane Doe"&lt;br /&gt;    reviewers = {"Alice", "Bob", "Cindy"} // Note array notation&lt;br /&gt;)&lt;br /&gt;public class Generation3List extends Generation2List {&lt;br /&gt;&lt;br /&gt;// class code goes here&lt;br /&gt;&lt;br /&gt;} &lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Catatan : Untuk membuat informasi2 pada ClassPreamble muncul pada saat pembuatan javadoc, kita harus mendefinisikan annotasi @Documented, sbb:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt; import java.lang.annotation.*; // import this to use @Documented&lt;br /&gt;&lt;br /&gt;@Documented&lt;br /&gt;@interface ClassPreamble {&lt;br /&gt;&lt;br /&gt;    // Annotation element definitions&lt;br /&gt; &lt;br /&gt;} &lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Annotation digunakan oleh compiler&lt;br /&gt;Ada tiga tipe annotation yang secara automatis akan didefinisikan : @Deprecated, @Override, dan @SuppressWarnings.&lt;br /&gt;@Deprecated -- Digunakan untuk menandai bahwa elemen yang ditandai sudah tidak digunakan lagi, mungkin karena suatu alasan dari developer. Kita menggunakan tag @deprecated untuk mendocumentasikannya, sbb :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;  // Javadoc comment follows&lt;br /&gt;     /**&lt;br /&gt;      * @deprecated&lt;br /&gt;      * explanation of why it was deprecated&lt;br /&gt;      */&lt;br /&gt;     @Deprecated&lt;br /&gt;     static void deprecatedMethod() { }&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;@Override -- Digunakan untuk menandai bahwa method merupakan method yang di-override dari supperclass atau interface.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt; // mark method as a superclass method&lt;br /&gt;    // that has been overridden&lt;br /&gt;    @Override&lt;br /&gt;    int overriddenMethod() { } &lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;compiler akan menampilkan kesalahan jika terjadi kesalahan pada waktu melakukan overriden.&lt;br /&gt;&lt;br /&gt;@SuppressWarnings -- Digunakan untuk tidak memunculkan pesan peringatan, misalnya kita menggunakan method yang telah deprecated, kita bisa menggunakan annotation ini untuk menghilangkan pesan peringatan bahwa method yang kita pakai adalah deprecated :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;  // use a deprecated method and tell&lt;br /&gt;    // compiler not to generate a warning&lt;br /&gt;    @SuppressWarnings("deprecation")&lt;br /&gt;     void useDeprecatedMethod() {&lt;br /&gt;         objectOne.deprecatedMethod(); //deprecation warning - suppressed&lt;br /&gt;    } &lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;agar annotation bisa dilihat saat runtime, maka gunakan @Retention(RetentionPolicy.RUNTIME), sbb:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt; import java.lang.annotation.*;&lt;br /&gt;&lt;br /&gt;@Retention(RetentionPolicy.RUNTIME)&lt;br /&gt;@interface AnnotationForRuntime {&lt;br /&gt;&lt;br /&gt;    // Elements that give information&lt;br /&gt;    // for runtime processing&lt;br /&gt; &lt;br /&gt;}&lt;/blockquote&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/6639474468897837856-2996709751439111383?l=amrurosyada.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/IxXW1VcK9-wjMQyigkulSXE5dIE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/IxXW1VcK9-wjMQyigkulSXE5dIE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/IxXW1VcK9-wjMQyigkulSXE5dIE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/IxXW1VcK9-wjMQyigkulSXE5dIE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Rosyadacode/~4/-37w9wJdNxQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://amrurosyada.blogspot.com/feeds/2996709751439111383/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://amrurosyada.blogspot.com/2008/12/mengenal-annotation-pada-java.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default/2996709751439111383?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default/2996709751439111383?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Rosyadacode/~3/-37w9wJdNxQ/mengenal-annotation-pada-java.html" title="Mengenal Annotation pada Java Programing" /><author><name>arros</name><uri>http://www.blogger.com/profile/15115335540591605422</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://1.bp.blogspot.com/_-cffNDQPfcc/ST9DFOnnX7I/AAAAAAAAAGY/hhLx1rQqh54/S220/1_998498248l-edit.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_-cffNDQPfcc/STpPn1oeFvI/AAAAAAAAAFY/ms--ceuzn_s/s72-c/Misc+Coffee+Cup.JPG" height="72" width="72" /><thr:total>4</thr:total><feedburner:origLink>http://amrurosyada.blogspot.com/2008/12/mengenal-annotation-pada-java.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0ADRXw6eSp7ImA9WxVSFEo.&quot;"><id>tag:blogger.com,1999:blog-6639474468897837856.post-7284477965347669187</id><published>2008-09-22T16:07:00.005+07:00</published><updated>2009-01-09T11:36:14.211+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-09T11:36:14.211+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Python" /><title>Parallel Computing in Python using PYRO</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_-cffNDQPfcc/SNdnjUjjuaI/AAAAAAAAAFQ/tUS-qLRMPGk/s1600-h/pyro.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_-cffNDQPfcc/SNdnjUjjuaI/AAAAAAAAAFQ/tUS-qLRMPGk/s320/pyro.jpg" alt="" id="BLOGGER_PHOTO_ID_5248777747234535842" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Image di garuk dari &lt;a href="http://schwehr.org/blog/attachments/2007-04/pyro.jpg"&gt;http://schwehr.org/blog/attachments/2007-04/pyro.jpg&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Setelah beberapa hari berkecimpung didunia python dan mencari-cari bahan2 di dunia yang tidak nyata a.k.a dunia maya a.k.a internet, ternyata banyak sekali metode-metode maupun library-library yang bisa digunakan untuk parallel computing bisa menggunakan RMI (java technologi), xmlrpc (xml), corba, dan masih banyak lagi (tak usah sebutin semua ntar malah menuh-menuhin postinggan).&lt;br /&gt;Dengan python kita juga bisa menggunakan XMLRPC yang manggunakan metode remote transaksinya menggunakan xml dan sudah ditulis di &lt;a href="http://ilmukomputer.com/2007/02/15/distributed-programming-dengan-python/"&gt;ilmukomputer oleh mas Noprianto kalo ngga salah judule distributed programming dengan python&lt;/a&gt;.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Abis surfing2 dan menghabiskan dua galon kopi, satu ton kacang akhirnya ada juga metode yang mirip dengan RMI, dan corba meskipun jika dibandingkan dengan corba masih kalah tapi klo pake PYRO lebih simple, gampang :D (cari yang gampang ga sabaran jeh..).&lt;br /&gt;Behahahahahaha... bukannya membanding-bandingkan satu sama lain, tapi alangkah baiknya jika satu bahasa pemrograman dengan bahasa pemrograman yang lain saling berintegrasi dan menghasilkan teknologi baru...&lt;br /&gt;Yoo kita bareng-bareng bekerja sama sharing ilmu bikin teknologi baru, Knowledge belong to the world but money belong to my pocket hehehe... just kidding.&lt;br /&gt;&lt;br /&gt;   &lt;span style="font-weight: bold;"&gt;Apakah PYRO ?&lt;/span&gt;&lt;br /&gt;   PYRO adalah kependekan dari PYthon Remote Object. PYRO merupakan sistem teknologi distribusi objek yang powerful, yang didesain mudah untuk digunakan. Tak perlu khawatir tentang pembuatan kode-kode komunikasi jaringan, ketika menggunakan PYRO kita tinggal menulis kode-kode program seperti membuat objek seperti halnya pembuatan program python biasa. Dengan sedikit kode ekstra, PYRO akan menangani komunikasi jaringan antara objek- objek yang terpisah dalam mesin-mesin komputer yang berbeda. Semua detail dari socket programming akan ditangani PYRO, kita tinggal memanggil method pada remote objek sebagaimana kita memanggil local objek.&lt;br /&gt;   PYRO terdiri dari bentukan objek oriented RPC (Remote Procedure Call). Kita dapat menggunakan PYRO dengan sistem tunggal tetapi juga digunakan untuk IPC. PYRO menyerupai RMI (Remote Procedure Call) pada Java. PYRO lebih mirip dengan CORBA (Common Object Request Broker Architecture) yang mana sistem dan bahasa teknologi objek distribusi berdiri sendiri dan lebih lengkap jika dibanding PYRO atau RMI. Tetapi PYRO simpel, kecil, fun dan free. Untuk mendapatkan dokumentasi tentang PYRO dan download paket bisa diperoleh dari &lt;a href="http://pyro.sourceforge.net/"&gt;http://pyro.sourceforge.net/&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;PYRO teknologi&lt;/span&gt;&lt;br /&gt;1. PYRO protocol didasarkan atas TCP/IP menggunakan pickle&lt;br /&gt;2. Dapat digunakan pada jaringan yang heterogen (LAN. WAN), kluster begitu juga untuk mesin multiprosessor.&lt;br /&gt;3. Server dan client dapat saling bertukar aturan (callback)&lt;br /&gt;4. Penggunaannya seperti python biasa&lt;br /&gt;5. Konfigurasi yang mudah&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Prinsip dari PYRO&lt;/span&gt;&lt;br /&gt;PYRO menggunakan name server (NS) untuk menemukan remote objek:&lt;br /&gt;- Remote objek harus diregister menggunakan NS&lt;br /&gt;- Client mencari NS remote objek untuk mendapatkan URI remote objek (seperti halnya WWW URL)&lt;br /&gt;Client menggunakan proxy untuk memforward method call ke remote objek. Terdapat tiga jenis proxi:&lt;br /&gt;- Static proxy&lt;br /&gt;- Dinamic proxy dan&lt;br /&gt;- Dinamic proxy dengan atribut akses suport&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Contoh simpel :&lt;/span&gt;&lt;br /&gt;Contoh dari distribusi yang mendemonstrasikan prinsip dari PYRO.&lt;br /&gt;- tst.py  : Remote kode yang akan melakukan komputasi/perhitungan.&lt;br /&gt;- server.py  : Server yang mengijinkan mengeksekusi ke tst.py&lt;br /&gt;- client.py : Client yang memanggil method dari tst.py secara remote&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;# tst.py&lt;br /&gt;# class ini yang akan diakses secara remote.&lt;br /&gt;class testclass:&lt;br /&gt;   def mul(s, arg1, arg2): return arg1*arg2&lt;br /&gt;   def add(s, arg1, arg2): return arg1+arg2&lt;br /&gt;   def sub(s, arg1, arg2): return arg1-arg2&lt;br /&gt;   def div(s, arg1, arg2): return arg1/arg2&lt;br /&gt;   def error(s):&lt;br /&gt;       x=foo()&lt;br /&gt;       x.crash()&lt;br /&gt;class foo:&lt;br /&gt;   def crash(s):&lt;br /&gt;       s.crash2('going down...')&lt;br /&gt;   def crash2(s, arg):&lt;br /&gt;       # statemen ini sengaja untuk mencoba jika program terjadi kesalahan:&lt;br /&gt;       x=arg/2&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;# server.py&lt;br /&gt;# class yang mengijinkan untuk mengakses tst.py&lt;br /&gt;import Pyro.core&lt;br /&gt;import Pyro.naming&lt;br /&gt;import tst&lt;br /&gt;&lt;br /&gt;class testclass(Pyro.core.ObjBase, tst.testclass):&lt;br /&gt;def __init__(self):&lt;br /&gt; Pyro.core.ObjBase.__init__(self)&lt;br /&gt; Pyro.core.initServer()&lt;br /&gt;&lt;br /&gt;ns=Pyro.naming.NameServerLocator().getNS()&lt;br /&gt;daemon=Pyro.core.Daemon()&lt;br /&gt;daemon.useNameServer(ns)&lt;br /&gt;uri=daemon.connect(testclass(),"simple")&lt;br /&gt;print "Server is ready."&lt;br /&gt;daemon.requestLoop()&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;# client.py&lt;br /&gt;import Pyro.util&lt;br /&gt;import Pyro.core&lt;br /&gt;Pyro.core.initClient()&lt;br /&gt;test = Pyro.core.getProxyForURI("PYRONAME://simple")&lt;br /&gt;print test.mul(111,9)&lt;br /&gt;print test.add(100,222)&lt;br /&gt;print test.sub(222,100)&lt;br /&gt;print test.div(2.0,9.0)&lt;br /&gt;print test.mul('.',10)&lt;br /&gt;print test.add('String1','String2')&lt;br /&gt;print '*** invoking server method that crashes ***'&lt;br /&gt;print test.error()&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;*Note : Dapat dijalankan pada satu komputer secara otomatis akan bounding ke localhost&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Menjalankan program dengan cara :&lt;/span&gt;&lt;br /&gt;1. Jalankan PYRO name server dahulu pada komputer 1 dengan menjalankan perintah pada console/command prompt "pyro-ns"&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;amru@icEcubE:~$ pyro-ns&lt;br /&gt;*** Pyro Name Server ***&lt;br /&gt;Pyro Server Initialized. Using Pyro V3.7&lt;br /&gt;URI is: PYRO://169.254.10.233:9090/a9fe0ae9017c2f9e44b865150e28f3da&lt;br /&gt;URI written to: ...\Pyro-3.4\examples\simple\Pyro_NS_URI&lt;br /&gt;Name Server started.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;2. Jalankan server pada komputer 2 dengan menjalankan :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;amru@icEcubE:~/Documents/distributed$ python server.py&lt;br /&gt;Pyro Client Initialized. Using Pyro V3.7&lt;br /&gt;Pyro Server Initialized. Using Pyro V3.7&lt;br /&gt;Server is ready.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;3. Jalankan client pada komputer 3 dengan menjalankan :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;amru@icEcubE:~/Documents/distributed$ python client.py&lt;br /&gt;Pyro Client Initialized. Using Pyro V3.7&lt;br /&gt;999&lt;br /&gt;322&lt;br /&gt;122&lt;br /&gt;0.222222222222&lt;br /&gt;..........&lt;br /&gt;String1String2&lt;br /&gt;*** invoking server method that crashes ***&lt;br /&gt;Traceback (most recent call last):&lt;br /&gt; File "client.py", line 12, in &lt;module&gt;&lt;br /&gt;   print test.error()&lt;br /&gt; File "/usr/lib/python2.5/site-packages/Pyro/core.py", line 390, in __call__&lt;br /&gt;   return self.__send(self.__name, args, kwargs)&lt;br /&gt; File "/usr/lib/python2.5/site-packages/Pyro/core.py", line 468, in _invokePYRO&lt;br /&gt;   return self.adapter.remoteInvocation(name, constants.RIF_VarargsAndKeywords, vargs, kargs)&lt;br /&gt; File "/usr/lib/python2.5/site-packages/Pyro/protocol.py", line 491, in remoteInvocation&lt;br /&gt;   answer.raiseEx()&lt;br /&gt; File "/usr/lib/python2.5/site-packages/Pyro/errors.py", line 81, in raiseEx&lt;br /&gt;   raise self.excObj&lt;br /&gt;TypeError: ("unsupported operand type(s) for /: 'str' and 'int'", 'This error occured remotely (Pyro). Remote traceback is available.')&lt;/module&gt;&lt;/blockquote&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/6639474468897837856-7284477965347669187?l=amrurosyada.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/GvhfCSvLk1_OITBrMDNcvGfyQxQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GvhfCSvLk1_OITBrMDNcvGfyQxQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/GvhfCSvLk1_OITBrMDNcvGfyQxQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GvhfCSvLk1_OITBrMDNcvGfyQxQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Rosyadacode/~4/wmpTrwQnoio" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://amrurosyada.blogspot.com/feeds/7284477965347669187/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://amrurosyada.blogspot.com/2008/09/parallel-computing-in-python-using-pyro.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default/7284477965347669187?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6639474468897837856/posts/default/7284477965347669187?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Rosyadacode/~3/wmpTrwQnoio/parallel-computing-in-python-using-pyro.html" title="Parallel Computing in Python using PYRO" /><author><name>arros</name><uri>http://www.blogger.com/profile/15115335540591605422</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://1.bp.blogspot.com/_-cffNDQPfcc/ST9DFOnnX7I/AAAAAAAAAGY/hhLx1rQqh54/S220/1_998498248l-edit.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_-cffNDQPfcc/SNdnjUjjuaI/AAAAAAAAAFQ/tUS-qLRMPGk/s72-c/pyro.jpg" height="72" width="72" /><thr:total>4</thr:total><feedburner:origLink>http://amrurosyada.blogspot.com/2008/09/parallel-computing-in-python-using-pyro.html</feedburner:origLink></entry></feed>

