<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5217372432017247701</id><updated>2012-02-10T09:15:38.184+07:00</updated><category term='Stories'/><category term='First Entry'/><category term='Objehttp://www.blogger.com/img/blank.gifctive-C'/><category term='Subversion'/><category term='Objective-C'/><category term='Beautiful Mind'/><category term='Ubuntu'/><category term='Java'/><category term='Oracle'/><category term='Curriculum Vitae'/><category term='Cobol'/><category term='svn'/><category term='Cassandra'/><title type='text'>Stay the Same</title><subtitle type='html'>Some things need to be changed,
some have to be changed,
but some have to stay the same...</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default?start-index=101&amp;max-results=100'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>109</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-5849407270003343012</id><published>2012-02-10T08:16:00.002+07:00</published><updated>2012-02-10T09:15:38.197+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Objehttp://www.blogger.com/img/blank.gifctive-C'/><title type='text'>Lesson Learnt from iPhone Development</title><content type='html'>Last week was quite tough for me dealing with the project I was working on. The project was quite simple actually. It was released on App Store and the client decided to make minor changes to the application. I made the requested changes and the application was resubmitted to the App Store. Then we got Apple's email saying that the app was rejected. The email said:&lt;br /&gt;&lt;br /&gt;"We found that your app does not follow the iOS Data Storage Guidelines &lt;a href="https://developer.apple.com/icloud/documentation/data-storage/"&gt;https://developer.apple.com/icloud/documentation/data-storage/&lt;/a&gt;, which is not in compliance with the App Store Review Guidelines &lt;a href="https://developer.apple.com/appstore/resources/approval/guidelines.html#functionality"&gt;https://developer.apple.com/appstore/resources/approval/guidelines.html#functionality&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;In particular, we found that the app is storing too much data, which can be recreated, in the incorrect location."&lt;br /&gt;&lt;br /&gt;I have to admit that I don't visit Apple Developer Portal regularly to check if there are any update on their Developer Guidelines. So the thing is our data was stored in document folder and I need to move application's data to library/cache folder for prior iOS 5.0.1 and setting "do not back up" attribute for iOS 5.0.1 above. Thanks to iCloud, iSun, iMoon and whatever it is on the sky above.&lt;br /&gt;&lt;br /&gt;There was another thing screwed me, the core data. Core data needs versioning if you happen to change the data structure like adding columns, changing relationships, renaming tables, etc. Apple has documentation about it but don't expect everything goes smoothly as there are many things undocumented. If you find any errors, stackoverflow.com is your help.&lt;br /&gt;&lt;br /&gt;Last thing is, I think it is always a good idea to introduce a User Default value that holds your application version early when you start developing your app. It is useful if you need to trace what application version installed on a device. Usually you need this when there are any update for your app.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-5849407270003343012?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/5849407270003343012/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=5849407270003343012' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/5849407270003343012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/5849407270003343012'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2012/02/lesson-learnt-from-iphone-development.html' title='Lesson Learnt from iPhone Development'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-4957265179913687868</id><published>2011-12-18T10:41:00.004+07:00</published><updated>2011-12-18T10:51:15.797+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>SWT JFace</title><content type='html'>&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51); font-family: Trebuchet, 'Trebuchet MS', Arial, sans-serif; font-size: 13px; line-height: 19px; background-color: rgb(255, 255, 255); "&gt;Finally finished writing SWT simple application. The PDF and source code compressed in rar are provided below:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;embed src="http://www.box.com//static/flash/box_explorer.swf?widget_hash=66zd63hxisog4zbb2rcd&amp;v=0&amp;cl=0&amp;s=0" width="460" height="225" wmode="transparent" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-4957265179913687868?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/4957265179913687868/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=4957265179913687868' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/4957265179913687868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/4957265179913687868'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2011/12/swt-jface.html' title='SWT JFace'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-6747059407106222759</id><published>2011-12-16T14:02:00.003+07:00</published><updated>2011-12-16T14:15:09.357+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Subversion'/><title type='text'>Subversion</title><content type='html'>I had problem with XCode 4.2 source control recently. It just keeps saying "Host unreachable". It worked perfect in XCode 3.2.5. Spending some time just to figure out what happened was completely waste of time as the Subversion Server host is 100% reachable. So I decided to download separate subversion client for mac. There are some subversion clients out there for mac but finally I choose RapidSVN. It's good and has friendly user interface.&lt;br /&gt;&lt;br /&gt;RapidSVN can be found &lt;a href="http://rapidsvn.tigris.org/"&gt;here&lt;/a&gt;. For the server I prefer &lt;a href="http://www.visualsvn.com/"&gt;VisualSVN &lt;/a&gt;for windows. For subversion client at windows the one and only &lt;a href="http://tortoisesvn.tigris.org/"&gt;TortoiseSVN &lt;/a&gt;is still unbeatable.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-6747059407106222759?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/6747059407106222759/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=6747059407106222759' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/6747059407106222759'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/6747059407106222759'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2011/12/subversion.html' title='Subversion'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-7266252989533215763</id><published>2011-11-08T16:11:00.004+07:00</published><updated>2011-11-26T13:26:50.981+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>GWT 2</title><content type='html'>Finally finished writing GWT simple application. There are four docs here.&lt;br /&gt;1. GWT Getting Started shows you how to create a GWT app in Eclipse.&lt;br /&gt;2. GWT Client Example shows you how to create client side code in GWT.&lt;br /&gt;3. GWT Server Example shows you how to create server side code in GWT.&lt;br /&gt;4. GWT Advance Example shows you how to integrate GWT and some other Google libs.&lt;br /&gt;&lt;br /&gt;&lt;embed src="http://www.box.net//static/flash/box_explorer.swf?widget_hash=6oyb2c9s9ierkoirhzfa&amp;amp;v=0&amp;amp;cl=0&amp;amp;s=0" wmode="transparent" type="application/x-shockwave-flash" height="250" width="460"&gt;&lt;/embed&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-7266252989533215763?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/7266252989533215763/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=7266252989533215763' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/7266252989533215763'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/7266252989533215763'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2011/11/gwt-2.html' title='GWT 2'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-3318582338036667762</id><published>2011-10-18T08:12:00.009+07:00</published><updated>2011-10-18T15:32:57.015+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Generic</title><content type='html'>Generic can be placed in class/interface declaration, variable declaration, method parameter or method return value.&lt;br /&gt;&lt;br /&gt;In method return value :&lt;br /&gt;public static &amp;lt;B&amp;gt; List&amp;lt;B&amp;gt; aMethod() {...} // any reference can replace B.&lt;br /&gt;&lt;br /&gt;In method parameter :&lt;br /&gt;public static &amp;lt;B&amp;gt; List&amp;lt;B&amp;gt; aMethod(B b) {...} // any reference can replace B.&lt;br /&gt;public &amp;lt;B&amp;gt; void aMethod(B b) {...} // any reference can replace B&lt;br /&gt;public &amp;lt;B extends Number&amp;gt; void aMethod(B b) {...} // B must be subclass of Number&lt;br /&gt;&lt;br /&gt;In variable declaration :&lt;br /&gt;List&amp;lt;String&amp;gt; list = new ArrayList&amp;lt;String&amp;gt;(); // list of String, no other type&lt;br /&gt;&lt;br /&gt;In interface or class declaration :&lt;br /&gt;interface IDao &amp;lt;X extends IEntity&amp;gt; {...} // X must be subclass of IEntity&lt;br /&gt;interface IBidDao extends IDao&amp;lt;Bid&amp;gt; // Bid replaces X and Bid is subclass of IEntity&lt;br /&gt;class BaseDao&amp;lt;X extends IEntity&amp;gt; implements IDao&amp;lt;X&amp;gt; // BaseDao takes X which is then substitutes X in IDao&lt;br /&gt;&lt;br /&gt;We can put ? to replace B or X above, which also means any but with restrictions:&lt;br /&gt;&lt;br /&gt;List&amp;lt;?&amp;gt; list = new ArrayList&amp;lt;Integer&amp;gt;(); means any class can fit in, and as for List, we can't add object to the list. In general, all of the methods in List that take the generic object as parameter are not applicable (compile error as in add, addAll, etc).&lt;br /&gt;&lt;br /&gt;List&amp;lt;? extends Number&amp;gt; list = new ArrayList&amp;lt;Integer&amp;gt;(); means any class that extends Number can fit in, and as for List, we can't add object to the list. In general, all of the methods in List that take the generic object as parameter are not applicable (compile error as in add, addAll, etc).&lt;br /&gt;&lt;br /&gt;List&amp;lt;? super Number&amp;gt; list = new ArrayList&amp;lt;Object&amp;gt;(); means any class on top of Number inheritance hierarchy can fit in, and as for List, we can add object to the list as opposed to &amp;lt;?&amp;gt; or &amp;lt;? extends Number&amp;gt;.&lt;br /&gt;&lt;br /&gt;The ? and super keyword in generic only apply to variable declaration or method parameter not to class declaration:&lt;br /&gt;List&amp;lt;? extends Number&amp;gt; list = new ArrayList&amp;lt;Integer&amp;gt;();&lt;br /&gt;public void aMethod(List&amp;lt;? extends Number&amp;gt; list) {...}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-3318582338036667762?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/3318582338036667762/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=3318582338036667762' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/3318582338036667762'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/3318582338036667762'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2011/10/generic.html' title='Generic'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-4195656893345370645</id><published>2011-10-10T13:17:00.002+07:00</published><updated>2011-10-10T17:19:56.600+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Java Collection</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-PhL1OlTGiVo/TpLGnpov9kI/AAAAAAAAAWk/lhoFq9na8lE/s1600/java_collection.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 262px;" src="http://2.bp.blogspot.com/-PhL1OlTGiVo/TpLGnpov9kI/AAAAAAAAAWk/lhoFq9na8lE/s320/java_collection.PNG" alt="" id="BLOGGER_PHOTO_ID_5661806066052101698" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;List &lt;/span&gt;- List of things.&lt;br /&gt;1. &lt;span style="font-style: italic;"&gt;ArrayList  &lt;/span&gt;-&amp;gt; Growable array. Good for fast iteration but not for a lot of insertion and deletion.&lt;br /&gt;2. &lt;span style="font-style: italic;"&gt;Vector     &lt;/span&gt;-&amp;gt; Same as ArrayList but its methods are synchronized for thread safety.&lt;br /&gt;3. &lt;span style="font-style: italic;"&gt;LinkedList &lt;/span&gt;-&amp;gt; Same as ArrayList. Good for fast insertion and deletion but not for iteration.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Set &lt;/span&gt;- Unique things&lt;br /&gt;1. &lt;span style="font-style: italic;"&gt;HashSet       &lt;/span&gt;-&amp;gt; Collection with no duplicate objects and unpredictable iteration order.&lt;br /&gt;2. &lt;span style="font-style: italic;"&gt;LinkedHashSet &lt;/span&gt;-&amp;gt; Ordered version of HashSet, ordered in which they are inserted.&lt;br /&gt;3. &lt;span style="font-style: italic;"&gt;TreeSet       &lt;/span&gt;-&amp;gt; Sorted Set by natural order using Red-Black tree structure.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Map &lt;/span&gt;- Things with unique ID&lt;br /&gt;1. &lt;span style="font-style: italic;"&gt;HashMap       &lt;/span&gt;-&amp;gt; The simplest map class.&lt;br /&gt;2. &lt;span style="font-style: italic;"&gt;Hashtable     &lt;/span&gt;-&amp;gt; Same as HashMap but its methods are synchronized for thread safety.&lt;br /&gt;3. &lt;span style="font-style: italic;"&gt;LinkedHashMap &lt;/span&gt;-&amp;gt; Ordered version of HashMap, ordered in which they are inserted.&lt;br /&gt;4. &lt;span style="font-style: italic;"&gt;TreeMap       &lt;/span&gt;-&amp;gt; Sorted Map by natural order.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Queue &lt;/span&gt;- Things arranged by the order in which they are to be processed&lt;br /&gt;1. &lt;span style="font-style: italic;"&gt;PriorityQueue&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-4195656893345370645?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/4195656893345370645/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=4195656893345370645' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/4195656893345370645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/4195656893345370645'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2011/10/java-collection.html' title='Java Collection'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-PhL1OlTGiVo/TpLGnpov9kI/AAAAAAAAAWk/lhoFq9na8lE/s72-c/java_collection.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-988520697699231834</id><published>2011-10-10T10:00:00.006+07:00</published><updated>2011-10-10T12:23:46.968+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Comparable &amp; Comparator</title><content type='html'>When we add two objects in a collection that doesn't allow duplication as in Set, we have to override the Objet.equals() method as well as Object.hashCode() method. But now we want to make all objects in a List or array sortable, that's why we have to deal with two interfaces: Comparable and Comparator.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Comparable&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Implements Comparable interface in the bean class to make the bean comparable:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public class SerializableBean implements Comparable&lt;serializablebean&gt; {&lt;/serializablebean&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    private String name;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public String getName() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        return name;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public void setName(String name) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        this.name = name;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    @Override&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public int compareTo(SerializableBean o) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        return name.compareTo(o.name);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now we can sort the list or array containing the beans using:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Collections.sort(list);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Arrays.sort(arr);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We can also find an index of an object inside the collection using binary search tree after sorting it:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Collections.binarySearch(list, key);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Arrays.binarySearch(arr, key);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Comparator&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Create a new class that implements Comparator interface:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public class CompareByName implements Comparator&lt;serializablebean&gt; {&lt;/serializablebean&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    @Override&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public int compare(SerializableBean bean1, SerializableBean bean2) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        return bean1.getName().compareTo(bean2.getName());&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now we can use it to sort a list or array:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Collections.sort(list, new CompareByName());&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Arrays.sort(arr, new CompareByName());&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;We can also find an index of an object inside the collection using binary search tree after sorting it:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Collections.binarySearch(list, key, new CompareByName());&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(0, 102, 0);"&gt;Arrays.binarySearch(arr, key, new CompareByName());&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-988520697699231834?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/988520697699231834/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=988520697699231834' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/988520697699231834'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/988520697699231834'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2011/10/comparable-comparator.html' title='Comparable &amp; Comparator'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-5277177514052388655</id><published>2011-10-06T12:27:00.004+07:00</published><updated>2011-10-06T13:54:40.136+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>SCJP 6 Part IX - Formatting String with Formatter</title><content type='html'>Here is the format&lt;br /&gt;%[&lt;span style="color: rgb(255, 0, 0);"&gt;arg_index&lt;/span&gt;$][&lt;span style="color: rgb(153, 51, 153);"&gt;flags&lt;/span&gt;][&lt;span style="color: rgb(51, 102, 255);"&gt;width&lt;/span&gt;][.&lt;span style="color: rgb(0, 102, 0);"&gt;precision&lt;/span&gt;]&lt;span style="color: rgb(153, 0, 0);"&gt;conversion_char&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;arg_index&lt;/span&gt;&lt;br /&gt;An integer followed directly by a $, this indicates which argument should be printed in this position.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(153, 51, 153);"&gt;flags&lt;/span&gt;&lt;br /&gt;"-" Left justify this argument&lt;br /&gt;"+" Include a sign (+ or -) with this argument&lt;br /&gt;"0" Pad this argument with zeroes&lt;br /&gt;"," Use locale-specific grouping separators&lt;br /&gt;"(" Enclose negative numbers in parentheses&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;width&lt;/span&gt;&lt;br /&gt;This value indicates the minimum number of characters to print.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;precision&lt;/span&gt;&lt;br /&gt;When formatting a floating-point number, precision indicates the number of digits to print after the decimal point.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;conversion_char&lt;/span&gt;&lt;br /&gt;The type of argument we'll be formatting.&lt;br /&gt;b boolean&lt;br /&gt;c char&lt;br /&gt;d integer&lt;br /&gt;f floating point&lt;br /&gt;s string&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Formatter formatter = new Formatter(System.out);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;// format int and use italian switzerland separator&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;formatter.format(new Locale("it", "ch"), "%,d", 1000000); // 1'000'000&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;// format int, use italian switzerland separator, and give parentheses for negative int&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;formatter.format(new Locale("it", "ch"), "%(,d", -1000000); // (1'000'000)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;// format int, use italian switzerland separator, and put a sign on it&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;formatter.format(new Locale("it", "ch"), "%,+d", 1000000); // +1'000'000&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-5277177514052388655?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/5277177514052388655/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=5277177514052388655' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/5277177514052388655'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/5277177514052388655'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2011/10/scjp-6-part-ix-formattingstring-with.html' title='SCJP 6 Part IX - Formatting String with Formatter'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-7792050540318913184</id><published>2011-10-06T12:00:00.002+07:00</published><updated>2011-10-06T12:21:07.996+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>SCJP 6 Part VIII - Regex With Scanner</title><content type='html'>&lt;span style="font-weight: bold;"&gt;// split string by a dot&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Scanner scanner = new Scanner("my.name.is.budi");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;scanner.useDelimiter("\\.");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;while (scanner.hasNext()) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;System.out.println(scanner.next());&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;result:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;my&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;name&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;is&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;budi&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;// split string by regex (zero or one comma) and a space&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Scanner scanner1 = new Scanner("1 isn't true, 0 isn't false, 2.0 is double");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;scanner1.useDelimiter("[,]? ");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;while (scanner1.hasNext()) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;// is the next token can be converted to int&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;if (scanner1.hasNextInt()) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;System.out.println("Found int : " + scanner1.nextInt());&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;// is the next token can be converted to boolean&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;} else if (scanner1.hasNextBoolean()) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;System.out.println("Found boolean : " + scanner1.nextBoolean());&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;// is the next token can be converted to double&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;} else if (scanner1.hasNextDouble()) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;System.out.println("Found double : " + scanner1.nextDouble());&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;} else {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;System.out.println(scanner1.next());&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;result:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Found int : 1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;isn't&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Found boolean : true&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Found int : 0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;isn't&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Found boolean : false&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Found double : 2.0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;is&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;double&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-7792050540318913184?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/7792050540318913184/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=7792050540318913184' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/7792050540318913184'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/7792050540318913184'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2011/10/scjp-6-part-viii-regex-with-scanner.html' title='SCJP 6 Part VIII - Regex With Scanner'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-3099665913493302746</id><published>2011-10-06T09:09:00.004+07:00</published><updated>2011-10-06T10:15:23.138+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>SCJP 6 Part VII - Regex</title><content type='html'>&lt;span style="color: rgb(0, 102, 0);"&gt;Pattern pattern = Pattern.compile("aba");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Matcher matcher = pattern.matcher("abababababababa");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;while (matcher.find()) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;System.out.println("aba has been found at index : " + matcher.start() + " " + matcher.group());&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;result:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;aba has been found at index : 0 aba&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;aba has been found at index : 4 aba&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;aba has been found at index : 8 aba&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;aba has been found at index : 12 aba&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Pattern pattern1 = Pattern.compile("\\d");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Matcher matcher1 = pattern1.matcher("jatim1");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;while (matcher1.find()) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;System.out.println("a digit has been found at index : " + matcher1.start() + " " + matcher1.group());&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;result:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;a digit has been found at index : 5 1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Pattern pattern2 = Pattern.compile("\\s");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Matcher matcher2 = pattern2.matcher("my name is ...");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;while (matcher2.find()) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;System.out.println("a space has been found at index : " + matcher2.start());&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;result:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;a space has been found at index : 2&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;a space has been found at index : 7&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;a space has been found at index : 10&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Pattern pattern3 = Pattern.compile("\\w");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Matcher matcher3 = pattern3.matcher("123 -&amp;gt; lets go");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;while (matcher3.find()) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;System.out.println("a letter or a digit or an underscore has been found at index : " + matcher3.start() + " " + matcher3.group());&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;result:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;a letter or a digit or an underscore has been found at index : 0 1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;a letter or a digit or an underscore has been found at index : 1 2&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;a letter or a digit or an underscore has been found at index : 2 3&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;a letter or a digit or an underscore has been found at index : 7 l&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;a letter or a digit or an underscore has been found at index : 8 e&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;a letter or a digit or an underscore has been found at index : 9 t&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;a letter or a digit or an underscore has been found at index : 10 s&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;a letter or a digit or an underscore has been found at index : 12 g&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;a letter or a digit or an underscore has been found at index : 13 o&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Pattern pattern4 = Pattern.compile("[ap]");&lt;br /&gt;Matcher matcher4 = pattern4.matcher("al pacino");&lt;br /&gt;while (matcher4.find()) {&lt;br /&gt;System.out.println("character 'a' or 'p' has been found at index : " + matcher4.start() + " " + matcher4.group());&lt;br /&gt;}&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;result:&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;character 'a' or 'p' has been found at index : 0 a&lt;br /&gt;character 'a' or 'p' has been found at index : 3 p&lt;br /&gt;character 'a' or 'p' has been found at index : 4 a&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Pattern pattern5 = Pattern.compile("[a-l]");&lt;br /&gt;Matcher matcher5 = pattern5.matcher("al pacino");&lt;br /&gt;while (matcher5.find()) {&lt;br /&gt;System.out.println("character 'a' until 'l' has been found at index : " + matcher5.start() + " " + matcher5.group());&lt;br /&gt;}&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;br /&gt;result:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;character 'a' until 'l' has been found at index : 0 a&lt;br /&gt;character 'a' until 'l' has been found at index : 1 l&lt;br /&gt;character 'a' until 'l' has been found at index : 4 a&lt;br /&gt;character 'a' until 'l' has been found at index : 5 c&lt;br /&gt;character 'a' until 'l' has been found at index : 6 i&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Pattern pattern6 = Pattern.compile("[a-lA-L]");&lt;br /&gt;Matcher matcher6 = pattern6.matcher("aL PaCiNo");&lt;br /&gt;&lt;br /&gt;while (matcher6.find()) {&lt;br /&gt;System.out.println("character 'a' until 'l' OR 'A' until 'L' has been found at index : " + matcher6.start() + " " + matcher6.group());&lt;br /&gt;}&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;return:&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;character 'a' until 'l' OR 'A' until 'L' has been found at index : 0 a&lt;br /&gt;character 'a' until 'l' OR 'A' until 'L' has been found at index : 1 L&lt;br /&gt;character 'a' until 'l' OR 'A' until 'L' has been found at index : 4 a&lt;br /&gt;character 'a' until 'l' OR 'A' until 'L' has been found at index : 5 C&lt;br /&gt;character 'a' until 'l' OR 'A' until 'L' has been found at index : 6 i&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Pattern pattern7 = Pattern.compile("\\d+");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Matcher matcher7 = pattern7.matcher("(031) 531 4249");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;while (matcher7.find()) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;System.out.println("a group of digit has been found at index : " + matcher7.start() + " " + matcher7.group());&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;result (+ means one or more, \\d+ means one or more digit):&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;a group of digit has been found at index : 1 031&lt;br /&gt;a group of digit has been found at index : 6 531&lt;br /&gt;a group of digit has been found at index : 10 4249&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Pattern pattern8 = Pattern.compile("0[xX]([0-9a-fA-F])+");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Matcher matcher8 = pattern8.matcher("0xffffff 0X778899 0X1 0XXX");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;while (matcher8.find()) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;System.out.println("a hexadecimal has been found at index : " + matcher8.start() + " " + matcher8.group());&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;result:&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;a hexadecimal has been found at index : 0 0xffffff&lt;br /&gt;a hexadecimal has been found at index : 9 0X778899&lt;br /&gt;a hexadecimal has been found at index : 18 0X1&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Pattern pattern9 = Pattern.compile("\\(\\d\\d\\d\\)([-\\s])?\\d\\d\\d([-\\s]?)\\d\\d\\d\\d");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Matcher matcher9 = pattern9.matcher("(031)-5314249, (031) 5314249, (031)5314249, (031)-531-4249, (031)-531 4249, (031) 531-42490000");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;while (matcher9.find()) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;System.out.println("a valid phone number has been found at index : " + matcher9.start() + " " + matcher9.group());&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;result (? means zero or one, &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;([-\\s])? means zero or one either - or space&lt;/span&gt;&lt;span&gt;):&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;a valid phone number has been found at index : 0 (031)-5314249&lt;br /&gt;a valid phone number has been found at index : 15 (031) 5314249&lt;br /&gt;a valid phone number has been found at index : 30 (031)5314249&lt;br /&gt;a valid phone number has been found at index : 44 (031)-531-4249&lt;br /&gt;a valid phone number has been found at index : 60 (031)-531 4249&lt;br /&gt;a valid phone number has been found at index : 76 (031) 531-4249&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Pattern pattern10 = Pattern.compile("[iI][nN][dD][oO]([a-zA-Z])*");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Matcher matcher10 = pattern10.matcher("Indonesia India indo123 indochina indo");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;while (matcher10.find()) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;System.out.println("a string start with indo has been found at index : " + matcher10.start() + " " + matcher10.group());&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;result (* means zero or more):&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;a string start with indo has been found at index : 0 Indonesia&lt;br /&gt;a string start with indo has been found at index : 16 indo&lt;br /&gt;a string start with indo has been found at index : 24 indochina&lt;br /&gt;a string start with indo has been found at index : 34 indo&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Pattern pattern11 = Pattern.compile("f...");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Matcher matcher11 = pattern11.matcher("fool feel fast fame fee flash");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;while (matcher11.find()) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;System.out.println(". is used to find any single char : " + matcher11.start() + " " + matcher11.group());&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;result:&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;. is used to find any single char : 0 fool&lt;br /&gt;. is used to find any single char : 5 feel&lt;br /&gt;. is used to find any single char : 10 fast&lt;br /&gt;. is used to find any single char : 15 fame&lt;br /&gt;. is used to find any single char : 20 fee&lt;br /&gt;. is used to find any single char : 24 flas&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/5217372432017247701-3099665913493302746?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/3099665913493302746/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=3099665913493302746' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/3099665913493302746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/3099665913493302746'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2011/10/scjp-6-part-vii-regex.html' title='SCJP 6 Part VII - Regex'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-3648856178713561953</id><published>2011-10-05T10:48:00.002+07:00</published><updated>2011-10-05T10:52:28.824+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>SCJP 6 Part VI - Locale - NumberFormat - DateFormat</title><content type='html'>&lt;span style="font-weight: bold;"&gt;// locale italy language in country switzerland&lt;/span&gt;&lt;br /&gt;       &lt;span style="color: rgb(0, 102, 0);"&gt;Locale localeItalyInSwitzerland = new Locale("it", "ch");&lt;/span&gt;&lt;br /&gt;     &lt;br /&gt;       &lt;span style="font-weight: bold;"&gt;// default DateFormat using SHORT format&lt;/span&gt;&lt;br /&gt;       &lt;span style="color: rgb(0, 102, 0);"&gt;DateFormat format = DateFormat.getInstance();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        System.out.println("Default format : " + format.format(new Date()));&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;       &lt;span style="font-weight: bold;"&gt;// format using date and time format.&lt;/span&gt;&lt;br /&gt;       &lt;span style="color: rgb(0, 102, 0);"&gt;DateFormat dateTimeFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.MEDIUM, localeItalyInSwitzerland);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        System.out.println("Date &amp;amp; time format : " + dateTimeFormat.format(new Date()));&lt;/span&gt;&lt;br /&gt;     &lt;br /&gt;       &lt;span style="font-weight: bold;"&gt;// format date only&lt;/span&gt;&lt;br /&gt;       &lt;span style="color: rgb(0, 102, 0);"&gt;DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.LONG, localeItalyInSwitzerland);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        System.out.println("Date format : " + dateFormat.format(new Date()));&lt;/span&gt;&lt;br /&gt;     &lt;br /&gt;       &lt;span style="font-weight: bold;"&gt;// format time only&lt;/span&gt;&lt;br /&gt;       &lt;span style="color: rgb(0, 102, 0);"&gt;DateFormat timeFormat = DateFormat.getTimeInstance(DateFormat.MEDIUM, localeItalyInSwitzerland);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        System.out.println("Time format : " + timeFormat.format(new Date()));&lt;/span&gt;&lt;br /&gt;     &lt;br /&gt;       &lt;span style="font-weight: bold;"&gt;// general-purpose number format&lt;/span&gt;&lt;br /&gt;       &lt;span style="color: rgb(0, 102, 0);"&gt;NumberFormat format1 = NumberFormat.getInstance(localeItalyInSwitzerland);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        System.out.println("General purpose format : " + format1.format(1000000));&lt;/span&gt;&lt;br /&gt;     &lt;br /&gt;       &lt;span style="font-weight: bold;"&gt;// general-purpose number format&lt;/span&gt;&lt;br /&gt;       &lt;span style="color: rgb(0, 102, 0);"&gt;NumberFormat format2 = NumberFormat.getNumberInstance(localeItalyInSwitzerland);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        System.out.println("General purpose format : " + format2.format(1000000));&lt;/span&gt;&lt;br /&gt;     &lt;br /&gt;       &lt;span style="font-weight: bold;"&gt;// currency format&lt;/span&gt;&lt;br /&gt;       &lt;span style="color: rgb(0, 102, 0);"&gt;NumberFormat currencyFormat = NumberFormat.getCurrencyInstance(localeItalyInSwitzerland);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        System.out.println("Currency format : " + currencyFormat.format(1000000));&lt;/span&gt;&lt;br /&gt;     &lt;br /&gt;       &lt;span style="font-weight: bold;"&gt;// integer format&lt;/span&gt;&lt;br /&gt;       &lt;span style="color: rgb(0, 102, 0);"&gt;NumberFormat integerFormat = NumberFormat.getIntegerInstance(localeItalyInSwitzerland);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        System.out.println("Integer format : " + integerFormat.format(1000000));&lt;/span&gt;&lt;br /&gt;      &lt;br /&gt;&lt;span style="font-weight: bold;"&gt;        // percent format&lt;/span&gt;&lt;br /&gt;       &lt;span style="color: rgb(0, 102, 0);"&gt;NumberFormat percentFormat = NumberFormat.getPercentInstance(localeItalyInSwitzerland);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        System.out.println("Percent format : " + percentFormat.format(1000000));&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-3648856178713561953?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/3648856178713561953/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=3648856178713561953' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/3648856178713561953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/3648856178713561953'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2011/10/scjp-6-part-vi-locale-numberformat.html' title='SCJP 6 Part VI - Locale - NumberFormat - DateFormat'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-7499551281829059174</id><published>2011-10-04T17:37:00.004+07:00</published><updated>2011-10-04T17:41:20.603+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>SCJP 6 Part V - Serialization</title><content type='html'>&lt;span style="color: rgb(0, 102, 0);"&gt;public class SerializableBean implements Serializable {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;   private String name;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;   private Date birthDate;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;   private Double money;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;   public void setName(String name) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;       this.name = name;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;   }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;   public void setBirthDate(Date birthDate) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;       this.birthDate = birthDate;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;   }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;   public void setMoney(Double money) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;       this.money = money;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;   }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;   public String toString() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;       SimpleDateFormat format = new SimpleDateFormat("dd/MMMM/yyyy");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;       return name + " " + format.format(birthDate) + " " + money;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;   }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;// data to be serialized&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(0, 102, 0);"&gt;SerializableBean bean = new SerializableBean();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;       bean.setBirthDate(new Date());&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;       bean.setMoney(10000000d);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;       bean.setName("Rochmat Santoso");&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;      &lt;span style="font-weight: bold;"&gt;// create new file if one doesn't exist&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(0, 102, 0);"&gt;File file = new File("myTextFile.txt");&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;      &lt;span style="font-weight: bold;"&gt;// serialize data&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(0, 102, 0);"&gt;FileOutputStream fileOutputStream = new FileOutputStream(file);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;       ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);&lt;/span&gt;&lt;br /&gt;     &lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;       objectOutputStream.writeObject(bean);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;       objectOutputStream.flush();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;       objectOutputStream.close();&lt;/span&gt;&lt;br /&gt;     &lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;       fileOutputStream.flush();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;       fileOutputStream.close();&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;      &lt;span style="font-weight: bold;"&gt;// deserialize data&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(0, 102, 0);"&gt;FileInputStream fileInputStream = new FileInputStream(file);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;       ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);&lt;/span&gt;&lt;br /&gt;     &lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;       SerializableBean bean1 = (SerializableBean) objectInputStream.readObject();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;       System.out.println(bean1);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;       objectInputStream.close();&lt;/span&gt;&lt;br /&gt;     &lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;       fileInputStream.close();&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-7499551281829059174?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/7499551281829059174/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=7499551281829059174' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/7499551281829059174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/7499551281829059174'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2011/10/scjp-6-part-v-serialization.html' title='SCJP 6 Part V - Serialization'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-2955302466505857974</id><published>2011-10-04T16:16:00.004+07:00</published><updated>2011-10-04T16:59:29.104+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>SCJP 6 Part IV - File IO</title><content type='html'>&lt;span style="font-weight: bold;"&gt;// create new file if one doesn't exist&lt;/span&gt;&lt;br /&gt;       &lt;span style="color: rgb(0, 102, 0);"&gt;File file = new File("myTextFile.txt");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        boolean isSuccessfullyCreated = file.createNewFile();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        if (isSuccessfullyCreated) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            System.out.println("File has been created successfully!");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        } else {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            System.out.println("Failed creating file!");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        }&lt;/span&gt;&lt;br /&gt;     &lt;br /&gt;       &lt;span style="font-weight: bold;"&gt;// create an object to write to the file, remove the old content&lt;/span&gt;&lt;br /&gt;       &lt;span style="color: rgb(0, 102, 0);"&gt;FileWriter fileWriter = new FileWriter(file);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        fileWriter.write("New Content");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        fileWriter.write("\n");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        fileWriter.write("Added String");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        fileWriter.flush();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        fileWriter.close();&lt;/span&gt;&lt;br /&gt;     &lt;br /&gt;       &lt;span style="font-weight: bold;"&gt;// another way to write to the file, remove the old content&lt;/span&gt;&lt;br /&gt;       &lt;span style="color: rgb(0, 102, 0);"&gt;PrintWriter printWriter = new PrintWriter(file);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        printWriter.println("Another content");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        printWriter.println("Another added content");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        printWriter.flush();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        printWriter.close();&lt;/span&gt;&lt;br /&gt;      &lt;br /&gt;       &lt;span style="font-weight: bold;"&gt;// advanced way to write to the file, remove the old content&lt;/span&gt;&lt;br /&gt;       &lt;span style="color: rgb(0, 102, 0);"&gt;BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(file));&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        bufferedWriter.write("The new content");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        bufferedWriter.newLine();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        bufferedWriter.write("The added content");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        bufferedWriter.flush();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        bufferedWriter.close();&lt;/span&gt;&lt;br /&gt;     &lt;br /&gt;       &lt;span style="font-weight: bold;"&gt;// create an object to read from the file&lt;/span&gt;&lt;br /&gt;       &lt;span style="color: rgb(0, 102, 0);"&gt;FileReader fileReader = new FileReader(file);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        StringBuilder sb = new StringBuilder();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        while (true) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            int content = fileReader.read();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            if (content == -1) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;                System.out.println("The content is : " + sb);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;                break;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            } else {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;                sb.append((char) content);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        fileReader.close();&lt;/span&gt;&lt;br /&gt;     &lt;br /&gt;       &lt;span style="font-weight: bold;"&gt;// advanced way to read from the file&lt;/span&gt;&lt;br /&gt;       &lt;span style="color: rgb(0, 102, 0);"&gt;BufferedReader bufferedReader = new BufferedReader(new FileReader(file));&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        StringBuilder sb1 = new StringBuilder();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        while (true) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            String content = bufferedReader.readLine();&lt;/span&gt;&lt;br /&gt;           &lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            if (content == null) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;                System.out.println("The content is : " + sb1);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;                break;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            } else {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;                sb1.append(content);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;                sb1.append("\n");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        bufferedReader.close();&lt;/span&gt;&lt;br /&gt;     &lt;br /&gt;       &lt;span style="font-weight: bold;"&gt;// console&lt;/span&gt;&lt;br /&gt;       &lt;span style="color: rgb(0, 102, 0);"&gt;Console console = System.console();&lt;/span&gt;&lt;br /&gt;       &lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        System.out.print("Type something : ");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        String typed = console.readLine();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        System.out.println("You typed : " + typed);&lt;/span&gt;&lt;br /&gt;       &lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        System.out.print("Type your secret : ");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        String secret = String.valueOf(console.readPassword());&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        System.out.println("Your secret was : " + secret);&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-2955302466505857974?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/2955302466505857974/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=2955302466505857974' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/2955302466505857974'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/2955302466505857974'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2011/10/scjp-6-part-iv-file-io.html' title='SCJP 6 Part IV - File IO'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-5924244325784124242</id><published>2011-09-29T09:20:00.008+07:00</published><updated>2011-09-29T11:27:02.115+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>SCJP 6 Part III</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Constructor&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Character, Byte, Short&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;Any integer that is passed as constructor parameter must be casted because int require memory space bigger than char, byte, or short so there could be some bits loss.&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(0, 102, 0);"&gt;Character c1 = new Character((char) 19);&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Long, Float, Double&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;Any integer can be passed to long, float, or double constructor without casting because int always fits memory of long, float, or double.&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(0, 102, 0);"&gt;Long l1 = new Long(18);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We then can conclude that if the being passed primitive is bigger, it needs casting.&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(0, 102, 0);"&gt;new Integer(shortObject.shortValue());&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(0, 102, 0);"&gt;new Integer((int) shortObject.doubleValue());&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Primitive&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Character, Byte, Short&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;Any integer that can fit char, byte, or short memory can be referenced without casting.&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(0, 102, 0);"&gt;char c3 = 127;&lt;/span&gt;&lt;br /&gt;Any integer that can not fit char, byte, or short memory must be casted because there could be some bits loss.&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(0, 102, 0);"&gt;char c5 = (char) 123456;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Long, Float, Double&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;Any integer can be referenced to long, float, or double.&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(0, 102, 0);"&gt;long l5 = 128;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We then can conclude that if the being passed primitive is bigger, it needs casting.&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(0, 102, 0);"&gt;float f = 90;&lt;br /&gt;long l = 90;&lt;br /&gt;double d = 90;&lt;br /&gt;int i = (int) d;&lt;br /&gt;short s = (short) f;&lt;br /&gt;long l = (long) f;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(0, 102, 0);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Autoboxing&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Character, Byte, Short&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;Any integer that can fit char, byte, or short memory can be referenced without casting.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic; color: rgb(0, 102, 0);"&gt;Character c3 = 127;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;Any integer that is greater than char, byte, or short bits must be casted because there could be some bits loss.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic; color: rgb(0, 102, 0);"&gt;Character c5 = (char) 123456;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Long, Float, Double&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;Any integer must be casted to be referenced by long, float, or double because long has l, float has f, and double has d after int.&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(0, 102, 0);"&gt;Long l5 = (long) 128;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(0, 102, 0);"&gt;Long l5 = 128l;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;From autoboxing example above we can conclude that we must always cast the primitive to the appropriate format&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(0, 102, 0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; This applies for char, byte, short, int, long, float, and double.&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(0, 102, 0);"&gt;&lt;br /&gt;&lt;br /&gt;private void m(Double d) {...}&lt;br /&gt;&lt;br /&gt;m(anIntObject); // compile error. Integer is not a Double&lt;br /&gt;m(anIntObject.intValue); // compile error. Equal to Double d = 123;&lt;br /&gt;m((double) &lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(0, 102, 0);"&gt;anIntObject.intValue&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(0, 102, 0);"&gt;); // OK&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(0, 102, 0);"&gt;m(&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(0, 102, 0);"&gt;anIntObject.doubleValue&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(0, 102, 0);"&gt;); // OK&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-5924244325784124242?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/5924244325784124242/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=5924244325784124242' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/5924244325784124242'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/5924244325784124242'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2011/09/scjp-6-part-iii.html' title='SCJP 6 Part III'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-7286095719334802493</id><published>2011-09-29T09:04:00.004+07:00</published><updated>2011-09-29T09:54:30.312+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>SCJP 6 Part II</title><content type='html'>Character c3 = 127;&lt;br /&gt;Character c4 = 127;&lt;br /&gt;&lt;br /&gt;if (c3 == c4) {&lt;br /&gt;System.out.println("Literals Character less than 127 is the same character");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Byte b3 = 127;&lt;br /&gt;Byte b4 = 127;&lt;br /&gt;&lt;br /&gt;if (b3 == b4) {&lt;br /&gt;System.out.println("Literals Byte less than 127 is the same byte");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Short sh3 = 127;&lt;br /&gt;Short sh4 = 127;&lt;br /&gt;&lt;br /&gt;if (sh3 == sh4) {&lt;br /&gt;System.out.println("Literals Short less than 127 is the same short");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Integer int5 = 100;&lt;br /&gt;Integer int6 = 100;&lt;br /&gt;&lt;br /&gt;if (int5 == int6) {&lt;br /&gt;System.out.println("Literals Integer less than 127 is the same integer");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Long l3 = (long) 127;&lt;br /&gt;Long l4 = (long) 127;&lt;br /&gt;&lt;br /&gt;if (l3 == l4) {&lt;br /&gt;System.out.println("Literals Long less than 127 is the same long");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Float f3 = (float) 66;&lt;br /&gt;Float f4 = (float) 66;&lt;br /&gt;&lt;br /&gt;if (f3 ==f4) {&lt;br /&gt;System.out.println("Literals Float is the same float");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Double d3 = (double) 6;&lt;br /&gt;Double d4 = (double) 6;&lt;br /&gt;&lt;br /&gt;if (d3 == d4) {&lt;br /&gt;System.out.println("Literals Double is the same double");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Boolean bol3 = true;&lt;br /&gt;Boolean bol4 = true;&lt;br /&gt;&lt;br /&gt;if (bol3 == bol4) {&lt;br /&gt;System.out.println("Literals Boolean is the same boolean");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Result :&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Literals Character less than 127 is the same character&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Literals Byte less than 127 is the same byte&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Literals Short less than 127 is the same short&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Literals Integer less than 127 is the same integer&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Literals Long less than 127 is the same long&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Literals Boolean is the same boolean&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We can conclude that two different objects created by assigning primitive to it, if the primitive is between -128 and 127, they are &lt;span style="font-weight: bold;"&gt;equal object for Charater, Byte, Short, Integer, and Long&lt;/span&gt; but &lt;span style="font-weight: bold;"&gt;not equal for Float and Double&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Obviously, if the primitives are not between -128 and 127, they are two different objects.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-7286095719334802493?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/7286095719334802493/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=7286095719334802493' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/7286095719334802493'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/7286095719334802493'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2011/09/scjp-6-part-ii.html' title='SCJP 6 Part II'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-5824062733579647785</id><published>2011-09-29T08:51:00.004+07:00</published><updated>2011-09-29T09:52:15.951+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>SCJP 6 Part I</title><content type='html'>String str1 = new String("My name is Budi");&lt;br /&gt;String str2 = new String("My name is Budi");&lt;br /&gt;&lt;br /&gt;if (str1 == str2) {&lt;br /&gt;System.out.println("Object String is the same string");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;String str3 = "Your name is Budi";&lt;br /&gt;String str4 = "Your name is Budi";&lt;br /&gt;&lt;br /&gt;if (str3 == str4) {&lt;br /&gt;System.out.println("Literals String is the same string");&lt;br /&gt;}&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Character c1 = new Character((char) 19);&lt;br /&gt;Character c2 = new Character((char) 19);&lt;br /&gt;&lt;br /&gt;if (c1 == c2) {&lt;br /&gt;System.out.println("Object Character is the same character");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Byte b1 = new Byte((byte) 8);&lt;br /&gt;Byte b2 = new Byte((byte) 8);&lt;br /&gt;&lt;br /&gt;if (b1 == b2) {&lt;br /&gt;System.out.println("Object Byte is the same byte");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Short sh1 = new Short((short) 9);&lt;br /&gt;Short sh2 = new Short((short) 9);&lt;br /&gt;&lt;br /&gt;if (sh1 == sh2) {&lt;br /&gt;System.out.println("Object Short is the same short");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Integer int1 = new Integer(1000);&lt;br /&gt;Integer int2 = new Integer(1000);&lt;br /&gt;&lt;br /&gt;if (int1 == int2) {&lt;br /&gt;System.out.println("Object Integer is the same integer");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Long l1 = new Long(18);&lt;br /&gt;Long l2 = new Long(18);&lt;br /&gt;&lt;br /&gt;if (l1 == l2) {&lt;br /&gt;System.out.println("Object Long is the same long");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Float f1 = new Float(17);&lt;br /&gt;Float f2 = new Float(17);&lt;br /&gt;&lt;br /&gt;if (f1 == f2) {&lt;br /&gt;System.out.println("Object Float is the same float");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Double d1 = new Double(5000);&lt;br /&gt;Double d2 = new Double(5000);&lt;br /&gt;&lt;br /&gt;if (d1 == d2) {&lt;br /&gt;System.out.println("Object Double is the same double");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Boolean bol1 = new Boolean(true);&lt;br /&gt;Boolean bol2 = new Boolean(true);&lt;br /&gt;&lt;br /&gt;if (bol1 == bol2) {&lt;br /&gt;System.out.println("Object Boolean is the same boolean");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Result : Literals String is the same string&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We can conclude that two different objects with same literals are always two different objects.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-5824062733579647785?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/5824062733579647785/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=5824062733579647785' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/5824062733579647785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/5824062733579647785'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2011/09/scjp-6-part-i.html' title='SCJP 6 Part I'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-7710771590968859132</id><published>2011-09-15T15:24:00.026+07:00</published><updated>2011-09-19T14:07:47.868+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Useful Java util Classes</title><content type='html'>There are some useful classes defined in java util package. Lets visit them:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Arrays&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This class contains methods for manipulating arrays (such as sorting and searching). This class also contains a static factory that allows arrays to be viewed as lists.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Integer[] array = new Integer[] {5, 3, 1, 4, 2, 4, 9};&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;// sort array&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Arrays.sort(array);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;// search integer 4 in the array and return the index using binary search algorithm&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;// note that the array must be in sort&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;int index = Arrays.binarySearch(array, 4);&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;// fill or replace index 2 (inclusive) until index 5 (exclusive) with integer 100&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Arrays.fill(array, 2, 5, 100);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;// create a List from an array&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;List&lt;integer&gt; list = Arrays.asList(array);&lt;/integer&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Collections&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This class consists of methods that operate on or return collections.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;List&lt;integer&gt; src = new ArrayList&lt;integer&gt;();&lt;/integer&gt;&lt;/integer&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;src.add(new Integer(5));&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;src.add(new Integer(3));&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;src.add(new Integer(1));&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;src.add(new Integer(4));&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;src.add(new Integer(2));&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;src.add(new Integer(4));&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;src.add(new Integer(9));&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;// reverse the order of the elements in the list&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Collections.reverse(src);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;// get max Integer element in the list&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Integer result = Collections.max(src);&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;// get min Integer element in the list&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Integer result = Collections.min(src);&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;// replace all integer 4 with integer 1000 in the list&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Collections.replaceAll(src, new Integer(4), new Integer(1000));&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;// replace oldBean with newBean, they are compared using Object.equals() method&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Collections.replaceAll(src, oldBean, newBean);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;// swap objects in index 0 and 6&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Collections.swap(src, 0, 6);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;// replace all objects in the list with the new integer object&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Collections.fill(src, new Integer(1999));&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;StringBuffer&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; &amp;amp; &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;StringBuilder&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Both classes are used to deal with string, however, StringBuffer is thread-safe because it performs thread synchronization. StringBuilder should be used when we don't need thread synchronization.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;SimpleDateFormat&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;SimpleDateFormat is a class for formatting and parsing date (date to text and vice versa). Date and time formats are specified by date and time pattern strings.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-J6cG9_eJqTw/Tna271cq50I/AAAAAAAAAWc/ZFSPy_d0srU/s1600/DateFormatPattern.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 152px; height: 320px;" src="http://2.bp.blogspot.com/-J6cG9_eJqTw/Tna271cq50I/AAAAAAAAAWc/ZFSPy_d0srU/s320/DateFormatPattern.PNG" alt="" id="BLOGGER_PHOTO_ID_5653907521286104898" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;// create SimpleDateFormat object&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;SimpleDateFormat format = new SimpleDateFormat("'on' dd/MMMM/yyyy");&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;// format date to string&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;String formattedDate = format.format(new Date()); // result: on 19/September/2011&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;// format string to date&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Date date = format.parse("on 12/August/2001");&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Properties&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This class represents a persistent set of properties. The Properties can be saved to a stream or loaded from a stream. Each key and its corresponding value in the property list is a string.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;// create Properties object&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Properties properties = new Properties();&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;// load Properties from input stream&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;InputStream inStream = new FileInputStream("properties.properties");&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0);"&gt;properties.load(inStream);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;// get property&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;String name = properties.getProperty("property.name");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;String size = properties.getProperty("property.size");&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;// set property&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;properties.setProperty("property.size", "101");&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;// persistent property&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;OutputStream out = new FileOutputStream("properties.properties");&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;properties.store(out, "Comments here");&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The content of properties file:&lt;br /&gt;&lt;br /&gt;property.name=Rochmat Santoso&lt;br /&gt;property.size=101&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-7710771590968859132?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/7710771590968859132/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=7710771590968859132' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/7710771590968859132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/7710771590968859132'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2011/09/useful-java-util-classes.html' title='Useful Java util Classes'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-J6cG9_eJqTw/Tna271cq50I/AAAAAAAAAWc/ZFSPy_d0srU/s72-c/DateFormatPattern.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-4473762451336743599</id><published>2011-09-15T09:35:00.005+07:00</published><updated>2011-09-15T15:18:24.621+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>equals, hashCode, and toString with Apache Commons</title><content type='html'>Lets now play a little bit with Apache Commons EqualsBuilder, HashCodeBuilder, and ToStringBuilder.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;ToStringBuilder&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When we print an object to console, something not meaningful like  [Ljava.lang.String;@a90653 will be printed. If we have an entity bean,  most likely we prefer printing all of its properties in a formatted  string to previous string. To achieve that, we can use ToStringBuilder  class in Apache Commons Lang library.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public class MyBean {&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="color: rgb(0, 102, 0);"&gt;private String name;&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(0, 102, 0);"&gt;private String address;&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(0, 102, 0);"&gt;private String email;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="color: rgb(0, 102, 0);"&gt;@Override&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(0, 102, 0);"&gt;public String toString() {&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(0, 102, 0);"&gt;return new ToStringBuilder(this).append("name", name).append("address", address).append("email", email).build();&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;And the result will be &lt;span style="color: rgb(0, 102, 0);"&gt;MyBean@a62fc3[name=Al Pacino,address=Surabaya,email=gmail]&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;EqualsBuilder&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When we want to compare two entity beans, most likely we want to compare by properties. If both entity holds same properties, they are equal. We can use EqualsBuilder to do this.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;@Override&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public boolean equals(Object obj) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;if(this == obj) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;return true;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;if((obj == null) || (obj.getClass() != this.getClass())) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;return false;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;MyBean target = (MyBean) obj;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;return new EqualsBuilder().append(this.name, target.name).append(this.address, target.address).append(this.email, target.email).isEquals();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;HashCodeBuilder&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Note that we must override the Object.hashCode() if we override Object.equals(). We can use HashCodeBuilder to create hash code for an object.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;@Override&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public int hashCode() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;return new HashCodeBuilder().append(this.name).append(this.address).append(this.email).toHashCode();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-4473762451336743599?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/4473762451336743599/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=4473762451336743599' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/4473762451336743599'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/4473762451336743599'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2011/09/equals-hashcode-and-tostring-with.html' title='equals, hashCode, and toString with Apache Commons'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-7818056025535336962</id><published>2011-09-14T09:35:00.007+07:00</published><updated>2011-09-14T10:19:20.062+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Enum</title><content type='html'>Since version 1.5.0, Java introduced enum as a special kind of class. It lets us to rewrite our static final constants to enum class. Here is a simple example:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public enum OrderStatus {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;NEW,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;COMPLETE,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;BILLING_FAILED,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;SHIPPED;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It is pretty straightforward, isn't it? Now lets put constructor, methods, and variables in it:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public enum OrderStatus {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;NEW(20),&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;COMPLETE(100),&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;BILLING_FAILED(-1),&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;SHIPPED(80);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;private int percent;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;private OrderStatus(int paramPercent) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;this.percent = paramPercent;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public int getPercent() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;return percent;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now what happens if we print it on console?&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;System.out.println(OrderStatus.NEW.name());&lt;/span&gt; // this will print NEW&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;System.out.println(OrderStatus.NEW.getPercent());&lt;/span&gt; // this will print 20&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;System.out.println(OrderStatus.NEW.ordinal());&lt;/span&gt; // this will print 0&lt;br /&gt;&lt;br /&gt;Note that the first statement must be the constant (NEW, COMPLETE, etc  in our example), otherwise the compiler will generate error messages. In addition, the constructor can't be declared as public (that's why I declare it as private).&lt;br /&gt;&lt;br /&gt;To get a list of all constants of the enum we can use OrderStatus.values() and it will return an array of {NEW, COMPLETE, BILLING_FAILED, SHIPPED} in that order.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-7818056025535336962?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/7818056025535336962/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=7818056025535336962' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/7818056025535336962'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/7818056025535336962'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2011/09/enum.html' title='Enum'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-8132077336221080914</id><published>2011-08-24T10:26:00.013+07:00</published><updated>2011-08-25T09:21:28.214+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Java Access Modifier</title><content type='html'>While waiting for the lunch time lets do something very basic but quiet interesting; Java access modifier.&lt;br /&gt;&lt;br /&gt;There are four access modifiers in Java: &lt;span style="font-style: italic; font-weight: bold;"&gt;public&lt;/span&gt;, &lt;span style="font-style: italic; font-weight: bold;"&gt;protected&lt;/span&gt;, &lt;span style="font-style: italic; font-weight: bold;"&gt;private&lt;/span&gt;, and &lt;span style="font-weight: bold; font-style: italic;"&gt;package access&lt;/span&gt;. Suppose we have a project with package structure as below:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-9AKGpCa2oaE/TlRwRP0L8mI/AAAAAAAAAVk/YHCc-opjYE4/s1600/package.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 154px; height: 121px;" src="http://2.bp.blogspot.com/-9AKGpCa2oaE/TlRwRP0L8mI/AAAAAAAAAVk/YHCc-opjYE4/s320/package.PNG" alt="" id="BLOGGER_PHOTO_ID_5644259674607579746" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There are four classes:&lt;br /&gt;1. A superclass for other classes named SuperClass&lt;br /&gt;2. A subclass of class SuperClass named SubClassA which resides at the same package as its superclass.&lt;br /&gt;3. A subclass of class SuperClass named SubClassB which resides at different package as its superclass.&lt;br /&gt;4. Another class at different package named Main.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-zY3CYuDxT30/TlRx5Bs1K5I/AAAAAAAAAVs/k8DBol2msLg/s1600/superclass.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 304px;" src="http://4.bp.blogspot.com/-zY3CYuDxT30/TlRx5Bs1K5I/AAAAAAAAAVs/k8DBol2msLg/s320/superclass.PNG" alt="" id="BLOGGER_PHOTO_ID_5644261457525025682" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The SuperClass has all four different level access method. We will see which methods are visible at any of the other three classes.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-CU2S6mS-o4Y/TlRysu_CBnI/AAAAAAAAAV0/_aao1Gzn2VA/s1600/subclass_a.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 294px; height: 320px;" src="http://3.bp.blogspot.com/-CU2S6mS-o4Y/TlRysu_CBnI/AAAAAAAAAV0/_aao1Gzn2VA/s320/subclass_a.PNG" alt="" id="BLOGGER_PHOTO_ID_5644262345854289522" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We can see that the &lt;span style="font-weight: bold; font-style: italic;"&gt;public&lt;/span&gt;, &lt;span style="font-weight: bold; font-style: italic;"&gt;protected&lt;/span&gt;, and &lt;span style="font-style: italic; font-weight: bold;"&gt;package access&lt;/span&gt; level methods are visible in class &lt;span style="font-weight: bold; font-style: italic;"&gt;SubClassA&lt;/span&gt; through both &lt;span style="font-weight: bold; font-style: italic;"&gt;inheritance and reference&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-g2-n4S5WO-E/TlRzWgdyC8I/AAAAAAAAAWE/1pT-d95k5_M/s1600/subclass_b.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 283px;" src="http://3.bp.blogspot.com/-g2-n4S5WO-E/TlRzWgdyC8I/AAAAAAAAAWE/1pT-d95k5_M/s320/subclass_b.PNG" alt="" id="BLOGGER_PHOTO_ID_5644263063511239618" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now we can see that there are only &lt;span style="font-weight: bold; font-style: italic;"&gt;public&lt;/span&gt; and &lt;span style="font-style: italic; font-weight: bold;"&gt;protected&lt;/span&gt; methods visible to class &lt;span style="font-weight: bold; font-style: italic;"&gt;SubClassB&lt;/span&gt; through &lt;span style="font-weight: bold; font-style: italic;"&gt;inheritance&lt;/span&gt; and only &lt;span style="font-weight: bold; font-style: italic;"&gt;public&lt;/span&gt; method visible through &lt;span style="font-weight: bold; font-style: italic;"&gt;reference&lt;/span&gt;. This happens because package level access, as its name suggest, only applies for classes reside at same package. Whereas protected applies for all of its subclasses.&lt;br /&gt;&lt;br /&gt;There is a note here regarding overriding protected method. As we can see in class SubClassB, we override method &lt;span style="font-style: italic;"&gt;protectedMethod &lt;/span&gt;from its superclass. Therefore, all classes at the same package with class SubClassB can access SubClassB's &lt;span style="font-style: italic;"&gt;protectedMethod &lt;/span&gt;through reference. However, if we didn't override the protectedMethod, all other classes at the same package wouldn't be able to access it at all because &lt;span style="font-style: italic;"&gt;protectedMethod &lt;/span&gt;would become private in SubClassB.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-IVb2hU0uCds/TlR0aSJuezI/AAAAAAAAAWM/JwCJeA8L7p4/s1600/main.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 260px;" src="http://2.bp.blogspot.com/-IVb2hU0uCds/TlR0aSJuezI/AAAAAAAAAWM/JwCJeA8L7p4/s320/main.PNG" alt="" id="BLOGGER_PHOTO_ID_5644264227900128050" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;For a class at another package, as we can see in class &lt;span style="font-weight: bold; font-style: italic;"&gt;Main&lt;/span&gt;, can only access &lt;span style="font-weight: bold; font-style: italic;"&gt;public&lt;/span&gt; methods.&lt;br /&gt;&lt;br /&gt;The access levels are simple and clear, aren't they? All method modifiers also apply to instance variables as well. OK, now it's time to go out for lunch.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-8132077336221080914?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/8132077336221080914/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=8132077336221080914' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/8132077336221080914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/8132077336221080914'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2011/08/java-access-modifier.html' title='Java Access Modifier'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-9AKGpCa2oaE/TlRwRP0L8mI/AAAAAAAAAVk/YHCc-opjYE4/s72-c/package.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-7183338546966272190</id><published>2011-08-22T09:09:00.009+07:00</published><updated>2011-08-26T10:48:30.404+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cassandra'/><title type='text'>Cassandra Architecture</title><content type='html'>Apache Cassandra is not another relational database in market. Instead of using relational model, it uses key-value map to store its data. The structure is more or less can be explain as in the following picture:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-_y9kN-KML8A/TlcNmv_SBPI/AAAAAAAAAWU/BvMbHxFuarU/s1600/cassandra-structure.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 207px;" src="http://2.bp.blogspot.com/-_y9kN-KML8A/TlcNmv_SBPI/AAAAAAAAAWU/BvMbHxFuarU/s320/cassandra-structure.PNG" alt="" id="BLOGGER_PHOTO_ID_5644995617300284658" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Cluster&lt;/span&gt;: Cassandra is designed to be distributed over several nodes/machines. A cluster consists of several nodes. I've only ever used Cassandra in a single node which is my computer.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Keyspace&lt;/span&gt;: A cluster consists of several keyspaces. Keyspace is the place where our data reside. A keyspace could have several Column Family or Super Column Family.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Column Family &lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;and &lt;span style="font-weight: bold; font-style: italic;"&gt;Super Column Family&lt;/span&gt;: Both Column Family and Super Column Family is a collection of rows, just like a table is a collection of rows in relational database.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Row&lt;/span&gt;: A row consists of columns; key-value columns for a row in Column Family, or Super Columns for a row in Super Column Family.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Super Column&lt;/span&gt;: It is sort of container of sub-columns (which are of type Key-value Column).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Key-value Column&lt;/span&gt;: The most basic data structure in Cassandra where the actual data is saved as byte. The behavior is a lot  like Java Hash data type.&lt;br /&gt;&lt;br /&gt;Here are examples of Cassandra data retention and retrieval:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;COLUMN_FAMILY_NAME[ROW_KEY_NAME][COLUMN]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;User['user1']['name'] = 'Rochmat Santoso';&lt;br /&gt;User['user1']['address'] = 'Surabaya';&lt;br /&gt;User['user2']['name'] = 'Barbie';&lt;br /&gt;User['user2']['address'] = 'Malibu';&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 102, 0);"&gt;SUPER_COLUMN_FAMILY_NAME[ROW_KEY_NAME][SUPER_COLUMN_NAME][COLUMN]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Province['province1']['info']['name'] = 'East Java';&lt;br /&gt;Province['province1']['info']['capital'] = 'Surabaya';&lt;br /&gt;Province['province1']['city']['sby'] = 'Surabaya';&lt;br /&gt;Province['province1']['city']['mlg'] = 'Malang';&lt;br /&gt;Province['province1']['city']['sda'] = 'Sidoarjo';&lt;br /&gt;&lt;br /&gt;Province['province2']['info']['name'] = 'West Java';&lt;br /&gt;Province['province2']['info']['capital'] = 'Bandung';&lt;br /&gt;Province['province2']['city']['bdg'] = 'Bandung';&lt;br /&gt;Province['province2']['city']['tgr'] = 'Tangerang';&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-7183338546966272190?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/7183338546966272190/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=7183338546966272190' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/7183338546966272190'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/7183338546966272190'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2011/08/cassandra-architecture.html' title='Cassandra Architecture'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-_y9kN-KML8A/TlcNmv_SBPI/AAAAAAAAAWU/BvMbHxFuarU/s72-c/cassandra-structure.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-8462311052232853064</id><published>2011-08-10T16:59:00.007+07:00</published><updated>2011-08-10T17:44:53.773+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Annotation</title><content type='html'>Setelah sekian lama akhirnya punya waktu juga untuk mencoba annotation. Beberapa catatan untuk annotation ini adalah:&lt;br /&gt;- Tambahkan &lt;span style="font-weight: bold;"&gt;@Documented&lt;/span&gt; agar annotation ini bisa di-generate saat membuat javadoc karena defaultnya sebuah annotation tidak di-generate oleh javadoc tool.&lt;br /&gt;- Tambahkan &lt;span style="font-weight: bold;"&gt;@Retention(RetentionPolicy.RUNTIME)&lt;/span&gt; untuk menyimpan data-data annotation pada saat kompilasi sehingga bisa dibaca saat runtime. Jika tidak disimpan maka kita tidak bisa membacanya.&lt;br /&gt;- Ada beberapa macam tipe annotation tergantung tempat di mana annotation itu akan ditempatkan misalnya di class, method, field, parameter, konstruktor, dll. Gunakan &lt;span style="font-weight: bold;"&gt;@Target(value = ElementType.TYPE)&lt;/span&gt; untuk annotation yang diletakkan di Class atau interface. Beberapa tipe yang lain adalah &lt;span style="font-weight: bold;"&gt;@Target(value = ElementType.METHOD)&lt;/span&gt; untuk annotation pada method, &lt;span style="font-weight: bold;"&gt;@Target(value = ElementType.FIELD)&lt;/span&gt; untuk annotation pada field, &lt;span style="font-weight: bold;"&gt;@Target(value = ElementType.PARAMETER) &lt;/span&gt;untuk annotation pada method parameter, dll.&lt;br /&gt;&lt;br /&gt;Berikut ini adalah contoh annotation dan cara mengaksesnya&lt;br /&gt;&lt;br /&gt;&lt;embed src="http://www.box.net//static/flash/box_explorer.swf?widget_hash=0facogptnb5sge19636j&amp;amp;v=0&amp;amp;cl=0&amp;amp;s=0" wmode="transparent" type="application/x-shockwave-flash" height="225" width="260"&gt;&lt;/embed&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-8462311052232853064?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/8462311052232853064/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=8462311052232853064' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/8462311052232853064'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/8462311052232853064'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2011/08/annotation.html' title='Annotation'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-335839769731953668</id><published>2011-08-05T14:56:00.004+07:00</published><updated>2011-08-09T13:35:36.534+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Lucene Analyzer</title><content type='html'>There are several analyzer available in Lucene:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;WhitespaceAnalyzer&lt;/span&gt;: It splits text into tokens on whitespace characters. It doesn't normalize the tokens and doesn't lowercase each token.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;SimpleAnalyzer&lt;/span&gt;: It splits tokens at non letter characters and lowercases each token. It discards numeric characters but keeps all other characters.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;StopAnalyzer&lt;/span&gt;: It acts almost same as SimpleAnalyzer except it removes common words. By default, it removes common words specific to English (the, a, etc).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;StandardAnalyzer&lt;/span&gt;: It is the most sophisticated core analyzer. It has quite a bit of logic to identify certain kinds of tokens such as company names, email addresses, and hostnames. It lowercases each token and removes stop words and punctuation.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;KeywordAnalyzer:&lt;/span&gt; It treats entire text as a single token.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-335839769731953668?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/335839769731953668/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=335839769731953668' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/335839769731953668'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/335839769731953668'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2011/08/lucene-analyzer.html' title='Lucene Analyzer'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-1726564373184751051</id><published>2011-08-01T14:18:00.006+07:00</published><updated>2011-08-01T16:20:15.174+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Lucene Field Options</title><content type='html'>&lt;span style="font-weight:bold;"&gt;Field Indexing Option&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 102, 0);"&gt;Field.Index.ANALYZED&lt;/span&gt; : Use analyzer to break the field's value into separate tokens and make each token searchable. This option is useful for body, title, abstract text.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 102, 0);"&gt;Field.Index.NOT_ANALYZED&lt;/span&gt; : Index the field but don't analyze the string value. Instead, treat the field's value as a single token and make the token searchable. This option is useful for URL, file system path, dates, personal names, card number, phone number. This option is useful for enabling "exact match" searching.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 102, 0);"&gt;Field.Index.NO&lt;/span&gt; : Don't make the field's value available for searching&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Field Storing Option&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 102, 0);"&gt;Field.Store.YES&lt;/span&gt; : Store field's value in the index. This option is useful for fields that we want to display along with the search result such as URL, title, database primary key. Without storing the field's value, we won't be able to retrieve it using document.get("fieldname") on searching.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 102, 0);"&gt;Field.Store.NO&lt;/span&gt; : Don't store the field's value in the index. This option is often used along with &lt;span style="font-weight: bold;"&gt;Field.Index.ANALYZED &lt;/span&gt;to index large text field such as text body.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Here are some example of field indexing and field storing option:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Analyzed &amp;amp; Stored : title, abstract text&lt;br /&gt;Analyzed &amp;amp; Not Stored : body&lt;br /&gt;Not Analyzed &amp;amp; Stored : URL, file system path, dates, personal names, card number, phone number&lt;br /&gt;No Index &amp;amp; Stored : database primary key&lt;br /&gt;Not Analyzed &amp;amp; Not Stored : hidden keywords&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Code Example:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Document document = new Document();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;document.add(new Field("filename", file.getName(), Field.Store.YES, Field.Index.NOT_ANALYZED));&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;indexWriter.addDocument(document );&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-1726564373184751051?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/1726564373184751051/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=1726564373184751051' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/1726564373184751051'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/1726564373184751051'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2011/08/lucene-field-options.html' title='Lucene Field Options'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-2214370106441043861</id><published>2011-07-19T13:28:00.007+07:00</published><updated>2011-07-19T13:40:53.996+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Beautiful Mind'/><title type='text'>AI and Thread Pool Code Example</title><content type='html'>Finally uploaded some examples of Breadth-first search, Depth-first search, Best-first search, Genetic Algorithm, Binary search tree, Backward and forward chaining code. Also, I tried to create simple thread pool because I found this pooling idea is very interesting and widely used.&lt;br /&gt;&lt;br /&gt;&lt;embed src="http://www.box.net//static/flash/box_explorer.swf?widget_hash=qjilmj4a4uj9l2yy5nxz&amp;amp;v=0&amp;amp;cl=0&amp;amp;s=0" wmode="transparent" type="application/x-shockwave-flash" height="230" width="460"&gt;&lt;/embed&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-2214370106441043861?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/2214370106441043861/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=2214370106441043861' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/2214370106441043861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/2214370106441043861'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2011/07/ai-and-thread-pool-code-example.html' title='AI and Thread Pool Code Example'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-3159423987231590561</id><published>2011-07-18T10:48:00.007+07:00</published><updated>2011-07-18T11:46:34.640+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stories'/><title type='text'>Is it crossroad?</title><content type='html'>Recently, I have been watching Al Pacino's speech when he won the Academy Award in 1992. He said "I've been very lucky I've found desire for what I do early in my life and have people who encourage that desire."&lt;br /&gt;&lt;br /&gt;I also kept Johnny Carson's farewell statement on final Tonight Show. He said "I am one of the lucky people in the world, I found something I always wanted to do, and I have enjoyed every single minute of it."&lt;br /&gt;&lt;br /&gt;Steve Jobs also said the same thing. He gave a speech at Stanford Commencement, he said "I was lucky I found what I loved to do early in life... Your work is going to fill a large part of your life, and the only way to be truly satisfied is to do what you believe is great work. And the only way to do great work is to love what you do. If you haven't found it yet, keep looking. Don't settle. As with all matters of the heart, you'll know when you find it. And, like any great relationship, it just gets better and better as the years roll on. So keep looking until you find it. Don't settle."&lt;br /&gt;&lt;br /&gt;They got me thinking about my life too, about what my desire is. I have to admit that being a software engineer was not my desire (there was no kid back in 1990s in my school who wanted to be a software engineer I suppose, we usually want to be doctor, pilot, president, etc :p). Software engineering was popular when I was at high school, computers and cellphones were becoming trend back in old days (I'm feeling so old when writing this hahaha...). I then chose to enter Informatics because I want to learn more about computer science. I knew I love math and science, and because I knew that the basic of computer is math logical expression, I thought it shouldn't be a big deal. But I realize it is not my desire to be a software engineer.&lt;br /&gt;&lt;br /&gt;I know that great people are them who always follow their hearth and do what they love because you have to love what you do to be great. I wonder if Al Pacino, Steve Jobs, or Johnny Carson ever came to this point of life, at the searching point of their desire. Anyway, what ever it is I am now, all I know is that I always have passion in learning anything new. I always do the best for my job. I learn many new Java frameworks. I love writing and sharing thought and knowledge with others, and I still hope someday I will find what my desire is, either it is in IT field or something else.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-3159423987231590561?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/3159423987231590561/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=3159423987231590561' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/3159423987231590561'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/3159423987231590561'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2011/07/is-it-crossroad.html' title='Is it crossroad?'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-3273571510221965365</id><published>2011-07-14T12:31:00.009+07:00</published><updated>2011-07-15T14:41:59.061+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>AOP - Notes on Advice</title><content type='html'>An advice has the following syntax:&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;advice_type([arg]) : pointcut_name {&lt;/span&gt; &lt;span style="color: rgb(0, 153, 0);"&gt;advice_body&lt;/span&gt; &lt;span style="color: rgb(0, 153, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;There are three types of Advice&lt;br /&gt;1. &lt;span style="color: rgb(0, 153, 0);"&gt;Before&lt;/span&gt;, the advice is executed right before the join point code is executed.&lt;br /&gt;&lt;br /&gt;Example of a &lt;span style="color: rgb(0, 153, 0);"&gt;before &lt;/span&gt;advice:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;/** pointcut */&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;private pointcut &lt;span style="color: rgb(153, 0, 0);"&gt;getNameField()&lt;/span&gt; : get(private String edu.mat.hello.MessageCommunicator.name);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;/** advice */&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;before() : &lt;span style="color: rgb(153, 0, 0);"&gt;getNameField()&lt;/span&gt; {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;System.out.println("Getter method is about to call.");&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;2. &lt;span style="color: rgb(0, 153, 0);"&gt;After&lt;/span&gt;, the advice is executed right after the join point code is executed.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;/** pointcut */&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;private pointcut&lt;/span&gt; &lt;span style="color: rgb(153, 0, 0);"&gt;setNameField() &lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;: set(private String edu.mat.hello.MessageCommunicator.name);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;/** advice: this advise is executed whether &lt;/span&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;setNameField() &lt;span style="color: rgb(0, 153, 0);"&gt;returns normally or throwing exception&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);"&gt; */&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;after() :&lt;/span&gt; &lt;span style="color: rgb(204, 0, 0);"&gt;setNameField() &lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;System.out.println("Name has been set.");&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;/** advice: this advise is executed only when &lt;/span&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;setNameField() &lt;span style="color: rgb(0, 153, 0);"&gt;returns successfully&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);"&gt; */&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;after() &lt;span style="font-weight: bold;"&gt;returning &lt;/span&gt;:&lt;/span&gt; &lt;span style="color: rgb(204, 0, 0);"&gt;setNameField() &lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;System.out.println("Name has been set.");&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;To get the returned object, we can use &lt;span style="color: rgb(0, 153, 0);"&gt;after() &lt;span style="font-weight: bold;"&gt;returning(Integer count) &lt;/span&gt;:&lt;/span&gt; &lt;span style="color: rgb(0, 153, 0);"&gt;calculateRevenue()  {...}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;/** advice: this advise is executed only when &lt;/span&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;setNameField() &lt;span style="color: rgb(0, 153, 0);"&gt;throws exception&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);"&gt; */&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;after() &lt;span style="font-weight: bold;"&gt;throwing &lt;/span&gt;:&lt;/span&gt; &lt;span style="color: rgb(204, 0, 0);"&gt;setNameField() &lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;System.out.println("Name has not been set.");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;To get the thrown exception, we can use &lt;span style="color: rgb(0, 153, 0);"&gt;after() &lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span style="font-weight: bold;"&gt;throwing &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span style="font-weight: bold;"&gt;(Exception e) &lt;/span&gt;:&lt;/span&gt; &lt;span style="color: rgb(0, 153, 0);"&gt;calculateRevenue()  {...}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;3. &lt;span style="color: rgb(0, 153, 0);"&gt;Around&lt;/span&gt;, this advice is useful to intercept an execution of a join point.&lt;br /&gt;&lt;br /&gt;Suppose we have the following pointcut:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;private pointcut sayHello(edu.mat.hello.MessageCommunicator caller, String person) : call(* edu.mat.hello.MessageCommunicator.&lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;sayHello&lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;(String, String)) &amp;amp;&amp;amp; args(person, String) &amp;amp;&amp;amp; target(caller);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The above pointcut says that we will capture all join points in &lt;span style="color: rgb(0, 153, 0);"&gt;sayHello(String, String)&lt;/span&gt; method of class &lt;span style="color: rgb(0, 153, 0);"&gt;MessageCommunicator&lt;/span&gt;, capture the method caller (target object as shown in &lt;span style="color: rgb(0, 153, 0);"&gt;target(caller)&lt;/span&gt;) and first parameter of the method (as shown in &lt;span style="color: rgb(0, 153, 0);"&gt;args(person, String)&lt;/span&gt;) as stated in pointcut's arguments.&lt;br /&gt;&lt;br /&gt;Then we have an advice as in:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;void around(&lt;span style="color: rgb(153, 0, 0);"&gt;edu.mat.hello.MessageCommunicator caller, String person&lt;/span&gt;) : sayHello(&lt;span style="color: rgb(0, 153, 0);"&gt;caller, person&lt;/span&gt;) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;        try {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;            proceed(&lt;span style="color: rgb(153, 0, 0);"&gt;caller, "Pak " + person&lt;/span&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;        } catch (Exception e) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;            &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;        } finally {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;            System.out.println("Say hello finally finished.");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;there, we execute the real join point code in &lt;span style="color: rgb(0, 153, 0);"&gt;proceed(caller, "Pak " + person);&lt;span style="color: rgb(0, 0, 0);"&gt; and surround it with try-catch block. The arguments in &lt;span style="color: rgb(0, 153, 0);"&gt;proceed &lt;/span&gt;must match arguments in &lt;span style="color: rgb(0, 153, 0);"&gt;around()&lt;/span&gt;.&lt;/span&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/5217372432017247701-3273571510221965365?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/3273571510221965365/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=3273571510221965365' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/3273571510221965365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/3273571510221965365'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2011/07/aop-notes-on-advice.html' title='AOP - Notes on Advice'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-7980410305500973971</id><published>2011-07-12T13:19:00.013+07:00</published><updated>2011-07-14T17:20:20.465+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>AOP - Notes on Pointcuts</title><content type='html'>A pointcut has the following syntax: &lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic; color: rgb(255, 0, 0);"&gt;[access specifier]&lt;/span&gt; &lt;span style="color: rgb(51, 204, 0);"&gt;pointcut&lt;/span&gt; &lt;span style="color: rgb(51, 204, 0);"&gt;pointcut-name(&lt;/span&gt;&lt;span style="color: rgb(51, 204, 255);"&gt;[args]&lt;/span&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;)&lt;/span&gt; : &lt;span style="font-style: italic; color: rgb(102, 0, 204);"&gt;pointcut-definition&lt;/span&gt;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;There are five parts of a pointcut as shown above:&lt;br /&gt;1. access specifier&lt;br /&gt;2. pointcut keyword&lt;br /&gt;3. pointcut name&lt;br /&gt;4. pointcut arguments&lt;br /&gt;5. pointcut definition&lt;br /&gt;&lt;br /&gt;Pointcut definition consists of &lt;span style="font-weight: bold;"&gt;pointcut type&lt;/span&gt; and &lt;span style="font-weight: bold;"&gt;pointcut signature&lt;/span&gt;, it can be seen as defined-join-point to be captured. To keep things simple, lets list some of the most commonly used pointcut type:&lt;br /&gt;&lt;br /&gt;1. execution(MethodSignature) : Method or constructor execution, i.e. &lt;span style="color: rgb(0, 153, 0);"&gt;execution(public void edu.mat.hello.MessageCommunicator.deliverGlobalMessage(String))&lt;/span&gt; which means capture all join point on the execution of method &lt;span style="color: rgb(0, 153, 0);"&gt;deliverGlobalMessage &lt;/span&gt;in class &lt;span style="color: rgb(0, 153, 0);"&gt;MessageCommunicator&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;2. call(MethodSignature) : Method or constructor call, i.e. &lt;span style="color: rgb(0, 153, 0);"&gt;call(public void edu.mat.hello.MessageCommunicator.deliverGlobalMessage(String))  &lt;/span&gt;which means capture all join points on the calling of method &lt;span style="color: rgb(0, 153, 0);"&gt;deliverGlobalMessage &lt;/span&gt;in class &lt;span style="color: rgb(0, 153, 0);"&gt;MessageCommunicator&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;3. staticinitialization(TypeSignature) : Class initialization, i.e. &lt;span style="color: rgb(0, 153, 0);"&gt;staticinitialization(edu.mat.hello.MessageCommunicator)&lt;/span&gt; which means capture all join points on &lt;span style="color: rgb(0, 153, 0);"&gt;MessageCommunicator &lt;/span&gt;class loading.&lt;br /&gt;&lt;br /&gt;4. get(FieldSignature) : Field read access, i.e. &lt;span style="color: rgb(0, 153, 0);"&gt;get(private String edu.mat.hello.MessageCommunicator.name)&lt;/span&gt; which means capture all join points on getter method of private variable &lt;span style="color: rgb(0, 153, 0);"&gt;name &lt;/span&gt;in class &lt;span style="color: rgb(0, 153, 0);"&gt;MessageCommunicator&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;5. set(FieldSignature) : Field write access, i.e. &lt;span style="color: rgb(0, 153, 0);"&gt;set(private String edu.mat.hello.MessageCommunicator.name)&lt;/span&gt; which means capture all join points on setter method of private variable &lt;span style="color: rgb(0, 153, 0);"&gt;name &lt;/span&gt;in class &lt;span style="color: rgb(0, 153, 0);"&gt;MessageCommunicator&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;6. handler(TypeSignature) : Exception handler execution.&lt;br /&gt;&lt;br /&gt;7. initialization(ConstructorSignature) : Object initialization, i.e. &lt;span style="color: rgb(0, 153, 0);"&gt;initialization(public edu.mat.hello.MessageCommunicator.new())&lt;/span&gt; which means capture all join points on object &lt;span style="color: rgb(0, 153, 0);"&gt;MessageCommunicator &lt;/span&gt;creation.&lt;br /&gt;&lt;br /&gt;8. within(TypePattern) : Capture join points in a scope, i.e. &lt;span style="color: rgb(0, 153, 0);"&gt;!within(AccountAspect) &amp;amp;&amp;amp; !within(edu.mat.hello.MessageCommunicator) &amp;amp;&amp;amp; !within(MessageCommunicatorAspect)&lt;/span&gt; which means capture all join points outside &lt;span style="color: rgb(0, 153, 0);"&gt;AccountAspect &lt;/span&gt;aspect and &lt;span style="color: rgb(0, 153, 0);"&gt;MessageCommunicator &lt;/span&gt;class and also outside &lt;span style="color: rgb(0, 153, 0);"&gt;MessageCommunicatorAspect &lt;/span&gt;aspect.&lt;br /&gt;&lt;br /&gt;A pointcut could have arguments as shown in the pointcut syntax above. We can capture the values of the arguments using &lt;span style="color: rgb(0, 153, 0);"&gt;args&lt;/span&gt;. For example: &lt;span style="color: rgb(0, 153, 0);"&gt;private pointcut sayMyName(String person) : call(* edu.mat.hello.MessageCommunicator.sayMyName(String, String)) &amp;amp;&amp;amp; args(person, String); &lt;/span&gt;which means capture all pointcuts in &lt;span style="color: rgb(0, 153, 0);"&gt;sayMyName &lt;/span&gt;method of class &lt;span style="color: rgb(0, 153, 0);"&gt;MessageCommunicator &lt;/span&gt;and grab first argument (named person) as shown in &lt;span style="color: rgb(0, 153, 0);"&gt;args(person, String)&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;We can also capture the caller of being executed join point using &lt;span style="color: rgb(0, 153, 0);"&gt;target&lt;/span&gt;. For example we have the following pointcut &lt;span style="color: rgb(0, 153, 0);"&gt;private pointcut setNameField() : set(private String edu.mat.hello.MessageCommunicator.name);&lt;/span&gt; and &lt;span style="color: rgb(0, 153, 0);"&gt;private pointcut targetObject(edu.mat.hello.MessageCommunicator object) : target(object) &amp;amp;&amp;amp; setNameField();&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;In the first pointcut we want to capture all join points on setter method of &lt;span style="color: rgb(0, 153, 0);"&gt;name &lt;/span&gt;variable on class &lt;span style="color: rgb(0, 153, 0);"&gt;MessageCommunicator&lt;/span&gt;. In the second pointcut, we want to capture all join points on previous pointcut (when &lt;span style="color: rgb(0, 153, 0);"&gt;name &lt;/span&gt;variable is set) and grab the &lt;span style="color: rgb(0, 153, 0);"&gt;MessageCommunicator &lt;/span&gt;object which calls that setter method, that is the target.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-7980410305500973971?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/7980410305500973971/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=7980410305500973971' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/7980410305500973971'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/7980410305500973971'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2011/07/aop-notes-on-pointcuts.html' title='AOP - Notes on Pointcuts'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-8196412542788408348</id><published>2011-07-12T07:55:00.003+07:00</published><updated>2011-07-12T08:32:32.538+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stories'/><title type='text'>Database Index, a little action leads to better performance</title><content type='html'>When you run a query and it happens to run very slow against a certain table, you start thinking that your fellow who created the query must have created a buggy query. Later, when you scan your database tables, you then find that the table has no index at all. Take a deep breath and start creating indexes on columns which are accessed a lot in queries, for example, primary keys, foreign keys, and columns that are used often in the &lt;span style="font-style: italic;"&gt;where &lt;/span&gt;and &lt;span style="font-style: italic;"&gt;order &lt;/span&gt;clauses. After that, don't forget to say sorry for blaming your fellow and start complaining your DBA :D.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-8196412542788408348?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/8196412542788408348/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=8196412542788408348' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/8196412542788408348'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/8196412542788408348'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2011/07/database-index-little-action-leads-to.html' title='Database Index, a little action leads to better performance'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-6057199971674838524</id><published>2011-07-11T09:47:00.003+07:00</published><updated>2011-07-11T10:28:58.077+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Beautiful Mind'/><title type='text'>Entity Object Locking</title><content type='html'>Object locking is required to avoid concurrency problem in an application. Generally speaking, there are two types of object locking: &lt;span style="font-weight: bold;"&gt;Pessimistic Locking&lt;/span&gt; and &lt;span style="font-weight: bold;"&gt;Optimistic Locking&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Pessimistic locking is a locking strategy where we prevent users from doing certain things. Here is an example of pessimistic locking:&lt;br /&gt;&lt;br /&gt;User A performs update action on an entity object, then user A gets &lt;span style="font-style: italic;"&gt;write lock&lt;/span&gt; on the being updated entity object. At almost concurrent time, user B performs update action on the same entity object, then user B's action is rejected since the entity object's &lt;span style="font-style: italic;"&gt;write lock&lt;/span&gt; is being hold by user A.&lt;br /&gt;&lt;br /&gt;JPA doesn't support this strategy because it has many disadvantages. It can make the application slower because certain action have to wait for entity object's lock to be released.&lt;br /&gt;&lt;br /&gt;Optimistic locking is a locking strategy where we will use object comparison to decide whether a certain transaction will be committed or rolled back. Here is an example of optimistic locking:&lt;br /&gt;&lt;br /&gt;When a user performs update action on an entity object, he/she will retrieve a copy of that entity object. Changes are made to the copy object, not the original. When the user is about to save it to database, application checks whether data have been updated since the user retrieved it. If no update has been made,  the user gets entity object's &lt;span style="font-style: italic;"&gt;write lock&lt;/span&gt;, then the data is committed. Otherwise, it is rejected.&lt;br /&gt;&lt;br /&gt;JPA support this strategy. It is implemented by adding a column to the table for the entity to save a version number. Every time the row is updated, the version number is incremented. It is by comparing that version number the update action is committed or rejected.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-6057199971674838524?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/6057199971674838524/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=6057199971674838524' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/6057199971674838524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/6057199971674838524'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2011/07/entity-object-locking.html' title='Entity Object Locking'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-1616823524011067878</id><published>2011-07-04T12:35:00.013+07:00</published><updated>2011-07-04T14:51:18.699+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Oracle Toplink + PostgreSQL = nightmare</title><content type='html'>Banyak masalah yang muncul ketika memakai Oracle Toplink sebagai persistence provider dan PostgreSQL sebagai databasenya, antara lain:&lt;br /&gt;1. Tidak mau menjalankan sequence. Solusi:&lt;br /&gt;&lt;br /&gt;package edu.mat.client;&lt;br /&gt;&lt;br /&gt;import oracle.toplink.essentials.platform.database.PostgreSQLPlatform;&lt;br /&gt;import oracle.toplink.essentials.queryframework.ValueReadQuery;&lt;br /&gt;import oracle.toplink.essentials.sessions.DatabaseSession;&lt;br /&gt;&lt;br /&gt;public class PostgreSQLPlatformSupportingSequences extends PostgreSQLPlatform {&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;*&lt;br /&gt;*/&lt;br /&gt;private static final long serialVersionUID = -2637524409846222203L;&lt;br /&gt;&lt;br /&gt;public boolean shouldNativeSequenceAcquireValueAfterInsert() {&lt;br /&gt;return false;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void platformSpecificSequencingInitialization(DatabaseSession session) {&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public ValueReadQuery buildSelectQueryForNativeSequence(String seqName,&lt;br /&gt;Integer size) {&lt;br /&gt;ValueReadQuery selectQuery = new ValueReadQuery();&lt;br /&gt;selectQuery.setSQLString("select nextval(\'" + seqName + "\')");&lt;br /&gt;return selectQuery;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Terus tambahkan di persistence.xml &lt;span style="font-weight: bold;"&gt;&amp;lt;property name="toplink.target-database" value="edu.mat.client.PostgreSQLPlatformSupportingSequences"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;2. Muncul error &lt;span style="font-weight: bold;"&gt;Problem with sequence setup increment does not match its pre-allocation size.&lt;/span&gt; Solusi: &lt;span style="font-weight: bold;"&gt;Ubah current-value di sequence menjadi 100&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;, dan increment-value menjadi genap semisal dua&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;3. Data byte dengan annotation @Lob seperti&lt;br /&gt;&lt;br /&gt;@Column(name = "PICTURE", table = "USER_PICTURES")&lt;br /&gt;   @Lob&lt;br /&gt;   @Basic(fetch = FetchType.LAZY)&lt;br /&gt;   public final byte[] getPicture() {&lt;br /&gt;       return picture;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;harus didefinisikan dengan tipe oid di PostgreSQL&lt;br /&gt;&lt;tt&gt;&lt;/tt&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-1616823524011067878?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/1616823524011067878/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=1616823524011067878' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/1616823524011067878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/1616823524011067878'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2011/07/oracle-toplink-postgresql-nightmare.html' title='Oracle Toplink + PostgreSQL = nightmare'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-4490887461681866940</id><published>2011-05-19T15:44:00.019+07:00</published><updated>2011-07-19T10:36:42.611+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>JAXP &amp; JAXB</title><content type='html'>&lt;span style="font-weight: bold;"&gt;JAXP = Java API for XML Processing (SAX, DOM, StaX)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;JAXP is for processing XML data using applications written in Java. JAXP leverages the parser standards Simple API for XML Parsing (SAX) and Document Object Model (DOM) so that you can choose to parse your data as a stream of events or to build an object representation of it. JAXP also implements the Streaming API for XML (StAX) standard.&lt;br /&gt;&lt;br /&gt;SAX is a standard interface for event-based XML parsing. It reports parsing events (such as the start and end of elements) directly to the application through callbacks, the application implements handlers to deal with the different events. It supports read-only access, that is, SAX is designed only for reading XML documents. Of course, we could write a new document out as a result of event, but we cannot change the document being processed.&lt;br /&gt;&lt;br /&gt;SAX is fast and efficient, but its event model makes it most useful for  such state-independent filtering. For example, a SAX parser calls one  method in your application when an element tag is encountered and calls a  different method when text is found. If the processing you are doing is  state-independent (meaning that it does not depend on the elements that  have come before), then SAX works fine.&lt;br /&gt;&lt;br /&gt;On the other hand, for state-dependent processing, where the program  needs to do one thing with the data under element A but something  different with the data under element B, then a pull parser such as the  Streaming API for XML (StAX) would be a better choice.&lt;br /&gt;&lt;br /&gt;StAX provides a streaming, event-driven, pull-parsing API for reading and writing XML documents. StAX offers a simpler programming model than SAX and more efficient memory management than DOM.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Pull Parsing versus Push Parsing&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Streaming pull parsing refers to a programming model in which a client  application calls methods on an XML parsing library when it needs to  interact with an XML infoset—that is, the client only gets (pulls) XML  data when it explicitly asks for it.&lt;br /&gt;&lt;br /&gt;Streaming push parsing refers to a programming model in which an XML  parser sends (pushes) XML data to the client as the parser encounters  elements in an XML infoset—that is, the parser sends the data whether or  not the client is ready to use it at that time.&lt;br /&gt;&lt;br /&gt;Pull parsers and the SAX API both act like a serial I/O stream. You see the data as it streams in, but you cannot go back to an earlier position or leap ahead to a different position. In general, such parsers work well when you simply want to read data and have the application act on it.&lt;br /&gt;But when you need to modify an XML structure - especially when you need to modify it interactively - an in-memory structure makes more sense. DOM is one such model.&lt;br /&gt;&lt;br /&gt;Generally speaking, there are two programming models for working with XML infosets: streaming and the document object model (DOM).&lt;br /&gt;&lt;br /&gt;The DOM model involves creating in-memory objects representing an entire document tree and the complete infoset state for an XML document. Once in memory, DOM trees can be navigated freely and parsed arbitrarily, and as such provide maximum flexibility for developers. However, the cost of this flexibility is a potentially large memory footprint and significant processor requirements, because the entire representation of the document must be held in memory as objects for the duration of the document processing. This may not be an issue when working with small documents, but memory and processor requirements can escalate quickly with document size.&lt;br /&gt;&lt;br /&gt;Streaming refers to a programming model in which XML infosets are transmitted and parsed serially at application runtime, often in real time, and often from dynamic sources whose contents are not precisely known beforehand. Moreover, stream-based parsers can start generating output immediately, and infoset elements can be discarded and garbage collected immediately after they are used. While providing a smaller memory footprint, reduced processor requirements, and higher performance in certain situations, the primary trade-off with stream processing is that you can only see the infoset state at one location at a time in the document.&lt;br /&gt;&lt;br /&gt;Streaming models for XML processing are particularly useful when your application has strict memory limitations, as with a cellphone running the Java Platform, Micro Edition (Java ME platform), or when your application needs to process several requests simultaneously, as with an application server.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;JAXB = Java API for XML Binding&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;JAXB provides a fast and convenient way to create a two-way mapping between XML documents and Java objects. What XML data-binding does is to create Java classes from schema definition. That is, the XML schema can be compiled to generate corresponding Java classes.And once the class is generated for the XML schema, a XML document which follows the syntax of the schema can be represented as an instance of the generated class. The process of converting XML document to a corresponding high-level Java object is called "un-marshalling" while the reverse is called "marshalling".&lt;br /&gt;&lt;br /&gt;Here is some example I provide:&lt;br /&gt;&lt;br /&gt;&lt;embed src="http://www.box.net//static/flash/box_explorer.swf?widget_hash=bbgd94a6xenni5n16z62&amp;v=0&amp;cl=0&amp;s=0" width="350" height="250" wmode="transparent" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-4490887461681866940?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/4490887461681866940/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=4490887461681866940' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/4490887461681866940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/4490887461681866940'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2011/05/what-are-those-jax-libs-in-java.html' title='JAXP &amp; JAXB'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-5927144052267525217</id><published>2011-04-06T12:39:00.007+07:00</published><updated>2011-04-20T12:28:20.521+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Objective-C'/><title type='text'>Encode URL and Decode Google Translate's Response in Objective C</title><content type='html'>I've been working on a project that needs to get a translation from google translate web service. There are some codes in google code that can help you doing this. However, I found some problems regarding string encoding.&lt;br /&gt;&lt;br /&gt;I used to encode the string with &lt;span style="color: rgb(0, 102, 0);"&gt;NSUTF8StringEncoding&lt;/span&gt;, but it doesn't encode character &lt;span style="color: rgb(0, 102, 0);"&gt;&amp;amp;&lt;/span&gt; into &lt;span style="color: rgb(0, 102, 0);"&gt;%26&lt;/span&gt; or &lt;span style="color: rgb(0, 102, 0);"&gt;+&lt;/span&gt; into &lt;span style="color: rgb(0, 102, 0);"&gt;%2B&lt;/span&gt; so I had to encode it manually.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;NSString* urlEncodedText = [text stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;urlEncodedText = [CommonUtil encodeCharacters:urlEncodedText];&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;+ (NSString*) encodeCharacters:(NSString*) string {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    NSMutableDictionary* dict = [[NSMutableDictionary alloc] init];&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    [dict setObject:@"%26" forKey:@"&amp;amp;"];&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    [dict setObject:@"%2B" forKey:@"+"];&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    NSArray* keys = [dict allKeys];&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    for (int i = 0; i &amp;lt; [keys count]; i++) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        NSString* key = [keys objectAtIndex:i];&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        string = [string stringByReplacingOccurrencesOfString:key withString:[dict objectForKey:key]];&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    return string;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The same thing happens when I get the translation. I get &lt;span style="color: rgb(0, 102, 0);"&gt;&amp;amp;amp;&lt;/span&gt; instead of &lt;span style="color: rgb(0, 102, 0);"&gt;&amp;amp;&lt;/span&gt;, &lt;span style="color: rgb(0, 102, 0);"&gt;&amp;amp;quot;&lt;/span&gt; instead of &lt;span style="color: rgb(0, 102, 0);"&gt;" (double quote)&lt;/span&gt;, etc so I had to manually decode it.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;+ (NSString *) decodeCharacters:(NSString *)string {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    NSMutableDictionary* dict = [[NSMutableDictionary alloc] init];&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    [dict setObject:@"&amp;amp;" forKey:@"&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;amp;"];&lt;br /&gt;[dict setObject:@"\"" forKey:@"&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;quot;"];&lt;br /&gt;[dict setObject:@"'" forKey:@"&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;#39;"];&lt;br /&gt;[dict setObject:@"&amp;lt;" forKey:@"&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;lt;"];&lt;br /&gt;[dict setObject:@"&amp;gt;" forKey:@"&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;gt;"];&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    NSArray* keys = [dict allKeys];&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    for (int i = 0; i &amp;lt; [keys count]; i++) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        NSString* key = [keys objectAtIndex:i];&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        string = [string stringByReplacingOccurrencesOfString:key withString:[dict objectForKey:key]];&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    return string;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-5927144052267525217?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/5927144052267525217/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=5927144052267525217' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/5927144052267525217'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/5927144052267525217'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2011/04/encode-url-and-decode-google-translates.html' title='Encode URL and Decode Google Translate&apos;s Response in Objective C'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-1476073907288365871</id><published>2011-03-23T09:27:00.004+07:00</published><updated>2011-03-23T09:37:56.567+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='svn'/><title type='text'>TortoiseSVN Error</title><content type='html'>I got the following notification when trying to commit my code:&lt;br /&gt;&lt;br /&gt;Error: Commit failed (details follow):&lt;br /&gt;Error: Unable to open an ra_local session to URL&lt;br /&gt;Error: Unable to open repository &lt;span class="zwsp"&gt;'file:///D:/SVN/LinkLearning/trunk'&lt;/span&gt;&lt;br /&gt;Error: Berkeley DB error for filesystem 'D:/SVN/LinkLearning/db' while opening environment:&lt;br /&gt;Error: Not enough space&lt;br /&gt;Error: bdb: unable to allocate memory for mutex; resize mutex region&lt;br /&gt;&lt;br /&gt;I googled without luck. Then I opened &lt;span style="color: rgb(0, 102, 0);"&gt;DB_CONFIG&lt;/span&gt; file located in D:/SVN/LinkLearning/db. There, I found a statement like "You must run 'svnadmin recover' whenever you modify this file,  for your changes to take effect." So I frustratingly run that command as in: &lt;span style="color: rgb(0, 102, 0);"&gt;D:\SVN\LinkLearning&gt;svnadmin recover d:\SVN\LinkLearning&lt;/span&gt;. Then I tried to commit my code again. Wolah... magically everything is OK :D.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-1476073907288365871?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/1476073907288365871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=1476073907288365871' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/1476073907288365871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/1476073907288365871'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2011/03/tortoisesvn-error.html' title='TortoiseSVN Error'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-3581167571523909159</id><published>2010-10-28T09:21:00.006+07:00</published><updated>2010-10-28T09:29:51.055+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Beautiful Mind'/><title type='text'>Insertion sort</title><content type='html'>Akhirnya sempat juga ngeblok di sela-sela ngoding iPhone ;)). Tak terasa sudah lama meninggalkan pulau Java. Sekarang ini sedang demam mempelajari kembali algoritma-algoritma yang sudah bertahun-tahun ditinggalkan. Sebagai permulaan sebaiknya mulai dari Insertion Sort. Berikut adalah implementasinya di Java:&lt;br /&gt;&lt;br /&gt;public class Algoritma {&lt;br /&gt;&lt;br /&gt;    public static void main(String[] args) {&lt;br /&gt;        int[] input = new int[] {5, 2, 4, 6, 1, 3};&lt;br /&gt;        insertionSortIncrease(input);&lt;br /&gt;        System.out.println("\n");&lt;br /&gt;        insertionSortDecrease(input);&lt;br /&gt;    }&lt;br /&gt;   &lt;br /&gt;    private static void insertionSortIncrease(int[] input) {&lt;br /&gt;        for (int j = 1; j &lt; input.length; j++) {&lt;br /&gt;            int key = input[j];&lt;br /&gt;            int i = j - 1;&lt;br /&gt;            while (i &gt;= 0 &amp;amp;&amp;amp; input[i] &gt; key) {&lt;br /&gt;                input[i + 1] = input[i];&lt;br /&gt;                i--;&lt;br /&gt;            }&lt;br /&gt;            input[i + 1] = key;&lt;br /&gt;        }&lt;br /&gt;        for (int i = 0; i &lt; input.length; i++) {&lt;br /&gt;            System.out.print(input[i] + " ");&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;   &lt;br /&gt;    private static void insertionSortDecrease(int[] input) {&lt;br /&gt;        for (int j = 1; j &lt; input.length; j++) {&lt;br /&gt;            int key = input[j];&lt;br /&gt;            int i = j - 1;&lt;br /&gt;            while (i &gt;= 0 &amp;amp;&amp;amp; input[i] &lt; key) {&lt;br /&gt;                input[i + 1] = input[i];&lt;br /&gt;                i--;&lt;br /&gt;            }&lt;br /&gt;            input[i + 1] = key;&lt;br /&gt;        }&lt;br /&gt;        for (int i = 0; i &lt; input.length; i++) {&lt;br /&gt;            System.out.print(input[i] + " ");&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-3581167571523909159?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/3581167571523909159/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=3581167571523909159' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/3581167571523909159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/3581167571523909159'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2010/10/insertion-sort.html' title='Insertion sort'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-2769064679279600904</id><published>2010-10-04T07:18:00.001+07:00</published><updated>2010-10-04T07:32:40.138+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Beautiful Mind'/><title type='text'>Pattern Builder and Factory</title><content type='html'>Builder and Factory are two different pattern, obviously. But sometimes I get confused because of their name. Both patterns act as object manager, they create object and hide the creation from user.&lt;br /&gt;&lt;br /&gt;Factory is used to create object in an object family. Usually I pass a static number and the factory will go through if-else condition to decide what object to create.&lt;br /&gt;&lt;br /&gt;Builder on the other hand, create an object based on some object characteristics. For example we have an xml file that holds object's state, and we want to create an object based on the file. We then pass the xml, then the Builder will create the object for us.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-2769064679279600904?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/2769064679279600904/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=2769064679279600904' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/2769064679279600904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/2769064679279600904'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2010/10/pattern-builder-and-factory.html' title='Pattern Builder and Factory'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-4382600374414942509</id><published>2010-10-03T07:42:00.013+07:00</published><updated>2010-10-04T07:14:42.778+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Thread: synch, lock, wait, notify, join</title><content type='html'>&lt;div&gt;&lt;b&gt;Synchronization&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Synchronization in java works with object lock. Every object in java has a built-in lock that only comes into play when the object has synchronized method code. Since there is only one lock per object, if one thread has picked up the lock, no other thread can enter the synchronized code (which means any synchronized method of that object) until the lock has been released. Typically, releasing a lock means the thread holding the lock (in other word, the thread currently in the synchronized method) exits the synchronized method. At that point, the lock is free until some other thread enters a synchronized method on that object.&lt;br /&gt;&lt;br /&gt;An example of synchronization is on account withdrawal. Usually, before making withdrawal, we check the account balance. We must guarantee that those two actions are never split apart. We need them to always be performed as one operation.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);" class="Apple-style-span"&gt;private synchronized void makeWithdrawal(int amt) {&lt;br /&gt; if (acct.getBalance() &amp;gt;= amt) {&lt;br /&gt;     System.out.println(Thread.currentThread().getName() + " is going to withdraw");&lt;br /&gt;     try {&lt;br /&gt;         Thread.sleep(500);&lt;br /&gt;     } catch(InterruptedException ex) { }&lt;br /&gt;     acct.withdraw(amt);&lt;br /&gt;         System.out.println(Thread.currentThread().getName() + " completes the withdrawal");&lt;br /&gt; } else {&lt;br /&gt;     System.out.println("Not enough in account for " + Thread.currentThread().getName() + " to withdraw " + acct.getBalance());&lt;br /&gt; }&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In previous code we simulate account checking and withdrawal as two action by making the thread to sleep. By putting those two actions in a single synchronized method, we make them as one operation.&lt;br /&gt;&lt;br /&gt;Because each object has a built-in lock, we can synchronize a block of code instead of a method as in &lt;span class="Apple-style-span" style="color: rgb(0, 153, 0);"&gt;synchronized(obj)&lt;/span&gt;. That means, the currently running thread is acquiring obj's lock so that no other thread can execute any synchronized method and block of code in object obj.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Thread Interaction&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Consider the following scenario for thread interaction.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;class Reader extends Thread {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    Calculator c;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    public Reader(Calculator calc) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;        c = calc;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    public void run() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;        synchronized(c) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;            try {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;                System.out.println("Waiting for calculation...");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;                c.wait();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;            } catch (InterruptedException e) {}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;        System.out.println("Total is: " + c.total);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    public static void main(String [] args) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;        Calculator calculator = new Calculator();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;        calculator.start();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;        new Reader(calculator).start();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;        new Reader(calculator).start();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;        new Reader(calculator).start();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;class Calculator extends Thread {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    int total;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    public void run() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;        synchronized(this) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;            for(int i=0;i&lt;100;i++)&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;                total += i;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;            notifyAll();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;The Calculator object is responsible for calculating the total value. It extends Thread, and the calculating process is wrapped inside run method. Another class is the Reader class. This class responsibility is to display the total value, calculated by Calculator before, to console. Because both classes extend Thread, they will be run on their own thread. We need some way to let Calculator finish calculating first and then display the result to console.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Java provides methods to deal with that condition. Those methods are wait(), notify(), and notifyAll(). In order to use those methods, we must have the lock on the target object, in this case is Calculator (that's why we synchronized both run method). In the code above, we have three Reader referencing to one shared Calculator. When any of the Reader object runs, it will hold the Calculator lock and make the other Reader blocked. It will then wait for the Calculator by releasing the lock (&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;when a thread calls wait() in an object, it will release the object's lock&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;). Once the lock is released, other Reader object go to their own run method and they all will be blocked when calling c.wait, just like the first Reader. Now calculator has it's turn to execute it's synchronized run method and notify all waiting thread.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Java specs says that there is no guarantee on thread execution order. It means that the notify call (on Calculator thread) can take place first before Reader thread calls wait method. If this happens, the thread will never wake up. To prevent this, we can use wait method that accepts a number of milisecond as max time to wait.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;Join&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;First time I learnt about join and wait/notify, it was pretty the same. After awhile, I can see the difference on the purpose / scenario. The above calculator example is about thread communication, two or more threads are talking to each other. An example of join is if we want to have a calculator for a reader. In that situation we can join the reader to calculator to make the reader waiting the calculator to finish and dead.&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/5217372432017247701-4382600374414942509?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/4382600374414942509/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=4382600374414942509' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/4382600374414942509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/4382600374414942509'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2010/10/thread-synch-lock-wait-notify-join.html' title='Thread: synch, lock, wait, notify, join'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-1816514292749680048</id><published>2010-09-13T15:16:00.008+07:00</published><updated>2010-09-13T15:42:19.592+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Objective-C'/><title type='text'>nil, NULL, and release</title><content type='html'>Just a quick note about how to check whether an object is null or not in Objective-C. In java, it is easy to do that through 'null' keyword. While in Objective-C, there are two keywords, 'NULL' and 'nil', to deal with that action. What is the difference? NOTHING. Both keywords point to __DARWIN_NULL which is defined as : #define NULL ((void *)0) . It means, they point to address 0 in memory.&lt;br /&gt;&lt;br /&gt;When we release an object using [object release], don't forget to set it to nil or NULL because when we compare it in 'if' statement, it won't be true because it is still pointing to its old address.&lt;br /&gt;&lt;br /&gt;For example:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;MyViewController c = [[MyViewController alloc] init];&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;[c release];&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If we compare it in 'if' statement &lt;span style="color: rgb(0, 153, 0);"&gt;if(c)&lt;/span&gt;, the statement will return true because the pointer is still pointing to its address even tough we have released it before. We need to set it to nil or NULL &lt;span style="color: rgb(0, 102, 0);"&gt;c = nil&lt;/span&gt; to make it point to address 0. After we do that, &lt;span style="color: rgb(0, 153, 0);"&gt;if(c)&lt;/span&gt; will return 0, which is false in C.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-1816514292749680048?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/1816514292749680048/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=1816514292749680048' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/1816514292749680048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/1816514292749680048'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2010/09/nil-null-and-release.html' title='nil, NULL, and release'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-7753352442332968428</id><published>2010-08-03T15:40:00.006+07:00</published><updated>2010-08-04T08:54:59.116+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Objective-C'/><title type='text'>Objective-C Event Handling Overview</title><content type='html'>Objective-C manages user input event as responder chain. It goes backward up from the first responder (object that user is interacting with) until application delegate at the top most.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_uZGWgKeKvmY/TFfXer5SF8I/AAAAAAAAATU/WIPG5f9hg9A/s1600/event.PNG"&gt;&lt;img style="cursor: pointer; width: 67px; height: 209px;" src="http://2.bp.blogspot.com/_uZGWgKeKvmY/TFfXer5SF8I/AAAAAAAAATU/WIPG5f9hg9A/s320/event.PNG" alt="" id="BLOGGER_PHOTO_ID_5501102392035383234" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;UIResponder contains methods to catch events. When we create a view as subclass of UIView, it inherits methods to access the events.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_uZGWgKeKvmY/TFfd31vMZlI/AAAAAAAAATc/0V-bLX952_U/s1600/event.PNG"&gt;&lt;img style="cursor: pointer; width: 320px; height: 126px;" src="http://1.bp.blogspot.com/_uZGWgKeKvmY/TFfd31vMZlI/AAAAAAAAATc/0V-bLX952_U/s320/event.PNG" alt="" id="BLOGGER_PHOTO_ID_5501109421243917906" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We can handle the events by implementing those methods. Following MVC pattern, usually we will delegate it to a controller.&lt;br /&gt;&lt;br /&gt;-(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {&lt;br /&gt;[controller doSomething];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;UIControl Target Action Events&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When we work with events, the UIResponder class holds many of the methods critical for event control. Similarly, we can access a lot of the methods important to SDK controls through the UIControl class. UIControl is a child of UIView (and thus UIResponder).&lt;br /&gt;&lt;br /&gt;The UIControl object introduces a whole new event-handling infrastructure that takes touch events and (eventually) converts them into simple actions, without having to worry about the specifics of how a user accessed control.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_uZGWgKeKvmY/TFfkp3dFaUI/AAAAAAAAATk/VmsmYLpuN0Q/s1600/event.PNG"&gt;&lt;img style="cursor: pointer; width: 320px; height: 140px;" src="http://2.bp.blogspot.com/_uZGWgKeKvmY/TFfkp3dFaUI/AAAAAAAAATk/VmsmYLpuN0Q/s320/event.PNG" alt="" id="BLOGGER_PHOTO_ID_5501116877768059202" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;When a touch event arrives at a UIControl object (via normal dispatching along the responder chain), the control does something unique. Inside the standard UIResponder methods (such as touchesBegan:withEvent:), a UIControl object turns standard touch events into special control events. These control events broadly describe how the user has interacted with the controls rather than just recording gestures. For example, they might report that a button has been pushed or a slider moved.&lt;br /&gt;&lt;br /&gt;Once a standard event has been turned into a control event, a sequence of additional methods is called. First, the UIControl object calls sendActionsForControlEvents:. That in turn breaks down the events it’s been sent and calls sendAction:to:forEvent:, once per event. Here the control event is turned into an action, which is a specific method that’s going to be run in a specific target object. Finally the UIApplication method sendAction:to:fromSender:forEvent: is called by the control, again once per event.&lt;br /&gt;&lt;br /&gt;That whole process can be slightly exhausting, and fortunately we shouldn’t normally need to know its details. For our purposes, we should be aware that a UIControl object turns a touch event first into a control event and then into an action with a specific recipient. Even better, it’s only the last part of that conversion, from control event into targeted action, which we need to code.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Summary&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Events are catched by the view (UIView) and then, following MVC pattern, they are delegated to the controller to be handled.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-7753352442332968428?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/7753352442332968428/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=7753352442332968428' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/7753352442332968428'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/7753352442332968428'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2010/08/objective-c-event-handling-overview.html' title='Objective-C Event Handling Overview'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_uZGWgKeKvmY/TFfXer5SF8I/AAAAAAAAATU/WIPG5f9hg9A/s72-c/event.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-3492975431749112019</id><published>2010-07-21T07:10:00.005+07:00</published><updated>2010-08-03T15:30:59.478+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Objective-C'/><title type='text'>Delegate</title><content type='html'>Usually if we want to add new behavior in an existing object, we do inheritance. For example if we have class Apple below:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_uZGWgKeKvmY/TEab-rGiulI/AAAAAAAAAS8/hDjpt93fSSU/s1600/apple.JPG"&gt;&lt;img style="cursor: pointer; width: 264px; height: 232px;" src="http://1.bp.blogspot.com/_uZGWgKeKvmY/TEab-rGiulI/AAAAAAAAAS8/hDjpt93fSSU/s320/apple.JPG" alt="" id="BLOGGER_PHOTO_ID_5496251896276630098" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If we want the Apple class to have a new behavior such as growAppleInDesert(), we have some options:&lt;br /&gt;1.    Put the new method in interface or parent class, IFruit. This will apply to all subclasses, however.&lt;br /&gt;2.    Put the new method in Apple class. This can be done; however, if our Apple class is a simple UI, adding the action growAppleInDesert() here will break layering pattern.&lt;br /&gt;3.    Subclass Apple to create new class, say DesertApple. This is what OO design pattern suggested.&lt;br /&gt;4.    Create new class, say AppleGrowAction which contains growAppleInDesert() , growAppleInMeadow(), etc. Our current Apple object can then refer to the new AppleGrowAction class to call its methods. This is known as delegate.&lt;br /&gt;5. Using "Category" feature of Objective-C. This will be explained later.&lt;br /&gt;&lt;br /&gt;Another example is if we want to create a new component from an existing one. We have some options:&lt;br /&gt;1.     We can inherit the existing component; however, if the component has  so many methods, we will end up having those methods in our class.&lt;br /&gt;2.    Put the component as delegate, our new component will only need to call methods in existing component.&lt;br /&gt;&lt;br /&gt;In Cocoa Framework, delegate usually implemented as protocol. For example if we have a control UITextField, we will need to implement UITextFieldDelegate protocol in order to handle text field event.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_uZGWgKeKvmY/TEagS_ef5KI/AAAAAAAAATE/WGk9wDiIp0M/s1600/apple1.JPG"&gt;&lt;img style="cursor: pointer; width: 320px; height: 246px;" src="http://3.bp.blogspot.com/_uZGWgKeKvmY/TEagS_ef5KI/AAAAAAAAATE/WGk9wDiIp0M/s320/apple1.JPG" alt="" id="BLOGGER_PHOTO_ID_5496256643389711522" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In Java it is common to do (3) or (4), but, in Objective-C, (4) is widely used. It is called delegation because we delegate some tasks to another object.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Category&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Category is an Objective-C feature that allows us to extend the capability of a given class. This feature works even if we do not have access to the source code of the class we are extending. When we extend a given class through a category, the extension is inherited by all its subclasses. Of course, the additional methods defined by the category are only seen by our program.&lt;br /&gt;&lt;br /&gt;To illustrate this feature, let us extend the NSObject class by adding an instance method to it:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_uZGWgKeKvmY/TFfTXfBlysI/AAAAAAAAATM/hFuSouu76kE/s1600/category_obj_c.PNG"&gt;&lt;img style="cursor: pointer; width: 320px; height: 175px;" src="http://4.bp.blogspot.com/_uZGWgKeKvmY/TFfTXfBlysI/AAAAAAAAATM/hFuSouu76kE/s320/category_obj_c.PNG" alt="" id="BLOGGER_PHOTO_ID_5501097870274972354" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-3492975431749112019?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/3492975431749112019/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=3492975431749112019' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/3492975431749112019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/3492975431749112019'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2010/07/delegate.html' title='Delegate'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_uZGWgKeKvmY/TEab-rGiulI/AAAAAAAAAS8/hDjpt93fSSU/s72-c/apple.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-6540444016359890821</id><published>2010-07-20T14:24:00.004+07:00</published><updated>2011-12-18T13:13:01.160+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Objective-C'/><title type='text'>Java reference, Objective-C retain count</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Java&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;How Java's garbage collector knows that an object must be destroyed? An object is a candidate for garbage collector if they lose all its references. For example Object B below. It is referred by variable B1 and B2. Once both B1 and B2 lose reference to it, none knows that it exists, then it becomes candidate for garbage collector.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_uZGWgKeKvmY/TEVPYCzKmAI/AAAAAAAAASs/oigIXjmYYPI/s1600/memory1.JPG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="cursor: pointer; width: 230px; height: 156px;" src="http://2.bp.blogspot.com/_uZGWgKeKvmY/TEVPYCzKmAI/AAAAAAAAASs/oigIXjmYYPI/s320/memory1.JPG" alt="" id="BLOGGER_PHOTO_ID_5495886194762487810" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Objective-C&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Objective-C on the other hand, uses different approach. Each object holds a variable named retainCount. It is set to 1 the first time the object created. It is incremented anytime the object retained or copied. It is decremented anytime it is released. When the retainCount equals zero, the object is destroyed.&lt;br /&gt;&lt;br /&gt;Those differences happen because they use different approach in memory management. Java depends on its garbage collection algorithm to release unused memory, while Objective-C gives programmers more responsibility to release their objects. If you allocate memory, it is your responsibility to release it.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;However, since XCode 4.2 Apple has put new feature called ARC (Automatic Reference Counting) to ease developers’ job dealing with allocating and releasing memory. It is sort of AOP implementation in Objective-C for me.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Using ARC, we don’t need to release memory we allocated before, in other words we don’t need to deal with retain-release code anymore. The compiler takes care the code of retaining-relasing objects.  At compile time, the compiler crosscuts your code and adds some line of retain-release code. Using ARC we now only have to deal with our logic.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-6540444016359890821?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/6540444016359890821/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=6540444016359890821' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/6540444016359890821'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/6540444016359890821'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2010/07/java-reference-objective-c-retain-count.html' title='Java reference, Objective-C retain count'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_uZGWgKeKvmY/TEVPYCzKmAI/AAAAAAAAASs/oigIXjmYYPI/s72-c/memory1.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-345145827311400747</id><published>2010-07-20T09:25:00.005+07:00</published><updated>2010-07-20T10:04:15.374+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Java Environment</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_uZGWgKeKvmY/TEUJgSQc4UI/AAAAAAAAASk/WFzie45hUv8/s1600/java.JPG"&gt;&lt;img style="cursor: pointer; width: 320px; height: 243px;" src="http://1.bp.blogspot.com/_uZGWgKeKvmY/TEUJgSQc4UI/AAAAAAAAASk/WFzie45hUv8/s320/java.JPG" alt="" id="BLOGGER_PHOTO_ID_5495809370536862018" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The picture above tells us a big picture of Java. Some codes written in Ada, Cobol, and C can be compiled into java byte code. The .class java byte code then translated by JVM into native machine language.&lt;br /&gt;&lt;br /&gt;So, what is JVM? Lets see java installation directory:&lt;br /&gt;1. JDK = java programs (java.exe, javac.exe, jar.exe, etc) + JRE&lt;br /&gt;2. JRE = collection of Java API (lang, util, text, io, net, math, nio)&lt;br /&gt;3. JVM = instance of JRE&lt;br /&gt;&lt;br /&gt;Another term is JIT which is a part of JVM that compiles java byte codes that have similar functionality at the same compiling time so it will reduce compile time.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Java Heap Space&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Heap is a part of memory used by JVM to allocate objects. There are three types of Java heap space:&lt;br /&gt;1. Young Generation: Space to save short-live objects, they are method-scope objects or loop-scope objects.&lt;br /&gt;2. Old/Tenured Generation: Space to save long-live objects, they are class-scope and application-scope objects.&lt;br /&gt;3. Permanent Generation (permgen): Space to save class definition and its metadata.&lt;br /&gt;&lt;br /&gt;There are some arguments that can be used to configure heap space:&lt;br /&gt;1. -Xmx256M : Maximum heap space value is 256 MB.&lt;br /&gt;2. -Xms128M: Initial heap space value is 128 MB. It will grow until xmx value is reached.&lt;br /&gt;3. -Xmn64M: Heap space allocated for young generation.&lt;br /&gt;&lt;br /&gt;There is nothing mentioned about default java heap space. It varies between machine, but wikipedia says it is 128M.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-345145827311400747?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/345145827311400747/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=345145827311400747' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/345145827311400747'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/345145827311400747'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2010/07/java-environment.html' title='Java Environment'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_uZGWgKeKvmY/TEUJgSQc4UI/AAAAAAAAASk/WFzie45hUv8/s72-c/java.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-7387244757505266232</id><published>2010-07-17T09:57:00.003+07:00</published><updated>2010-07-17T10:11:16.580+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Java Block (Static, Non static, Constructor)</title><content type='html'>Hanya untuk pengingat saja, daripada terus googling&lt;br /&gt;&lt;br /&gt;public class TestBlock {&lt;br /&gt;&lt;br /&gt;    {&lt;br /&gt;        System.out.println("This is object block...");&lt;br /&gt;    }&lt;br /&gt;   &lt;br /&gt;    public TestBlock() {&lt;br /&gt;        System.out.println("This is constructor...");&lt;br /&gt;    }&lt;br /&gt;   &lt;br /&gt;    static {&lt;br /&gt;        System.out.println("This is static block...");&lt;br /&gt;    }&lt;br /&gt;   &lt;br /&gt;    public static void main(String args[]) {&lt;br /&gt;        TestBlock obj1 = new TestBlock();&lt;br /&gt;        TestBlock obj2 = new TestBlock();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Hasil :&lt;br /&gt;&lt;br /&gt;This is static block...&lt;br /&gt;This is object block...&lt;br /&gt;This is constructor...&lt;br /&gt;This is object block...&lt;br /&gt;This is constructor...&lt;br /&gt;&lt;br /&gt;Dari hasilnya, ketahuan urutan eksekusi dan jumlah eksekusi.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-7387244757505266232?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/7387244757505266232/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=7387244757505266232' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/7387244757505266232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/7387244757505266232'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2010/07/java-block-static-non-static.html' title='Java Block (Static, Non static, Constructor)'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-5128249676360101001</id><published>2009-11-01T14:35:00.008+07:00</published><updated>2010-09-13T15:03:47.510+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Beautiful Mind'/><title type='text'>Design Pattern in Brief (10)</title><content type='html'>Facade&lt;br /&gt;&lt;br /&gt;Facade digunakan untuk menyembunyikan kompleksitas dan dependency terhadap subsystem. Jika tidak menggunakan facade client akan langsung berhubungan dengan subsystem sehingga terjadi tight couple seperti gambar berikut :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_uZGWgKeKvmY/Su07_EIOqpI/AAAAAAAAAQw/dr1_PC_65Uk/s1600-h/facade1.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 230px;" src="http://2.bp.blogspot.com/_uZGWgKeKvmY/Su07_EIOqpI/AAAAAAAAAQw/dr1_PC_65Uk/s320/facade1.png" alt="" id="BLOGGER_PHOTO_ID_5399037482913147538" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Namun dengan memanfaatkan facade maka antara client dan subsystem menjadi lebih loose coupling seperti gambar berikut :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_uZGWgKeKvmY/Su1CRMmjmaI/AAAAAAAAARA/MH7Ur1mY0zk/s1600-h/facade2.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 210px;" src="http://3.bp.blogspot.com/_uZGWgKeKvmY/Su1CRMmjmaI/AAAAAAAAARA/MH7Ur1mY0zk/s320/facade2.png" alt="" id="BLOGGER_PHOTO_ID_5399044391495244194" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Berikut adalah contoh untuk lebih memahami pattern facade : Misalkan kita memiliki tiga bean yaitu Address, Account, dan CreditCard. Kita ingin menyimpan data ketiganya tanpa client harus mengetahui ketiga bean tersebut. Di sinilah facade berperan. Berikut adalah gambar ketiga bean dan facade tersebut :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_uZGWgKeKvmY/Su1fnmlrWhI/AAAAAAAAARQ/9wJzaXuPk10/s1600-h/facade3.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 308px;" src="http://1.bp.blogspot.com/_uZGWgKeKvmY/Su1fnmlrWhI/AAAAAAAAARQ/9wJzaXuPk10/s320/facade3.png" alt="" id="BLOGGER_PHOTO_ID_5399076662265207314" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_uZGWgKeKvmY/Su1h-dSIO2I/AAAAAAAAARY/WJA_qHxiJmE/s1600-h/facade4.png"&gt;&lt;img style="cursor: pointer; width: 286px; height: 320px;" src="http://1.bp.blogspot.com/_uZGWgKeKvmY/Su1h-dSIO2I/AAAAAAAAARY/WJA_qHxiJmE/s320/facade4.png" alt="" id="BLOGGER_PHOTO_ID_5399079253927541602" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Berikut beberapa catatan penting tentang facade :&lt;br /&gt;- Facade seharusnya tidak didesain untuk menyediakan fungsi tambahan&lt;br /&gt;- Jangan pernah mengembalikan return value berupa komponen dalam subsystem kepada client. Sebagai contoh jangan pernah memiliki method seperti &lt;span style="color: rgb(0, 102, 0);"&gt;CreditCard getCreditCard()&lt;/span&gt; karena client akan mengetahui isi subsystem dan penggunaan facade menjadi tidak jelas.&lt;br /&gt;- Penggunaan facade seharusnya untuk melakukan business service, bukan individual task.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-5128249676360101001?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/5128249676360101001/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=5128249676360101001' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/5128249676360101001'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/5128249676360101001'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2009/11/design-pattern-in-brief-10.html' title='Design Pattern in Brief (10)'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_uZGWgKeKvmY/Su07_EIOqpI/AAAAAAAAAQw/dr1_PC_65Uk/s72-c/facade1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-6764432243594266566</id><published>2009-10-25T11:34:00.001+07:00</published><updated>2009-10-25T11:36:40.050+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stories'/><title type='text'>Not another nice story</title><content type='html'>Nyeruput teh dulu di sini, Neng. Panas banget,” ajak Kusnan (47) sambil menuju lapak warung minuman di sudut Pasar Cipulir, Jakarta Selatan, Selasa (20/10). Setumpuk celana pendek dagangannya disampirkan di sandaran kursi plastik. Tas pinggang dibukanya, hanya tampak empat lembar uang ribuan dan buku catatan kecil kumal.&lt;br /&gt;&lt;br /&gt;Kusnan mencomot sepotong tempe goreng dan meneguk teh hangat, makan siangnya hari itu. ”Beginilah, sudah dari jam delapan keliling pasar, baru empat orang yang bayar kredit celana. Kalau lagi untung, setengah hari begini sudah dapat Rp 15.000, bisa makan nasi saya,” katanya.&lt;br /&gt;&lt;br /&gt;Kusnan salah satu dari banyak penjual pakaian secara kredit dengan daerah operasi di pasar-pasar dan perkampungan di Jakarta. Selain celana pendek, dagangan mereka antara lain daster, pakaian anak-anak, celana jin, busana muslim, hingga pakaian dalam perempuan.&lt;br /&gt;&lt;br /&gt;Konsumen mereka mulai dari pekerja di pasar, pemilik lapak-lapak kecil, hingga ibu-ibu rumah tangga. Harga dagangan mulai dari Rp 10.000 untuk tiga pakaian dalam anak-anak sampai Rp 200.000 untuk satu setel busana muslim plus kerudung atau jilbab. Waktu dan besar cicilan disesuaikan dengan kemampuan konsumen.&lt;br /&gt;&lt;br /&gt;Harga celana pendek dagangan Kusnan, misalnya, rata–rata Rp 10.000-Rp 20.000. Yang berminat cukup membayar Rp 1.000 per hari. ”Setiap hari, paling tidak ada satu sampai 20 celana bisa saya jual. Cicilan pertama dibayar saat itu juga. Pemasukan lain dari nagih ke pembeli sebelumnya. Sayangnya, selalu saja ada yang menunggak, bahkan tidak bayar karena pindah atau benar-benar tidak punya uang. Mau ditarik barangnya tidak mungkin, sudah telanjur dipakai,” katanya.&lt;br /&gt;&lt;br /&gt;Kusnan menambahkan, ia mengambil celana itu dari perajin konveksi yang juga tetangga sebelah rumah petak kontrakannya, tak jauh dari Pasar Cipulir. Bergantung model, bahan, dan ukuran, celana jualannya dipatok Rp 6.000-Rp 12.000 per potong. Kalau lancar, Kusnan sebenarnya bisa untung Rp 4.000-Rp 8.000 setiap satu celana yang lunas terbayar.&lt;br /&gt;&lt;br /&gt;Sekitar enam tahun lalu, Kusnan mengaku memiliki lapak kecil tempat ia dan istrinya berdagang pakaian di dekat Pasar Kebayoran Lama. Namun, nasib membawanya menjadi korban gusuran. Lusinan pakaian dan lapak disita petugas, tak pernah kembali. Tanpa modal, Kusnan kesulitan memulai lagi membuka usahanya.&lt;br /&gt;&lt;br /&gt;”Saya sudah dari umur 15 tahun merantau dari Tegal, Jawa Tengah, ke sini. Pernah jadi tukang batu sebelum akhirnya bisa buka lapak. Setelah digusur, istri dan tiga anak saya masih butuh makan. Ya sudah, jadi tukang kredit celana. Pendapatan turun, tetapi antigusuran,” katanya tergelak.&lt;br /&gt;&lt;br /&gt;Bagi Kusnan, tidak ada alasan untuk tidak tertawa di sela-sela keletihan akibat berkeliling Pasar Cipulir dan kampung-kampung di sekitarnya. Selasa kemarin, jika nasib baik belum menghinggapinya, dipastikan hanya kurang dari Rp 4.000 yang bisa diberikannya kepada sang istri. Yang penting usaha, tegasnya.&lt;br /&gt;&lt;br /&gt;Belum tersentuh&lt;br /&gt;&lt;br /&gt;”Mau tidak mau, harus mau. Tidak ada yang menolong. Kucuran kredit dari pemerintah kata Neng? Tidak pernah ditawarkan ke kami. Tempat untuk pedagang kecil saja susah, apalagi bantuan modal. Mungkin karena kami enggak punya, jadi enggak pernah ditanyain maunya apa?” tambah Kusnan.&lt;br /&gt;&lt;br /&gt;Pekerja nonformal seperti Kusnan hanyalah segelintir orang yang terselip di antara jutaan warga miskin. Di jalanan Ibu Kota, sudut-sudut perempatan, hingga kolong jembatan, tampak kehidupan orang-orang yang tidak punya jalan keluar menggantungkan hidup dari mengemis.&lt;br /&gt;&lt;br /&gt;Berdasarkan data Badan Pusat Statistik 2009, tingkat kemiskinan sekarang mencapai 15,4 persen dari sekitar 220 juta penduduk Indonesia. Bagaimana mengentaskan mereka dari kemiskinan?&lt;br /&gt;&lt;br /&gt;Tentu ini menjadi pekerjaan rumah bagi kepemimpinan Presiden dan Wakil Presiden baru, Susilo Bambang Yudhoyono dan Boediono. Apalagi dalam pidato kenegaraan saat dilantik di Gedung MPR/DPR, Selasa kemarin, SBY menekankan bahwa target utama kinerja pemerintahan dalam lima tahun ke depan adalah meningkatkan kesejahteraan rakyat.&lt;br /&gt;&lt;br /&gt;Masyarakat masih menunggu bisakah target periode pemerintahan terdahulu mereduksi angka kemiskinan menjadi 8,2 persen terpenuhi dalam lima tahun ke depan? Lihat saja nanti. (NELI TRIANA)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-6764432243594266566?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/6764432243594266566/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=6764432243594266566' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/6764432243594266566'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/6764432243594266566'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2009/10/not-another-nice-story.html' title='Not another nice story'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-8627680002654635961</id><published>2009-10-25T11:11:00.003+07:00</published><updated>2009-10-25T11:31:43.399+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stories'/><title type='text'>Thomas Alva Edison</title><content type='html'>&lt;span style="font-weight: bold; color: rgb(153, 0, 0);"&gt;“Jenius adalah 1 persen ide cemerlang dan 99 persen kerja keras”&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_uZGWgKeKvmY/SuPSZXlU1wI/AAAAAAAAAQQ/sfK-vyr7tYI/s1600-h/Thomas_Edison,_1878.jpg"&gt;&lt;img style="cursor: pointer; width: 271px; height: 320px;" src="http://3.bp.blogspot.com/_uZGWgKeKvmY/SuPSZXlU1wI/AAAAAAAAAQQ/sfK-vyr7tYI/s320/Thomas_Edison,_1878.jpg" alt="" id="BLOGGER_PHOTO_ID_5396388111789119234" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Thomas Alva Edison, seorang penemu terbesar di dunia, menemukan sekitar 3000 penemuan dan 1.093 diantaranya telah dipatenkan. Edison dilahirkan pada tanggal 11 Februari 1847 di Milan, Ohio, Amerika Serikat dari pasangan suami-Istri Samuel Ogden seorang tukang kayu dan Nancy Elliot seorang guru. Keduanya merupakan keturunan Belanda. Pada usia 7 tahun, edison kecil pindah ke kota Port Huron, Michigan dan bersekolah di Port Huron. Namun tidak lama, 3 bulan kemudian ia dikeluarkan dari Sekolah karena menurut gurunya “Dia terlalu bodoh” sehingga tidak mampu menerima pelajaran apa pun, dia pun sering dipanggil idiot oleh gurunya.&lt;br /&gt;&lt;br /&gt;Sang ibu, Nancy Elliot memutuskan untuk berhenti sebagai guru dan kemudian berkonsentrasi mengajari Edison baca tulis dan hitung menghitung.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;“My mother was the making of me. She was so true, so sure of me; and I felt I had something to live for, someone I must not disappoint.”&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Begitulah perkataan Edison kecil yang menunjukkan motivasi dalam diri Edison yang cukup kuat dalam belajar. Setelah dia bisa membaca, Edison jadi gemar membaca, ia membaca apa saja yang dapat dijumpainya ia membaca ensiklopedia, Sejarah Inggris, Kamus IPA karangan Ure, Principia karangan Newton dan juga Ilmu Kimia karangan Richard G. Parker. kegemarannya yang menonjol adalah membaca, berpikir dan berkeksperimen.&lt;br /&gt;&lt;br /&gt;Pada umur 12 Tahun Edison menjadi penjual koran, permen, kacang dan kue di kereta api, sama seperti penjual asongan yang sering kita temui di kereta api ekonomi di Indonesia. Keuntungan dari berdagang itu sebagiannya dia berikan kepada orang tuanya dan sebagiannya dia simpan sebagai modal. Di dalam kereta api, ia menerbitkan koran Weekly Herald sembari mengadakan eksperimen di salah satu gerbong kereta api, setelah sebelumnya meinta ijin perusahaan kereta api “Grand Trunk Railway”.&lt;br /&gt;&lt;br /&gt;Pada suatu malam Edison tidak sengaja menumpahkan sebuah cairan kimia sehingga menyebabkan sebuah gerbong hampir terbakar. Karena kasus ini Edison ditampar kondektur hingga pendengarannya rusak, kemudian dia dilarang bekerja di kereta api. Namun Edison tidak menganggap pendengarannya yang rusak sebagai cacat, namun justru dia menganggapnya secara positif sebagai sebuah keuntungan sehingga ia memiliki lebih banyak waktu untuk berfikir daripada mendengarkan omongan – omongan kosong.&lt;br /&gt;&lt;br /&gt;Pada usia 15 tahun Edison remaja menyelamatkan nyawa anak kepala stasiun yang hampir tergilas gerbong kereta api. Karena merasa berhutang jasa, sang kepala stasiun tersebut akhirnya mengajarkan cara pengiriman telegram, Edison hanya memerlukan waktu 3 bulan untuk menguasai pelajaran gratis tersebut. Sesudah itu, ia mendapat pekerjaan sebagai operator telegraf.&lt;br /&gt;&lt;br /&gt;Penemuan pertama yang dia patenkan adalah electric vote recorder, namun karena tidak laku, Edison akhirnya beralih ke penemuan yang lebih komersial. Edison kemudian menemukan stock ticker atau mesin telegraf. Peralatan itu dijualnya dan laku 40.000 dollar Amerika serikat (Sekitar 390 juta rupiah). Edison hampir – hampir pingsan melihat uang sebanyak itu. Uang ini dipakai Edison untuk mendirikan pabrik di Newark dan merekrut 300 orang pekerja sekaligus, disini ia mengembangkan telegraf sehingga mampu mengirimkan 4 berita sekaligus.&lt;br /&gt;&lt;br /&gt;Pada umur 29 tahun, Edison mendirikan laboratorium riset untuk industri di Menlo Park, New Jersey. dan dalam 13 bulan ia menemukan 400 macam penemuan yang kemudian mengubah pola hidup sebagian besar orang-orang di dunia.&lt;br /&gt;&lt;br /&gt;Tahun 1877 ia berkonsentrasi pada lampu pijar. Edison sadar bahwa betapa pentingnya sumber cahaya ini bagi manusia. Dia menghabiskan 40.000 dollar dalam kurun waktu dua tahun untuk eksperimen lampu pijar. Yang menjadi masalah adalah menemukan bahan yg bisa berpijar ketika dialiri arus listrik namun tidak terbakar. Total ada sekitar 6000 bahan yang dicobanya. Melalui usaha keras Edison, akhirnya pada tanggal 21 Oktober 1879 lahirlah lampu pijar listrik pertama yang mampu menyala selama 40 jam. Tahun 1882, untuk pertama kalinya dalam sejarah lampu-lampu listrik di pasang di jalan-jalan dan di rumah rumah&lt;br /&gt;&lt;br /&gt;Sungguh patut direnungkan ketika saat keberhasilan dicapainya, dia sempat ditanya: Apa kunci kesuksesannya. Thomas Alfa Edison menjawab:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;“Saya sukses, karena saya telah kehabisan apa yang disebut dengan kegagalan”       &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ketika dia telah banyak sekali mengalami kegagalan yang berulang-ulang. Bahkan saat dia ditanya apakah dia tidak bosan dengan kegagalannya, Thomas Alfa Edison menjawab:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;“Dengan Kegagalan Tersebut, Saya malah mengetahui ribuan cara agar lampu tidak menyala”       &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is Amazing!!, Edison memandang sebuah kegagalan sebagai sebuah hal yang sangat positif. Kegagalan bukan kekalahan tapi sebagai sebuah keuntungan. Cara memandang yang positif ini membuat Edison mampu meyakinkan orang lain untuk tetap mendanai proyeknya meskipun gagal berulang – ulang kali. Mungkin prinsip Edison inilah yang patut kita terapkan dalam kehidupan kita sehari. Bahwa sebenarnya kita tidak pernah mengalami kerugian, dan sesungguhnya kerugian itu bermula dari sikap dan cara pandang kita sendiri yang negatif.&lt;br /&gt;&lt;br /&gt;Edison telah banyak menghasilkan berbagai penemuan yang sangat berharga bagi perkembangan umat manusia. Telegraf cetak, pulpen elektrik, proses penambangan magnetik, torpedo listrik, karet sintetis, baterai alkaline, pengaduk semen, mikrofon, transmiter telepon karbon dan proyektor gambar bergerak adalah beberapa dari penemuan Edison.&lt;br /&gt;&lt;br /&gt;Melewati tahun 1920-an kondisi kesehatannya kian memburuk dan Edison meninggal dunia tanggal 18 Oktober 1931 pada usia 84 tahun.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-8627680002654635961?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/8627680002654635961/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=8627680002654635961' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/8627680002654635961'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/8627680002654635961'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2009/10/thomas-alva-edison.html' title='Thomas Alva Edison'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_uZGWgKeKvmY/SuPSZXlU1wI/AAAAAAAAAQQ/sfK-vyr7tYI/s72-c/Thomas_Edison,_1878.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-6345989367513972850</id><published>2009-10-18T13:46:00.009+07:00</published><updated>2009-10-18T19:04:21.831+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Beautiful Mind'/><title type='text'>Design Pattern in Brief (9)</title><content type='html'>&lt;span style="color: rgb(153, 0, 0); font-weight: bold;"&gt;Chain of Responsibility&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Pattern ini mirip dengan model layering dalam arsitektur software. Pattern ini menjelaskan bahwa antara object pengirim request dan object-object yang menangani request sebaiknya terpisah bahkan benar-benar tidak saling terkait (loosely coupling).&lt;br /&gt;&lt;br /&gt;Jika ada lebih dari satu object yang bertugas menangani request, maka prosesnya dilakukan secara berurutan. Urutan tersebut membentuk sebuah rantai di mana setiap object mempunyai pointer yang merujuk ke chain selanjutnya.&lt;br /&gt;&lt;br /&gt;Object pertama yang menerima request bisa memutuskan apakah akan menghandle request atau meneruskannya ke object selanjutnya. Request tersebut berjalan terus sampai dihandle oleh salah satu object atau request sampai di ujung rantai tanpa ada yang menghandlenya. Dengan kata lain, setelah melewati serangkaian rantai tersebut, request bisa saja tidak ada yang menghandlenya.&lt;br /&gt;&lt;br /&gt;Berikut adalah karakteristik dari Chain of Responsibility :&lt;br /&gt;&lt;br /&gt;- Sekumpulan request handler, dan urut-urutannya sehingga membentuk sebuah rantai dapat dilakukan secara dinamis saat runtime oleh klien.&lt;br /&gt;- Klien bisa memiliki rantai request handler yang berbeda-beda tergantung jenis requestnya.&lt;br /&gt;- Baik klien maupun masing-masing object request handler tidak perlu tahu object handler mana yang akhirnya menghandle request.&lt;br /&gt;- Setelah melalui rantai request handler, request bisa saja tidak ada yang menghandlenya.&lt;br /&gt;&lt;br /&gt;Untuk aplikasinya perhatikan contoh berikut :&lt;br /&gt;&lt;br /&gt;Misal kita mempunyai sebuah purchase request.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_uZGWgKeKvmY/StrtRSuFdTI/AAAAAAAAAPY/X4HbO-1ZaTg/s1600-h/cor2.png"&gt;&lt;img style="cursor: pointer; width: 280px; height: 220px;" src="http://3.bp.blogspot.com/_uZGWgKeKvmY/StrtRSuFdTI/AAAAAAAAAPY/X4HbO-1ZaTg/s320/cor2.png" alt="" id="BLOGGER_PHOTO_ID_5393884385068283186" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Agar purchase request ini bisa dikirim maka harus melewati serangkaian pemeriksaan batas pembelian oleh 4 manajerial level.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_uZGWgKeKvmY/StrvVRVRaGI/AAAAAAAAAP4/YhyG-M4nQzE/s1600-h/cor1.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 144px;" src="http://3.bp.blogspot.com/_uZGWgKeKvmY/StrvVRVRaGI/AAAAAAAAAP4/YhyG-M4nQzE/s320/cor1.png" alt="" id="BLOGGER_PHOTO_ID_5393886652438505570" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_uZGWgKeKvmY/StrwH5ypMSI/AAAAAAAAAQI/k2XJ-947pts/s1600-h/cor4.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 128px;" src="http://1.bp.blogspot.com/_uZGWgKeKvmY/StrwH5ypMSI/AAAAAAAAAQI/k2XJ-947pts/s320/cor4.png" alt="" id="BLOGGER_PHOTO_ID_5393887522292576546" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Perhatikan diagram dan kode berikut :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_uZGWgKeKvmY/Strtj_GKIiI/AAAAAAAAAPg/5RfQtPVUPMg/s1600-h/cor3.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 262px;" src="http://2.bp.blogspot.com/_uZGWgKeKvmY/Strtj_GKIiI/AAAAAAAAAPg/5RfQtPVUPMg/s320/cor3.png" alt="" id="BLOGGER_PHOTO_ID_5393884706218058274" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Kita memiliki PRHandler sebagai parent dari keempat manajerial class request handler di atas. Berikut adalah codenya&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;package edu.mat.pattern.chain;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;import edu.mat.pattern.request.PurchaseRequest;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public abstract class RequestHandler {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    protected RequestHandler nextHandler;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public abstract boolean authorize(PurchaseRequest request);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public RequestHandler getNextHandler() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        return nextHandler;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public void setNextHandler(RequestHandler nextHandler) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        this.nextHandler = nextHandler;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;package edu.mat.pattern.chain;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;import edu.mat.pattern.request.PurchaseRequest;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public class BranchManager extends RequestHandler {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    private static final int LIMIT = 25000;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    @Override&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public boolean authorize(PurchaseRequest request) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        // do authorization&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        if(request.getAmount() &lt;= LIMIT) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            System.out.println("Authorized by branch manager...");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            return true;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        } else&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            return nextHandler.authorize(request);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;package edu.mat.pattern.chain;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;import edu.mat.pattern.request.PurchaseRequest;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public class PresidentCOO extends RequestHandler {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    private static final int LIMIT = 400000;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    @Override&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public boolean authorize(PurchaseRequest request) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        // do authorization&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        if(request.getAmount() &lt;= LIMIT) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            System.out.println("Authorized by president coo...");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            return true;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        } else&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            return nextHandler.authorize(request);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;package edu.mat.pattern.chain;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;import edu.mat.pattern.request.PurchaseRequest;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public class RegionalDirector extends RequestHandler {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    private static final int LIMIT = 100000;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    @Override&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public boolean authorize(PurchaseRequest request) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        // do authorization&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        if(request.getAmount() &lt;= LIMIT) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            System.out.println("Authorized by regional director...");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            return true;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        } else&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            return nextHandler.authorize(request);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;package edu.mat.pattern.chain;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;import edu.mat.pattern.request.PurchaseRequest;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public class VicePresident extends RequestHandler {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    private static final int LIMIT = 200000;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    @Override&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public boolean authorize(PurchaseRequest request) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        // do authorization&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        if(request.getAmount() &lt;= LIMIT) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            System.out.println("Authorized by vice president...");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            return true;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        }else&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            return nextHandler.authorize(request);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;package edu.mat.pattern.request;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public class PurchaseRequest {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    private String id;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    private String description;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    private double amount;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public PurchaseRequest(String id, String description, double amount) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        super();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        this.id = id;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        this.description = description;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        this.amount = amount;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public String getId() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        return id;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public String getDescription() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        return description;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public double getAmount() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        return amount;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;package edu.mat.pattern.main;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;import edu.mat.pattern.chain.BranchManager;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;import edu.mat.pattern.chain.PresidentCOO;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;import edu.mat.pattern.chain.RegionalDirector;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;import edu.mat.pattern.chain.VicePresident;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;import edu.mat.pattern.request.PurchaseRequest;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public class Main {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public static void main(String args[]) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        BranchManager branchManager = new BranchManager();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        PresidentCOO presidentCOO = new PresidentCOO();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        RegionalDirector regionalDirector = new RegionalDirector();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        VicePresident vicePresident = new VicePresident();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        branchManager.setNextHandler(regionalDirector);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        regionalDirector.setNextHandler(vicePresident);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        vicePresident.setNextHandler(presidentCOO);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        presidentCOO.setNextHandler(null);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        PurchaseRequest request = new PurchaseRequest("one", "request one", 300000);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        branchManager.authorize(request);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Jika dijalankan :&lt;br /&gt;&lt;br /&gt;Authorized by president coo...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-6345989367513972850?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/6345989367513972850/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=6345989367513972850' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/6345989367513972850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/6345989367513972850'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2009/10/design-pattern-in-brief-9.html' title='Design Pattern in Brief (9)'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_uZGWgKeKvmY/StrtRSuFdTI/AAAAAAAAAPY/X4HbO-1ZaTg/s72-c/cor2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-8819890265509056262</id><published>2009-10-17T18:11:00.008+07:00</published><updated>2009-10-18T09:20:16.258+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Beautiful Mind'/><title type='text'>Design Pattern in Brief (8)</title><content type='html'>&lt;span style="font-weight: bold; color: rgb(153, 0, 0);"&gt;Adapter&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Adapter adalah salah satu pattern yang populer. Untuk memahami pattern ini perhatikan contoh berikut :&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Kita ingin melakukan validasi terhadap alamat customer. Untuk keperluan ini kita telah memiliki sebuah bean &lt;span style="color: rgb(153, 0, 0);"&gt;Customer&lt;/span&gt;, sebuah interface untuk validasi &lt;span style="color: rgb(153, 0, 0);"&gt;IAddressValidator&lt;/span&gt;, dan sebuah class konkret yang implement interface tersebut &lt;span style="color: rgb(153, 0, 0);"&gt;USAddressValidator&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_uZGWgKeKvmY/StpbOvpkb3I/AAAAAAAAAOw/FDpdyGBkjZY/s1600-h/adapter1.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 201px;" src="http://3.bp.blogspot.com/_uZGWgKeKvmY/StpbOvpkb3I/AAAAAAAAAOw/FDpdyGBkjZY/s320/adapter1.png" alt="" id="BLOGGER_PHOTO_ID_5393723812596707186" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Karena customer tidak hanya dari US saja, kita ingin menambah validator untuk Kanada, misalnya. Misal untuk alamat Kanada kita telah mempunyai sebuah class lain, &lt;span style="color: rgb(153, 0, 0);"&gt;CAAddress&lt;/span&gt;, yang tidak sama interfacenya dengan USAddressValidator. Interface dalam hal ini bukan berarti java interface atau GUI, tapi yang dimaksud adalah bahwa jika kita menerapkan CAAddress dalam struktur desain kita, maka akan terlihat aneh menurut klien. Karena itu kita membuat sebuh class lagi &lt;span style="color: rgb(153, 0, 0);"&gt;CAAddressAdapter&lt;/span&gt; yang berisi reference ke CAAddress.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_uZGWgKeKvmY/StpbpP60LUI/AAAAAAAAAO4/cdANsuHgtiA/s1600-h/adapter2.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 149px;" src="http://1.bp.blogspot.com/_uZGWgKeKvmY/StpbpP60LUI/AAAAAAAAAO4/cdANsuHgtiA/s320/adapter2.png" alt="" id="BLOGGER_PHOTO_ID_5393724267935575362" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Struktur class di atas bisa dilihat dalam diagram berikut :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_uZGWgKeKvmY/StpcHlBGFfI/AAAAAAAAAPA/sJg-am2JvA0/s1600-h/adapter3.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 246px;" src="http://1.bp.blogspot.com/_uZGWgKeKvmY/StpcHlBGFfI/AAAAAAAAAPA/sJg-am2JvA0/s320/adapter3.png" alt="" id="BLOGGER_PHOTO_ID_5393724788995134962" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-8819890265509056262?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/8819890265509056262/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=8819890265509056262' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/8819890265509056262'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/8819890265509056262'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2009/10/design-pattern-in-brief-8.html' title='Design Pattern in Brief (8)'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_uZGWgKeKvmY/StpbOvpkb3I/AAAAAAAAAOw/FDpdyGBkjZY/s72-c/adapter1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-5655933159282149742</id><published>2009-10-14T07:25:00.015+07:00</published><updated>2009-10-14T17:12:21.049+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Beautiful Mind'/><title type='text'>Design Pattern in Brief (7)</title><content type='html'>&lt;span style="color: rgb(153, 0, 0);"&gt;Decorator&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Dalam pemrograman OOP kita pasti sudah terbiasa dengan pattern inheritance. Inheritance adalah salah satu dasar dari OOP. Decorator bisa dibilang kebalikan dari inheritance. Untuk lebih memahami pattern ini perhatikan contoh berikut :&lt;br /&gt;&lt;br /&gt;Misal kita mempunyai struktur class untuk logger seperti gambar berikut :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_uZGWgKeKvmY/StUfKdeQp2I/AAAAAAAAAOA/mDAogwkGgJg/s1600-h/decorator1.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 194px;" src="http://1.bp.blogspot.com/_uZGWgKeKvmY/StUfKdeQp2I/AAAAAAAAAOA/mDAogwkGgJg/s320/decorator1.png" alt="" id="BLOGGER_PHOTO_ID_5392250393416738658" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Dan selanjutnya sesuai dengan bisnis proses yang ada, kita diharuskan untuk bisa menampilkan dan menyimpan log berupa struktur HTML dan text terenkripsi. Bagaimana kita melakukan ini? Pendekatan pertama kita adalah dengan melakukan inheritance terhadap ConsoleLogger dan FileLogger. Dengan demikian kita akan mendapatkan struktur class seperti gambar berikut :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_uZGWgKeKvmY/StUhnTeQK1I/AAAAAAAAAOY/-uRxgWq90iw/s1600-h/console2.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 192px;" src="http://1.bp.blogspot.com/_uZGWgKeKvmY/StUhnTeQK1I/AAAAAAAAAOY/-uRxgWq90iw/s320/console2.png" alt="" id="BLOGGER_PHOTO_ID_5392253087971814226" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Dengan diagram di atas kita akan mendapatkan struktur file yang kompleks. Kita akan mencoba mengatasinya dengan pattern Decorator. Decorator menyarankan agar kita menggunakan wrapper, bukan inheritance. Pada contoh di atas, Decorator yang akan kita buat harus juga implements interface yang sama dengan object yang akan kita buat wrappernya, dalam hal ini interface Logger. Saat klien berinteraksi dengan decorator, mereka berinteraksi dengan cara yang sama seperti berinteraksi dengan object yang dibut wrappernya. Berikut adalah diagram untuk decorator :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_uZGWgKeKvmY/StVINZQxUcI/AAAAAAAAAOg/U5gy3tIdRTs/s1600-h/decorator3.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 235px;" src="http://2.bp.blogspot.com/_uZGWgKeKvmY/StVINZQxUcI/AAAAAAAAAOg/U5gy3tIdRTs/s320/decorator3.png" alt="" id="BLOGGER_PHOTO_ID_5392295523802763714" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Terlihat dari diagram di atas bahwa HTMLLogger dan EncryptLogger override method log(String) dari class di atasnya. Di dalam masing2 method tersebut HTMLLogger membuat inputan yang di-log berbentuk html dan EncryptLogger mengenkripsi inputannya. Bagaimana selanjutnya cara menampilkan ke console atau ke file? Perhatikan bahwa LoggerDecorator mempunyai sebuah variabel logger bertipe Logger. Variabel ini bisa diisi dengan wrapper class yang sesuai, misal ConsoleLogger atau FileLogger.&lt;br /&gt;&lt;br /&gt;Berikut adalah diagram akhir yang menggambarkan struktur class :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_uZGWgKeKvmY/StWh5CAWCsI/AAAAAAAAAOo/knsaGS6Dv98/s1600-h/decorator4.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 226px;" src="http://2.bp.blogspot.com/_uZGWgKeKvmY/StWh5CAWCsI/AAAAAAAAAOo/knsaGS6Dv98/s320/decorator4.png" alt="" id="BLOGGER_PHOTO_ID_5392394130008967874" border="0" /&gt;&lt;/a&gt;&lt;span style="color: rgb(0, 153, 0);"&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/5217372432017247701-5655933159282149742?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/5655933159282149742/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=5655933159282149742' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/5655933159282149742'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/5655933159282149742'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2009/10/design-pattern-in-brief-7.html' title='Design Pattern in Brief (7)'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_uZGWgKeKvmY/StUfKdeQp2I/AAAAAAAAAOA/mDAogwkGgJg/s72-c/decorator1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-5434716264408451938</id><published>2009-10-11T13:12:00.011+07:00</published><updated>2009-10-13T20:11:55.873+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Beautiful Mind'/><title type='text'>Design Pattern in Brief (6)</title><content type='html'>&lt;span style="color: rgb(153, 0, 0);"&gt;Visitor&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Untuk memahami visitor perhatikan contoh berikut : Misal kita memiliki list of order yang bisa kita kategorikan menjadi tiga yaitu California order, Non California order, dan Overseas order. Saat mengiterasi list tersebut, untuk masing-masing order kita ingin menjalankan sebuah method, misalkan accept(), namun method accept ini akan melakukan hal-hal yang berbeda tergantung jenis ordernya. Bagaimana kita melakukan hal ini? Inilah yang coba dipecahkan pattern visitor.&lt;br /&gt;&lt;br /&gt;Untuk mengimplementasikannya kita akan membuat sebuah interface IOrder yang berisi sebuah method yang sama, accept(IVisitor visitor) yang akan dieksekusi lewat list. Selanjutnya kita membuat tiga class, masing-masing untuk order yang berbeda.&lt;br /&gt;&lt;br /&gt;Untuk visitornya, kita membuat sebuah interface, IVisitor, yang memiliki tiga method visit() dengan parameter yang berbeda, masing-masing untuk tiap order. Kemudian kita akan mengimplementasikan IVisitor dalam sebuah class VisitorImpl yang akan mengimplementasikan masing-masing method visit() tersebut.&lt;br /&gt;&lt;br /&gt;Kita bisa merangkum class-class yang terlibat dalam diagram berikut :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_uZGWgKeKvmY/StOx-v13RwI/AAAAAAAAANY/---yksD7xWw/s1600-h/order.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 147px;" src="http://3.bp.blogspot.com/_uZGWgKeKvmY/StOx-v13RwI/AAAAAAAAANY/---yksD7xWw/s320/order.png" alt="" id="BLOGGER_PHOTO_ID_5391848870445008642" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_uZGWgKeKvmY/StOyIAkTKpI/AAAAAAAAANg/c7UKMhGWXa4/s1600-h/order-accept.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 234px;" src="http://1.bp.blogspot.com/_uZGWgKeKvmY/StOyIAkTKpI/AAAAAAAAANg/c7UKMhGWXa4/s320/order-accept.png" alt="" id="BLOGGER_PHOTO_ID_5391849029553564306" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_uZGWgKeKvmY/StOyVA_suxI/AAAAAAAAANo/5n7Iycnsh30/s1600-h/visit.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 320px;" src="http://2.bp.blogspot.com/_uZGWgKeKvmY/StOyVA_suxI/AAAAAAAAANo/5n7Iycnsh30/s320/visit.png" alt="" id="BLOGGER_PHOTO_ID_5391849253006785298" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Dan berikut adalah codenya :&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;package edu.mat.pattern;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public interface IOrder {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public void accept(IVisitor visitor);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;package edu.mat.pattern;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public class OrderCalifornia implements IOrder {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    private String message;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    @Override&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public void accept(IVisitor visitor) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        visitor.visit(this);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public String getMessage() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        if(message == null)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            message = "Order California";&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        return message;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public void setMessage(String message) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        this.message = message;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;package edu.mat.pattern;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public class OrderNonCalifornia implements IOrder {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    private String state;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    @Override&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public void accept(IVisitor visitor) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        visitor.visit(this);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public String getState() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        if(state == null)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            state = "New York";&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        return state;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public void setState(String state) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        this.state = state;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;package edu.mat.pattern;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public class OrderOverseas implements IOrder {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    private String destinationCountry;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    @Override&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public void accept(IVisitor visitor) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        visitor.visit(this);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public String getDestinationCountry() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        if(destinationCountry == null)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            destinationCountry = "Indonesia";&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        return destinationCountry;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public void setDestinationCountry(String destinationCountry) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        this.destinationCountry = destinationCountry;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;package edu.mat.pattern;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public interface IVisitor {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public void visit(OrderCalifornia orderCalifornia);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public void visit(OrderNonCalifornia orderNonCalifornia);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public void visit(OrderOverseas orderOverseas);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;package edu.mat.pattern;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public class VisitorImpl implements IVisitor {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    @Override&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public void visit(OrderCalifornia orderCalifornia) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        System.out.println(orderCalifornia.getMessage());&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    @Override&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public void visit(OrderNonCalifornia orderNonCalifornia) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        System.out.println(orderNonCalifornia.getState());&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    @Override&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public void visit(OrderOverseas orderOverseas) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        System.out.println(orderOverseas.getDestinationCountry());&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;package edu.mat.pattern;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;import java.util.ArrayList;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;import java.util.Iterator;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;import java.util.List;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public class Main {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public static void main(String[] args) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        IVisitor visitor = new VisitorImpl();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        List&lt;iorder&gt; orders = new ArrayList&lt;iorder&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        orders.add(new OrderCalifornia());&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        orders.add(new OrderNonCalifornia());&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        orders.add(new OrderOverseas());&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        Iterator&lt;iorder&gt; iter = orders.iterator();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        while(iter.hasNext()) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            iter.next().accept(visitor);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-5434716264408451938?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/5434716264408451938/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=5434716264408451938' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/5434716264408451938'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/5434716264408451938'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2009/10/design-pattern-in-brief-6.html' title='Design Pattern in Brief (6)'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_uZGWgKeKvmY/StOx-v13RwI/AAAAAAAAANY/---yksD7xWw/s72-c/order.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-3051206427913533712</id><published>2009-10-05T17:55:00.002+07:00</published><updated>2009-10-05T18:05:19.132+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Beautiful Mind'/><title type='text'>Design Pattern in Brief (5)</title><content type='html'>&lt;span style="color: rgb(153, 0, 0); font-weight: bold;"&gt;Flyweight&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Setiap object mengandung informasi yang tersimpan dalam propertynya. Informasi tersebut bisa dibagi menjadi dua kategori yaitu informasi intrinsik dan ekstrinsik. Informasi intrinsik adalah informasi yang independen, yaitu informasi yang bersifat tetap atau konstan terhadap instance suatu class. Contohnya adalah informasi nama dan alamat perusahaan pada class kartu identitas pegawai. Informasi ekstrinsik adalah informasi yang bersifat berubah-ubah tergantung object tempat informasi tersebut berada. Hal ini berarti informasi tersebut "unique" untuk tiap instance dari class. Sebagai contoh, nama dan jabatan pegawai adalah "unique" untuk tiap pegawai.&lt;br /&gt;&lt;br /&gt;Sekarang misalkan kita memiliki sebuah class employee yang bisa dibuat menjadi ribuan object dan di dalam class tersebut tersimpan informasi intrinsik dan ekstrinsik. Jika hal itu terjadi maka akan menimbulkan overhead pada memori karena menyimpan tiap informasi intrinsik yang sebetulnya sama bagi semua object employee tersebut. Untuk mengatasi hal inilah pattern flyweight dibuat.&lt;br /&gt;&lt;br /&gt;Pattern flyweight menyarankan untuk memisah informasi intrinsik ke dalam object sendiri yang disebut object flyweight. Tiap object yang membutuhkan object flyweight dapat berbagi instance flyweight sehingga akan mampu menghemat memori dan waktu yang dibutuhkan untuk membuat object (object creation time).&lt;br /&gt;&lt;br /&gt;Berikut adalah requirement yang harus dipenuhi untuk membuat flyweight :&lt;br /&gt;- Hanya ada satu object flyweight dan object tersebut digunakan bersama oleh object lain yang membutuhkan.&lt;br /&gt;- Object yang memanfaatkan flyweight di atas tidak boleh secara langsung membuat object flyweight.&lt;br /&gt;&lt;br /&gt;Untuk memenuhi requirement di atas maka berikut adalah pendekatan yang dilakukan&lt;br /&gt;- Class flyweight harus memiliki konstruktor private sehingga tidak bisa dibuat oleh class lain.&lt;br /&gt;- Pattern singleton digunakan untuk memastikan bahwa tidak ada duplikasi object.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;package edu.mat.pattern;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public interface IFlyweight {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public String getCompanyName();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public String getCompanyAddress();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;package edu.mat.pattern;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;import java.util.HashMap;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;import java.util.Map;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public class FlyweightFactory {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    private static final FlyweightFactory INSTANCE = new FlyweightFactory();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    private Map&lt;string,&gt; flyweightList;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    private FlyweightFactory() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        super();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        this.flyweightList = new HashMap&lt;string,&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public static FlyweightFactory getInstance() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        return INSTANCE;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public synchronized Flyweight getFlyweight(String companyName) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        if(flyweightList.get(companyName) == null) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            Flyweight fly = new Flyweight(companyName);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            flyweightList.put(companyName, fly);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            return fly;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        else&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            return flyweightList.get(companyName);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    private class Flyweight implements IFlyweight {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        private String companyName;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        private String companyAddress;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        private Flyweight(String companyName) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            super();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            this.companyName = companyName;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            if(companyName != null) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;                if(companyName.equals("IBM"))&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;                    this.companyAddress = "California";&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;                else if(companyName.equals("SUN"))&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;                    this.companyAddress = "Silicon Valley";&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        @Override&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        public String getCompanyAddress() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            return companyAddress;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        @Override&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        public String getCompanyName() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            return companyName;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;package edu.mat.pattern;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public class Main {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public static void main(String[] args) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        FlyweightFactory factory = FlyweightFactory.getInstance();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        System.out.println(factory.getFlyweight("SUN"));&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        System.out.println(factory.getFlyweight("IBM"));&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        System.out.println(factory.getFlyweight("SUN"));&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        System.out.println(factory.getFlyweight("IBM"));&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Saat dijalankan akan menghasilkan :&lt;br /&gt;&lt;br /&gt;edu.mat.pattern.FlyweightFactory$Flyweight@42e816&lt;br /&gt;edu.mat.pattern.FlyweightFactory$Flyweight@9304b1&lt;br /&gt;edu.mat.pattern.FlyweightFactory$Flyweight@42e816&lt;br /&gt;edu.mat.pattern.FlyweightFactory$Flyweight@9304b1&lt;br /&gt;&lt;br /&gt;Perhatikan bahwa tepat hanya ada satu object flyweight untuk tiap companyName yang sama.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-3051206427913533712?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/3051206427913533712/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=3051206427913533712' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/3051206427913533712'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/3051206427913533712'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2009/10/design-pattern-in-brief-5.html' title='Design Pattern in Brief (5)'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-1511575768259819307</id><published>2009-10-04T11:35:00.006+07:00</published><updated>2009-10-04T14:18:45.648+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Beautiful Mind'/><title type='text'>Design Pattern in Brief (4)</title><content type='html'>&lt;span style="color: rgb(204, 0, 0); font-weight: bold;"&gt;Iterator&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Iterator digunakan untuk mengakses isi sebuah container secara urut tanpa harus mengetahui isi container tersebut. Container yang dimaksud adalah collection of data. Di java, Iterator dapat diterapkan dengan implement java.util.Iterator. Ada dua macam iterator yaitu internal dan eksternal.&lt;br /&gt;&lt;br /&gt;Misalkan kita memiliki sebuah container, maka internal iterator adalah iterator yang dimaintain oleh container tersebut. Container bertanggung jawab terhadap state dari iterator dan hanya bisa ada satu iterator dalam satu container. Sedangkan eksternal iterator adalah iterator yang diletakkan dalam object terpisah dari container. Jadi sekarang ada dua object, container dan iterator, di mana container mengembalikan sebuah object bertipe iterator dalam sebuah methodnya, misalnya getIterator().&lt;br /&gt;&lt;br /&gt;Berikut adalah contoh internal iterator :&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;package edu.mat.pattern.iterator;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;import java.util.Enumeration;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;import java.util.Iterator;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;import java.util.NoSuchElementException;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;import java.util.Vector;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt; * Internal Iterator means the collection itself needs to maintain the iterator,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt; * that's why this collection extends Iterator. So this class can be viewed as both&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt; * a container and an iterator.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt; * */&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;public class InternalIterator implements Iterator&lt;employee&gt; {&lt;/employee&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    private Vector&lt;employee&gt; data;&lt;/employee&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    private Enumeration&lt;employee&gt; enumeration;&lt;/employee&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    private Employee nextEmployee;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    public InternalIterator() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;        data = new Vector&lt;employee&gt;();&lt;/employee&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;        data.add(new Employee("Santoso", "Los Angeles"));&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;        data.add(new Employee("Rochmat", "New York"));&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;        &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;        enumeration = data.elements();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    @Override&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    public boolean hasNext() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;        nextEmployee = null;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;        while(enumeration.hasMoreElements()) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;            Employee employee = enumeration.nextElement();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;            nextEmployee = employee;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;            if(employee != null)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;                return true;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;        return false;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    @Override&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    public Employee next() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;        if(nextEmployee == null)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;            throw new NoSuchElementException();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;        else&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;            return nextEmployee;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    @Override&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    public void remove() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;        // do nothing because we don't wanna remove anything&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;        &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Dan berikut adalah contoh eksternal iterator yang terdiri dari container dan iterator :&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;package edu.mat.pattern.iterator;&lt;br /&gt;&lt;br /&gt;import java.util.Enumeration;&lt;br /&gt;import java.util.Iterator;&lt;br /&gt;import java.util.Vector;&lt;br /&gt;&lt;br /&gt;public class ExternalContainer {&lt;br /&gt;&lt;br /&gt;private Vector&lt;employee&gt; data;&lt;br /&gt;&lt;br /&gt;public ExternalContainer() {&lt;br /&gt;   data = new Vector&lt;employee&gt;();&lt;br /&gt;   data.add(new Employee("Santoso", "Los Angeles"));&lt;br /&gt;   data.add(new Employee("Rochmat", "New York"));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public Enumeration&lt;employee&gt; getAllEmployees() {&lt;br /&gt;   return data.elements();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public Iterator&lt;employee&gt; getEmployeeByName(String name) {&lt;br /&gt;   return new ExternalIterator(this, name);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;package edu.mat.pattern.iterator;&lt;br /&gt;&lt;br /&gt;import java.util.Enumeration;&lt;br /&gt;import java.util.Iterator;&lt;br /&gt;import java.util.NoSuchElementException;&lt;br /&gt;&lt;br /&gt;public class ExternalIterator implements Iterator&lt;employee&gt; {&lt;br /&gt;&lt;br /&gt;private String name;&lt;br /&gt;private Enumeration&lt;employee&gt; enumeration;&lt;br /&gt;private Employee nextEmployee;&lt;br /&gt;&lt;br /&gt;public ExternalIterator(ExternalContainer employees, String name) {&lt;br /&gt;   this.name = name;&lt;br /&gt;   this.enumeration = employees.getAllEmployees();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public boolean hasNext() {&lt;br /&gt;   nextEmployee = null;&lt;br /&gt;   while(enumeration.hasMoreElements()) {&lt;br /&gt;       Employee employee = enumeration.nextElement();&lt;br /&gt;       nextEmployee = employee;&lt;br /&gt;       if(employee != null) {&lt;br /&gt;           if(name == null)&lt;br /&gt;               return true; // jika tidak ada filter maka return true&lt;br /&gt;           else {&lt;br /&gt;               if(employee.getName() != null) {&lt;br /&gt;                   if(name.equals(employee.getName()))&lt;br /&gt;                       return true; // jika ada filter dan curr employee name sama maka return true&lt;br /&gt;                   // jika ada filter tapi curr employee name tdk sama maka continue&lt;br /&gt;               } // jika ada filter tapi curr employee name null maka continue&lt;br /&gt;           }&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;   return false; // jika next employee = null maka return false&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public Employee next() {&lt;br /&gt;   if(nextEmployee == null)&lt;br /&gt;       throw new NoSuchElementException();&lt;br /&gt;   else&lt;br /&gt;       return nextEmployee;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public void remove() {&lt;br /&gt;   // do nothing because we don't wanna remove anything&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;/employee&gt;&lt;/employee&gt;&lt;/employee&gt;&lt;/employee&gt;&lt;/employee&gt;&lt;/employee&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-1511575768259819307?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/1511575768259819307/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=1511575768259819307' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/1511575768259819307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/1511575768259819307'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2009/10/design-pattern-in-brief-4.html' title='Design Pattern in Brief (4)'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-8773186938343741203</id><published>2009-09-17T01:36:00.006+07:00</published><updated>2009-10-04T11:35:03.802+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Beautiful Mind'/><title type='text'>Design Pattern in Brief (3)</title><content type='html'>&lt;span style="font-weight: bold; color: rgb(153, 0, 0);"&gt;Composite&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Setiap komponen atau objek bisa dikelompokkan ke dalam salah satu dari dua kategori, individual komponen atau komposit komponen (yang terdiri dari individual komponen dan komposit komponen lain). Composite pattern digunakan untuk memodelkan sebuah interface sehingga kedua komponen tersebut bisa dilihat sebagai sebuah komponen yang sama dari sisi klien. Sederhananya, klien akan melihat dan bisa memperlakukan kedua komponen tersebut dengan cara yang sama.&lt;br /&gt;&lt;br /&gt;Implementasi composite bisa dilihat pada tree, yang terdiri dari parent nodes dan leaves. Berikut ini kita mempunyai sebuah interface FileSystemComponent yang mempunyai method-method untuk megakses file komponen dan direktori komponen.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_uZGWgKeKvmY/SrEzC51UOYI/AAAAAAAAANA/NhwN8tkXLiQ/s1600-h/composite1.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 174px;" src="http://3.bp.blogspot.com/_uZGWgKeKvmY/SrEzC51UOYI/AAAAAAAAANA/NhwN8tkXLiQ/s320/composite1.png" alt="" id="BLOGGER_PHOTO_ID_5382139154661652866" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Method addComponent() pada class DirComponent digunakan untuk menambah file atau direktori baru di susunan file sistem tersebut. Sedangkan untuk mendapatkan ukuran dari file sistem yang ada, klien cukup memanggil getComponentSize(). Klien memperlakukan sama kedua file sistem tersebut, file dan direktori, untuk mendapatkan ukuran file sistem yang ada.&lt;br /&gt;&lt;br /&gt;Design berikut adalah perbaikan dari design sebelumnya.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_uZGWgKeKvmY/SrEz7-S8EhI/AAAAAAAAANI/9D8GYfGhR38/s1600-h/composite2.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 234px;" src="http://3.bp.blogspot.com/_uZGWgKeKvmY/SrEz7-S8EhI/AAAAAAAAANI/9D8GYfGhR38/s320/composite2.png" alt="" id="BLOGGER_PHOTO_ID_5382140135112184338" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Kita bisa memanfaatkan interface atau abstract class dengan memindahkan semua method di DirComponent ke interface atau abstract tersebut. Karena class FileComponent tidak seharusnya memiliki method selain getComponentSize() maka FileComponent bisa throw exception jika method2 tersebut dipanggil dari dirinya. Sedangkan DirComponent harus mengoverride method2 tersebut.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;public abstract class FileSystemComponent {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;String name;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;public FileSystemComponent(String cName) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;name = cName;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;public void addComponent(FileSystemComponent component)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;throws CompositeException {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;throw new CompositeException(&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;  "Invalid Operation. Not Supported");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;public FileSystemComponent getComponent(int componentNum)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;throws CompositeException {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;throw new CompositeException(&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;  "Invalid Operation. Not Supported");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;public abstract long getComponentSize();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;public class FileComponent extends FileSystemComponent {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;private long size;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;public FileComponent(String cName, long sz) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;super(cName);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;size = sz;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;public long getComponentSize() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;return size;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;public class DirComponent extends FileSystemComponent {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;Vector dirContents = new Vector();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;//individual files/sub folders collection&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;public DirComponent(String cName) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;super(cName);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;public void addComponent(FileSystemComponent fc)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;throws CompositeException {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;dirContents.add(fc);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;public FileSystemComponent getComponent(int location)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;throws CompositeException {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;return (FileSystemComponent) dirContents.elementAt(&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;         location);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;public long getComponentSize() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;long sizeOfAllFiles = 0;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;Enumeration e = dirContents.elements();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;while (e.hasMoreElements()) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;  FileSystemComponent component =&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    (FileSystemComponent) e.nextElement();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;  sizeOfAllFiles = sizeOfAllFiles +&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;                    (component.getComponentSize());&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;return sizeOfAllFiles;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Yang perlu diperhatikan adalah bahwa setiap kali kita menambah method baru, misal removeComponent() untuk DirComponent, maka kita juga harus menambahkannya di abstract atau interfacenya (dan FileComponent harus mengoverridenya). Kenapa? Karena kedua class child, FileComponent dan DirComponent, harus bisa dilihat dan diperlakukan sama oleh klien.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-8773186938343741203?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/8773186938343741203/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=8773186938343741203' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/8773186938343741203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/8773186938343741203'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2009/09/design-pattern-in-brief-3.html' title='Design Pattern in Brief (3)'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_uZGWgKeKvmY/SrEzC51UOYI/AAAAAAAAANA/NhwN8tkXLiQ/s72-c/composite1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-6033387709660519610</id><published>2009-09-12T09:50:00.003+07:00</published><updated>2009-09-12T10:26:52.568+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Debugging in GWT</title><content type='html'>Days a go I tried to debug my GWT code and... nothing happened. In GWT, we can debug our code in hosted mode but not in web mode by the way. My breakpoint didn't hit by debugger. How could it be? After googling for awhile I found out that I'm not the only one who has the same problem. Some people say that they have problem when it is jdk 1.6.0_14, and when they downgrade to 1.6.0_13, it runs well without any debugging problems.&lt;br /&gt;&lt;br /&gt;But before I revert back to older version, it's a good practice to upgrade first. So I decided to upgrade to 1.6.0.16 (currently available version). And when I run eclipse debugger, it works. Fiuh...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-6033387709660519610?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/6033387709660519610/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=6033387709660519610' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/6033387709660519610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/6033387709660519610'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2009/09/debugging-in-gwt.html' title='Debugging in GWT'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-2151674531288504563</id><published>2009-09-12T05:35:00.003+07:00</published><updated>2009-09-12T05:58:40.130+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Beautiful Mind'/><title type='text'>Design Pattern in Brief (2)</title><content type='html'>&lt;span style="font-weight: bold; color: rgb(153, 0, 0);"&gt;Prototype&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Prototype bisa dipandang sebagai salah satu alternatif dari Factory dan Abstract Factory. Untuk memahaminya bisa dilihat pada contoh-contoh berikut.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_uZGWgKeKvmY/SqrUvYGNt6I/AAAAAAAAAMY/Xe8VG9z1-aQ/s1600-h/proto1.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 192px;" src="http://3.bp.blogspot.com/_uZGWgKeKvmY/SqrUvYGNt6I/AAAAAAAAAMY/Xe8VG9z1-aQ/s320/proto1.png" alt="" id="BLOGGER_PHOTO_ID_5380346615234934690" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Design di atas bisa diimplementasikan dengan abstract factory seperti berikut :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_uZGWgKeKvmY/SqrVNPUuKZI/AAAAAAAAAMg/Sc8qAo2LVd4/s1600-h/proto3.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 178px;" src="http://3.bp.blogspot.com/_uZGWgKeKvmY/SqrVNPUuKZI/AAAAAAAAAMg/Sc8qAo2LVd4/s320/proto3.png" alt="" id="BLOGGER_PHOTO_ID_5380347128275937682" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Dengan prototype kita bisa mengimplementasikannya seperti :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_uZGWgKeKvmY/SqrV1W6dNmI/AAAAAAAAAMw/FUA1keMgcCw/s1600-h/proto4.png"&gt;&lt;img style="cursor: pointer; width: 298px; height: 320px;" src="http://3.bp.blogspot.com/_uZGWgKeKvmY/SqrV1W6dNmI/AAAAAAAAAMw/FUA1keMgcCw/s320/proto4.png" alt="" id="BLOGGER_PHOTO_ID_5380347817508025954" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_uZGWgKeKvmY/SqrV06YPgrI/AAAAAAAAAMo/uthhLFGZ8Ow/s1600-h/proto2.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 146px;" src="http://3.bp.blogspot.com/_uZGWgKeKvmY/SqrV06YPgrI/AAAAAAAAAMo/uthhLFGZ8Ow/s320/proto2.png" alt="" id="BLOGGER_PHOTO_ID_5380347809848328882" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public class HostingPlanKit {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;  private HostingPlan basicPlan;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;  private HostingPlan premiumPlan;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;  private HostingPlan premPlusPlan;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;  public HostingPlanKit(HostingPlan basic, HostingPlan premium,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;      HostingPlan premPlus) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    basicPlan = basic;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    premiumPlan = premium;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    premPlusPlan = premPlus;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;  public HostingPlan getBasicPlan() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    return (HostingPlan) basicPlan.clone();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;  public HostingPlan getPremiumPlan() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    return (HostingPlan) premiumPlan.clone();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;  public HostingPlan getPremPlusPlan() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    return (HostingPlan) premPlusPlan.clone();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public class HostingPlanManager {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;  public static HostingPlanKit getHostingPlanKit(&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    String platform) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    HostingPlan basicPlan = null;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    HostingPlan premiumPlan = null;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    HostingPlan premPlusPlan = null;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    if (platform.equalsIgnoreCase("Win")) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;      basicPlan = new WinBasic();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;      premiumPlan = new WinPremium();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;      premPlusPlan = new WinPremPlus();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    if (platform.equalsIgnoreCase("Unix")) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;      basicPlan = new UnixBasic();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;      premiumPlan = new UnixPremium();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;      premPlusPlan = new UnixPremPlus();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    return new HostingPlanKit(basicPlan, premiumPlan,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            premPlusPlan);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-2151674531288504563?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/2151674531288504563/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=2151674531288504563' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/2151674531288504563'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/2151674531288504563'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2009/09/design-pattern-in-brief-2.html' title='Design Pattern in Brief (2)'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_uZGWgKeKvmY/SqrUvYGNt6I/AAAAAAAAAMY/Xe8VG9z1-aQ/s72-c/proto1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-8761081424524806798</id><published>2009-09-10T06:02:00.001+07:00</published><updated>2009-09-10T06:04:02.084+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Shallow Copy &amp; Deep Copy</title><content type='html'>Semua java class memilik method clone() yang diturunkan dari java.lang.Object. Method tersebut membuat copy dari sebuah object sebagai shallow copy. Apa yang dimaksud dengan shallow copy adalah :&lt;br /&gt;1. Java membuat object baru di memori, termasuk membuat instance variabel yang bertipe primitive sekalipun.&lt;br /&gt;2. Object lain yang direference oleh class yang diclone tersebut tidak dibuat copynya, hanya membuat reference baru ke object tersebut. Jadi kini ada dua reference yang mengarah pada object yang sama.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public class Car extends Object implements Cloneable {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    private String carName;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    private String carType;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    private SUV suv;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public String getCarName() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        return carName;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public void setCarName(String carName) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        this.carName = carName;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public String getCarType() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        return carType;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public void setCarType(String carType) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        this.carType = carType;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public SUV getSuv() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        return suv;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public void setSuv(SUV suv) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        this.suv = suv;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    @Override&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public Object clone() throws CloneNotSupportedException {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        return super.clone();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    @Override&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public String toString() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        return "carName : " + carName + " car type : " + carType + " suv : " + suv;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public class SUV {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    private String suvType;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    private String suvModel;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public String getSuvType() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        return suvType;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public void setSuvType(String suvType) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        this.suvType = suvType;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public String getSuvModel() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        return suvModel;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public void setSuvModel(String suvModel) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        this.suvModel = suvModel;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    @Override&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public String toString() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        return "suv type : " + suvType + " suv model : " + suvModel;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public class Main {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public static void main(String[] args) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        SUV suv = new SUV();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        suv.setSuvModel("suv model 1");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        suv.setSuvType("suv type 1");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        Car car = new Car();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        car.setCarName("Timor");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        car.setCarType("Sedan");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        car.setSuv(suv);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        System.out.println("car 1 : " + car);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        try {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            Car car2 = (Car) car.clone();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            suv.setSuvModel("suv model update");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            System.out.println("car 2 : " + car2);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            System.out.println("car 1 : " + car);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        } catch (CloneNotSupportedException e) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            e.printStackTrace();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;car 1 : carName : Timor car type : Sedan suv : suv type : suv type 1 suv model : suv model 1&lt;br /&gt;car 2 : carName : Timor car type : Sedan suv : suv type : suv type 1 suv model : suv model update&lt;br /&gt;car 1 : carName : Timor car type : Sedan suv : suv type : suv type 1 suv model : suv model update&lt;br /&gt;&lt;br /&gt;Sedangkan deep copy adalah :&lt;br /&gt;1. Java menduplikasi object yang dicopy termasuk variabel yang primitif.&lt;br /&gt;2. Object yang direference pun dicopy sehingga kini dua object yang diclone merefer ke dua object yang berbeda.&lt;br /&gt;&lt;br /&gt;Bagaimana implementasi deep copy pada java? Kita bisa mengoverride method clone() untuk keperluan deep copy ini.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-8761081424524806798?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/8761081424524806798/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=8761081424524806798' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/8761081424524806798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/8761081424524806798'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2009/09/shallow-copy-deep-copy.html' title='Shallow Copy &amp; Deep Copy'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-6761589700448080178</id><published>2009-09-07T19:38:00.009+07:00</published><updated>2009-09-10T06:02:01.453+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Beautiful Mind'/><title type='text'>Design Pattern in Brief</title><content type='html'>&lt;span style="font-weight: bold; color: rgb(153, 0, 0);"&gt;Immutable&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Immutable berarti tidak dapat diubah. Apanya yang tidak dapat diubah? Tentunya state dari suatu object, secara teknis, tentu nilai dari variabelnya. Dalam design pattern kita bisa membuat sebuah object menjadi immutable dengan cara&lt;br /&gt;1. Semua instance variabel harus diset hanya dari konstruktor. Tidak ada method atau cara lain untuk mengeset nilai variabel selain dari konstruktor tsb. Dengan kata lain jadikan instance variabel private dan tanpa setter.&lt;br /&gt;2. Agar class yang kita inginkan menjadi immutable tidak bisa di-extends, maka kita deklarasikan class tersebut sebagai final. Dengan demikian tidak ada cara untuk mengoverride method yang kita miliki.&lt;br /&gt;3. Semua instance variabel harus dideklarasikan final sehingga hanya bisa diinisialisasi sekali, lewat konstruktor.&lt;br /&gt;4. Jika sebuah method mempunyai return value berupa class dari object tersebut, maka sebaiknya ia tidak mengembalikan object yang sebenarnya melainkan copy atau clonenya.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(153, 0, 0);"&gt;Monitor&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Menulis tentang monitor tentunya mengingatkan pada kuliah Sistem Operasi oleh Bapak Mochammad Husni :). Tak salah lagi, topik yang jadi hot thread pada kuliah itu adalah race condition, deadlock. Monitor adalah mekanisme yang digunakan untuk mengatasi deadlock sehingga hanya satu thread yang bisa mengakses sebuah method dalam satu waktu. Pada Java hal ini diatasi dengan mendeklarasikan sebuah method sebagai synchronized.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(153, 0, 0);"&gt;Factory&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_uZGWgKeKvmY/SqXLa57_JAI/AAAAAAAAAKY/tj3B68-RS3Y/s1600-h/Screenshot.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 234px;" src="http://2.bp.blogspot.com/_uZGWgKeKvmY/SqXLa57_JAI/AAAAAAAAAKY/tj3B68-RS3Y/s320/Screenshot.png" alt="" id="BLOGGER_PHOTO_ID_5378928993053385730" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Factory dapat digambarkan sebagai sebuah class yang mengotomatisasi pembuatan sebuah object. Dalam diagram berikut kita memiliki sebuah parent class (bisa abstract, interface, atau konkret class) yang diextend oleh dua subclass. Sebuah class lain, yang bisa jadi bukan bagian dari aplikasi kita, ingin memanfaatkan class yang telah kita buat tersebut. Yang class lain tersebut ketahui hanyalah parent class saja. Mereka tidak tahu menahu struktur hirarki class kita. Sementara itu struktur yang kita buat adalah request harus didelegasikan ke masing-masing subclass yang bersesuaian. Bagaimana kita dapat menginstansiasi class-class yang berbeda dan mengembalikan return value dengan tipe yang sama adalah tugas Class Factory.&lt;br /&gt;&lt;br /&gt;Pada gambar kita memiliki dua buah struktur factory. Pertama adalah sebuah interface sebagai contract dengan class lain. Kedua adalah Konkret class yang berisi factory method yang bertugas 'memilih' subclass mana yang harus diinstansiasi. Bagaimana cara factory method melakukan tugasnya? Sederhananya dengan if-then rules atau switch.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(153, 0, 0);"&gt;Singleton&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Dalam design pattern, singleton berarti hanya ada satu instance. Bagaimana cara mendapatkan hanya satu instance selama aplikasi berjalan? Kita bisa melakukannya dengan meletakkan variabel dengan tipe class singleton sebagai global variabel, semua class yang membutuhkan object tersebut merefer ke variabel global yang dimaksud. Namun walaupun demikian, client masih tetap bisa membuat instance dari class tersebut bukan? Walaupun bukan sebagai global variabel.&lt;br /&gt;&lt;br /&gt;Sebuah class yang bisa membuat dirinya sendiri hanya mempunyai satu instance disebut singleton class. Berikut adalah cara membuat class menjadi singleton&lt;br /&gt;1. Buat constructornya private. Dengan demikian tidak ada cara class lain menginstansiasi class tersebut selain dirinya sendiri.&lt;br /&gt;2. Di dalam class singleton tersebut buat public static method dengan nama getInstance().&lt;br /&gt;3. Di dalam body method getInstance() buat instance yang hanya dibuat sekali pada saat pertama class di-invoke.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;public class Singleton {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;   private static final Singleton INSTANCE = new Singleton();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;   // Private constructor prevents instantiation from other classes&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;   private Singleton() {}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;   public static Singleton getInstance() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;      return INSTANCE;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;   }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Pada code di atas, instance singleton dibuat hanya sekali yaitu saat class dipanggil. Namun cara ini memiliki kelemahan yaitu instance dibuat saat pertama class diinisialisasi, bukan saat dipanggil.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;public class Singleton {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;   // Private constructor prevents instantiation from other classes&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;   private Singleton() {}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;   /**&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    * SingletonHolder is loaded on the first execution of Singleton.getInstance() &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    * or the first access to SingletonHolder.INSTANCE, not before.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    */&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;   private static class SingletonHolder { &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;     private static final Singleton INSTANCE = new Singleton();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;   }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;   public static Singleton getInstance() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;     return SingletonHolder.INSTANCE;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;   }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Code di atas adalah yang diusulkan oleh Bill Pugh. Instance benar-benar dibuat saat getInstance() dipanggil, bukan saat class diinisialisasi.&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(153, 0, 0);"&gt;AbstractFactory&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Untuk memahami AbstractFactory perhatikan gambar berikut&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_uZGWgKeKvmY/SqYKjfYn2dI/AAAAAAAAAKg/VlXHPVPFqdQ/s1600-h/Screenshot.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 267px;" src="http://1.bp.blogspot.com/_uZGWgKeKvmY/SqYKjfYn2dI/AAAAAAAAAKg/VlXHPVPFqdQ/s320/Screenshot.png" alt="" id="BLOGGER_PHOTO_ID_5378998409777109458" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_uZGWgKeKvmY/SqYK7GzuyiI/AAAAAAAAAK4/pPJd1djsSH4/s1600-h/Screenshot-3.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 167px;" src="http://3.bp.blogspot.com/_uZGWgKeKvmY/SqYK7GzuyiI/AAAAAAAAAK4/pPJd1djsSH4/s320/Screenshot-3.png" alt="" id="BLOGGER_PHOTO_ID_5378998815496784418" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_uZGWgKeKvmY/SqYK64YjPbI/AAAAAAAAAKw/SG7IbdC-fMA/s1600-h/Screenshot-2.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 167px;" src="http://3.bp.blogspot.com/_uZGWgKeKvmY/SqYK64YjPbI/AAAAAAAAAKw/SG7IbdC-fMA/s320/Screenshot-2.png" alt="" id="BLOGGER_PHOTO_ID_5378998811624684978" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_uZGWgKeKvmY/SqYK6WHvwII/AAAAAAAAAKo/Ttbkg_FZ47o/s1600-h/Screenshot-1.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 167px;" src="http://1.bp.blogspot.com/_uZGWgKeKvmY/SqYK6WHvwII/AAAAAAAAAKo/Ttbkg_FZ47o/s320/Screenshot-1.png" alt="" id="BLOGGER_PHOTO_ID_5378998802427396226" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_uZGWgKeKvmY/SqYNrg7cplI/AAAAAAAAALg/bPm3BbXxVXg/s1600-h/Screenshot-8.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 183px;" src="http://3.bp.blogspot.com/_uZGWgKeKvmY/SqYNrg7cplI/AAAAAAAAALg/bPm3BbXxVXg/s320/Screenshot-8.png" alt="" id="BLOGGER_PHOTO_ID_5379001846165448274" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_uZGWgKeKvmY/SqYNrUkDdxI/AAAAAAAAALY/laS1s_WAfNI/s1600-h/Screenshot-7.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 274px;" src="http://1.bp.blogspot.com/_uZGWgKeKvmY/SqYNrUkDdxI/AAAAAAAAALY/laS1s_WAfNI/s320/Screenshot-7.png" alt="" id="BLOGGER_PHOTO_ID_5379001842846103314" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_uZGWgKeKvmY/SqYNqwa2M-I/AAAAAAAAALQ/xLow7-z9d40/s1600-h/Screenshot-6.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 274px;" src="http://2.bp.blogspot.com/_uZGWgKeKvmY/SqYNqwa2M-I/AAAAAAAAALQ/xLow7-z9d40/s320/Screenshot-6.png" alt="" id="BLOGGER_PHOTO_ID_5379001833143808994" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_uZGWgKeKvmY/SqYNqfIHxhI/AAAAAAAAALI/SFdKcRSKGZc/s1600-h/Screenshot-5.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 274px;" src="http://1.bp.blogspot.com/_uZGWgKeKvmY/SqYNqfIHxhI/AAAAAAAAALI/SFdKcRSKGZc/s320/Screenshot-5.png" alt="" id="BLOGGER_PHOTO_ID_5379001828501866002" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_uZGWgKeKvmY/SqglKkBQqnI/AAAAAAAAALw/1Ju5VVFx2wk/s1600-h/Screenshot-4.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 320px;" src="http://1.bp.blogspot.com/_uZGWgKeKvmY/SqglKkBQqnI/AAAAAAAAALw/1Ju5VVFx2wk/s320/Screenshot-4.png" alt="" id="BLOGGER_PHOTO_ID_5379590618291939954" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public class LuxuryVehicleFactory extends VehicleFactory {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;  public Car getCar() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    return new LuxuryCar("L-C");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;  public SUV getSUV() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    return new LuxurySUV("L-S");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public class NonLuxuryVehicleFactory extends VehicleFactory {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;  public Car getCar() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    return new NonLuxuryCar("NL-C");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;  public SUV getSUV() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    return new NonLuxurySUV("NL-S");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public abstract class VehicleFactory {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;  public static final String LUXURY_VEHICLE = "Luxury";&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;  public static final String NON_LUXURY_VEHICLE = "Non-Luxury";&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;  public abstract Car getCar();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;  public abstract SUV getSUV();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;  public static VehicleFactory getVehicleFactory(String type) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    if (type.equals(VehicleFactory.LUXURY_VEHICLE))&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;      return new LuxuryVehicleFactory();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    if (type.equals(VehicleFactory.NON_LUXURY_VEHICLE))&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;      return new NonLuxuryVehicleFactory();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    return new LuxuryVehicleFactory();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-6761589700448080178?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/6761589700448080178/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=6761589700448080178' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/6761589700448080178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/6761589700448080178'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2009/09/design-pattern-in-brief.html' title='Design Pattern in Brief'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_uZGWgKeKvmY/SqXLa57_JAI/AAAAAAAAAKY/tj3B68-RS3Y/s72-c/Screenshot.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-626100948303343127</id><published>2009-09-02T04:43:00.008+07:00</published><updated>2009-09-02T19:21:27.896+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>JVM terminated. Exit code=-1</title><content type='html'>Have you ever got the above error message when you try to launch eclipse? Well it happened yesterday. When I started eclipse, it showed this error window&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_uZGWgKeKvmY/Sp2aLCUaD_I/AAAAAAAAAKQ/y7ge3Yiy8C0/s1600-h/eclipseError.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 200px;" src="http://2.bp.blogspot.com/_uZGWgKeKvmY/Sp2aLCUaD_I/AAAAAAAAAKQ/y7ge3Yiy8C0/s320/eclipseError.png" alt="" id="BLOGGER_PHOTO_ID_5376623044541943794" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This error is quiet strange since I did fresh install jdk and eclipse on my windows machine. When I googled this error, there were some advices including to increase &lt;span class="postbody"&gt; Xms512. But it did work before without setting anything. Then finally I found a good advice here : &lt;a href="http://www.coderanch.com/t/423852/IDEs-Version-Control-other-tools/IRAD-JVM-Terminated-Exit-Code"&gt;http://www.coderanch.com/t/423852/IDEs-Version-Control-other-tools/IRAD-JVM-Terminated-Exit-Code&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Yup. Remove the entries in eclipse.ini :). But unfortunately after you do that, there will be an error saying that you need to close your eclipse. To deal with this, you need to restore your eclipse.ini file (you can try another eclipse.ini file or just restore the last one) and change this : &lt;/span&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;-Xmx512m&lt;/span&gt; to &lt;span style="color: rgb(153, 0, 0);"&gt;Xmx256m&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;People says that it happens because eclipse tries to allocate heap memory as much as 512 but it fails.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-626100948303343127?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/626100948303343127/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=626100948303343127' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/626100948303343127'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/626100948303343127'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2009/09/jvm-terminated-exit-code-1.html' title='JVM terminated. Exit code=-1'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_uZGWgKeKvmY/Sp2aLCUaD_I/AAAAAAAAAKQ/y7ge3Yiy8C0/s72-c/eclipseError.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-6991267911696215847</id><published>2009-08-29T15:20:00.010+07:00</published><updated>2009-08-29T16:34:23.900+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>GWT, A small notes</title><content type='html'>It seems that developing rich internet application using GWT is very interesting because of its rich of features widgets. But sometimes something annoying and unrealistic happens. Here are just small amount of problems that looks ridiculous and trivial but could give you headache and make you spend hours googling forums.&lt;br /&gt;&lt;br /&gt;First thing first, consider this :&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public class Skippy implements EntryPoint {&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;&lt;br /&gt;public void onModuleLoad() {&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;&lt;br /&gt;MenuView menu = new MenuView();&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;&lt;br /&gt;TicTacView tictac = new TicTacView();&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;&lt;br /&gt;RootPanel.get(&lt;span style="color: rgb(153, 0, 0); font-weight: bold;"&gt;"menu"&lt;/span&gt;).add(menu);&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;&lt;br /&gt;RootPanel.get(&lt;span style="color: rgb(153, 0, 0); font-weight: bold;"&gt;"tictac"&lt;/span&gt;).add(tictac);&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Code snippet above is about to add two widgets to RootPanel. Look at this html code snippet :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_uZGWgKeKvmY/SpjxwSLhTdI/AAAAAAAAAKI/pyQpMkuh-Gw/s1600-h/html.png"&gt;&lt;img style="cursor: pointer; width: 250px; height: 100px;" src="http://1.bp.blogspot.com/_uZGWgKeKvmY/SpjxwSLhTdI/AAAAAAAAAKI/pyQpMkuh-Gw/s320/html.png" alt="" id="BLOGGER_PHOTO_ID_5375311967082859986" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;See the connection? Yup I wanna add a widget in an appropriate html element. You can do this using this html code : &lt;span style="color: rgb(153, 0, 0); font-weight: bold;"&gt;&amp;lt;span id="menu"&amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt;, but not with this one : &lt;span style="font-weight: bold; color: rgb(153, 0, 0);"&gt;&amp;lt;span id="menu" /&amp;gt;&lt;/span&gt;. A bit tricky huh...&lt;br /&gt;&lt;br /&gt;Second thing is, folder structure. Suppose I wanna add some new classes in a package, say, LanguageConstants which is used for internationalization. You have to place it inside package that wraps your module (edu.mat.gwt.skippy) and if it is for client side then you have to place it inside client package, for example edu.mat.gwt.skippy.client.util. You can not put it inside edu.mat.gwt.skippy.util because the compiler will say that there is no source code for your class.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_uZGWgKeKvmY/SpjrqdXrJJI/AAAAAAAAAKA/LnFjXP0s6O0/s1600-h/package.png"&gt;&lt;img style="cursor: pointer; width: 279px; height: 320px;" src="http://3.bp.blogspot.com/_uZGWgKeKvmY/SpjrqdXrJJI/AAAAAAAAAKA/LnFjXP0s6O0/s320/package.png" alt="" id="BLOGGER_PHOTO_ID_5375305269937644690" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-6991267911696215847?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/6991267911696215847/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=6991267911696215847' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/6991267911696215847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/6991267911696215847'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2009/08/gwt-small-notes.html' title='GWT, A small notes'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_uZGWgKeKvmY/SpjxwSLhTdI/AAAAAAAAAKI/pyQpMkuh-Gw/s72-c/html.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-4057371585859886909</id><published>2009-08-17T19:57:00.004+07:00</published><updated>2009-08-17T20:29:27.405+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stories'/><title type='text'>PHP? A big no-no</title><content type='html'>Woww posting terakhir tgl 28 Juli? Blogger macam apa ini tiga minggu nggak ngeblog sama sekali. Maklum sibuk training (biasa... cari kambing hitam dulu). Training kali ini menarik soalnya tentang Java hehehe.&lt;br /&gt;&lt;br /&gt;Jadi, training Java sekitar 12 hari dan cukup menarik karena mengharuskan kita belajar spring, hibernate, struts, servlet, deelel. Tapi semua itu berubah karena nilai Javanya ternyata ancurr lebur :(, padahal semua teknologi yang ditrainingkan sudah dipake komplit. Yah semoga trainernya diberi pencerahan, amiin (kesel mode on).&lt;br /&gt;&lt;br /&gt;Btw, back to title, setelah Java sekarang dihajar sama materi PHP. Dari awal sudah nggak ada minat mau belajar PHP, karena PHP pendukung kapitalis barat dengan tanda $-nya (becanda boss). Yang bikin kesel dari PHP adalah methodnya yang buaaaanyak sekali dan gak jelas punya siapa alias silakan baca manualnya. Dan fakta mencengangkan lainnya yang baru newbie ini ketahui adalah bahwa kita bisa mengirim parameter ke method yang tidak punya argumen (hah...), catet ni method bukan overloading lho ya... Jadi siap-siap aja bingung kalo nyari method a(param1, param2) tapi yang diketemukan hanya method a().&lt;br /&gt;&lt;br /&gt;Sekian dulu deh uneg-uneg dari saya yang pingin dikeluarkan (daripada dipendem trus stres kayak Marshanda, ya kan). Moga-moga aja trainernya gak baca ini dan moga-moga besok ujiannya ada mukjizat...amin&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-4057371585859886909?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/4057371585859886909/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=4057371585859886909' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/4057371585859886909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/4057371585859886909'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2009/08/php-big-no-no.html' title='PHP? A big no-no'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-6415644269105282757</id><published>2009-07-28T21:19:00.003+07:00</published><updated>2009-07-28T21:37:38.128+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Installing Apache Tomcat on Ubuntu</title><content type='html'>First download &lt;span style="color: rgb(0, 102, 0);"&gt;apache-tomcat-6.0.20&lt;/span&gt; from &lt;a href="http://tomcat.apache.org/"&gt;http://tomcat.apache.org/&lt;/a&gt;. Extract it in your chosen directory, I extracted it in my home directory.&lt;br /&gt;After that run &lt;span style="color: rgb(0, 102, 0);"&gt;startup.sh&lt;/span&gt; to start tomcat. If it can't be run on terminal or it is opened by text editor, edit its properties -&gt; Permissions tab -&gt; and then tick 'execute checkbox' to allow executing file as program. Repeate it for &lt;span style="color: rgb(0, 102, 0);"&gt;catalina.sh&lt;/span&gt;.&lt;br /&gt;And then add &lt;span style="color: rgb(0, 102, 0);"&gt;export JAVA_HOME=/usr/lib/jvm/java-6-sun-1.6.0.14&lt;/span&gt; and &lt;span style="color: rgb(0, 102, 0);"&gt;export CATALINA_HOME=/home/matt/apache-tomcat-6.0.20&lt;/span&gt; to your environment variable (&lt;span style="color: rgb(0, 102, 0);"&gt;/etc/profile&lt;/span&gt;), logout.&lt;br /&gt;Last step is add permission to your .sh file : &lt;span style="color: rgb(0, 102, 0);"&gt;sudo chmod 755 *.sh&lt;/span&gt; on &lt;span style="color: rgb(0, 102, 0);"&gt;apache-tomcat-6.0.20/bin&lt;/span&gt; directory.&lt;br /&gt;Try again to run it with &lt;span style="color: rgb(0, 102, 0);"&gt;./startup.sh&lt;/span&gt;. To stop it run &lt;span style="color: rgb(0, 102, 0);"&gt;./shutdown.sh&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;That's all...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-6415644269105282757?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/6415644269105282757/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=6415644269105282757' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/6415644269105282757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/6415644269105282757'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2009/07/installing-apache-tomcat-on-ubuntu.html' title='Installing Apache Tomcat on Ubuntu'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-9177035614345278245</id><published>2009-07-20T08:39:00.008+07:00</published><updated>2009-07-20T18:35:25.715+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Google Web Toolkit Getting Started</title><content type='html'>Last week one of my friend asked me if I can join him to write a book about Java. He told me that it's very difficult to find books about Java in stores. I agree with that. Nowadays Microsofts technologies seem more popular than any other open source technologies. He gave ideas about writing web-based application book.&lt;br /&gt;&lt;br /&gt;Because AJAX is very popular at present, we decided to write Google Web Toolkit, one of the most popular open source AJAX-based technology to build rich internet application. But the problem is I don't know anything about GWT. But I think it's not difficult to be learnt.&lt;br /&gt;&lt;br /&gt;I started with downloading ebooks about GWT and it's latest toolkit. But then a link pointing me to google documentation about google plugins for eclipse. Interesting... now I love eclipse very much, we can do almost everything with eclipse.&lt;br /&gt;&lt;br /&gt;In order to use this plugin, we need eclipse  3.4 Ganymede. You can go to this link for detail instructions : &lt;a href="http://code.google.com/eclipse/docs/install-eclipse-3.4.html"&gt;http://code.google.com/eclipse/docs/install-eclipse-3.4.html&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If you downloaded the toolkit (I downloaded gwt-linux-1.7.0) from &lt;a href="http://code.google.com/webtoolkit/download.html"&gt;http://code.google.com/webtoolkit/download.html&lt;/a&gt; you'll find a folder called samples which is collection of samples provided for you. You can use these samples and import it in eclipse. First go to one of the samples you want to import and run ant there : &lt;span style="color: rgb(0, 102, 0);"&gt;matt@digitalfortress:~/Desktop/gwt-linux-1.7.0/samples/DynaTable$ ant eclipse.generate&lt;/span&gt;. After successfully running this command you can use popular eclipse 'imports existing project into workspace' menu to import it and run as usual.&lt;br /&gt;&lt;br /&gt;How to run the application? There are two modes how you can run your application. The first is &lt;span style="color: rgb(0, 102, 0);"&gt;hosted mode&lt;/span&gt;, and the second is &lt;span style="color: rgb(0, 102, 0);"&gt;web mode&lt;/span&gt;. To run in hosted mode just click the popular &lt;span style="color: rgb(0, 102, 0);"&gt;'run'&lt;/span&gt; green button in eclipse. To run in web mode from hosted mode click &lt;span style="color: rgb(0, 102, 0);"&gt;'compile/browse'&lt;/span&gt; button from GWT hosted mode browser.&lt;br /&gt;&lt;br /&gt;But before running on web mode add this : &lt;span style="color: rgb(0, 102, 0);"&gt;export GWT_EXTERNAL_BROWSER=/usr/bin/firefox&lt;/span&gt; to your environment variable (&lt;span style="color: rgb(0, 102, 0);"&gt;/etc/profile&lt;/span&gt;) to set your default web browser so that GWT knows which browser to be fired up when you want to run on web mode.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-9177035614345278245?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/9177035614345278245/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=9177035614345278245' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/9177035614345278245'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/9177035614345278245'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2009/07/google-web-toolkit-getting-started.html' title='Google Web Toolkit Getting Started'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-3042170461123817487</id><published>2009-07-18T01:42:00.002+07:00</published><updated>2009-07-18T02:03:08.803+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stories'/><title type='text'>Dokter Lo Siaw Ging</title><content type='html'>&lt;span style="font-family: verdana;font-size:100%;" &gt;Laporan wartawan KOMPAS Sonya Helen Sinombor&lt;br /&gt;&lt;br /&gt;Ketika biaya perawatan dokter dan rumah sakit semakin membubung tinggi, tidak ada yang berubah dari sosok Lo Siaw Ging, seorang dokter di Kota Solo, Jawa Tengah. Dia tetap merawat dan mengobati pasien tanpa menetapkan tarif, bahkan sebagian besar pasiennya justru tidak pernah dimintai bayaran.&lt;br /&gt;&lt;br /&gt;Maka, tak heran kalau pasien-pasien Lo Siaw Ging tidak hanya warga Solo, tetapi juga mereka yang berasal dari Sukoharjo, Karanganyar, Sragen, Klaten, Boyolali, dan Wonogiri. Usianya yang sudah menjelang 75 tahun tak membuat pria itu menghentikan kesibukannya memeriksa para pasien.&lt;br /&gt;&lt;br /&gt;Dokter Lo, panggilannya, setiap hari tetap melayani puluhan pasien yang datang ke tempatnya praktik sekaligus rumah tinggalnya di Jalan Jagalan 27, Kelurahan Jebres, Kota Solo. Mayoritas pasien Lo adalah keluarga tak mampu secara ekonomi. Mereka itu, jangankan membayar ongkos periksa, untuk menebus resep dokter Lo pun sering kali tak sanggup.&lt;br /&gt;&lt;br /&gt;Namun, bagi Lo, semua itu dihadapinya dengan ”biasa saja”. Dia merasa dapat memahami kondisi sebagian pasiennya itu. Seorang pasiennya bercerita, karena terlalu sering berobat ke dokter Lo dan tak membayar, ia merasa tidak enak hati. Dia lalu bertanya berapa biaya pemeriksaan dan resep obatnya.&lt;br /&gt;&lt;br /&gt;Mendengar pertanyaan si pasien, Lo malah balik bertanya, ”Memangnya kamu sudah punya uang banyak?”&lt;br /&gt;&lt;br /&gt;Pasiennya yang lain, Yuli (30), warga Cemani, Sukoharjo, bercerita, dia juga tak pernah membayar saat memeriksakan diri. ”Saya pernah ngasih uang kepada Pak Dokter, tetapi enggak diterima,” ucapnya.&lt;br /&gt;&lt;br /&gt;Kardiman (45), penjual bakso di samping rumah dokter Lo, mengatakan, para tetangga dan mereka yang tinggal di sekitar rumah dokter itu juga tak pernah diminta bayaran. ”Kami hanya bisa bilang terima kasih dokter, lalu ke luar ruang periksa,” katanya.&lt;br /&gt;&lt;br /&gt;Cara kerja Lo itu membuat dia setiap bulan justru harus membayar tagihan dari apotek atas resep-resep yang diambil para pasiennya. Ini tak terhindarkan karena ada saja pasien yang benar-benar tak punya uang untuk menebus obat atau karena penyakitnya memerlukan obat segera, padahal si pasien tak membawa cukup uang.&lt;br /&gt;&lt;br /&gt;Dalam kondisi seperti itu, biasanya setelah memeriksa dan menuliskan resep untuk sang pasien, Lo langsung meminta pasien dan keluarganya menebus obat ke apotek yang memang telah menjadi langganannya. Pasien atau keluarganya cukup membawa resep yang telah ditandatangani Lo, petugas di apotek akan memberikan obat yang diperlukan.&lt;br /&gt;&lt;br /&gt;Pada setiap akhir bulan, barulah pihak apotek menagih harga obat tersebut kepada Lo. Berapa besar tagihannya? ”Bervariasi, dari ratusan ribu sampai Rp 10 juta per bulan.”&lt;br /&gt;&lt;br /&gt;Bahkan, pasien tak mampu yang menderita sakit parah pun tanpa ragu dikirim Lo ke Rumah Sakit Kasih Ibu, Solo. Dengan mengantongi surat dari dokter Lo, pasien biasanya diterima pihak rumah sakit, yang lalu membebankan biaya perawatan kepada Lo.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;              &lt;span style="font-family: verdana;font-size:100%;" &gt;&lt;span style="font-weight: bold;"&gt;Kerusuhan 1998&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Nama dokter Lo sebagai rujukan, terutama bagi kalangan warga tak mampu, relatif ”populer”. Namun, mantan Direktur RS Kasih Ibu ini justru tak suka pada publikasi. Beberapa kali dia menolak permintaan wawancara dari media.&lt;br /&gt;&lt;br /&gt;”Enggak usahlah diberita-beritakan. Saya bukan siapa-siapa,” ujarnya.&lt;br /&gt;&lt;br /&gt;Bagi Lo, apa yang dia lakukan selama ini sekadar membantu mereka yang tak mampu dan membutuhkan pertolongan dokter. ”Apa yang saya lakukan itu biasa dilakukan orang lain juga. Jadi, tak ada yang istimewa,” ujarnya.&lt;br /&gt;&lt;br /&gt;Di kalangan warga Solo, terutama di sekitar tempat tinggalnya, Lo dikenal sebagai sosok yang selalu bersedia menolong siapa pun yang membutuhkan. Tak heran jika saat terjadi kerusuhan rasial di Solo pada Mei 1998, rumah dokter keturunan Tionghoa ini justru dijaga ketat oleh masyarakat setempat.&lt;br /&gt;&lt;br /&gt;Lo juga tak merasa khawatir. Justru para tetangga yang meminta dia tidak membuka praktik pada masa kerusuhan itu mengingat situasinya rawan, terutama bagi warga keturunan Tionghoa. Namun, Lo menolak permintaan itu, dia tetap menerima pasien yang datang.&lt;br /&gt;&lt;br /&gt;”Saya mengingatkan dokter, kenapa buka praktik. Wong suasananya kritis. Eh, saya yang malah dimarahi dokter. Katanya, dokter akan tetap buka praktik, kasihan sama orang yang sudah datang jauh-jauh mau berobat,” cerita Putut Hari Purwanto (46), warga Purwodiningratan, yang rumahnya tak jauh dari rumah Lo.&lt;br /&gt;&lt;br /&gt;Bahkan, meski tentara datang ke rumah Lo untuk mengevakuasi dia ke tempat yang aman, Lo tetap menolak. Maka, wargalah yang kemudian berjaga-jaga di rumah Lo agar dia tak menjadi sasaran kerusuhan.&lt;br /&gt;&lt;br /&gt;”Saya ini orang Solo, jadi tak perlu pergi ke mana-mana. Buat apa?” ucapnya.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Anugerah&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Menjadi dokter, bagi Lo, adalah sebuah anugerah. Dia kemudian bercerita, seorang dokter di Solo yang dikenal dengan nama dokter Oen, seniornya, dan sang ayahlah yang membentuk sosoknya. Dokter Oen dan sang ayah kini telah tiada.&lt;br /&gt;&lt;br /&gt;Lo selalu ingat pesan ayahnya saat memutuskan belajar di sekolah kedokteran. ”Ayah saya berkali-kali mengatakan, kalau saya mau jadi dokter, ya jangan dagang. Kalau mau dagang, jangan jadi dokter. Makanya, siapa pun orang yang datang ke sini, miskin atau kaya, saya harus terbuka. Saya tidak pasang tarif,” kata Lo yang namanya masuk dalam buku Kitab Solo itu.&lt;br /&gt;&lt;br /&gt;Papan praktik dokter pun selama bertahun-tahun tak pernah dia pasang. Kalau belakangan ini dia memasang papan nama praktik dokternya, itu karena harus memenuhi peraturan pemerintah.&lt;br /&gt;&lt;br /&gt;Tentang peran dokter Oen dalam dirinya, Lo bercerita, selama sekitar 15 tahun dia bekerja kepada dokter Oen yang dia jadikan sebagai panutan. ”Dokter Oen itu jiwa sosialnya tinggi dan kehidupan sehari-harinya sederhana,” ujarnya.&lt;br /&gt;&lt;br /&gt;Dari kedua orang itulah, Lo belajar bahwa kebahagiaan justru muncul saat kita bisa berbuat sesuatu bagi sesama. ”Ini bukan berarti saya tak menerima bayaran dari pasien, tetapi kepuasan bisa membantu sesama yang tidak bisa dibayar dengan uang,” katanya sambil bercerita, sebagian pasien yang datang dari desa suka membawakan pisang untuknya.&lt;br /&gt;&lt;br /&gt;Gaya hidup sederhana membuat Lo merasa pendapatan sebagai dokter bisa lebih dari cukup untuk membiayai kehidupannya sehari-hari. Apalagi, dia dan sang istri, Maria Gan May Kwee atau Maria Gandi, yang dinikahinya tahun 1968, tak memiliki anak.&lt;br /&gt;&lt;br /&gt;”Kebutuhan kami hanya makan. Lagi pula orang seumur saya, seberapa banyak sih makannya?” ujar Lo.&lt;br /&gt;&lt;br /&gt;Bahkan, di mata para pasien, Lo seakan tak pernah ”cuti” praktik. Lies (55), ibu dua anak, warga Kepatihan Kulon, Solo, yang selama puluhan tahun menjadi pasiennya mengatakan, ”Dokter Lo praktik pagi dan malam. Setiap kali saya datang tak pernah tutup. Sepertinya, dokter Lo selalu ada kapan pun kami memerlukan.”&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;DATA DIRI&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;• Nama: Lo Siaw Ging&lt;br /&gt;• Lahir: Magelang, 16 Agustus 1934&lt;br /&gt;• Istri: Maria Gan May Kwee (62)&lt;br /&gt;• Pendidikan: - Fakultas Kedokteran Universitas Airlangga, 1962&lt;br /&gt;   S-2 (MARS) Universitas Indonesia, 1995&lt;br /&gt;• Profesi: - Dokter RS Panti Kosala, Kandang Sapi, Solo (sekarang RS dokter Oen, Solo)&lt;br /&gt;                - Mantan Direktur Rumah Sakit Kasih Ibu, Solo&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/5217372432017247701-3042170461123817487?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/3042170461123817487/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=3042170461123817487' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/3042170461123817487'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/3042170461123817487'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2009/07/dokter-lo-siaw-ging.html' title='Dokter Lo Siaw Ging'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-1291762751003524830</id><published>2009-07-15T01:11:00.010+07:00</published><updated>2009-07-20T08:31:03.032+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cobol'/><title type='text'>Eclipse Cobol Plugin</title><content type='html'>I've got Cobol training materials started from yesterday until next 5 days from company I'm working for. It's a bit old fashion programming language to learn but I think it's ok to learn something new, just to get to know. It's not pure ordinary Cobol We're going to learn actually, but it's Mincom Cobol, Cobol customized by Mincom.&lt;br /&gt;&lt;br /&gt;Because of my curiousity, I googled any sources about ordinary Cobol, I downloaded ebooks about Cobol until I realized that it needs compiler hehehe. Then I realized (again) that it's very difficult to download free Cobol compiler. Some ebooks said that they use Fujitsu but when I went to the link they give, no download links...until I saw a link pointing to 'eclipse cobol plugin from Fujitsu'. Wow... somebody wrote plugins for Cobol? Then I remember that there are either plugins for C or C++ in eclipse hehehe, I'm just so out of date...&lt;br /&gt;&lt;br /&gt;Actually this is my very first time using Cobol. This writing is just about telling you how to install Cobol plugin in eclipse, just my notes in case I need it again later. Lets start...&lt;br /&gt;&lt;br /&gt;1. Download cobol plugin from eclipse.org. At the moment of writing, I can only install on eclipse 3.4. It didn't work for eclipse 3.2, besides, it's still in beta version. Extract it and put the plugins and features into your eclipse appropriate folders as usual.&lt;br /&gt;&lt;br /&gt;2. Download source code open-cobol-1.0, extract it, and then run three magic steps after you're in extracted folder : &lt;span style="color: rgb(0, 153, 0);"&gt;./configure&lt;/span&gt;, &lt;span style="color: rgb(0, 153, 0);"&gt;make check&lt;/span&gt;, &lt;span style="color: rgb(0, 153, 0);"&gt;sudo make install&lt;/span&gt;. Don't forget to download dependency library if you encounter some errors. On configuration I made yesterday, I encountered two dependency libraries missing which are &lt;span style="color: rgb(0, 102, 0);"&gt;libgmp3-dev&lt;/span&gt; and &lt;span style="color: rgb(0, 102, 0);"&gt;libdb4.2-dev&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;3. Create Cobol command in &lt;span style="color: rgb(0, 153, 0);"&gt;/opt/FJSVcbl/bin/cobol&lt;/span&gt; just like this :&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;#!/bin/bash&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;# netCOBOL -&gt; OpenCOBOL&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;echo " =NetCOBOL&gt;OpenCOBOL: $*"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;compiler="/usr/local/bin/cobc"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;exefile=""&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;dolink=true&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;mainp=""&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;copylib=""&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;while getopts ":cMI:o:" optioncode; do&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;  case $optioncode in&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    c ) dolink=false ;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    M ) mainp="-x" ;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    I ) wOPTARG=${OPTARG%;} ; copylib="-I ${wOPTARG//;/ -I }" ;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    o ) exefile=" -o $OPTARG" ;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    \? ) ;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;  esac&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;done&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;shift $((OPTIND - 1))&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;if [ $dolink = false ]; then&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;  command="$compiler $mainp -c $copylib $*"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;  echo " =Compile: $command"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;  $command&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;fi&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;if [ $dolink = true ]; then&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;  command="$compiler -x $exefile $*"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;  echo " =Link: $command"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;  $command&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;fi&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;# eof&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;4. To test, create new Cobol project in eclipse Cobol perspective. If you find error message at console when you build the project, which is permission denied, then do &lt;span style="color: rgb(0, 102, 0);"&gt;chmod 755 /opt/FJSVcbl/bin/cobol&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;5. If it is error "&lt;span style="color: rgb(204, 0, 0);"&gt;error while loading shared libraries: libcob.so.1: cannot open shared object file: No such file or directory&lt;/span&gt;" when you run the project, then do &lt;span style="color: rgb(0, 102, 0);"&gt;sudo ln -s /usr/local/lib/libcob.so.1 /usr/lib/libcob.so.1&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Reference : http://www.hop-penchan.org/yogawa/tool/opencobol/index.xml&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-1291762751003524830?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/1291762751003524830/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=1291762751003524830' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/1291762751003524830'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/1291762751003524830'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2009/07/eclipse-cobol-plugin.html' title='Eclipse Cobol Plugin'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-4777779591133532847</id><published>2009-07-05T09:37:00.003+07:00</published><updated>2009-07-05T11:11:13.562+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stories'/><title type='text'>Fanatic or easy-going programmer?</title><content type='html'>Selama dua minggu ini di tempat baru, saya menjumpai banyak orang baru, dalam dunia programming tentu saja. Ada yang super fanatik dengan bahasa pemrogramannya, ada yang 'mau ini mau itu pilih yang mana? semua kusuka...'. Mengingat di kantor baru ini ada tiga stream (kok cuman tiga ya...PHP ke mana?), everybody is encouraged to learn all of them. But unfortunately (or fortunately maybe) I'm a type of a guy that still believe in 'you learn from life and life to learn', 'every good things are worth to try', and 'you will never know until you have tried', karena itulah saya selalu berpendapat bahwa tidak ada salahnya mencoba hal-hal baru.&lt;br /&gt;&lt;br /&gt;Kembali kepada orang-orang yang baru saya kenal tersebut. Saya percaya ada alasan khusus setiap orang menjadi fanatik atau easy-going, keduanya bagus selama kita bisa mengetahui kelebihan dan kekurangan kita masing-masing. Saya pernah diinterview dengan pertanyaan 'Kamu kan bisa Java, pasti bisa juga C# .net, kan keduanya hampir mirip?'. Meneketehe, saya kan gak pernah pake C#, pakenya VB.net. Tapi agar lebih diplomatis saya jawab 'bisa sedikit' hehehe... Untung tidak dikejar dengan membuat aplikasi C# hehehe...&lt;br /&gt;&lt;br /&gt;Menurut saya pribadi (menurut pendapat pribadi lho ya...jadi dilarang protes), menjadi terlalu fanatik is not good for your career in a company and the company itself hehehe (kecuali lo dah punya posisi kuat hehehe...). Bayangin aja kalo kita dapat assignment trus nolak karena 'I don't like it sir, i'm not into it... can u find anybody else to do it?', 'Yeah... your colleage can do it much better than you...so we don't need you anymore'. Kalo terlalu easy going juga gak bagus, kesannya anda gampangan hihihi... Jadi orang yang terlalu easy going kata pak ustadz mudah diombang-ambingkan jaman. Pas ditanya konsep, eh jadi campur aduk kan...&lt;br /&gt;&lt;br /&gt;Jadi gw sendiri ada di mana ya... Sekarang ini gw coba menjadi orang seperti perintah Nabi Muhammad (biarpun agak maksa sih...) yaitu mastering di salah satu bahasa, sebagai pedoman agar kita tidak tersesat, and keep your mind up with other languages, cukup fleksibel untuk company tanpa harus kehilangan identitas diri ya kan...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-4777779591133532847?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/4777779591133532847/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=4777779591133532847' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/4777779591133532847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/4777779591133532847'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2009/07/fanatic-or-easy-going-programmer.html' title='Fanatic or easy-going programmer?'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-2658837174351090696</id><published>2009-06-28T20:16:00.007+07:00</published><updated>2009-07-02T20:49:35.381+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stories'/><title type='text'>Bali</title><content type='html'>It's been a week since I moved to Bali. It wasn't a vacation trip but a working trip because finally I decided to accept a job offering that requires me to move here, in Bali. There are many things that I want to share here, in this blog, but I'm going to tell You several things that a bit shocking me, not as a bad compliment ofcourse, but I just want to share my personal story.&lt;br /&gt;&lt;br /&gt;Bali has so much distinctions compared with Surabaya. The first thing is that Bali is very very hot at day and very very cold at morning especially for You riding motorcycle. To make it even worse, I didn't bring any jacket here, so...yup... I got flu and a bit sunburned skin hehehe. The second is the time zone differentiation. When I was in Surabaya, it was very very late to do Sholat Subuh at five o clock, but now, it's even still dark at five.&lt;br /&gt;&lt;br /&gt;The third is kos-kosan. Almost all of kos-kosan in Bali doesn't provide basic stuf such as bed and cupboard but an empty room for you. Tada... Now I now the reason why the company gives us relocation allowance hohoho... The fourth is the dog. It seems that there are one or two dogs for each house including kos. So... I've got to learn to make myself feel comfort with it. And the last one is that You'll find angkot as a very very unpopular transportation to go somewhere.&lt;br /&gt;&lt;br /&gt;But there is another thing that surprising me, Balinesse are very kind, one of the most gentle people I've found . It is proved when I got lost, twice, in Bypass Ngurah Rai and in Kuta area. Every people I asked about direction were showing very good conviction for helping me to find my way out. Something that You'll never found in many places. So...I think the real asset of Bali is its people.&lt;br /&gt;&lt;br /&gt;Now, I'm trying to adapt with this new place, a place that someday I hope I can consider it as my second home.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-2658837174351090696?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/2658837174351090696/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=2658837174351090696' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/2658837174351090696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/2658837174351090696'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2009/06/bali.html' title='Bali'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-7771169151189612563</id><published>2009-06-06T07:02:00.005+07:00</published><updated>2009-06-06T08:56:41.393+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stories'/><title type='text'>Not Another Nice Story</title><content type='html'>Time moves so fast that it's been ten days since last post here. I've been very busy recently with my English test and my Ubuntu. It's been full of English learning material within past two months. I've got pieces of English exam recently. The first exam was last Saturday. It was TOEFL exam at ITS Language Centre. I don't think I did well by the way. The second one was last Thursday at TBI. It was speaking and listening exam. Not good enough I think, but not bad as a beginner hehehe. It's going to be writing and reading exam next Tuesday. I didn't put much hard-working attitude in all of these English exam because I think learning English is something that I've got to do regularly, You can't learn English very hard for weeks and then stop, can You? Listening to BBC and watching movies with subtitle help me improve my English. Creating our own English speaking environment, that's all We can do when We can't always find native speaker to speak to. Well... enough about English.&lt;br /&gt;&lt;br /&gt;The second thing that needs my attention is my Ubuntu. I removed my Hardy finally and installed Jaunty. I needed to switch to safe mode graphic at the first installer menu because, as I said in my previous post, it shows blank when I try to use the live CD. Is there something wrong with graphic card or graphic driver? Whatever. Jaunty installed successfully, finally. Then It's high time we install everything, but something odd happened.&lt;br /&gt;&lt;br /&gt;First, when I tried to install google earth from synaptic I couldn't find the package eventhough I did check many time if I missed something. I found no difficulties when I installed it on Hardy. And then guess what? Surprise... google package appeared later when I searched it again in synaptic. Don't know why.&lt;br /&gt;&lt;br /&gt;Second, I tried to install Oracle XE. I did exactly the same steps as I did on Hardy. Again, no package found in synaptic. So I tried to install it from terminal. Wow... it worked. Package installed successfully. Did I miss something?&lt;br /&gt;&lt;br /&gt;Third, when I tried to start Oracle instance, tada... nothing happened. I read again my previous notes about starting Oracle on Hardy. That was exactly 100% same steps. Frustrated, I started Oracle from 'Applications' menu. The error console said that there was no privilege to start instance. Ok, I added my username to dba group and tried to start instance again. It worked. So? From now on, I need to do extra step to start Oracle instance. First, start listener using lsnrctl start, and then use 'Start Database' choice from 'Applications' menu. What the hell... Ok stop there, don't want to know why.&lt;br /&gt;&lt;br /&gt;And fourth, I can't start my iReport. What the hell has just happened here. I doubled click iReport.sh and it's just hang up. Shows nothing but blank terminal and grey spash screen.&lt;br /&gt;&lt;br /&gt;I really miss my Hardy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-7771169151189612563?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/7771169151189612563/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=7771169151189612563' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/7771169151189612563'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/7771169151189612563'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2009/06/not-another-nice-story.html' title='Not Another Nice Story'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-3305070588283463960</id><published>2009-05-26T22:58:00.008+07:00</published><updated>2009-05-27T06:08:20.183+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stories'/><title type='text'>Busy Days Looking for a Job</title><content type='html'>It's been long long time since my last post here. It's because I've got job tests and interviews recently. It was very tiring but at the same time I really enjoy it. It gave me lots of new experiences that I've never had before. In fact, it is the first time for me to seriously look for a job. My first job was when I was at university and I don't think I put much attention to look for a job before. My first job application was very embarrassing, either the cover letter, cv, my clothes, or the interview session. Well, live and learn.&lt;br /&gt;&lt;br /&gt;At first it was psikometri test few days ago to determine whether you are a robot or not :). Why? Because you've got to finish 15 questions within 5 minutes. So it is 18 seconds per question. The first thing is, can You read and understand that question less than 18 seconds? If You can't, then how can You answer that question? Your time was running out. Unfortunately I failed the exam.&lt;br /&gt;&lt;br /&gt;I did apply to other company. And it was academic test held on Saturday. Thanks My Lord I passed it. They called me Saturday night to come to an english test and job interview on Sunday. The interview session was a bit difficult, I made mistakes still. But thanks Lord I passed it too.&lt;br /&gt;&lt;br /&gt;Today, it was english and academic test for other job that I applied. I was very shocked when I opened the question sheets. O My Goodness... It reminds me about my first year at university. It was questions about algorithms, tupple, record, computer architecture, OOP, software design lifecycle. Damn... if only I've paid more attention on those subjects before. Hope I can pass it too.&lt;br /&gt;&lt;br /&gt;And tomorrow is going to be medical test, followed by TOEFL test on next Saturday because my TOEFL certificate got expired almost 2 years ago. Fiuh...lots of tests huh...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-3305070588283463960?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/3305070588283463960/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=3305070588283463960' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/3305070588283463960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/3305070588283463960'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2009/05/busy-days-looking-for-job.html' title='Busy Days Looking for a Job'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-1688367968048416746</id><published>2009-05-20T09:54:00.007+07:00</published><updated>2009-05-20T17:06:06.014+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Ubuntu U make me "Buntu"</title><content type='html'>Two days ago Jaunty Jackalope Ubuntu cd that I ordered from shipit arrived. It only took not later that twenty days, much more fast than my first request on Intrepid Ibex. I was so excited that I put that cd in my DVDROM immediately. The loading screen looks fresh and cool but then it became black. What's wrong? I was thinking that it must be still in the process. But unfortunately nothing appeared on my screen a minute later. OMG... This Jaunty just behaved exactly the same as Intrepid Ibex that I tried days before.&lt;br /&gt;&lt;br /&gt;It was started many days ago when my Ubuntu Hardy behaved very annoying. It's been going to not responding state everytime I move my mouse faster, dragging down my pdf document faster, and changing application window a lot. I don't think I've missed something because I always update my Hardy everytime the update manager popping up an update message.&lt;br /&gt;&lt;br /&gt;I asked Kaskus Ubuntu Forum then, but nobody's given me an answer. Huh... I decided to upgrade this Hardy to Intrepid then but... it showed loading screen and then blank. Then two days ago I found my Jaunty cd behaved exactly the same. Now I think (possibly) the problem is my hardware because it's been two cds showing blank screen everytime I try to boot from DVDROM. Fiuh... Any suggestion readers?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-1688367968048416746?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/1688367968048416746/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=1688367968048416746' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/1688367968048416746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/1688367968048416746'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2009/05/ubuntu-u-make-me-buntu.html' title='Ubuntu U make me &quot;Buntu&quot;'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-5273478191657763338</id><published>2009-05-11T09:16:00.035+07:00</published><updated>2009-05-12T15:12:30.854+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Beautiful Mind'/><title type='text'>Single Layer Perceptron</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Neural Network&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Neural Networks berdasarkan algoritma pembelajarannya bisa dikelompokkan menjadi dua kategori yaitu Feed-forward network (jaringan saraf umpan maju) dan Recurrent-feedback network (jaringan saraf umpan balik). Feed-forward network dicirikan dengan graf yang tidak memiliki loop sedangkan recurrent-forward network pada grafnya memiliki loop-loop koneksi balik. Berikut adalah diagram pengelompokan jaringan saraf atau neural network :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_uZGWgKeKvmY/SgeXAKxoNqI/AAAAAAAAAGo/JmjTlzqqqPA/s1600-h/neural_network.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 118px;" src="http://2.bp.blogspot.com/_uZGWgKeKvmY/SgeXAKxoNqI/AAAAAAAAAGo/JmjTlzqqqPA/s320/neural_network.png" alt="" id="BLOGGER_PHOTO_ID_5334398312791946914" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Single-layer Perceptron&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Single-layer perceptron bisa dibilang merupakan salah satu teknik jaringan saraf tiruan yang paling sederhana. Jaringan ini hanya memiliki lapisan input dan lapisan output. Jaringan ini termasuk supervised learning, artinya metode pembelajarannya dilakukan melalui contoh-contoh. Jaringan akan ditraining dengan sekumpulan contoh-contoh yang diketahui input dan outputnya. Selama proses belajar tersebut jaringan akan menyesuaikan nilai bobotnya agar menghasilkan output yang diinginkan. Jaringan ini bisa digambarkan sebagai berikut :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_uZGWgKeKvmY/SgfbFE2WdPI/AAAAAAAAAGw/BBY4_tfWOXg/s1600-h/single_layer_perceptron.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 213px;" src="http://4.bp.blogspot.com/_uZGWgKeKvmY/SgfbFE2WdPI/AAAAAAAAAGw/BBY4_tfWOXg/s320/single_layer_perceptron.png" alt="" id="BLOGGER_PHOTO_ID_5334473163891176690" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Jaringan di atas mempunyai input sebanyak n (x1 sampai xn) dengan masing-masing input mempunyai bobot wn. Sebuah bias ditambahkan ke dalam jaringan dengan angka pembelajaran = 1. Output yang dihasilkan adalah Y. Karena metode ini adalah supervised learning maka ada threshold yang harus dilewati. Berikut adalah beberapa notasi dan fungsi yang perlu kita ketahui :&lt;br /&gt;&lt;br /&gt;1. xi = input ke-i, b = bias, α = angka pembelajaran (0&amp;lt;α≤1), wi = bobot masing-masing input, ti = batas ambang / threshold dari input ke-i&lt;br /&gt;&lt;br /&gt;2. Output yang dihasilkan adalah : Yin = Σwi.xi + α.b&lt;br /&gt;&lt;br /&gt;3. Sedangkan output dalam bentuk biner (y) adalah 1 jika 1 ≤ Yin dan 0 jika Yin ≤ 0&lt;br /&gt;&lt;br /&gt;4. Perubahan nilai bobot (w) dan bias (b) selama learning dinotasikan sebagai :&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_uZGWgKeKvmY/SgkEpbXxWeI/AAAAAAAAAHY/x2zJWPVQp70/s1600-h/weight.png"&gt;&lt;img style="cursor: pointer; width: 300px; height: 110px;" src="http://2.bp.blogspot.com/_uZGWgKeKvmY/SgkEpbXxWeI/AAAAAAAAAHY/x2zJWPVQp70/s320/weight.png" alt="" id="BLOGGER_PHOTO_ID_5334800343365671394" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Sekarang kita akan mencobanya pada fungsi logika OR. Berikut adalah gambar tabel diagram OR&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_uZGWgKeKvmY/SgfpCw9uAVI/AAAAAAAAAG4/-1d2AkF3ttI/s1600-h/or.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 104px;" src="http://3.bp.blogspot.com/_uZGWgKeKvmY/SgfpCw9uAVI/AAAAAAAAAG4/-1d2AkF3ttI/s320/or.png" alt="" id="BLOGGER_PHOTO_ID_5334488517356421458" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Selain diagram OR, kita perlu menginisialisasi bobot masing-masing input yaitu masing-masing bernilai 0. Kita juga menginisialisasi bias = 0. Dengan demikian kita mendapatkan : w1=0, w2=0, b=0.&lt;br /&gt;&lt;br /&gt;Sekarang kita akan mulai melakukan iterasi pada jaringan ini. Dalam empat iterasi nilai bobot dan bias tidak berubah lagi dan jaringan menghasilkan output sesuai yang diharapkan.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_uZGWgKeKvmY/SgkuQXdPbMI/AAAAAAAAAHg/oz9K6UUX3GI/s1600-h/iterasi1.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 101px;" src="http://4.bp.blogspot.com/_uZGWgKeKvmY/SgkuQXdPbMI/AAAAAAAAAHg/oz9K6UUX3GI/s320/iterasi1.png" alt="" id="BLOGGER_PHOTO_ID_5334846092306508994" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_uZGWgKeKvmY/SgkumEJIYnI/AAAAAAAAAHo/U0NQXpUu_ac/s1600-h/iterasi2.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 101px;" src="http://4.bp.blogspot.com/_uZGWgKeKvmY/SgkumEJIYnI/AAAAAAAAAHo/U0NQXpUu_ac/s320/iterasi2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5334846465079009906" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_uZGWgKeKvmY/Sgku2YCY_UI/AAAAAAAAAHw/cBap4sdaGFo/s1600-h/iterasi3.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 101px;" src="http://1.bp.blogspot.com/_uZGWgKeKvmY/Sgku2YCY_UI/AAAAAAAAAHw/cBap4sdaGFo/s320/iterasi3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5334846745297354050" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_uZGWgKeKvmY/SgkvRDZYLAI/AAAAAAAAAH4/-uMwmfX1oP4/s1600-h/iterasi4.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 101px;" src="http://4.bp.blogspot.com/_uZGWgKeKvmY/SgkvRDZYLAI/AAAAAAAAAH4/-uMwmfX1oP4/s320/iterasi4.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5334847203613092866" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-5273478191657763338?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/5273478191657763338/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=5273478191657763338' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/5273478191657763338'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/5273478191657763338'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2009/05/single-layer-perceptron.html' title='Single Layer Perceptron'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_uZGWgKeKvmY/SgeXAKxoNqI/AAAAAAAAAGo/JmjTlzqqqPA/s72-c/neural_network.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-6539845783222905747</id><published>2009-05-10T10:55:00.002+07:00</published><updated>2009-05-15T14:03:38.968+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>AOP Related Terminology (cont...)</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Aspect&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Pada &lt;a href="http://rochmatsantoso.blogspot.com/2009/05/aop-related-terminology.html"&gt;entry sebelumnya&lt;/a&gt; kita sudah mempunyai aspect. Terlihat mirip class bukan? Aspect memang dirancang agar mirip class sehingga kita merasa seperti berada di 'rumah sendiri'. Namun aspect tetaplah bukan sebuah class. Berikut adalah persamaan dan perbedaan aspect dengan class&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Persamaan&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;1. Aspect bisa memiliki variabel dan method yang dalam koteks class kita kenal dengan instance variable dan method.&lt;br /&gt;2. Aspect bisa memiliki access modifier seperti private, public, protected, atau package access.&lt;br /&gt;3. Aspect bisa memiliki konstruktor, namun harus tanpa argumen.&lt;br /&gt;4. Aspect bisa abstract, namun abstract aspect harus diimplementasikan oleh konkret aspect agar bisa digunakan.&lt;br /&gt;5. Aspect bisa extends abstract aspect atau extends class atau implements interface&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Perbedaan&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;1. Aspect tidak bisa kita istansiasi, dengan kata lain tidak bisa di-new.&lt;br /&gt;2. Aspect tidak bisa extends konkret aspect.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-6539845783222905747?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/6539845783222905747/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=6539845783222905747' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/6539845783222905747'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/6539845783222905747'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2009/05/aop-related-terminology-cont.html' title='AOP Related Terminology (cont...)'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-4729118304986214907</id><published>2009-05-05T01:47:00.048+07:00</published><updated>2009-05-10T10:51:59.198+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>AOP Related Terminology</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Join Point&lt;/span&gt;&lt;br /&gt;&lt;p&gt;Joseph D Gradecki dan Nicholas Lesiecki menuliskan join point sebagai : &lt;span style="font-style: italic; color: rgb(0, 102, 0);"&gt;&lt;span style="font-weight: bold;"&gt;well-defined location within the primary code where a concern will crosscut the application&lt;/span&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Jelaslah bahwa join point adalah sebuah titik di dalam coding (core concern) di mana kita bisa melakukan crosscut dan menyisipkan coding lain (crosscutting concern) di dalamnya.&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Join points bisa berupa method call, constructor invocations, exception handlers, atau titik-titik lain pada program&lt;/span&gt;. Perhatikan contoh berikut :&lt;/p&gt;Kali ini kita memiliki class Product yang merupakan base class untuk DVD dan Boxset dengan masing-masing variabel dan methodnya. Sebuah class bernama Main bertugas untuk menginstansiasi class DVD dan Boxset.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_uZGWgKeKvmY/SgVu1f-FctI/AAAAAAAAAFo/0Tx-ypo2vW0/s1600-h/joinPoint1.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 263px;" src="http://2.bp.blogspot.com/_uZGWgKeKvmY/SgVu1f-FctI/AAAAAAAAAFo/0Tx-ypo2vW0/s320/joinPoint1.png" alt="" id="BLOGGER_PHOTO_ID_5333791199084245714" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_uZGWgKeKvmY/SgVysbZ4gII/AAAAAAAAAF4/rJDNnBy4IG8/s1600-h/joinPoint2.png"&gt;&lt;img style="cursor: pointer; width: 285px; height: 320px;" src="http://1.bp.blogspot.com/_uZGWgKeKvmY/SgVysbZ4gII/AAAAAAAAAF4/rJDNnBy4IG8/s320/joinPoint2.png" alt="" id="BLOGGER_PHOTO_ID_5333795441286348930" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_uZGWgKeKvmY/SgVzG_AhSFI/AAAAAAAAAGA/pw9944LGYUg/s1600-h/joinPoint3.png"&gt;&lt;img style="cursor: pointer; width: 304px; height: 320px;" src="http://4.bp.blogspot.com/_uZGWgKeKvmY/SgVzG_AhSFI/AAAAAAAAAGA/pw9944LGYUg/s320/joinPoint3.png" alt="" id="BLOGGER_PHOTO_ID_5333795897520244818" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_uZGWgKeKvmY/SgVzhXc9HOI/AAAAAAAAAGI/U-oXAyu4Abs/s1600-h/joinPoint4.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 231px;" src="http://2.bp.blogspot.com/_uZGWgKeKvmY/SgVzhXc9HOI/AAAAAAAAAGI/U-oXAyu4Abs/s320/joinPoint4.png" alt="" id="BLOGGER_PHOTO_ID_5333796350758558946" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Selanjutnya kita memiliki sebuah aspect bernama ProductAspect. Di dalamnya berisi sebuah pointcut bernama tracePoint dan advice. Keduanya akan dijelaskan nanti. Yang perlu menjadi perhatian di sini adalah bahwa dengan aspect ini kita akan mencari tahu bagian mana saja dari class-class yang kita miliki di atas yang merupakan join point. Join point ditunjukkan pada baris yang memiliki tanda panah (&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_uZGWgKeKvmY/SgYfMBJORuI/AAAAAAAAAGY/vNBnV_7f2NQ/s1600-h/panah.png"&gt;&lt;img style="cursor: pointer; width: 20px; height: 10px;" src="http://3.bp.blogspot.com/_uZGWgKeKvmY/SgYfMBJORuI/AAAAAAAAAGY/vNBnV_7f2NQ/s320/panah.png" alt="" id="BLOGGER_PHOTO_ID_5333985099992942306" border="0" /&gt;&lt;/a&gt;).&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_uZGWgKeKvmY/SgVz-oyb62I/AAAAAAAAAGQ/6BrHV1N2gIw/s1600-h/joinPoint5.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 163px;" src="http://1.bp.blogspot.com/_uZGWgKeKvmY/SgVz-oyb62I/AAAAAAAAAGQ/6BrHV1N2gIw/s320/joinPoint5.png" alt="" id="BLOGGER_PHOTO_ID_5333796853628267362" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Wow banyak sekali titik yang bisa menjadi join point pada class-class di atas. Sebenarnya bagian mana sajakah yang bisa menjadi join point? Beberapa di antaranya adalah method call (ditunjukkan dengan tanda panah pada nama method), method execution (termasuk variable assignment dan return statement), object construction (lihat saat instansiasi class DVD dan Boxset), dan beberapa point yang tidak ditunjukkan pada class di atas adalah termasuk conditional check, loop (for, while, do-while), dan exception handling.&lt;br /&gt;&lt;br /&gt;Perlu diingat bahwa tidak semua join point di atas bisa kita gunakan. Join point yang dapat kita gunakan (dalam hal ini lewat pointcut nantinya) disebut exposed join point. AspectJ misalnya tidak mengikutsertakan loop sebagai join point. Selain itu join point juga memiliki context yang berasosiasi dengannya. Misalnya adalah tiap method call ke join point akan mendapatkan object yang memanggil, object target, dan argumen-argumen method tersebut. Contoh lain adalah join point dalam exception handling akan mendapatkan current object dan thrown exception. Kita akan melihat contoh penggunaannya saat berbicara tentang pointcut dan advice nanti.&lt;br /&gt;&lt;br /&gt;Kita akan lihat lebih detil untuk beberapa join point. (Untuk melihat implementasinya silakan dicoba seperti contoh di atas)&lt;br /&gt;&lt;br /&gt;1. Method join point&lt;br /&gt;Seperti disebutkan di atas ada dua jenis method join point yaitu method call dan method execution. Join point pada method call adalah saat method tersebut dipanggil (dari manapun). Misalnya &lt;span style="color: rgb(0, 102, 0);"&gt;starwars.getTitle()&lt;/span&gt;. Sedangkan method execution adalah di semua bagian dari body method tersebut, misalnya lihat pada method main() pada class Main.&lt;br /&gt;2. Constructor join point&lt;br /&gt;Sama seperti method join point, ada dua jenis constructor join point yaitu constructor call (object creation) dan construction execution.&lt;br /&gt;3. Field access join point&lt;br /&gt;Adalah saat mengeset atau membaca instance variable BUKAN variabel lokal. Perhatikan juga bahwa join point ini bukan berarti hanya ada di getter dan setter saja namun semua code yang membaca dan mengeset instance variable. Perhatikan kode berikut&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_uZGWgKeKvmY/SgZFTmeyhaI/AAAAAAAAAGg/5rRVtYFVJ4w/s1600-h/joinPoint6.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 218px;" src="http://1.bp.blogspot.com/_uZGWgKeKvmY/SgZFTmeyhaI/AAAAAAAAAGg/5rRVtYFVJ4w/s320/joinPoint6.png" alt="" id="BLOGGER_PHOTO_ID_5334027011716449698" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;baris 13 dan 14 adalah termasuk field access join point untuk instance variable starwars. Baris 13 memiliki 2 penanda untuk before dan after sesuai aspect sebelumnya untuk set starwars. Sedangkan baris 14 memiliki 4 penanda yaitu 2 untuk method call addDVD() dan 2 penanda untuk field access join point untuk membaca starwars.&lt;br /&gt;4. Exception handler execution join point&lt;br /&gt;Join point yang muncul pada blok catch seperti pada gambar di atas&lt;br /&gt;5. Class initilization join point&lt;br /&gt;Join point yang muncul saat loading class, termasuk inisialisasi static variabel dan static blok.&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;private static DVD dvd1;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;static {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;dvd1 = new DVD("");&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; // terdapat 4 penanda; 2 untuk constructor DVD dan 2 untuk field access&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Aspect&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(bersambung...)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-4729118304986214907?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/4729118304986214907/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=4729118304986214907' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/4729118304986214907'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/4729118304986214907'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2009/05/aop-related-terminology.html' title='AOP Related Terminology'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_uZGWgKeKvmY/SgVu1f-FctI/AAAAAAAAAFo/0Tx-ypo2vW0/s72-c/joinPoint1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-422174683476450004</id><published>2009-05-01T05:49:00.003+07:00</published><updated>2009-05-01T06:07:53.765+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stories'/><title type='text'>Kisah Cinta Dari China</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_uZGWgKeKvmY/SfouKv3bB8I/AAAAAAAAAEo/CHBIe1oNWm0/s1600-h/romantic1.jpg"&gt;&lt;img style="cursor: pointer; width: 320px; height: 214px;" src="http://2.bp.blogspot.com/_uZGWgKeKvmY/SfouKv3bB8I/AAAAAAAAAEo/CHBIe1oNWm0/s320/romantic1.jpg" alt="" id="BLOGGER_PHOTO_ID_5330623871128897474" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;(satu lagi dari kaskus...)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Contoh nyata kesetian pasangan suami-istri. Sebegitu nekatnya keinginan untuk hidup bersama, melarikan diri dari keluarga, hidup terasing selama 50 tahun.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Satu kisah cinta baru-baru ini keluar dari China dan langsung menyentuh seisi dunia. Kisah ini adalah kisah seorang laki-laki dan seorang wanita yang lebih tua, yang melarikan diri untuk hidup bersama dan saling mengasihi dalam kedamaian selama setengah abad. Laki-laki China berusia 70 tahun yang telah memahat 6000 anak tangga dengan tangannya (hand carved) untuk isterinya yang berusia 80 tahun itu meninggal dunia di dalam goa yang selama 50 tahun terakhir menjadi tempat tinggalnya.&lt;br /&gt;&lt;br /&gt;Lima puluh tahun yang lalu, Liu Guojiang, pemuda 19 tahun, jatuh cinta pada seorang janda 29 tahun bernama Xu Chaoqin. Seperti pada kisah Romeo dan Juliet karangan Shakespeare, teman-teman dan kerabat mereka mencela hubungan mereka karena perbedaan usia di antara mereka dan kenyataan bahwa Xu sudah punya beberapa anak.&lt;br /&gt;&lt;br /&gt;Pada waktu itu tidak bisa diterima dan dianggap tidak bermoral bila seorang pemuda mencintai wanita yang lebih tua. Untuk menghindari gosip murahan dan celaan dari lingkungannya, pasangan ini memutuskan untuk melarikan diri dan tinggal di sebuah goa di Desa Jiangjin, di sebelah selatan Chong Qing.&lt;br /&gt;&lt;br /&gt;Pada mulanya kehidupan mereka sangat menyedihkan karena tidak punya apa-apa, tidak ada listrik atau pun makanan. Mereka harus makan rumput-rumputan dan akar-akaran yang mereka temukan di gunung itu. Dan Liu membuat sebuah lampu minyak tanah untuk menerangi hidup mereka. Xu selalu merasa bahwa ia telah mengikat Liu dan ia berulang-kali bertanya, "Apakah kau menyesal?" Liu selalu menjawab, "Selama kita rajin, kehidupan ini akan menjadi lebih baik".&lt;br /&gt;&lt;br /&gt;Setelah 2 tahun mereka tinggal di gunung itu, Liu mulai memahat anak-anak tangga agar isterinya dapat turun gunung dengan mudah. Dan ini berlangsung terus selama 50 tahun. Setengah abad kemudian, di tahun 2001, sekelompok pengembara (adventurers) melakukan explorasi ke hutan itu. Mereka terheran-heran menemukan pasangan usia lanjut itu dan juga 6000 anak tangga yang telah dibuat Liu.&lt;br /&gt;&lt;br /&gt;Liu Ming Sheng, satu dari 7 orang anak mereka mengatakan, "Orang tuaku sangat saling mengasihi, mereka hidup menyendiri selama lebih dari 50 tahun dan tak pernah berpisah sehari pun. Selama itu ayah telah memahat 6000 anak tangga itu untuk menyukakan hati ibuku, walau pun ia tidak terlalu sering turun gunung.&lt;br /&gt;&lt;br /&gt;Pasangan ini hidup dalam damai selama lebih dari 50 tahun. Suatu hari Liu yang sudah berusia 72 tahun pingsan ketika pulang dari ladangnya. Xu duduk dan berdoa bersama suaminya sampai Liu akhirnya meninggal dalam pelukannya. Karena sangat mencintai isterinya, genggaman Liu sangat sukar dilepaskan dari tangan Xu, isterinya.&lt;br /&gt;&lt;br /&gt;"Kau telah berjanji akan menjagaku dan akan terus bersamaku sampai aku meninggal, sekarang kau telah mendahuluiku, bagaimana aku akan dapat hidup tanpamu?" Selama beberapa hari Xu terus-menerus mengulangi kalimat ini sambil meraba peti jenasah suaminya dan dengan air mata yang membasahi pipinya.&lt;br /&gt;&lt;br /&gt;Pada tahun 2006 kisah ini menjadi salah satu dari 10 kisah cinta yang terkenal di China, yang dikumpulkan oleh majalah Chinese Women Weekly.&lt;br /&gt;&lt;br /&gt;Pemerintah telah memutuskan untuk melestarikan "anak tangga cinta" itu, dan tempat kediaman mereka telah dijadikan musium agar kisah cinta ini dapat hidup terus.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_uZGWgKeKvmY/SfouKpldmVI/AAAAAAAAAEw/FbRoVDETwtc/s1600-h/romantic7.jpg"&gt;&lt;img style="cursor: pointer; width: 213px; height: 320px;" src="http://4.bp.blogspot.com/_uZGWgKeKvmY/SfouKpldmVI/AAAAAAAAAEw/FbRoVDETwtc/s320/romantic7.jpg" alt="" id="BLOGGER_PHOTO_ID_5330623869442955602" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-422174683476450004?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/422174683476450004/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=422174683476450004' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/422174683476450004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/422174683476450004'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2009/05/kisah-cinta-dari-china.html' title='Kisah Cinta Dari China'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_uZGWgKeKvmY/SfouKv3bB8I/AAAAAAAAAEo/CHBIe1oNWm0/s72-c/romantic1.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-2746319215920305222</id><published>2009-05-01T05:36:00.003+07:00</published><updated>2009-05-01T05:47:31.415+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stories'/><title type='text'>Kegigihan Seorang Colonel Sanders</title><content type='html'>(disadur dari kaskus lagi neh... si kolonel kaya pengalaman hidup, pernah mencoba segala macam pekerjaan)&lt;br /&gt;&lt;br /&gt;Inilah kisah kegigihan Kolonel Sanders, pendiri waralaba ayam goreng terkenal K*C. Dia memulainya di usia 66 tahun. Pensiunan angkatan darat Amerika ini tidak memiliki uang sepeser pun kecuali dari tunjangan hari tuanya, yang semakin menipis. Namun dia memiliki keahlian dalam memasak dan menawarkan resep masakannya ke lebih dari 1.000 restoran di negaranya. Kolonel Harland Sanders adalah pelopor K******* Fried Chicken atau K*C yang telah tumbuh menjadi salah satu yang terbesar dalam industri waralaba makanan siap saji di dunia.&lt;br /&gt;&lt;br /&gt;Sosok Kolonel Sanders, bahkan kini menjadi simbol dari semangat kewirausahaan. Dia lahir pada 9 September 1890 di Henryville, Indiana, namun baru mulai aktif dalam mewaralabakan bisnis ayamnya di usia 65 tahun. Di usia 6 tahun, ayahnya meninggal dan Ibunya sudah tidak mampu bekerja lagi sehingga Harland muda harus menjaga adik laki-lakinya yang baru berumur 3 tahun. Dengan kondisi ini ia harus memasak untuk keluarganya. Di masa ini dia sudah mulai menunjukkan kebolehannya.&lt;br /&gt;&lt;br /&gt;Pada umur 7 tahun ia sudah pandai memasak di beberapa tempat memasak. Pada usia 10 tahun ia mendapatkan pekerjaan pertamanya didekat pertanian dengan gaji 2 dolar sebulan. Ketika berumur 12 tahun ibunya kembali menikah, sehingga ia meninggalkan rumah tempat tinggalnya untuk mendapatkan pekerjaan di pertanian di daerah Greenwood, Indiana. Selepas itu, ia berganti-ganti pekerjaan selama beberapa tahun.&lt;br /&gt;&lt;br /&gt;Pertama, sebagai tukang parkir di usia 15 tahun di New Albany, Indiana dan kemudian menjadi tentara yang dikirim selama 6 bulan ke Kuba. Setelah itu ia menjadi petugas pemadam kebakaran, belajar ilmu hukum melalui korespondensi, praktik dalam pengadilan, asuransi, operator kapal feri, penjual ban, dan operator bengkel.&lt;br /&gt;&lt;br /&gt;Di usia 40 tahun, Kolonel ini mulai memasak untuk orang yang bepergian yang singgah di bengkelnya di Corbin. Kolonel Sanders belum punya restoran pada saat itu. Ia menyajikan makanannya di ruang makan di bengkel tersebut. Karena semakin banyak orang yang datang ke tempatnya untuk makan, akhirnya ia pindah ke seberang jalan dekat penginapan dan restoran bisa menampung 142 orang.&lt;br /&gt;&lt;br /&gt;Selama hampir 9 tahun ia menggunakan resep yang dibuatnya dengan teknik dasar memasak hingga saat ini. Citra Sander semakin baik. Gubernur Ruby Laffoon memberi penghargaan Kentucky Colonel pada tahun 1935 atas kontribusinya bagi negara bagian Cuisine. Dan pada tahun 1939, keberadaannya pertama kali terdaftar di Duncan Hines “Adventures in Good Eating.”&lt;br /&gt;&lt;br /&gt;Di awal tahun 1950 jalan raya baru antar negara bagian direncanakan melewati kota Corbin. Melihat akan berakhir bisnisnya, Kolonel ini akhirnya menutup restorannya. Setelah membayar sejumlah uang, ia mendapatkan tunjangan sosial hari tuanya sebesar $105.&lt;br /&gt;&lt;br /&gt;Dikarenakan memiliki rasa percaya diri kuat akan kualitas ayam gorengnya, Kolonel membuka usaha waralaba yang dimulai tahun 1952. Ia pergi jauh menyeberangi negara bagian ini dengan mobil dari satu restoran ke restoran lainnya, memasak sejumlah ayam untuk pemilik restoran dan karyawannya. Jika reaksi yang terlihat bagus, ia menawarkan perjanjian untuk mendapatkan pembayaran dari setiap ayam yang laku terjual.&lt;br /&gt;&lt;br /&gt;Pada 1964, Kolonel Sanders sudah memiliki lebih dari 600 outlet waralaba untuk ayam gorengnya di seluruh Amerika dan Kanada. Pada tahun itu juga ia menjual bunga dari pembayarannya untuk perusahaan Amerika sebanyak 2 juta dolar kepada sejumlah grup investor termasuk John Y Brown Jr, (kelak menjadi Gubernur Kentucky). Pada tahun 1976, sebuah survey independen menempatkan Kolonel Sanders sebagai peringkat kedua dari deretan selebriti yang terkenal di dunia.&lt;br /&gt;&lt;br /&gt;Di bawah pemilik baru, perusahaan K******* Fried Chicken tumbuh pesat yang kemudian menjadi perusahaan terbuka pada 17 Maret 1966, dan terdaftar pada New York Stock Exchange pada 16 Januari 1969. Lebih dari 3.500 waralaba dan restoran yang dimiliki perusahaan ini beroperasi hampir di seluruh dunia. K******* Fried Chicken menjadi anak perusahaan dari RJ Reynolds Industries, Inc. (sekarang RJR Nabisco, Inc.), semenjak Heublein Inc. diakuisisi oleh Reynolds pada tahun 1982. K*C diakuisisi pada Oktober 1986 dari RJR Nabisco Inc oleh PepsiCo Inc, seharga kurang lebih 840 juta dolar.&lt;br /&gt;&lt;br /&gt;Pada Januari 1997, PepsiCo, Inc mengumumkan spin-off restoran cepat sajinya — K*C, T*c* Bell dan Pizza H** – menjadi perusahaan restoran independen, Tricon Global Restorans Inc. Pada Mei 2002, perusahaan ini mengumumkan persetujuan pemilik saham untuk merubah nama perusahaan menjadi Yum! Brands Inc. Perusahaan, yang dimiliki oleh A&amp;amp;W All-American Food Restorans, K*C, Long John Silvers, Pizza H* dan T*c* Bell restorans, adalah perusahaan restoran terbesar di dunia dalam kategori unit system dengan jumlah mendekati 32,500 di lebih dari 100 negara dan wilayah.&lt;br /&gt;&lt;br /&gt;K*C berkembang pesat. Kini, lebih dari satu miliar ayam goreng hasil resep Kolonel ini dinikmati setiap tahunnya, bukan hanya di Amerika Utara, bahkan tersedia hampir di 80 negara di seluruh dunia. Tapi Kolonel Sanders tidak lagi bisa menyaksikannya. Pada 1980, di usia 90 tahun, ia terserang leukemia. Ia meninggal seusai melakukan perjalanan 250.000 mil dalam satu tahun kunjungannya ke restoran K*C di seluruh dunia. “Impian meraih sukses tidak harus di masa kecil. Impian bisa juga di saat usia senja.” Kolonel Sanders, pendiri K*C.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-2746319215920305222?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/2746319215920305222/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=2746319215920305222' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/2746319215920305222'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/2746319215920305222'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2009/05/kegigihan-seorang-colonel-sanders.html' title='Kegigihan Seorang Colonel Sanders'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-4066759319975600350</id><published>2009-05-01T05:22:00.004+07:00</published><updated>2009-05-01T05:33:31.818+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stories'/><title type='text'>Jagalah lisan-mu</title><content type='html'>(hasil ngaskus pagi-pagi hehehehe....)&lt;br /&gt;&lt;br /&gt;"Ingatlah janganlah mulutmu suka kau gunakan untuk mencela orang lain, sesungguhnya semua orang punya cela, dan semua orang punya mulut."&lt;br /&gt;&lt;br /&gt;Ada seorang yang pemarah. Pada saat marah, mulutnya selalu menyakiti orang lain. Perkataannya selalu menyakitkan dan dia tidak bisa mengendalikan diri sendiri. Tidak bisa menjaga emosinya terutama ketika sedang marah. Suatu hari dia bertemu dengan ayahnya.&lt;br /&gt;&lt;br /&gt;Ayahnya berkata, "Wahai anakku, aku akan memberikan pekerjaan padamu". "Apa itu ayah...?" jawab orang itu kepada ayahnya. "Hari ini coba kamu masukkan paku-paku ini satu per satu kepagar bambu dibelakang rumah untuk setiap kali kamu marah dan tidak bisa mengendalikan diri".&lt;br /&gt;&lt;br /&gt;Orang itu pun mengikuti perintah ayahnya, memalu paku-paku tersebut satu per satu kepagar bambu dibelakang rumah untuk setiap kali orang itu marah.&lt;br /&gt;&lt;br /&gt;"Sudah selesai Ayah", akhirnya orang itu kembali menemui ayahnya. "Aku sudah bisa memasukkan paku-paku itu ke pagar bambu belakang rumah untuk setiap kali aku marah, dan sekarang pakunya sudah habis."&lt;br /&gt;&lt;br /&gt;"Coba mari kita lihat" jawab sang ayah lalu berkata "Oke sekarang ada tugas baru, untuk setiap kali kamu bisa menahan marah dan tidak marah, kamu cabuti paku-paku itu satu persatu."&lt;br /&gt;&lt;br /&gt;Perintah itu pun dilakukan, dan orang itu untuk setiap kali tidak marah dan bisa menahan marah dia mencabuti paku-paku tersebut sampai habis.&lt;br /&gt;&lt;br /&gt;"Ayah, paku itu sudah aku ambil semuanya, dan aku sudah bisa menahan marah," kata orang itu. "Wahai anakku, lihatlah bahwa untuk setiap kali engkau marah dan engkau tidak bisa menahan diri kemudian engkau menyakiti orang lain, adalah seperti engkau menusukkan paku-paku itu kehati orang lain dan menyakitinya.&lt;br /&gt;&lt;br /&gt;Kemudian engkau meminta maaf kepada orang yang kau sakiti dengan mencabut paku-paku itu dari hati mereka, lihatlah bahwa bambu itu tetap berlubang akibat paku itu, tidak kembali seperti semula setelah engkau cabut paku itu. Hati orang-orang yang kau sakiti akan tetap meninggalkan bekas luka, tak perduli berapa banyaknya engkau minta maaf. " kata ayahnya.&lt;br /&gt;&lt;br /&gt;"Oleh karena itu, jagalah emosimu, tenangkan jiwamu dan jaga lisanmu agar tidak menyakiti orang lain. Sesungguhnya manusia yang baik itu adalah apabila manusia lain merasa aman dari gangguan tangan maupun lisannya."&lt;br /&gt;&lt;br /&gt;&lt;i&gt;oleh : purwanoto, disarikan dari berbagai sumber&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-4066759319975600350?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/4066759319975600350/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=4066759319975600350' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/4066759319975600350'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/4066759319975600350'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2009/05/jagalah-lisan-mu.html' title='Jagalah lisan-mu'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-8363185299685978192</id><published>2009-05-01T05:09:00.004+07:00</published><updated>2009-05-01T05:34:07.042+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stories'/><title type='text'>Hilangnya "Kehilangan" Besar</title><content type='html'>(dapat dari kaskus lagi... jangan sampai nyesal karena kehilangan kesempatan)&lt;br /&gt;&lt;br /&gt;Aku tak akan pernah melupakan hari pertama kali aku melihat “impian berjalan”. Namanya Susie Summers (namanya sengaja diubah untuk melindungi si dia yang menakjubkan). Senyumnya yang berkilauan di bawah kedua matanya yang bak bintang kejora, sungguh mempesona dan membuat si penerimanya (terutama kaum pria) merasa sangat istimewa.&lt;br /&gt;&lt;br /&gt;Memang kecantikannya mencengangkan, namun kecantikan batinnyalah yang selalu kuingat. Dia benar-benar mempedulikan orang lain dan merupakan seorang pendengar yang sangat berbakat. Selera humornya dapat mencerahkan seluruh hari anda, dan kata-katanya yang bijaksana selalu pas dengan apa yang perlu anda dengar. Dia bukan saja dikagumi,melainkan juga sungguh-sungguh dihargai oleh pria maupun wanita. Meskipun dia memiliki segalanya yang dapat disombongkan, tapi dia sangatlah rendah hati.&lt;br /&gt;&lt;br /&gt;Tak usah dikatakan lagi, dia menjadi dambaan setiap pria. Terutama aku. Aku pernah menemaninya masuk kelas, dan pada hari lainnya aku pernah makan siang berdua saja dengannya. Rasanya seperti di langit ketujuh.&lt;br /&gt;&lt;br /&gt;Waktu itu kupikir, “Kalau saja aku punya pacar seperti Susie Summers, aku tak akan pernah melirik gadis lain.” Tapi, aku yakin bahwa gadis sehebat dia tentulah sudah punya pacar yang jauh lebih baik dariku. Meskipun aku Ketua OSIS, aku tahu aku tak mungkin menjadi pacarnya.&lt;br /&gt;&lt;br /&gt;Jadi, saat wisuda, aku pun mengucapkan salam perpisahan kepada cinta pertamaku.&lt;br /&gt;&lt;br /&gt;Setahun kemudian, aku bertemu dengan sahabatnya di sebuah pertokoan, dan kami makan siang bersama. Dengan tenggorokan tersumbat aku menanyakan keadaan Susie.&lt;br /&gt;&lt;br /&gt;“Yaaah, akhirnya dia bisa juga melupakanmu,” jawabnya.&lt;br /&gt;&lt;br /&gt;“Apa maksudmu?” tanyaku.&lt;br /&gt;&lt;br /&gt;“Kamu benar-benar kejam padanya. Kamu biarkan dia memendam harapan, menemaninya masuk kelas, dan membiarkannya mengira bahwa kamu tertarik padanya. Kamu masih ingat waktu makan siang berdua dengannya? Dia menunggu teleponmu sepanjang minggu. Dia begitu yakin kamu akan menelepon dan mengajaknya berkencan.”&lt;br /&gt;&lt;br /&gt;Aku begitu takut ditolak sehingga aku tak berani mengambil resiko untuk memberitahukan perasaanku terhadapnya. Seandainya waktu itu aku mengajaknya berkencan, dan ternyata dia menolak? Apa hal terburuk yang mungkin terjadi? Paling-paling aku tak jadi berkencan dengannya. Tanpa mengajaknya pun AKU TIDAK BERKENCAN DENGANNYA! Yang lebih buruk lagi adalah bahwa sebenarnya waktu itu aku bisa berkencan dengannya.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;(Disadur dari Chicken Soup for the Teenage Soul hal.8 yang ditulis oleh Jack Schlatter)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Fixedsys;"&gt;"Kita tak pernah kalah karena mencintai seseorang. Kita selalu kalah karena tidak berterus terang." (Barbara DeAngelis)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-8363185299685978192?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/8363185299685978192/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=8363185299685978192' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/8363185299685978192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/8363185299685978192'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2009/05/hilangnya-kehilangan-besar.html' title='Hilangnya &quot;Kehilangan&quot; Besar'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-2123851841182170117</id><published>2009-04-29T20:12:00.022+07:00</published><updated>2009-05-02T12:32:07.536+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Beautiful Mind'/><title type='text'>Aspect Oriented Programming</title><content type='html'>Dalam membuat software, kita harus memikirkan banyak hal dalam satu waktu seperti proses bisnis, security, logging, persistence, multithreading, transaction, dll. Dari sekian banyak hal yang harus dipikirkan di atas, kita bisa mengelompokkannya menjadi dua kategori (dalam istilah AOP disebut &lt;span style="font-weight: bold;"&gt;concern&lt;/span&gt;). Kategori pertama adalah &lt;span style="font-weight: bold;"&gt;core concern&lt;/span&gt;, yaitu fungsi-fungsi utama sebuah software dibangun. Dalam hal ini tentu saja adalah proses bisnis. Kategori kedua adalah &lt;span style="font-weight: bold;"&gt;system-wide concern&lt;/span&gt; atau &lt;span style="font-weight: bold;"&gt;crosscutting concern&lt;/span&gt;, yaitu fungsi-fungsi yang tersebar di seluruh bagian software. Fungsi-fungsi ini bukan fungsi utama tetapi pendukung sistem, namun keberadaannya tetap diperlukan untuk memenuhi requirement software yang baik. Contohnya adalah security, pooling, logging, dan persistence.&lt;br /&gt;&lt;br /&gt;OOP, seperti Java dan C++, telah terbukti sebagai metodologi yang baik untuk implementasi core concern, tapi tidak cukup baik untuk crosscutting concern. Ambil contoh logging. Dengan Java kita terbiasa menulis kode untuk logging bercampur dengan bisnis proses, misalnya untuk debugging. Jika kita ingin mengubah logging, maka kita harus melakukan perubahan di core concern, dalam hal ini class atau method untuk proses bisnis. Sebagai ilustrasi lihat gambar berikut ini yang memperlihatkan sebuah sistem yang terdiri dari beberapa concern menjadi satu, dalam AOP disebut &lt;span style="font-weight: bold;"&gt;tangled&lt;/span&gt; (awut-awutan).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_uZGWgKeKvmY/Sfh1-X6z_tI/AAAAAAAAAEQ/l-SnMcWGta0/s1600-h/tangled.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 228px;" src="http://3.bp.blogspot.com/_uZGWgKeKvmY/Sfh1-X6z_tI/AAAAAAAAAEQ/l-SnMcWGta0/s320/tangled.png" alt="" id="BLOGGER_PHOTO_ID_5330139873426013906" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Perhatikan ilustrasi lain berikut ini, Ramnivas Laddad menggambarkan beberapa concern dalam multidimensional-space sebagai berikut&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_uZGWgKeKvmY/SfjbybJSVDI/AAAAAAAAAEg/hDxyE2PyfTk/s1600-h/crosscutting_impl.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 134px;" src="http://2.bp.blogspot.com/_uZGWgKeKvmY/SfjbybJSVDI/AAAAAAAAAEg/hDxyE2PyfTk/s320/crosscutting_impl.png" alt="" id="BLOGGER_PHOTO_ID_5330251818319631410" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Dari gambar terlihat bahwa sebuah software terdiri dari tiga concern yaitu persistence, logging, dan business logic. Namun dalam implementasinya ketiga concern tersebut tetap menjadi satu dimensi karena metodologi OOP mengharuskannya demikian. Gambar di atas jika diimplementasikan dalam code lebih kurang seperti ini&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public class MyAllInOneClass {&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;&lt;br /&gt;public void superMethod() {&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;&lt;br /&gt;// lakukan autorisasi&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;       // logging start business process&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;       // lakukan proses bisnis&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;       // logging end business process&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public void save() {...}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public void load() {...}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Dari implementasi class di atas terlihat bahwa concern persistence berada dalam satu class dengan core concern, juga security dan logging concern berada dalam satu method dengan core concern.&lt;br /&gt;&lt;br /&gt;AOP adalah metodologi yang memisahkan antara core concern dan crosscutting concern dengan memperkenalkan sebuah modul yang disebut &lt;span style="font-weight: bold;"&gt;aspect&lt;/span&gt;. Dengan AOP, kita mengimplementasikan crosscutting concern dalam aspect, tidak lagi dalam core concern. Dengan demikian kita tidak perlu mengkhawatirkan masalah crosscutting concern lagi pada saat awal kita membangun software. Kita bisa fokus membangun proses bisnis karena crosscutting concern tersebut bisa ditambahkan ke dalam sistem tanpa kita perlu mengubah core concern.&lt;br /&gt;&lt;br /&gt;OOP telah sukses membuktikan diri sebagai metodologi yang tepat untuk memecahkan sistem yang kompleks menjadi sederhana dengan membaginya ke dalam class-class yang dikenal dengan istilah &lt;span style="font-weight: bold;"&gt;modularisasi&lt;/span&gt;. Dalam loosely coupling, OOP juga bisa diandalkan dengan memisahkan interface dan class-class implementasinya.&lt;br /&gt;&lt;br /&gt;AOP tidak dimaksudkan untuk menggantikan OOP, sebaliknya, AOP akan menjadikan OOP semakin handal dalam membuat modularisasi melalui pemisahan concern. Dan walaupun pemisahan abstract dan implementasi dalam interface dan class berhasil untuk core concern, namun tidak untuk crosscutting concern. Perhatikan bahwa untuk setiap kita melakukan logging kita tetap harus memanggil API logger di setiap method yang mau logging. Artinya code untuk memanggil API logging akan tersebar di seluruh core concern yang membutuhkannya, yang seperti telah digambarkan di atas sebagai code tangling (awut-awutan). Dengan AOP, kita tidak perlu memanggil API untuk logging dari core concern. Dua gambar berikut adalah ilustrasi sebelum dan sesudah AOP digunakan. Perhatikan bahwa pada gambar pertama kita memanggil API logging sedangkan pada gambar kedua seluruh modul benar-benar terpisah.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_uZGWgKeKvmY/SfsVGlLdu9I/AAAAAAAAAE4/siIRW_2h_vU/s1600-h/beforeAOP.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 205px;" src="http://1.bp.blogspot.com/_uZGWgKeKvmY/SfsVGlLdu9I/AAAAAAAAAE4/siIRW_2h_vU/s320/beforeAOP.png" alt="" id="BLOGGER_PHOTO_ID_5330877786726710226" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_uZGWgKeKvmY/SfsVrnfIWAI/AAAAAAAAAFA/z2x7KGmusJI/s1600-h/afterAOP.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 226px;" src="http://4.bp.blogspot.com/_uZGWgKeKvmY/SfsVrnfIWAI/AAAAAAAAAFA/z2x7KGmusJI/s320/afterAOP.png" alt="" id="BLOGGER_PHOTO_ID_5330878423001225218" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;AOP Methodology&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Membangun sistem menggunakan AOP mirip dengan membangun sistem menggunakan metodologi lainnya : mengidentifikasi concern, mengimplementasikan concern, dan membentuk sistem akhir dengan menggabungkan concern-concern tersebut.&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;1. Aspectual Decomposition&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Pada tahap ini kita melakukan decompose requirements untuk mengidentifikasi core concern dan crosscutting concern.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;2. Concern Implementation&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Pada tahap ini kita mengimplementasikan tiap concern secara independen. Perhatikan bahwa pada tahap ini masing-masing concern diimplementasikan pada modulnya sendiri, terpisah dengan modul lain. Dengan demikian kita bisa membuat modul per modul secara bertahap, tidak perlu memikirkan sekian banyak modul dalam satu waktu.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;3. Aspectual Recomposition&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Pada tahap ini kita membuat recomposition rules dengan membuat modularization unit atau aspect. Proses recomposition disebut juga weaving atau integrating, dan akan membentuk sistem akhir berdasarkan aspect tersebut.&lt;br /&gt;&lt;br /&gt;Berikut ilustrasi yang digambarkan oleh Ramnivas Laddad :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_uZGWgKeKvmY/SfvHN-2CJtI/AAAAAAAAAFI/ZERtStn3mxE/s1600-h/AOP_Methodology.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 120px;" src="http://3.bp.blogspot.com/_uZGWgKeKvmY/SfvHN-2CJtI/AAAAAAAAAFI/ZERtStn3mxE/s320/AOP_Methodology.png" alt="" id="BLOGGER_PHOTO_ID_5331073626944972498" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Bagaimanakah weaver bekerja? Cara yang paling sederhana adalah melalui source-to-source translation. Source code untuk masing-masing modul dan aspect diproses untuk membentuk &lt;span style="font-style: italic;"&gt;woven source code&lt;/span&gt;. Aspect compiler kemudian mengirimkan woven-source-code tersebut kepada compiler bahasa pemrograman yang dipakai untuk membentuk byte-code. Dengan pendekatan ini menggunakan Java, maka Java-based AOP implementation mengubah masing-masing source code pada tiap modul kedalam woven java source code kemudian java compiler mengubahnya menjadi byte code. Perhatikan bahwa weaver tidak akan mengubah original source code sama sekali.&lt;br /&gt;&lt;br /&gt;Berikut adalah contoh untuk memperjelas bagaimana AOP diimplementasikan pada Java&lt;br /&gt;&lt;br /&gt;1. Kita memiliki core logic sebagai berikut&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_uZGWgKeKvmY/SfvZk9iArWI/AAAAAAAAAFQ/ADyxQ8JDsFM/s1600-h/core_code.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 170px;" src="http://1.bp.blogspot.com/_uZGWgKeKvmY/SfvZk9iArWI/AAAAAAAAAFQ/ADyxQ8JDsFM/s320/core_code.png" alt="" id="BLOGGER_PHOTO_ID_5331093812938845538" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2. Kita memiliki crosscutting concern berupa logging interface seperti berikut&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public interface Logger {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public void log(String message);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;3. Kita memiliki aspect berikut&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_uZGWgKeKvmY/SfvZ3PDs3MI/AAAAAAAAAFY/Ocdv6tXqU8I/s1600-h/aspect_code.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 78px;" src="http://2.bp.blogspot.com/_uZGWgKeKvmY/SfvZ3PDs3MI/AAAAAAAAAFY/Ocdv6tXqU8I/s320/aspect_code.png" alt="" id="BLOGGER_PHOTO_ID_5331094126881201346" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;3. Setelah proses weaving maka kita memiliki source code kira-kira seperti berikut&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_uZGWgKeKvmY/SfvZ3I3wN6I/AAAAAAAAAFg/WO6QdO90kqk/s1600-h/woven_code.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 196px;" src="http://2.bp.blogspot.com/_uZGWgKeKvmY/SfvZ3I3wN6I/AAAAAAAAAFg/WO6QdO90kqk/s320/woven_code.png" alt="" id="BLOGGER_PHOTO_ID_5331094125220476834" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-2123851841182170117?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/2123851841182170117/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=2123851841182170117' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/2123851841182170117'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/2123851841182170117'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2009/04/aspect-oriented-programming.html' title='Aspect Oriented Programming'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_uZGWgKeKvmY/Sfh1-X6z_tI/AAAAAAAAAEQ/l-SnMcWGta0/s72-c/tangled.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-4738473095287839108</id><published>2009-04-22T06:29:00.017+07:00</published><updated>2009-04-28T11:54:26.842+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>EJB 3 Web Service Overview</title><content type='html'>Menggunakan JavaEE 5, kita bisa menggunakan POJO atau EJB 3 stateless session bean untuk membangun web service. Ada beberapa spesification dalam JavaEE 5 untuk membangun web service, antara lain :&lt;br /&gt;&lt;br /&gt;1. Java API for XML-based Web Service 2.0 (JAX-WS 2.0), inti web service dan merupakan ekstensi dari JAX-RPC 1.0&lt;br /&gt;2. Java API for XML Binding 2.0, binding dari WSDL ke Java.&lt;br /&gt;3. WS Basic Profile 1.1, interoperability dengan .NET.&lt;br /&gt;4. Web Services Metadata 2.0, pendekatan metadata untuk mendefinisikan web service.&lt;br /&gt;5. Java API for XML-RPC 1.1, untuk kompatibility dengan JavaEE 1.4 web service.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Implementasi WS : POJO atau EJB3 Stateless Session Bean&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Berikut perbandingan yang diberikan Debu Panda antara POJO web service dan EJB web service :&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_uZGWgKeKvmY/Se7SE0Dl2tI/AAAAAAAAAEI/xe9ezTxohH4/s1600-h/POJO_or_EJB_WS.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 154px;" src="http://1.bp.blogspot.com/_uZGWgKeKvmY/Se7SE0Dl2tI/AAAAAAAAAEI/xe9ezTxohH4/s320/POJO_or_EJB_WS.png" alt="" id="BLOGGER_PHOTO_ID_5327426389360892626" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Implementasi EJB3 &amp;amp; JAX-WS 2.0&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Membangun web service dengan EJB3 sesuai tabel di atas, memberikan lebih banyak keuntungan, dalam hal ini dari service-service yang ditawarkan oleh EJB container. Karena itu kita akan membahas web service dengan EJB3. Beberapa annotation yang digunakan dalam web service adalah sbb :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;@WebService&lt;/span&gt;&lt;br /&gt;Digunakan untuk memberitahu EJB container bahwa bean tersebut adalah sebuah web service. Annotation ini bisa diletakkan pada bean class atau interface. Jika diletakkan pada bean class maka EJB container akan men-generate-kan interfacenya.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;@Remote&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public interface BidManagerWS {...}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;@Stateless&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;@WebService(targetNamespace="urn:edu/mat/test/webservice")&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;@SOAPBinding(style=SOAPBinding.Style.DOCUMENT)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public class BidManagerWSBean implements BidManagerWS {...}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;selanjutnya saat deploy interface akan digenerate. Perhatikan bahwa interface yang dimaksud bukan interface session bean. Karena kita menggunakan session bean sebagai web service maka kita tetap menggunakan annotation @Remote dan @Stateless. Dan di bean class kita tambahkan annotation @WebService. Interface hasil generate saat deployment definitely bukan session interface di atas. Sebagai contoh berikut adalah interface yang dimaksud :&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;@WebService(name = "BidManagerWSBean", targetNamespace = "urn:edu/mat/test/webservice")&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;@XmlSeeAlso({&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    ObjectFactory.class&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;})&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public interface BidManagerWSBean {...}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Interface hasil generate tersebut bisa digunakan client untuk berkomunikasi dengan web service kita.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;@SOAPBinding&lt;/span&gt;&lt;br /&gt;Seperti telah disebutkan pada &lt;a href="http://rochmatsantoso.blogspot.com/2009/04/web-service-related-terminology.html"&gt;entry sebelumnya&lt;/a&gt; bahwa service yang disupport adalah document-oriented dan RPC-oriented. Kita menggunakan annotation ini untuk mengontrol style web service.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;@SOAPBinding(style=SOAPBinding.Style.DOCUMENT)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public class ItemManagerWSBean extends BaseStatelessSessionManager {&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0);"&gt;...&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;atau&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;@SOAPBinding(style=SOAPBinding.Style.DOCUMENT)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public class BidManagerWSBean extends BaseStatelessSessionManager implements BidManagerWS {&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0);"&gt;...&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;@WebMethod&lt;/span&gt;&lt;br /&gt;Jika kita menggunakan @WebService pada interface, maka semua public method di interface tersebut akan menjadi methodnya web service. Jika kita menggunakan @WebService pada bean class maka kita harus menggunakan @WebMethod pada method yang diinginkan untuk menjadi method web service. Jika tidak, maka seluruh public method di class bean tersebut akan menjadi methodnya web service (sama seperti pada @WebService di interface).&lt;br /&gt;&lt;br /&gt;Jika kita tidak menginginkan suatu public method menjadi methodnya web service maka gunakan : &lt;span style="color: rgb(0, 102, 0);"&gt;@WebMethod(exclude=true)&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;@WebMethod&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public void deleteItem(String itemId) {...}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;@WebParam&lt;/span&gt;&lt;br /&gt;Digunakan untuk kustomisasi parameter web service.  Nama parameter akan menjadi sama dengan nama pada @WebParam&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public Item addItem(@WebParam(name="itemTitle") String itemTitle, @WebParam(name="itemDesc") String itemDesc) {...}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;@WebResult&lt;/span&gt;&lt;br /&gt;Digunakan untuk kustomisasi return value suatu method web service. Nama return value di WSDL akan menjadi sama dengan pada @WebResult ini&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;@WebMethod&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;@WebResult(name="item")&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public Item addItem(@WebParam(name="itemTitle") String itemTitle) {...}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;@OneWay&lt;/span&gt;&lt;br /&gt;Digunakan pada method web service yang tidak memiliki return value alias void return value.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;@WebMethod&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;@OneWay&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public void pingServer() {...}&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-4738473095287839108?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/4738473095287839108/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=4738473095287839108' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/4738473095287839108'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/4738473095287839108'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2009/04/ejb-3-web-service-overview.html' title='EJB 3 Web Service Overview'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_uZGWgKeKvmY/Se7SE0Dl2tI/AAAAAAAAAEI/xe9ezTxohH4/s72-c/POJO_or_EJB_WS.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-7165047815016573173</id><published>2009-04-19T22:20:00.010+07:00</published><updated>2009-04-20T09:11:16.991+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Web Service Related Terminology</title><content type='html'>Ada beberapa pendekatan mengimplementasikan web service. Tiga yang paling banyak digunakan adalah Representational State Transfer (REST), XML-RPC, dan SOAP. Namun kebanyakan aplikasi enterprise menggunakan SOAP.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;SOAP&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Awalnya SOAP adalah kependekan dari "Simple Object Access Protocol". Tapi kemudian oleh W3C singkatan tersebut dihapus sehingga sekarang SOAP bukan singkatan dari apapun. Kini pengertian SOAP adalah protokol untuk pertukaran message berformat XML. Sebuah client web service mengirim request berbentuk XML kepada provider web service. Provider mem-parsing request tersebut, menjalankan service, dan mengirim response kembali ke client juga dalam bentuk XML. Baik request dan response tersebut keduanya menggunakan protokol SOAP.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;WSDL&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Web Service Description Language (WSDL) adalah sebuah dokumen XML yang menyediakan segala informasi yang diperlukan untuk menentukan lokasi dan cara mengakses web service. Provider web service lah yang bertanggung jawab membuat WSDL. WSDL juga mendeskripsikan message, tipe, return value, dan detil lain yang dimiliki web service.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;UDDI&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Konsep lain dalam teknologi web service adalah web service registry. Setelah membuat sebuah web service, provider bisa memilih untuk mempublikasikan dokumen WSDL pada sebuah registry. Registry tersebut bisa jadi milik organisasi provider web service atau milik pihak ketiga. Client yang berminat menggunakan web service akan mencari informasi tentang sebuah web service di direktori registry untuk menentukan lokasi sebuah web service dan mendapatkan WSDL-nya. Selanjutnya client menggunakan dokumen WSDL untuk membuat request ke web service. Kegiatan publish, searching, dan retrieve tersebut ditentukan oleh UDDI (Universal Description, Discovery, and Integration)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;SOA&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Perbedaan web service dan Service Oriented Architecture (SOA) adalah bahwa SOA merupakan sebuah rancangan/arsitektur sistem sedangkan web service adalah sebuah platform. SOA bisa diimplementasikan menggunakan teknologi untuk messaging seperti JMS atau remoting seperti RMI, namun yang paling populer adalah menggunakan web service.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Web service style&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ada dua tipe utama web service yaitu RPC-oriented dan document oriented.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Web service development style&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ada tiga cara membangun web service yaitu bottom-up, top-down, dan meet-in-the-middle. Bottom-up adalah cara yang paling populer digunakan.&lt;br /&gt;&lt;br /&gt;Bottom-up digunakan jika sistem kita telah terlebih dahulu siap dan kemudian ada keputusan untuk membangun web service dari sistem yang sudah ada tersebut. Jadi bottom-up dilakukan dengan membuat WSDL dari class-class java yang sudah ada sekarang.&lt;br /&gt;&lt;br /&gt;Top-down digunakan jika kita ingin membuat web service benar-benar dari awal. Cara ini dilakukan dengan membuat dokumen WSDL lebih dulu baru kemudian dibuat interface dan class-classnya.&lt;br /&gt;&lt;br /&gt;Kedua cara tersebut biasanya sudah ada generatornya. Misal kita bisa men-generate dokumen WSDL dari class java maupun sebaliknya.&lt;br /&gt;&lt;br /&gt;Cara yang ketiga yaitu meet-in-the-middle, dilakukan dengan membuat dokumen WSDL dan class-class implementasi bersamaan. Cara ini sulit dilakukan karena kita harus menjaga sinkronisasi antara keduanya.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-7165047815016573173?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/7165047815016573173/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=7165047815016573173' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/7165047815016573173'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/7165047815016573173'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2009/04/web-service-related-terminology.html' title='Web Service Related Terminology'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-6895568394686086789</id><published>2009-04-19T13:03:00.001+07:00</published><updated>2009-04-19T13:05:37.210+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Message-Driven Bean</title><content type='html'>Message-Driven Bean (MDB) adalah komponen EJB yang digunakan untuk berhubungan dengan asynchronous message sebagai consumer. MDB dikelola menggunakan pooling. Segera setelah message tiba di destination, container mengambil sebuah MDB dari pool untuk meng-handle-nya. Tidak seperti session bean, MDB tidak memiliki remote atau local business interface. MDB bisa digunakan untuk berbagai macam messaging teknologi seperti JMS dan JCA. MDB yang digunakan bersama JMS harus implements interface MessageListener (ingat interface yang punya method onMessage pada JMS?). Sama seperti stateless session bean, MDB memiliki dua callback method yaitu PostConstruct yang dipanggil setelah MDB dibuat, dan PreDestroy yang dipanggil sebelum MDB dihapus dari pool untuk didestroy. Pada MDB, kita biasanya tidak secara eksplisit menangani transaksi, melainkan kita menyerahkan urusan tersebut kepada container. Secara default, container memulai transaksi sebelum method onMessage dipanggil dan mengakhiri transaksi saat onMessage berakhir atau terjadi rollback melalui MessageDrivenContext.&lt;br /&gt;&lt;br /&gt;Perhatikan contoh MDB berikut :&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public class MessageReceiverMDB implements MessageListener {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    @Resource&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    private MessageDrivenContext context;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public void onMessage(Message message) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        try {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            ObjectMessage objectMessage = (ObjectMessage)message;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            ShippingRequest shippingRequest = (ShippingRequest)objectMessage.getObject();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            System.out.println(shippingRequest);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        } catch (Exception e) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            e.printStackTrace();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            context.setRollbackOnly();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Bagaimana jadinya jika message yg dikirim bukan bertipe ObjectMessage? Code di atas akan gagal dan melakukan rollback. Rollback berarti message yang sudah diambil akan dikembalikan ke destination (queue/topic). Dan selanjutnya MDB akan berusaha mengambil message tersebut lagi, kemudian gagal lagi. Maka terjadi looping yang terus menerus mengalami kegagalan yang sama. Karena itu sebaiknya pada onMessage tidak dilakukan rollback message sehingga method di atas sebaiknya menjadi :&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public class MessageReceiverMDB implements MessageListener {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public void onMessage(Message message) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        try {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            ObjectMessage objectMessage = (ObjectMessage)message;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            ShippingRequest shippingRequest = (ShippingRequest)objectMessage.getObject();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            System.out.println(shippingRequest);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        } catch (Exception e) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            e.printStackTrace();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Hal yang sama juga bisa terjadi jika kita tidak mendesain exception-handling dengan baik. Perhatikan code berikut :&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public class MessageReceiverMDB implements MessageListener {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public void onMessage(Message message) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        try {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            ObjectMessage objectMessage = (ObjectMessage)message;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            ShippingRequest shippingRequest = (ShippingRequest)objectMessage.getObject();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            System.out.println(shippingRequest);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        } catch (&lt;span style="color: rgb(0, 0, 0);"&gt;JMSException e&lt;/span&gt;) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            e.printStackTrace();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Bagaimana jika terjadi exception selain JMSException? Misalnya RuntimeException, RemoteException, atau EJBException. Method onMessage di atas akan melempar exception yang tidak di-handling. Dan exception yang tidak di-handling menyebabkan transaction rollback. Jika transaction rollback, maka looping yang terus menerus mengalami kegagalan akan terus terjadi. Karena itu sebaiknya onMessage tidak melempar exception, sehingga kode di atas sebaiknya kembali menjadi :&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public class MessageReceiverMDB implements MessageListener {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    public void onMessage(Message message) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        try {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            ObjectMessage objectMessage = (ObjectMessage)message;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            ShippingRequest shippingRequest = (ShippingRequest)objectMessage.getObject();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            System.out.println(shippingRequest);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        } catch (&lt;span style="color: rgb(0, 0, 0);"&gt;Exception e&lt;/span&gt;) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            e.printStackTrace();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;}&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-6895568394686086789?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/6895568394686086789/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=6895568394686086789' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/6895568394686086789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/6895568394686086789'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2009/04/message-driven-bean.html' title='Message-Driven Bean'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-2384038098795497401</id><published>2009-04-17T08:05:00.004+07:00</published><updated>2009-04-17T08:22:57.545+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Message-oriented middleware</title><content type='html'>Dulu saya pernah mendapat email dari teman bahwa sebuah software house terkemuka akan mengadakan training java. Salah satu isi training itu adalah tentang message-oriented middleware (MOM). Sempat bertanya-tanya juga dalam hati apakah yang dimaksud MOM tersebut. Dari namanya terlihat panjang dan kayaknya mengerikan :). Tapi hari ini saya baru tahu dari sebuah ebook bahwa message-oriented middleware itu adalah software yang memungkinkan asynchronous message antar sistem atau komponen. Software tersebut menyimpan message dari sender yang disebut producer, dan lokasi tempat penyimpanan message disebut destination. Dan komponen atau sistem lain yang menerima message itu disebut consumer.&lt;br /&gt;&lt;br /&gt;Dan baru saya ngeh setelah tahu macam-macam message-oriented middleware yang termasuk IBM Web-Sphere MQ, TIBCO Rendezvous, SonicMQ, &lt;span style="font-weight: bold;"&gt;ActiveMQ&lt;/span&gt;, dan Oracle Advanced Queuing. Kenapa? Karena dulu pernah berada dalam sebuah tim project yang menggunakan ActiveMQ kekekeke... Ternyata JMS, fiuh.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-2384038098795497401?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/2384038098795497401/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=2384038098795497401' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/2384038098795497401'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/2384038098795497401'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2009/04/message-oriented-middleware.html' title='Message-oriented middleware'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-6058098965116570904</id><published>2009-04-17T02:27:00.010+07:00</published><updated>2009-04-21T09:09:44.345+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Beautiful Mind'/><title type='text'>Fuzzy</title><content type='html'>Perhatikan contoh-contoh berikut&lt;br /&gt;&lt;br /&gt;1. The description of a human characteristics such as &lt;span style="font-weight: bold;"&gt;healthy&lt;/span&gt;.&lt;br /&gt;2. The classification of patients as &lt;span style="font-weight: bold;"&gt;depressed&lt;/span&gt;.&lt;br /&gt;3. The classification of certain objects as &lt;span style="font-weight: bold;"&gt;large&lt;/span&gt;.&lt;br /&gt;4. The classification of people by age such as &lt;span style="font-weight: bold;"&gt;old&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Pada contoh-contoh di atas, terminologi seperti depressed, old, dan large adalah kabur dalam artian bahwa hal tersebut tidak bisa dengan jelas didefinisikan. Namun sebagai manusia, kita sering berhubungan dengan informasi-informasi tersebut dan mengunakannya untuk membuat keputusan. Terminologi tersebut sangat kontras dengan kata-kata seperti &lt;span style="font-weight: bold;"&gt;married&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;over 39 years old&lt;/span&gt;, atau &lt;span style="font-weight: bold;"&gt;under 6 feet tall&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Dalam matematika, kita terbiasa menggunakan himpunan untuk, katakanlah, bilangan integer. Tapi saat berbicara tentang himpunan &lt;span style="font-weight: bold;"&gt;depressed people&lt;/span&gt;, sulit untuk memutuskan apakah seseorang berada dalam himpunan tersebut atau tidak. Memaksa dengan menjawab &lt;span style="font-style: italic;"&gt;ya&lt;/span&gt; atau &lt;span style="font-style: italic;"&gt;tidak&lt;/span&gt; mungkin bisa dilakukan tapi akan ada informasi yang hilang yaitu seberapa besar kadar depresinya.&lt;br /&gt;&lt;br /&gt;Membicarakan Fuzzy Logic berarti berbicara tentang degree. Sebagai contoh, bandingkan kedua kalimat berikut :&lt;br /&gt;&lt;br /&gt;"BMG meramalkan bahwa peluang terjadinya hujan pada esok hari sebesar 50%."&lt;br /&gt;"BMG mengatakan bahwa besok akan terjadi hujan deras."&lt;br /&gt;&lt;br /&gt;Kalimat pertama adalah tentang teori kemungkinan atau probabilitas, bahwa besok bisa saja hujan. Tapi bisa juga tidak. Kemungkinannya sama. Sedangkan kalimat kedua mengatakan bahwa besok terjadi hujan, itu adalah fakta, dengan intensitas tertentu. Apakah hujan tersebut bisa disebut deras atau tidak itu tergantung kadarnya (dan opini). Fuzzy logic berhubungan dengan kadar (degree) terhadap sesuatu.&lt;br /&gt;&lt;br /&gt;Jika Boolean logic hanya memiliki state 1 dan 0, maka Fuzzy logic punya range kontinyu antara 0 dan 1. Jadi sesuatu bisa setengah benar (0,5), hampir benar (0,9) atau hampir tidak benar (0,1).&lt;br /&gt;&lt;br /&gt;Model matematika fuzzy diperkenalkan oleh Zadeh pada 1965. Profesor Zadeh ini beranggapan bahwa arti suatu kata dalam natural language adalah masalah degree. Jika kita memiliki dalil seperti &lt;span style="font-weight: bold;"&gt;John is  young&lt;/span&gt; maka kita tidak selalu bisa mengatakan bahwa hal tersebut benar atau salah. Jika kita mengetahui bahwa umur John adalah x maka kebenarannya, atau lebih tepatnya kecocokan, dari x dengan &lt;span style="font-style: italic;"&gt;young&lt;/span&gt; adalah masalah kadar (degree). Ini tergantung pemahaman kita terhadap &lt;span style="font-style: italic;"&gt;young&lt;/span&gt; tersebut. Jika dalilnya diganti dengan &lt;span style="font-weight: bold;"&gt;John is under 22 years old&lt;/span&gt; dan kita tahu umur John, maka kita bisa memberi jawaban  &lt;span style="font-style: italic;"&gt;ya&lt;/span&gt; atau &lt;span style="font-style: italic;"&gt;tidak&lt;/span&gt; (&lt;span style="font-style: italic;"&gt;benar&lt;/span&gt; atau &lt;span style="font-style: italic;"&gt;salah&lt;/span&gt; umur John di bawah 22 tahun). Jelas bahwa 18 dan 20 itu muda, tapi dengan sudut pandang yang bebeda 18 lebih muda daripada 20. Hal ini menjelaskan bahwa keanggotaan himpunan fuzzy tidak seharusnya dalam basis 0 &lt;span style="font-weight: bold;"&gt;ATAU&lt;/span&gt; 1, tapi &lt;span style="font-weight: bold;"&gt;ANTARA&lt;/span&gt; 0 &lt;span style="font-weight: bold;"&gt;DAN&lt;/span&gt; 1.&lt;br /&gt;&lt;br /&gt;Berikut adalah contoh pemodelan fuzzy untuk &lt;span style="font-weight: bold;"&gt;young&lt;/span&gt; :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_uZGWgKeKvmY/Se0U9_vTiUI/AAAAAAAAADo/LUHOurVQGPM/s1600-h/fuzzy1.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 139px;" src="http://2.bp.blogspot.com/_uZGWgKeKvmY/Se0U9_vTiUI/AAAAAAAAADo/LUHOurVQGPM/s320/fuzzy1.png" alt="" id="BLOGGER_PHOTO_ID_5326936989563586882" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_uZGWgKeKvmY/Se0kbujN56I/AAAAAAAAAD4/ksR8nNV9DBs/s1600-h/fuzzy3.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 175px;" src="http://3.bp.blogspot.com/_uZGWgKeKvmY/Se0kbujN56I/AAAAAAAAAD4/ksR8nNV9DBs/s320/fuzzy3.png" alt="" id="BLOGGER_PHOTO_ID_5326953993019975586" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Contoh pemodelan yang lain :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_uZGWgKeKvmY/Se0XG5z07fI/AAAAAAAAADw/zbFTBSg814M/s1600-h/fuzzy2.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 181px;" src="http://3.bp.blogspot.com/_uZGWgKeKvmY/Se0XG5z07fI/AAAAAAAAADw/zbFTBSg814M/s320/fuzzy2.png" alt="" id="BLOGGER_PHOTO_ID_5326939341614018034" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_uZGWgKeKvmY/Se0qujryprI/AAAAAAAAAEA/r-1Yv1rxE8I/s1600-h/fuzzy4.png"&gt;&lt;img style="cursor: pointer; width: 318px; height: 320px;" src="http://4.bp.blogspot.com/_uZGWgKeKvmY/Se0qujryprI/AAAAAAAAAEA/r-1Yv1rxE8I/s320/fuzzy4.png" alt="" id="BLOGGER_PHOTO_ID_5326960913590429362" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Menggunakan contoh kedua di atas, jika kita memiliki nilai umur x adalah 20 maka dalil &lt;span style="font-weight: bold;"&gt;John is young&lt;/span&gt; adalah benar 100%. Jika x adalah 66 maka nilai Y(66) = (70-66)/20 = 0.2. Jadi nilai kemudaannya atau derajat kemudaannya adalah 0.2.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-6058098965116570904?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/6058098965116570904/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=6058098965116570904' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/6058098965116570904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/6058098965116570904'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2009/04/fuzzy.html' title='Fuzzy'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_uZGWgKeKvmY/Se0U9_vTiUI/AAAAAAAAADo/LUHOurVQGPM/s72-c/fuzzy1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-5076660200606299598</id><published>2009-04-17T02:23:00.005+07:00</published><updated>2011-06-09T10:14:56.551+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>JMS Flashback</title><content type='html'>Hari ini coba-coba membaca kembali tentang JMS karena gak nyangkut-nyangkut saat googling Fuzzy Logic hahaha, cuman sekedar catatan saja buat pengingat kalau-kalau suatu hari nanti dibutuhkan.&lt;br /&gt;&lt;br /&gt;Java Messaging Service (JMS) adalah teknologi Java yang digunakan untuk memroses asynchronous message. Ada dua mode yang digunakan yaitu &lt;span style="font-weight: bold;"&gt;point-to-point&lt;/span&gt; dan &lt;span style="font-weight: bold;"&gt;publish/subscribe&lt;/span&gt;. Pada mode point-to-point, producer mengirim message ke queue. Message yang dikirim hanya dibaca sekali oleh sebuah consumer. Setelah sebuah consumer membacanya, message dihapus dari queue. Ringkasnya, satu message = satu consumer. Consumer tidak harus sedang aktif saat message dikirim oleh producer.&lt;br /&gt;&lt;br /&gt;Pada mode publish/subscribe, producer mengirim message ke sebuah topic di mana satu atau lebih consumer telah melakukan registrasi atau subscribe ke topic tersebut. Message akan tetap ada di topic tersebut sampai seluruh consumer yang telah subscribe membacanya. Jika consumer belum teregistrasi saat message dikirim maka consumer tidak bisa membaca message tersebut. Untuk membaca message dari sebuah topic, consumer harus aktif. JMS mengatasi hal ini dengan mengijinkan client untuk membuat durable subscription. Durable subscription dapat menerima message saat consumer tidak aktif (mirip queue) .&lt;br /&gt;&lt;br /&gt;JMS tidak menjamin message yang diterima consumer berada pada urutan yang sesuai waktu dikirim producer. Ada dua macam tipe consumer. Synchronous dan Asynchronous consumer.&lt;br /&gt;&lt;br /&gt;Synchronous consumer membaca message dari destination jika message ada di destination. Jika tidak ada message di destination maka consumer akan tetap looping selama limit waktunya belum tercapai menggunakan method MessageConsumer.receive(). Jika diberi parameter 0 maka akan menjadi limit tak berhingga a.k.a hidup selamanya.&lt;br /&gt;&lt;br /&gt;Sedangkan Asynchronous consumer membaca message dari destination menggunakan MessageListener. MessageListener diregistrasikan pada MessageConsumer melalui method MessageConsumer.setMessageListener(MessageListener). MessageListener ini mirip event listener dimana jika message ada di destination maka JMS akan mengirim message dengan memanggil method onMessage pada listener.&lt;br /&gt;&lt;br /&gt;Terminologi synchronous dan asynchronous consumer hanya berhubungan dengan cara sebuah consumer mengambil message, bukan cara JMS mengirim message. JMS mengirim message sesuai queue/topic seperti dijelaskan sebelumnya.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-5076660200606299598?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/5076660200606299598/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=5076660200606299598' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/5076660200606299598'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/5076660200606299598'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2009/04/jms-flashback.html' title='JMS Flashback'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-911599607650626064</id><published>2009-04-17T02:04:00.003+07:00</published><updated>2009-04-21T07:55:15.171+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Beautiful Mind'/><title type='text'>Backward Chaining</title><content type='html'>Tidak seperti forward-chaining yang digunakan untuk mendapatkan fakta-fakta baru, backward chaining menggunakan rule untuk menjawab pertanyaan tentang apakah sebuah consequence clause itu benar atau tidak.&lt;br /&gt;&lt;br /&gt;Kita masih akan mengunakan rules yang sama seperti entry pada &lt;a href="http://rochmatsantoso.blogspot.com/2009/04/forward-chaining.html"&gt;forward-chaining&lt;/a&gt; tapi kali ini dengan persoalan yang berbeda. Misalnya kita ingin mengetahui apakah vehicle benar sebuah Minivan, maka kita harus mencari dari rules tersebut yang memiliki consequence vehicle = Minivan, dan kita mendapat rule berikut :&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Minivan : IF vehicleType = automobile&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;          AND size = medium&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;          AND num_doors = 3&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;          THEN vehicle = Minivan&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Dari situ diketahui bahwa untuk membuktikan vehicle = Minivan kita harus membuktikan bahwa vehicleType = automobile dan size = medium dan num_doors = 3.&lt;br /&gt;&lt;br /&gt;Untuk membuktikan vehicleType = automobile kita harus mencari dari rules yang memiliki consequence tersebut dan kita mendapat :&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Automobile : IF num_wheels = 4&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;             AND motor = yes&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;             THEN vehicleType = automobile&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Selanjutnya untuk membuktikan bahwa vehicleType = automobile kita harus membuktikan bahwa num_wheels = 4 dan motor = yes. Karena pada rules yang kita miliki tidak terdapat consequence untuk num_wheels = 4, maka kita bisa menghentikan penelusuran atau meminta input dari user berapa nilai dari num_wheels. Begitu pula untuk motor = yes. Misalnya user telah memasukkan nilai untuk num_wheels dan motor adalah masing-masing '4' dan 'yes', maka kini kita memiliki tiga fakta baru yaitu&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    num_wheels = 4&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    motor = yes&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    vehicleType = automobile&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;yang sekaligus membuktikan bahwa vehicleType = automobile adalah benar. Selanjutnya kita harus membuktikan bahwa size = medium. Karena kita tidak memiliki rule yang mempunyai consequence size = medium, maka kita kembali harus meminta input dari user. Misal user memberikan nilai size adalah medium maka kini kita mempunyai fakta baru&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    num_wheels = 4&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    motor = yes&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    vehicleType = automobile&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    size = medium&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Menuju antecedent berikutnya yaitu num_doors = 3, kita juga tidak mempunyai rule tersebut. Misalnya user memberikan input '3' untuk num_doors maka kini kita mempunyai fakta-fakta&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    num_wheels = 4&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    motor = yes&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    vehicleType = automobile&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    size = medium&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    num_doors = 3&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    vehicle = Minivan&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;yang sekaligus membuktikan bahwa vehicle adalah benar sebuah Minivan.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-911599607650626064?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/911599607650626064/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=911599607650626064' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/911599607650626064'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/911599607650626064'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2009/04/backward-chaining.html' title='Backward Chaining'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-7166450996025987328</id><published>2009-04-16T11:00:00.011+07:00</published><updated>2009-04-21T07:55:39.654+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Beautiful Mind'/><title type='text'>Forward Chaining</title><content type='html'>&lt;p&gt;Dalam reasoning system dengan IF-THEN rules, ada sebuah algoritma yang dikenal dengan nama Forward Chaining, untuk lebih jelas bagaimana algoritma ini bekerja sebaiknya diilustrasikan dengan contoh. Misal kita memiliki sembilan rules yang sudah didefinisikan sebelumnya seperti berikut&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Vehicle Rule Base:&lt;br /&gt;&lt;br /&gt;Bicycle :&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;IF vehicleType = cycle&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;AND num_wheels = 2&lt;br /&gt;AND motor = no&lt;br /&gt;THEN vehicle = Bicycle&lt;br /&gt;&lt;br /&gt;Tricycle :&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;IF vehicleType = cycle&lt;br /&gt;AND num_wheels = 3&lt;br /&gt;AND motor = no&lt;br /&gt;THEN vehicle = Tricycle&lt;br /&gt;&lt;br /&gt;Motorcycle :&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;IF vehicleType = cycle&lt;br /&gt; AND num_wheels = 2&lt;br /&gt; AND motor = yes&lt;br /&gt; THEN vehicle = Motorcycle&lt;br /&gt;&lt;br /&gt;Sportscar :&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;IF vehicleType = automobile&lt;br /&gt;AND size = small&lt;br /&gt;AND num_doors = 2&lt;br /&gt;THEN vehicle = Sports car&lt;br /&gt;&lt;br /&gt;Sedan :&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;IF vehicleType = automobile&lt;br /&gt;AND size = medium&lt;br /&gt;AND num_doors = 4&lt;br /&gt;THEN vehicle = Sedan&lt;br /&gt;&lt;br /&gt;Minivan :&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;IF vehicleType = automobile&lt;br /&gt;AND size = medium&lt;br /&gt;AND num_doors = 3&lt;br /&gt;THEN vehicle = Minivan&lt;br /&gt;&lt;br /&gt;SUV :&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;IF vehicleType = automobile&lt;br /&gt;AND size = large&lt;br /&gt;AND num_doors = 4&lt;br /&gt;THEN vehicle = Sports Utility Vehicle&lt;br /&gt;&lt;br /&gt;Cycle :&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;IF num_wheels &amp;lt; 4&lt;br /&gt;THEN vehicleType = cycle&lt;br /&gt;&lt;br /&gt;Automobile :&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;IF num_wheels = 4&lt;br /&gt;   AND motor = yes&lt;br /&gt;   THEN vehicleType = automobile&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;Misalnya kita mempunyai fakta-fakta berikut :&lt;br /&gt;&lt;p&gt;  &lt;span style="color: rgb(0, 102, 0);"&gt;num_wheels = 4&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;motor = yes&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;num_doors = 3&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;size = medium&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;kita ingin mengetahui fakta-fakta baru apa saja yang akan kita dapat dengan menelusuri Vehicle Rule di atas. Perhatikan bahwa kita menelusuri rule dari atas ke bawah (dari rule Bicycle ke rule Automobile).&lt;br /&gt;&lt;br /&gt;Dengan fakta-fakta di atas, penelusuran kita jatuh pada rule Automobile. Dengan demikian kita mempunyai fakta baru yaitu vehicleType = automobile, dan fakta-fakta yang kini kita miliki adalah&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;num_wheels = 4&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;motor = yes&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;num_doors = 3&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;size = medium&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;vehicleType = automobile&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Kemudian penelusuran berlanjut kembali ke awal dan jatuh pada rule Minivan. Dari rule ini kita kembali mendapatkan fakta baru yaitu vehicle = Minivan, dan kini kita memiliki fakta-fakta&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;num_wheels = 4&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;motor = yes&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;num_doors = 3&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;size = medium&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;vehicleType = automobile&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;vehicle = Minivan&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Penelusuran kembali ke awal, dan karena sudah tidak ada lagi rule yang memenuhi, maka penelusuran berhenti dengan mendapatkan kesimpulan terakhir bahwa vehicle adalah sebuah Minivan.&lt;br /&gt;&lt;br /&gt;Tapi bagaimana jika rule-rule tersebut overlap? Bagaimana jika ada rule yang merupakan subset dari rule lain? Karena itulah urut-urutan rule yang diproses menjadi penting. Dalam penelusuran, sebaiknya dipilih rule yang lebih spesifik daripada rule yang bersifat umum/general terlebih dahulu. Karena itulah rule yang bersifat spesifik selalu diletakkan pada bagian teratas Vehicle rule di atas.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-7166450996025987328?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/7166450996025987328/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=7166450996025987328' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/7166450996025987328'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/7166450996025987328'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2009/04/forward-chaining.html' title='Forward Chaining'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-3873291801671228634</id><published>2009-04-16T07:53:00.004+07:00</published><updated>2009-04-16T08:05:55.401+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stories'/><title type='text'>Kaca Spion</title><content type='html'>Kaca Spion (Catatan Andy Noya)&lt;br /&gt;&lt;br /&gt;Sejak bekerja saya tidak pernah lagi berkunjung ke Perpustakaan Soemantri Brodjonegoro di Jalan Rasuna Said, Jakarta . Tapi, suatu hari ada kerinduan dan dorongan yang luar biasa untuk ke sana . Bukan untuk baca buku, melainkan makan gado-gado di luar pagar perpustakaan. Gado-gado yang dulu selalu membuat saya ngiler. Namun baru dua tiga suap, saya merasa gado-gado yang masuk ke mulut jauh dari bayangan masa lalu. Bumbu kacang yang dulu ingin saya jilat sampai piringnya mengkilap, kini rasanya amburadul. Padahal ini gado-gado yang saya makan dulu. Kain penutup hitamnya sama. Penjualnya juga masih sama. Tapi mengapa rasanya jauh berbeda? malamnya, soal gado-gado itu saya ceritakan kepada istri. Bukan soal rasanya yang mengecewakan, tetapi ada hal lain yang membuat saya gundah.&lt;br /&gt;&lt;br /&gt;Sewaktu kuliah, hampir setiap siang, sebelum ke kampus saya selalu mampir ke perpustakaan Soemantri Brodjonegoro. Ini tempat favorit saya. Selain karena harus menyalin bahan-bahan pelajaran dari buku-buku wajib yang tidak mampu saya beli, berada di antara ratusan buku membuat saya merasa begitu bahagia. Biasanya satu sampai dua jam saya di sana . Jika masih ada waktu, saya melahap buku-buku yang saya minati. Bau harum buku, terutama buku baru, sungguh membuat pikiran terang dan hati riang. Sebelum meninggalkan perpustakaan, biasanya saya singgah di gerobak gado-gado di sudut jalan, di luar pagar. Kain penutupnya khas, warna hitam. Menurut saya, waktu itu, inilah gado-gado paling enak seantero Jakarta . Harganya Rp 500 sepiring sudah termasuk lontong. Makan sepiring tidak akan pernah puas. Kalau ada uang lebih, saya pasti nambah satu piring lagi. Tahun berganti tahun. Drop out dari kuliah, saya bekerja di Majalah TEMPO sebagai reporter buku Apa dan Siapa Orang Indonesia . Kemudian pindah menjadi reporter di Harian Bisnis Indonesia . Setelah itu menjadi redaktur di Majalah MATRA. Karir sayaterus meningkat hingga menjadi pemimpin redaksi di Harian Media Indonesia dan Metro TV.&lt;br /&gt;&lt;br /&gt;Sampai suatu hari, kerinduan itu datang. Saya rindu makan gado-gado di sudut jalan itu. Tetapi ketika rasa gado-gado berubah drastis, saya menjadi gundah. Kegundahan yang aneh. Kepada istri saya utarakan kegundahan tersebut. Saya risau saya sudah berubah dan tidak lagi menjadi diri saya sendiri. Padahal sejak kecil saya berjanji jika suatu hari kelak saya punya penghasilan yang cukup, punya mobil sendiri, dan punya rumah sendiri, saya tidak ingin berubah. Saya tidak ingin menjadi sombong karenanya.&lt;br /&gt;&lt;br /&gt;Hal itu berkaitan dengan pengalaman masa kecil saya di Surabaya . Sejak kecil saya benci orang kaya. Ada kejadian yang sangat membekas dan menjadi trauma masa kecil saya. Waktu itu umur saya sembilan tahun. Saya bersama seorang teman berboncengan sepeda hendak bermain bola. Sepeda milik teman yang saya kemudikan menyerempet sebuah mobil. Kaca spion mobil itu patah.&lt;br /&gt;&lt;br /&gt;Begitu takutnya, bak kesetanan saya berlari pulang. Jarak 10 kilometer saya tempuh tanpa berhenti. Hampir pingsan rasanya. Sesampai di rumah saya langsung bersembunyi di bawah kolong tempat tidur. Upaya yang sebenarnya sia-sia. Sebab waktu itu kami hanya tinggal di sebuah garasi mobil, di Jalan Prapanca. Garasi mobil itu oleh pemiliknya disulap menjadi kamar untuk disewakan kepada kami. Dengan ukuran kamar yang cuma enam kali empat meter, tidak akan sulit menemukan saya. Apalagi tempat tidur di mana saya bersembunyi adalah satu-satunya tempat tidur di ruangan itu. Tak lama kemudian, saya mendengar keributan di luar. Rupanya sang pemilik mobil datang. dengan suara keras dia marah-marah dan mengancam ibu saya. Intinya dia meminta ganti rugi atas kerusakan mobilnya.&lt;br /&gt;&lt;br /&gt;Pria itu, yang cuma saya kenali dari suaranya yang keras dan tidak bersahabat, akhirnya pergi setelah ibu berjanji akan mengganti kaca spion mobilnya. Saya ingat harga kaca spion itu Rp 2.000. Tapi uang senilai itu, pada tahun 1970, sangat besar. Terutama bagi ibu yang mengandalkan penghasilan dari menjahit baju. Sebagai gambaran, ongkos menjahit baju waktu itu Rp 1.000 per potong. Satu baju memakan waktu dua minggu. Dalam sebulan, order jahitan tidak menentu. Kadang sebulan ada tiga, tapi lebih sering cuma satu. Dengan penghasilan dari menjahit itulah kami - ibu, dua kakak, dan saya - harus bisa bertahan hidup sebulan.&lt;br /&gt;&lt;br /&gt;Setiap bulan ibu harus mengangsur ganti rugi kaca spion tersebut. Setiap akhir bulan sang pemilik mobil, atau utusannya, datang untuk mengambil uang. Begitu berbulan-bulan. Saya lupa berapa lama ibu harus menyisihkan uang untuk itu. Tetapi rasanya tidak ada habis-habisnya. Setiap akhir bulan, saat orang itu datang untuk mengambil uang, saya selalu ketakutan. Di mata saya dia begitu jahat. Bukankah dia kaya? Apalah artinya kaca spion mobil baginya? Tidakah dia berbelas kasihan melihat kondisi ibu dan kami yang hanya menumpang di sebuah garasi?&lt;br /&gt;&lt;br /&gt;Saya tidak habis mengerti betapa teganya dia. Apalagi jika melihat wajah ibu juga gelisah menjelang saat-saat pembayaran tiba. Saya benci pemilik mobil itu. Saya benci orang-orang yang naik mobil mahal. Saya benci orang kaya.&lt;br /&gt;&lt;br /&gt;Untuk menyalurkan kebencian itu, sering saya mengempeskan ban mobil-mobil mewah. Bahkan anak-anak orang kaya menjadi sasaran saya. Jika musim layangan, saya main ke kompleks perumahan orang-orang kaya. Saya menawarkan jasa menjadi tukang gulung benang gelasan ketika mereka adu layangan. Pada saat mereka sedang asyik, diam-diam benangnya saya putus dan gulungan benang gelasannya saya bawa lari. Begitu berkali-kali. Setiap berhasil melakukannya, saya puas. Ada dendam yang terbalaskan. Sampai remaja perasaan itu masih ada. Saya muak melihat orang-orang kaya di dalam mobil mewah. Saya merasa semua orang yang naik mobil mahal jahat. Mereka orang-orang yang tidak punya belas kasihan. Mereka tidak punya hati nurani.&lt;br /&gt;&lt;br /&gt;Nah, ketika sudah bekerja dan rindu pada gado-gado yang dulu semasa kuliah begitu lezat, saya dihadapkan pada kenyataan rasa gado-gado itu tidak enak di lidah. Saya gundah. Jangan-jangan sayalah yang sudah berubah. Hal yang sangat saya takuti. Kegundahan itu saya utarakan kepada istri. Dia hanya tertawa. ''Andy Noya, kamu tidak usah merasa bersalah. Kalau gado-gado langgananmu dulu tidak lagi nikmat, itu karena sekarang kamu sudah pernah merasakan berbagai jenis makanan. Dulu mungkin kamu hanya bisa makan gado-gado di pinggir jalan. Sekarang, apalagi sebagai wartawan, kamu punya kesempatan mencoba makanan yang enak-enak. Citarasamu sudah meningkat,'' ujarnya. Ketika dia melihat saya tetap gundah, istri saya mencoba meyakinkan, "Kamu berhak untuk itu. Sebab kamu sudah bekerja keras." Tidak mudah untuk untuk menghilangkan perasaan bersalah itu. Sama sulitnya dengan meyakinkan diri saya waktu itu bahwa tidak semua orang kaya itu jahat. Dengan karir yang terus meningkat dan gaji yang saya terima, ada ketakutan saya akan berubah. Saya takut perasaan saya tidak lagi sensisitif. Itulah kegundahan hati saya setelah makan gado-gado yang berubah rasa. Saya takut bukan rasa gado-gado yang berubah, tetapi sayalah yang berubah. Berubah menjadi sombong.&lt;br /&gt;&lt;br /&gt;Ketakutan itu memang sangat kuat. Saya tidak ingin menjadi tidak sensitif. Saya tidak ingin menjadi seperti pemilik mobil yang kaca spionnya saya tabrak. Kesadaran semacam itu selalu saya tanamkan dalam hati. Walau dalam kehidupan sehari-hari sering menghadapi ujian. Salah satunya ketika mobil saya ditabrak sepeda motor dari belakang. Penumpang dan orang yang dibonceng terjerembab. Pada siang terik, ketika jalanan macet, ditabrak dari belakang, sungguh ujian yang berat untuk tidak marah. Rasanya ingin melompat dan mendamprat pemilik motor yang menabrak saya. Namun, saya terkejut ketika menyadari yang dibonceng adalah seorang ibu tua dengan kebaya lusuh. Pengemudi motor adalah anaknya. Mereka berdua pucat pasi. Selain karena terjatuh, tentu karena melihat mobil saya penyok. Hanya dalam sekian detik bayangan masa kecil saya melintas. Wajah pucat itu serupa dengan wajah saya&lt;br /&gt;ketika menabrak kaca spion.&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Wajah yang merefleksikan ketakutan akan akibat yang harus mereka tanggung. Sang ibu, yang ecet-lecet di lutut dan sikunya, berkali-kali meminta maaf atas keteledoran anaknya. Dengan mengabaikan lukanya, dia berusaha meluluhkan hati saya. Setidaknya agar saya tidak menuntut ganti rugi. Sementara sang anak terpaku membisu. Pucat pasi. Hati yang panas segera luluh. Saya tidak ingin mengulang apa yang pernah terjadi pada saya. Saya tidak boleh membiarkan benih kebencian lahir siang itu. Apalah artinya mobil yang penyok berbanding beban yang harus mereka pikul. Maka saya bersyukur. Bersyukur pernah berada di posisi mereka. Dengan begitu saya bisa merasakan apa yang mereka rasakan. Setidaknya siang itu saya tidak ingin lahir sebuah benih kebencian. Kebencian seperti yang pernah saya rasakan dulu. Kebencian yang lahir dari pengalaman hidup yang pahit.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;"My mom said man only need few rich, the remain is only for show up"&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5217372432017247701-3873291801671228634?l=rochmatsantoso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rochmatsantoso.blogspot.com/feeds/3873291801671228634/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5217372432017247701&amp;postID=3873291801671228634' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/3873291801671228634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5217372432017247701/posts/default/3873291801671228634'/><link rel='alternate' type='text/html' href='http://rochmatsantoso.blogspot.com/2009/04/kaca-spion.html' title='Kaca Spion'/><author><name>Rochmat Santoso</name><uri>http://www.blogger.com/profile/14932638392542701756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_uZGWgKeKvmY/TGuDcGjm1yI/AAAAAAAAAT8/S5Y614dEUBk/S220/matt.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5217372432017247701.post-4826081456634722062</id><published>2009-04-16T07:10:00.001+07:00</published><updated>2009-04-16T07:14:09.951+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stories'/><title type='text'>Tuhan Menciptakan Kejahatan?</title><content type='html'>Apakah Tuhan menciptakan segala yang ada?&lt;br /&gt;Apakah kejahatan itu ada?&lt;br /&gt;Apakah Tuhan menciptakan kejahatan?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Seorang Profesor dari sebuah universitas terkenal itu menantang mahasiswa-mahasiswa nya dengan pertanyaan ini, “Apakah Tuhan menciptakan segala yang ada?”.&lt;br /&gt;&lt;br /&gt;Seorang mahasiswa dengan berani menjawab, “Betul, Dia yang menciptakan semuanya”.&lt;br /&gt;&lt;br /&gt;“Tuhan menciptakan semuanya?” Tanya professor sekali lagi.&lt;br /&gt;&lt;br /&gt;“Ya, Pak, semuanya” kata mahasiswa tersebut.&lt;br /&gt;&lt;br /&gt;Profesor itu menjawab, “Jika Tuhan menciptakan segalanya, berarti Tuhan menciptakan Kejahatan. Karena kejahatan itu ada, dan
