<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-26918278</atom:id><lastBuildDate>Wed, 27 May 2026 00:04:12 +0000</lastBuildDate><category>Software</category><category>Internet</category><category>Article</category><category>Programming</category><category>Life Hack</category><category>AI</category><category>Tutorial</category><category>Java</category><category>Microsoft</category><category>Misc</category><category>Blog</category><category>Game</category><category>Troubleshooting</category><category>C#</category><category>Computer Graphic</category><category>Funny</category><category>ITS</category><category>Agent</category><category>Database</category><category>GAE</category><category>GWT</category><category>Linux</category><category>OpenGL</category><category>WSN</category><category>C++</category><category>Drawing</category><category>Google Maps</category><category>Microservices</category><category>Object Tracking</category><category>Windows</category><title>geeky.blogger</title><description>yet another blog about computer, technology, programming, and internet</description><link>http://habsq.blogspot.com/</link><managingEditor>noreply@blogger.com (Ismail Habib)</managingEditor><generator>Blogger</generator><openSearch:totalResults>69</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-26918278.post-500693509959055146</guid><pubDate>Thu, 10 Jul 2014 19:58:00 +0000</pubDate><atom:updated>2014-07-11T17:10:08.317+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Microservices</category><title>Tentang Microservices</title><description>Apa sih microservices itu? Sepertinya tidak ada definisi yang baku. Sebagian orang mengaitkannya dengan SOA (Service Oriented Architecture). Kalau saya pribadi lebih suka menggunakan term &quot;SOA a la UNIX&quot; untuk mendefinisikannya. Maksudnya disini adalah setiap service akan fokus pada satu fungsionalitas tertentu. Satu service dan service lainnya saling berkomunikasi untuk menghasilnya business value yang sesungguhnya.&lt;br /&gt;
&lt;br /&gt;
Sedikit latar belakang, saya bukan ahli dalam bidang ini. Hanya kebetulan topik ini sedang banyak didiskusikan, seperti yang dituliskan juga di report Technology Radar 2014nya ThoughtWorks. Reportnya bisa dilihat di sini:&amp;nbsp;&lt;a href=&quot;http://thoughtworks.fileburst.com/assets/technology-radar-july-2014-en.pdf&quot;&gt;http://thoughtworks.fileburst.com/assets/technology-radar-july-2014-en.pdf&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Kalau diskusi tentang microservices, sepertinya tidak lengkap kalau tidak dimulai dari arsitektur monolitik. Arsitektur monolitik, seperti namanya, punya arti bahwa semua fungsionalitas berada pada satu unit saja. Unit ini menangani segalanya, business logic, database access, templating, dll. Dalam kasus web application, struktur aplikasi monolitik biasanya terdiri dari client-side, server-side, dan database. Arsitektur monolitik ini tentunya punya kelemahan-kelamahan yang solusinya bisa dialamatkan oleh microservices.&lt;br /&gt;
&lt;br /&gt;
Apa saja kekuatan microservices dibandingkan dengan monolitik?&lt;br /&gt;
&lt;b&gt;Yang pertama&lt;/b&gt;, microservices memberikan fleksibilitas bagi developer untuk menentukan tools yang akan digunakan untuk implementasi sebuah service tanpa harus memaksakan tools tersebut untuk digunakan pada service-service lainnya. Hal ini sangat memungkinkan karena antara satu service dan service lainnya tidak tightly coupled. Komunikasi antara satu service di microservices dengan service lainnya umumnya dilakukan via messaging atau web service. Keduanya bisa diimplementasi dengan menggunakan teknologi yang berbeda.&lt;br /&gt;
&lt;b&gt;Kedua&lt;/b&gt;, microservices memungkinkan team splitting dilakukan dengan lebih mudah. Satu tim yang menangani sebuah microservice bisa dengan mudah memisahkan diri dari tim lainnya karena, mereka tidak berbagi code base dan hanya terikat dengan interface yang didefinisikan di dalam service-service tersebut.&lt;br /&gt;
&lt;b&gt;Ketiga&lt;/b&gt;, memisahkan fungsionalitas dalam service-service terpisah menjadikan service-service tersebut terisolasi satu sama lain. Dengan kata lain, resiko dan problem dalam satu service akan lebih mudah dilokalisir. Termasuk di dalamnya adalah permasalahan dengan legacy system. Salah satu contohnya adalah website The Guardian yang mulai dengan aplikasi monolitik dan kemudian berevolusi menjadi microservices. Aplikasi yang dikembangkan di awal tetap dapat dipertahankan meskipun sudah menjadi legacy dan tidak fleksibel.&lt;br /&gt;
&lt;b&gt;Keempat&lt;/b&gt;, microservices memungkinkan pembedaan profil satu service dengan service lainnya, terutama yang berhubungan dengan scaling up.&lt;br /&gt;
&lt;br /&gt;
Masih banyak keunggulan microservices yang tidak saya sebutkan disini, terutama karena empat poin yang saya sebutkan di atas adalah major concern yang saya rasakan selama bekerja sebagai software engineer. Yang perlu diingat, selain punya kekuatan, seorang sofware architect juga harus menyadari tantangan yang dihadapi dalam mengimplementasikan sistem dengan arsitektur microservices. Tapi mungkin ini bahasan di posting yang lain :)</description><link>http://habsq.blogspot.com/2014/07/tentang-microservices.html</link><author>noreply@blogger.com (Ismail Habib)</author><thr:total>21</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-26918278.post-8968238342455145304</guid><pubDate>Thu, 10 Jul 2014 19:15:00 +0000</pubDate><atom:updated>2014-07-10T21:15:46.067+02:00</atom:updated><title>Menulis Kembali</title><description>Sudah agak lama blog ini dibiarkan tanpa tulisan baru. Untuk menyegarkan kembali motivasi menulis, rencananya saya akan mengubah target pembaca dan topik tulisan. Kemungkinan besar kedepannya blog ini akan diisi dengan tulisan dalam Bahasa Indonesia.</description><link>http://habsq.blogspot.com/2014/07/menulis-kembali.html</link><author>noreply@blogger.com (Ismail Habib)</author><thr:total>31</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-26918278.post-110925625191154803</guid><pubDate>Sun, 27 Jan 2013 19:51:00 +0000</pubDate><atom:updated>2013-01-27T20:59:22.713+01:00</atom:updated><title>Java and Lombok</title><description>If you are an Indonesian, it&#39;s pretty easy to make a connection between &lt;a href=&quot;http://en.wikipedia.org/wiki/Java&quot;&gt;Java&lt;/a&gt;&amp;nbsp;and &lt;a href=&quot;http://en.wikipedia.org/wiki/Lombok&quot;&gt;Lombok&lt;/a&gt;. However, this post is not about that Java and Lombok, but rather for the Java programming language and &lt;a href=&quot;http://projectlombok.org/&quot;&gt;Project Lombok&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
One of the drawback of Java language is its verbosity. One very easy example can be found in any typical Java POJO.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: java&quot;&gt;public class Order{

  private long id;
  private String name;
  private int size;

  public Order(){
  }

  public Order(long id){
    this.id = id;
  }

  public long getId(){
    return id;
  }

  public void setId(long id){
    this.id = id;
  }

  public String getName(){
    return name;
  }

  public void setName(String name){
    this.name = name;
  }

  public int getSize(){
    return size();
  }

  public void setSize(int size){
    this.size = size;
  }

  @Override
  public String toString(){
    return String.format(&quot;%s %d %d&quot;, id, name, size);
  }
}
&lt;/pre&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;&lt;/pre&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;&lt;/pre&gt;
Already that much code just for a very simple structure with constructors, getters, setters, and toString method. This is where Lombok comes to save the day! Instead of writing that much code, you can have something like this:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: java&quot;&gt;@Data
public class Order{

  private long id;
  private String name;
  private int size;
}
&lt;/pre&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;&lt;/pre&gt;
...and that&#39;s it! A clean, nice code that is easy to maintain. The @Data annotation will tell Lombok to generate the constructor, getters and setters, toString method (and even equals and hashCode method!) all during compilation time! (instead of hiding the code in other file ala AspectJ). Since Lombok can be integrated with your IDE, you will not lose the nice content assist or any other feature that you currently enjoying.&lt;br /&gt;
&lt;br /&gt;
There are several other features provided by Lombok (see: &lt;a href=&quot;http://projectlombok.org/features/index.html&quot;&gt;Lombok features&lt;/a&gt;),&amp;nbsp;although personally for me, this one is going to be the one I use the most. I am not too scared&amp;nbsp;of introducing Lombok dependency to my project since Lombok itself presented a nice way to stop using Lombok dependency with a tool called &quot;delombok&quot;. By using delombok, all magically generated code will be written to the source code and the dependency to Lombok library will be removed.&lt;br /&gt;
&lt;br /&gt;
The only drawback I can think of is whenever I rename one of the field name and the rest of code which refer to the getter/setter will also need to be updated manually (instead of having them automatically updated using a refactor tool in your IDE), but it is a very small price to pay (I guess).</description><link>http://habsq.blogspot.com/2013/01/java-and-lombok.html</link><author>noreply@blogger.com (Ismail Habib)</author><thr:total>53</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-26918278.post-1651742085435424484</guid><pubDate>Sat, 07 Jan 2012 18:43:00 +0000</pubDate><atom:updated>2012-01-07T19:43:29.140+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Software</category><category domain="http://www.blogger.com/atom/ns#">Windows</category><title>Software of the day: Fence</title><description>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://www.stardock.com/products/fences/images/screenshots/fences_image.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; src=&quot;http://www.stardock.com/products/fences/images/screenshots/fences_image.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.stardock.com/products/fences/index.asp&quot;&gt;Fence&lt;/a&gt; is a software created by Stardock that helps organize icons/files in your Windows&#39;s desktop. Basically what a user can do is to create a &quot;fence&quot; (kind of group) and associate icons of your choice into it. The fences are blocks that does not enlarge/shrink according to the number of icons/files you put there, but instead the size are determined by the user themselves. Thus, no matter how many icons/files you have, it will still look like it&#39;s very well organized ;)&lt;br /&gt;
&lt;br /&gt;
For someone like me who loves to put everything in desktop (who doesn&#39;t?), Fence is a must-have-tool. Quite often I put something that I would need immediately, but most probably wouldn&#39;t be for long in the desktop. Fence help he organize it so that in the future it is very easy to find find and remove them. Another nice thing that I like:&amp;nbsp;Fence does not separate the icons in different fences to actual different directories, so it does not mess up the files location.&lt;br /&gt;
&lt;br /&gt;
Fence is free, and if you want more features, they have a paid version for it as well.&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;screen shot was taken from Fence website&lt;/span&gt;&lt;/i&gt;</description><link>http://habsq.blogspot.com/2012/01/software-of-day-fence.html</link><author>noreply@blogger.com (Ismail Habib)</author><thr:total>39</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-26918278.post-4339562521675413285</guid><pubDate>Mon, 02 May 2011 10:13:00 +0000</pubDate><atom:updated>2013-01-27T21:01:06.144+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">GAE</category><category domain="http://www.blogger.com/atom/ns#">Programming</category><title>Using ClientLogin to do Authentication for App Engine Application</title><description>General information about ClientLogin: &lt;a href=&quot;http://code.google.com/apis/accounts/docs/AuthForInstalledApps.html&quot;&gt;http://code.google.com/apis/accounts/docs/AuthForInstalledApps.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Discussion on Google Groups (including the original solution posted by geoffd123):&lt;br /&gt;
&lt;a href=&quot;http://groups.google.com/group/google-appengine-java/browse_thread/thread/c96d4fff73117e1d&quot;&gt;http://groups.google.com/group/google-appengine-java/browse_thread/thread/c96d4fff73117e1d&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
My solution uses Apache Http library instead of HttpUnit.&lt;br /&gt;
&lt;pre class=&quot;brush: java&quot;&gt;public static String loginToGoogle(String userid, String password,
   String appUrl) throws Exception {
  HttpClient client = new DefaultHttpClient();
  HttpPost post = new HttpPost(
    &quot;https://www.google.com/accounts/ClientLogin&quot;);
  
  MultipartEntity reqEntity = new MultipartEntity();
  reqEntity.addPart(&quot;accountType&quot;, new StringBody(&quot;HOSTED_OR_GOOGLE&quot;,
    &quot;text/plain&quot;, Charset.forName(&quot;UTF-8&quot;)));
  reqEntity.addPart(&quot;Email&quot;, new StringBody(userid));
  reqEntity.addPart(&quot;Passwd&quot;, new StringBody(password));
  reqEntity.addPart(&quot;service&quot;, new StringBody(&quot;ah&quot;));
  reqEntity.addPart(&quot;source&quot;, new StringBody(
    &quot;YourCompany-YourApp-YourVersion&quot;));
  post.setEntity(reqEntity);
  HttpResponse response = client.execute(post);
  if (response.getStatusLine().getStatusCode() == 200) {
   InputStream input = response.getEntity().getContent();
   String result = IOUtils.toString(input);
   String authToken = getAuthToken(result);
   post = new HttpPost(appUrl + &quot;/_ah/login?auth=&quot; + authToken);
   response = client.execute(post);
   Header[] cookies = response.getHeaders(&quot;SET-COOKIE&quot;);
   for (Header cookie : cookies) {
    if (cookie.getValue().startsWith(&quot;ACSID=&quot;)) {
     return cookie.getValue();
    }
   }
   throw new Exception(&quot;ACSID cookie cannot be found&quot;);
  } else
   throw new Exception(&quot;Error obtaining ACSID&quot;);
 }
&lt;/pre&gt;A simple example on how to use it:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: java&quot;&gt;String authCookie = logonHelper.loginToGoogle(&quot;email@gmail.com&quot;,
   &quot;password&quot;,&quot;http://yourapp.appspot.com&quot;);  
DefaultHttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(&quot;http://yourapp.appspot.com/service&quot;);
get.setHeader(&quot;Cookie&quot;, authCookie);
HttpResponse response = client.execute(get);
response.getEntity().writeTo(System.out);
&lt;/pre&gt;</description><link>http://habsq.blogspot.com/2011/05/using-clientlogin-to-do-authentication.html</link><author>noreply@blogger.com (Ismail Habib)</author><thr:total>35</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-26918278.post-1070783578065941971</guid><pubDate>Thu, 03 Feb 2011 08:43:00 +0000</pubDate><atom:updated>2013-01-27T21:01:32.734+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">GWT</category><category domain="http://www.blogger.com/atom/ns#">Programming</category><title>GWT and Delayed Execution for Google Maps Geocoding</title><description>Google Maps provide us with an asynchronous way of doing a geocoding, which is pretty much how GWT is dealing with all type of client-server communication. However, sometimes we need a way to synchronize them. By synchronizing I mean waiting for the required asynchronous call to return a value before continue with other execution. Using something like Timer to wait for a reply doesn&#39;t work since it will only block the whole process on the browser since JavaScript interpreter is single-threaded. Fortunately, there is a way to deal with it within GWT by using &lt;b&gt;DeferredCommand&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
I&#39;m going to take an example of using Geocoding from Google Maps. What I would like to do is geocode two address into latitude, longitude coordinate and use them as parameters for another method.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: java&quot;&gt;Geocoder geocode = new Geocoder();
final Callback firstCallback = new Callbak();
geocode.getLatLng(&quot;Jl. Tb Ismail Bandung Indonesia&quot;, firstCallback);
final Callback secondCallback = new Callbak();
geocode.getLatLng(&quot;Jl. Ganesha Bandung Indonesia&quot;, secondCallback);
final Command command = new Command() {
   @Override
   public void execute(){
      if ((firstCallback.location != null) 
            &amp;amp;&amp;amp; (secondCallback.location != null)) {
         //call the method
         anotherMethod(firstCallback.location, secondCallback.location);
      } else {
         DeferredCommand.addCommand(this); //delay execution
      }
   }
}
command.execute();
&lt;/pre&gt;&lt;br /&gt;
With &quot;Callback&quot; as a class to temporarily store value from geocode.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: java&quot;&gt;class Callback implements LatLngCallback {
   public LatLng location;

   @Override
   public void onFailure() {
      //put something here
   }

   @Override
   public void onSuccess(LatLng point) {
      location = point;
   }
}
&lt;/pre&gt;&lt;br /&gt;
This works for me well, however, I do realize that DeferredCommand is now deprecated. Any other solution?</description><link>http://habsq.blogspot.com/2011/02/gwt-and-delayed-execution-for-google.html</link><author>noreply@blogger.com (Ismail Habib)</author><thr:total>25</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-26918278.post-8412981526376308921</guid><pubDate>Tue, 21 Dec 2010 13:38:00 +0000</pubDate><atom:updated>2013-01-27T21:02:08.449+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Google Maps</category><category domain="http://www.blogger.com/atom/ns#">Java</category><category domain="http://www.blogger.com/atom/ns#">Programming</category><title>Decoding Polylines from Google Maps Direction API</title><description>The Google Maps Directions API provides a way to retrieve directions data from the back-end as opposed to the original JavaScript version when one should retrieve the data from browser. Google provides the routing results as an encoded polylines format. as explained in the &lt;a href=&quot;http://code.google.com/apis/maps/documentation/utilities/polylinealgorithm.html&quot;&gt;Encoded Polyline Algorithm Format&lt;/a&gt;. The JavaScript version contains a library for both Encoding and Decoding, which is not the case for a back-end solution written in another language.&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Since I&#39;m more interested in the decoding part for Java, here is a code that can be used:&lt;/div&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: java&quot;&gt;import java.util.ArrayList;

public class PolylineDecoder {
 public static ArrayList&lt;location&gt; decodePoly(String encoded) {
  ArrayList&lt;location&gt; poly = new ArrayList&lt;location&gt;();
  int index = 0, len = encoded.length();
  int lat = 0, lng = 0;
  while (index &amp;lt; len) {
   int b, shift = 0, result = 0;
   do {
    b = encoded.charAt(index++) - 63;
    result |= (b &amp;amp; 0x1f) &amp;lt;&amp;lt; shift;
    shift += 5;
   } while (b &amp;gt;= 0x20);
   int dlat = ((result &amp;amp; 1) != 0 ? ~(result &amp;gt;&amp;gt; 1) : (result &amp;gt;&amp;gt; 1));
   lat += dlat;
   shift = 0;
   result = 0;
   do {
    b = encoded.charAt(index++) - 63;
    result |= (b &amp;amp; 0x1f) &amp;lt;&amp;lt; shift;
    shift += 5;
   } while (b &amp;gt;= 0x20);
   int dlng = ((result &amp;amp; 1) != 0 ? ~(result &amp;gt;&amp;gt; 1) : (result &amp;gt;&amp;gt; 1));
   lng += dlng;
   Location p = new Location((((double) lat / 1E5)),
     (((double) lng / 1E5)));
   poly.add(p);
  }
  return poly;
 }
}&lt;/location&gt;&lt;/location&gt;&lt;/location&gt;&lt;/pre&gt;&lt;br /&gt;
&quot;Location&quot; is a self-defined, simple class that I use to store coordinate (Latitude and Longitude). Google Map&#39;s LatLng is not used because this is for backend.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: java&quot;&gt;public class Location implements IsSerializable {

 private double latitude;

 private double longitude;

 public Location() {

 }

 public Location(Double latitude, Double longitude) {
  this.latitude = latitude;
  this.longitude = longitude;
 }
 
 /**
  * @return the latitude
  */
 public double getLatitude() {
  return latitude;
 }

 /**
  * @return the longitude
  */
 public double getLongitude() {
  return longitude;
 }
}
&lt;/pre&gt;&lt;br /&gt;
This PolylineEncoder class code is taken from &lt;a href=&quot;http://jeffreysambells.com/posts/2010/05/27/decoding-polylines-from-google-maps-direction-api-with-java/&quot;&gt;JeffreySambels.com&lt;/a&gt;&amp;nbsp;with several modifications.</description><link>http://habsq.blogspot.com/2010/12/decoding-polylines-from-google-maps.html</link><author>noreply@blogger.com (Ismail Habib)</author><thr:total>63</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-26918278.post-3668819558823960710</guid><pubDate>Sat, 19 Jun 2010 14:18:00 +0000</pubDate><atom:updated>2010-06-19T16:18:13.613+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">GAE</category><category domain="http://www.blogger.com/atom/ns#">Internet</category><category domain="http://www.blogger.com/atom/ns#">Java</category><category domain="http://www.blogger.com/atom/ns#">Programming</category><category domain="http://www.blogger.com/atom/ns#">Software</category><title>Pairing Google App Engine with Other(s)</title><description>&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihCSZDOI-mF4cbDU1CrzqoFpxWu7GpDpxT4Ez7TzX1PZfXQ6R7-6H6A0luPLd8cPccSwGSXae0Rm9d7Gbymbs_YnqaoCmsZoxEaqzBYKbWhcsTe-g1mXq76OL8HDEClfo6yXJWXQ/s1600/appengine_lowres.gif&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihCSZDOI-mF4cbDU1CrzqoFpxWu7GpDpxT4Ez7TzX1PZfXQ6R7-6H6A0luPLd8cPccSwGSXae0Rm9d7Gbymbs_YnqaoCmsZoxEaqzBYKbWhcsTe-g1mXq76OL8HDEClfo6yXJWXQ/s1600/appengine_lowres.gif&quot; /&gt;&lt;/a&gt;I discovered &lt;a href=&quot;http://code.google.com/appengine/&quot;&gt;Google App Engine (GAE)&lt;/a&gt; just a couple months ago and immediately attached to it. The idea of having a web application platform which is easy to use (no sys-admin thingy, just concentrate on developing), scalable, and free (up to a certain limit). Without even realizing (okay, I&#39;m exaggerating), I ended up with a project where I paired up GAE with another server. Well, not necessary a server, but any kind of machine that provides something extra to GAE. At first I wasn&#39;t so sure that this is a good idea, however, in the end I was convinced that this is the best solution that I can come up with.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;1. GAE&#39;s power vs GAE&#39;s limitation&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
With great power comes great responsibility. With cool features come some restrictions. It&#39;s a trade-off, ying and yang. I&#39;m a Java programmer so I care mainly about the Java version of GAE. In GAE, not all Java features is available. Things like creating thread and writing to file system are not allowed in GAE. GAE also doesn&#39;t have persistent running process and every task should be finished in 30 seconds or less. Despite that, you might still want the GAE power. Why not using both?&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;2. Scalability is not entirely necessary, but still needed in some part&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
As I mentioned in the first paragraph. Scalability is one of GAE virtue. We can have a part of our application which requires high scalability to be deployed on GAE. Another part of the application that could not be necessarily scalable may reside on the other server. I could imagine this setting where GAE serves as an interface to outside the system and/or as a storage while the other server responsible to do things that GAE specifically couldn&#39;t do due to its restrictions.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;3. It will be pure GAE in the future&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
For one or more reason, we can&#39;t have a pure GAE solution. It might be because the application is migrated from other technology and require some more time to be ported, or that the current GAE is not yet capable, but will be in the future (see &lt;a href=&quot;http://code.google.com/appengine/docs/roadmap.html&quot;&gt;GAE road map&lt;/a&gt;). It might be a good decision to start doing things in GAE if we believe that the future is on GAE, thus investing some resources now instead of doing it later (which will cost more without a doubt).&lt;br /&gt;
&lt;br /&gt;
What do you think?</description><link>http://habsq.blogspot.com/2010/06/pairing-google-app-engine-with-others.html</link><author>noreply@blogger.com (Ismail Habib)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihCSZDOI-mF4cbDU1CrzqoFpxWu7GpDpxT4Ez7TzX1PZfXQ6R7-6H6A0luPLd8cPccSwGSXae0Rm9d7Gbymbs_YnqaoCmsZoxEaqzBYKbWhcsTe-g1mXq76OL8HDEClfo6yXJWXQ/s72-c/appengine_lowres.gif" height="72" width="72"/><thr:total>18</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-26918278.post-5268778906775633120</guid><pubDate>Sun, 30 May 2010 08:41:00 +0000</pubDate><atom:updated>2010-05-30T11:26:49.194+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Article</category><category domain="http://www.blogger.com/atom/ns#">Internet</category><title>Bagaimana Saya Menjelaskan REST kepada Istri (How I Explained REST to My Wife)</title><description>For the first time since this blog is created. I&#39;m writing a post in two languages. I was impressed with an explanation from Ryan Tomayko which is based on his conversation with his non-techy wife about REST. You can read the original version &lt;a href=&quot;http://tomayko.com/writings/rest-to-my-wife&quot;&gt;here&lt;/a&gt;. Some people may think that the article is somewhat sexist. However, I do believe that he didn&#39;t do it on purpose ;) The rest of this post will be in Bahasa Indonesia.&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
Artikel di bawah ini adalah terjemahan dari &lt;a href=&quot;http://tomayko.com/writings/rest-to-my-wife&quot;&gt;artikel yang ditulis oleh Ryan Tomayko&lt;/a&gt;. Beberapa bagian tulisan di bawah ini mungkin tidak/kurang/belum akurat, namun akan saya coba untuk memperbaharuinya setiap kali saya menemukan kekurangan. Semoga bermanfaat.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Istri&lt;/b&gt;: Siapa itu Roy Fielding?&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Ryan&lt;/b&gt;: Orang yang cerdas.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Istri&lt;/b&gt;: Oh, memangnya apa yang dia lakukan?&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Ryan&lt;/b&gt;: Dia &lt;a href=&quot;http://1997.webhistory.org/www.lists/www-talk.1994q2/1072.html&quot;&gt;membantu menulis (mengkode) web server pertama&lt;/a&gt; dan &lt;a href=&quot;http://www.ics.uci.edu/%7Efielding/pubs/dissertation/top.htm&quot;&gt;melakukan banyak research&lt;/a&gt; untuk menjelaskan kenapa web bekerja seperti itu. &lt;a href=&quot;http://www.blogger.com/&quot;&gt;Namanya ada di spesifikasi&lt;/a&gt; untuk protokol yang digunakan untuk menerima halaman web dari server ke browser.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Istri&lt;/b&gt;: Bagaimana cara kerjanya?&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Ryan&lt;/b&gt;: Maksudnya, web?&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Istri&lt;/b&gt;: Yup.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Ryan&lt;/b&gt;: Hmm. Semua itu sangat mengagumkan. Lucunya, orang tidak terlalu menghargai ini. Protokol yang sedang kubicarakan ini, HTTP, mampu melakukan banyak hal berguna yang diacuhkan orang dengan alasan-alasan tertentu.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Istri&lt;/b&gt;: Maksudnya HTTP seperti yang ada di awal teks yang aku ketik di browser?&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Ryan&lt;/b&gt;: Ya. Itu menunjukkan browser tentang protokol apa yang digunakan. Yang kamu ketik itu adalah satu dari sekian terobosan penting dalam sejarah komputer.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Istri&lt;/b&gt;: Kok bisa?&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Ryan&lt;/b&gt;: Karena itu mampu mendeskripsikan lokasi dari suatu hal dimanapun di dunia ini. Itu adalah fondasi dari web. Kamu bisa bayangkan itu seperti koordinat GPS untuk pengetahuan dan informasi.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Istri&lt;/b&gt;: Untuk halaman web?&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Ryan&lt;/b&gt;: Tidak hanya untuk halaman web. Orang itu, Roy Fielding, dia banyak bercerita tentang apa yang ditunjukkan oleh HTTP dalam riset yang aku sebutkan tadi. Web dibangun dengan arsitektur &quot;REST&quot;. REST memberikan definisi dari &quot;resource&quot; dimana &quot;resource&quot; ini ditunjuk oleh HTTP.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Istri&lt;/b&gt;: Halaman web itu sebuah resource?&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Ryan&lt;/b&gt;: Kira-kira begitulah. Sebuah halaman web adalah representasi dari sebuah resource. Resource itu sendiri adalah sebuah konsep. URL-itulah yang diketikkan ke browser...&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Istri&lt;/b&gt;: Aku tahu apa itu URL.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Ryan&lt;/b&gt;: Oh. URL dapat memberi tahu browser bahwa ada sebuah konsep di suatu tempat. Browser kemudian dapat menanyakan representasi spesifik dari konsep tersebut. Lebih spesifik lagi, browser tersebut bertanya tentang representasi halaman web dari konsep yang ada.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Istri&lt;/b&gt;: Apa ada jenis lain dari representasi?&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Ryan&lt;/b&gt;: Sebetulnya, representasi adalah salah satu hal yang kurang termanfaatkan. Dalam banyak kasus, sebuah resource hanya memiliki satu representasi. Tapi kami berharap bahwa representasi akan digunakan lebih banyak di masa depan karena akan ada banyak format baru bermunculan.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Istri&lt;/b&gt;: Seperti apa?&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Ryan&lt;/b&gt;: Hmm. Ada konsep yang disebut orang sebagai &quot;Web Services&quot;. Itu bisa berarti macam-macam tapi konsep dasarnya ialah bahwa mesin juga dapat menggunakan web seperti manusia.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Istri&lt;/b&gt;: Maksudnya seperti robot begitu?&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Ryan&lt;/b&gt;: Tidak, bukan begitu. Bukan maksudku bahwa robot akan duduk di kursi dan kemudian browsing halaman web. Tapi komputer dapat menggunakan protokol yang sama untuk mengirim message antar sesamanya. Kami sudah melakukan itu untuk waktu yang lama tapi tidak ada teknik yang dapat digunakan untuk berbicara dengan mesin di seluruh dunia pada saat ini.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Istri&lt;/b&gt;: Kenapa tidak?&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Ryan&lt;/b&gt;: Karena mereka tidak didesain seperti itu. Ketika Fielding dan teman-temannya mulai membangun web, kemampuan untuk berkomunikasi antar mesin di seluruh dunia adalah perhatian utama mereka. Kebanyakan dari teknik yang digunakan untuk membuat komputer berkomunikasi dengan sesamanya tidak memiliki kebutuhan seperti itu. Kebanyakan hanya perlu untuk berkomunikasi dengan grup kecil saja.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Istri&lt;/b&gt;: Dan sekarang kamu perlu untuk berkomunikasi dengan semua mesin?&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Ryan&lt;/b&gt;: Ya - bahkan lebih. Kami perlu untuk dapat berkomunikasi dengan semua mesin tentang semua hal yang ada di mesin-mesin tersebut. Jadi kamu membutuhkan sebuah cara untuk memungkinkan mesin berbagi informasi tentang resource yang mungkin belum ada pada mesin lain.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Istri&lt;/b&gt;: Apa?&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Ryan&lt;/b&gt;: Misalkan kamu ngobrol dengan adikmu dan dia mau meminjam sapu atau apapun. Tapi kamu tidak punya - Ibumu yang punya. Jadi kamu bilang ke adikmu untuk meminjam dari Ibumu. Ini terjadi sepanjang waktu di dunia nyata dan ini juga akan terjadi ketika mesin mulai berkomunikasi satu sama lain.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Istri&lt;/b&gt;: Jadi bagaimana mesin memberitahu satu sama lain tentang lokasi hal-hal tersebut?&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Ryan&lt;/b&gt;: URL, pastinya. Kalau semua yang dibutuhkan mesin memiliki URL, berarti kamu sudah menciptakan sebuah equivalen dari kata benda. Kesepakatan antara kamu, aku, dan seisi dunia tentang kata benda dalam suatu cara pastinya penting kan?&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Istri&lt;/b&gt;: Ya.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Ryan&lt;/b&gt;: Mesin tidak punya kata benda yang universal - makanya mereka payah. Setiap bahasa pemrograman, database, atau sistem lain punya cara yang berbeda-beda dalam mengkomunikasikan benda. Itulah kenapa URL itu sangat penting. URL memungkinkan semua sistem ini berkomunikasi tentang benda masing-masing.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Istri&lt;/b&gt;: Tapi ketika aku melihat halaman web, aku nggak berpikir seperti itu.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Ryan&lt;/b&gt;: Orang lain juga tidak. Kecuali Fielding dan sedikit orang lain. Itulah kenapa mesin masih payah.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Istri&lt;/b&gt;: Bagaimana dengan kata kerja, kata ganti, dan kata sifat?&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Ryan&lt;/b&gt;: Lucu juga kamu tanya itu karena itu adalah hal penting lain dari REST. Eng, setidaknya kata kerja lah.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Istri&lt;/b&gt;: Aku cuma bercanda.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Ryan&lt;/b&gt;: Itu lucu, tapi sebenarnya bukan joke sama sekali. Kata kerja itu penting. Ada konsep yang sangat kuat dalam pemrograman yang siebut sebagai &quot;polymorphism&quot; dalam Computer Science. Itu adalah cara kami mengatakan bahwa benda yang berbeda bisa memiliki kata kerja yang sama yang dikenakan pada mereka.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Istri&lt;/b&gt;: Aku tak mengerti.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Ryan&lt;/b&gt;: Wel... Kita lihat meja kopi. Kata benda apa saja yang ada? Gelas, baki, koran, remote. Sekarang, apa saja yang bisa kamu lakukan terhadap benda-benda itu?&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Istri&lt;/b&gt;: Aku tak mengerti.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Ryan&lt;/b&gt;: Kamu bisa &lt;i&gt;mengambil&lt;/i&gt; mereka, kan? Kamu bisa mengangkat mereka. Kamu bisa menjatuhkan mereka. Kamu bisa membakar mereka. Kamu bisa menggunakan kata kerja yang sama untuk objek manapun yang ada di sana.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Istri&lt;/b&gt;: Oke... jadi?&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Ryan&lt;/b&gt;: Nah, itu yang penting. Bagaimana jika kita tidak bisa mengatakan, &quot;ambil gelas&quot;, atau &quot;ambil koran&quot;, atau &quot;ambil remote&quot;; Bagaimana jika untuk itu kita harus menggunakan kata kerja yang berbeda untuk setiap kata benda? Kita tidak bisa menggunakan kata &quot;ambil&quot; secara unversal, tapi harus menggunakan kata baru untuk setiap kombinasi kata kerja/kata benda.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Istri&lt;/b&gt;: Wow! Itu aneh.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Ryan&lt;/b&gt;: Ya, itu aneh. Otak kita cukup cerdas untuk mengetahui bahwa kata kerja yang sama dapat digunakan untuk benda-benda yang berbeda. Sebagian kata kerja memang lebih spesifik dan hanya bisa digunakan pada kata benda tertentu. Misalnya, aku tidak bisa &quot;mengendarai gelas&quot; atau &quot;minum mobil&quot;. Tapi sebagian kata kerja sangat universal seperti ambil (GET), taruh (PUT), dan hapus (DELETE).&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Istri&lt;/b&gt;: Kamu tidak bisa menghapus gelas.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Ryan&lt;/b&gt;: Oke, tapi kamu bisa membuang gelas. Tapi itu cuma joke kan?&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Istri&lt;/b&gt;: Yeah.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Ryan&lt;/b&gt;: Jadi, HTTP -protokol yang dibuat Fielding dan teman-temannya ini- adalah tentang penggunaan kata kerja ke kata benda. Contohnya, ketika kamu mengunjungi sebuah halaman web, browser akan menggunakan HTTP GET ke URL yang kamu ketikkan dan halaman web akan kamu peroleh.&lt;br /&gt;
&lt;br /&gt;
Halaman web biasanya mengandung gambar kan? Gambar adalah resource yang berbeda. Halaman web hanya menyebutkan URL ke gambar dan browser akan memanggil HTTP GET ke semua URL gambar tersebut hingga semua resource yang dibutuhkan untuk menampilkan halaman web itu diperoleh. Tapi yang penting disini ialah bahwa hal-hal yang berbeda dapat diperlakukan dengan cara yang sama. Apakah kata benda itu adalah gambar, teks, video, mp3, slideshow, atau apapun. Aku bisa melakukan instruksi GET untuk semua hal tersebut selama mereka memiliki URL.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Istri&lt;/b&gt;: Sepertinya GET itu kata kerja yang penting.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Ryan&lt;/b&gt;: Memang. Terutama bila kamu menggunakan browser karena browser biasanya hanya digunakan untuk mengambil sesuatu. Browser tidak terlalu banyak berinteraksi dengan resource. Ini jadi masalah karena orang jadi berpikir bahwa HTTP itu hanya untuk mengambil sesuatu. Padahal sebenarnya HTTP itu adalah protokol umum untuk mengaplikasikan kata kerja pada kata benda.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Istri&lt;/b&gt;: Keren. Tapi aku tidak paham kenapa ini bisa mengubah apapun. Kata benda dan kata kerja apa saja yang kamu mau?&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Ryan&lt;/b&gt;: Kata benda sudah ada tapi tidak dalam format yang benar.&lt;br /&gt;
&lt;br /&gt;
Coba bayangkan ketika kamu sedang browsing di amazon.com untuk mencari hadiah natal. Bayangkan setiap produk adalah kata benda. Sekarang, ketika mereka tersedia dalam bentuk yang dapat dimengerti mesin, kamu bisa melakukan banyak hal yang menarik.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Istri&lt;/b&gt;: Mengapa mesin tidak bisa mengeri halaman web biasa?&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Ryan&lt;/b&gt;: Karena halaman web didesain untuk dimengerti oleh manusia. Mesin tidak peduli terhadap layout dan style. Mesin hanya butuh data. Idealnya, setiap URL punya representasi yang dapat dimenerti manusia dan representasi yang dapat dimengerti mesin. Ketika sebuah mesin melakukan GET terhadap resource, maka dia akan meminta representasi yang dapat dimengerti mesin. Ketika sebuah browser melakukan GET terhadap resource atas permintaan manusia, maka yang diperoleh adalah representasi yang dapat dimengerti oleh manusia.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Istri&lt;/b&gt;: Jadi semua orang harus membuat format yang dapat dimengerti oleh mesin ke semua halaman web mereka?&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Ryan&lt;/b&gt;: Kalau itu memang bermanfaat.&lt;br /&gt;
&lt;br /&gt;
Kita sudah banyak ngobrol dengan abstraksi. Bagaimana kalau ita ambil contoh yang nyata. Kamu adalah seorang guru -di sekolah aku yakin kamu punya sistem komputer yang besar, atau tiga atau empat komputer, yang memungkinkanmu untuk mengelola murid: di kelas mana mereka berada, berapa nilai mereka, kontak darurat, informasi mengenai buku yang kamu ajarkan, dan laib sebagainya. Jika sistem ini web-based, maka kemungkinan ada URL untuk setiap benda yang terlibat disini: murid, guru, kelas, buku, ruangan, dll. Saat ini, memasukkan URL lewat browser akan memberikanmu sebuah ahalaman web. Jika ada representasi yang dapat dimengerti oleh mesin untuk setiap URL, maka mudah saja untuk menelurkan sebuah aplikasi ke dalam sistem karena semua infomasi tersebut dapat dikonsumsi dengan cara yang standar. Itu juga akan memungkinan semua sistem untuk berkomunikasi satu sama lain dengan mudah. Atau, kamu bisa membuat sistem untuk propinsi atau negara yang bisa berkomunikasi dengan masing-masing sekolah untuk mengumpulkan nilai ujian. Kemungkinan yang ada bisa tanpa batas.&lt;br /&gt;
&lt;br /&gt;
Setiap sistem akan memperoleh informasi dari yang lain dengan menggunakan instruksi HTTP GET yang sederhana. Jika sebuah sistem perlu menambahkan sesuatu ke sistem lain, maka dia akan menggunakan HTTP POST. Jika sebuah sistem ingin memutakhirkan sesuatu ke sistem lain, dia akan menggunakan HTTP PUT. Satu-satunya yang perlu didiskusikan adalah dalam bentuk apa data itu seharusnya.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Istri&lt;/b&gt;: Jadi ini yang kamu dan semua orang komputer lakukan sekarang? Mendiskusikan bagaimana data itu seharusnya?&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Ryan&lt;/b&gt;: Sedihnya, tidak. Malah kebanyakan sibuk menulis spesifikasi kopleks untuk melakukan hal ini dengan cara yang berbeda dan tidak terlalu bermanfaat. Benda tidak universal dan kata kerja tidak polimorphic. Kita membuang puluhan tahun pengalaman dari penggunaan di dunia nyata dan teknik yang telah terbukti dan memulai kembali dengan sesuatu yang kelihatannya sangat mirip dengan sistem lain yang telah gagal di masa lalu. Kami menggunakan HTTP tapi hanya karena itu membantu kita untuk menghindari pembicaraan dengan administrator jaringan. Kami mengorbankan kemudahan dengan aplikasi yang terlihat keren dan aplikasi wizard.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Istri&lt;/b&gt;: Kenapa?&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Ryan&lt;/b&gt;: Aku tidak tahu.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Istri&lt;/b&gt;: Kenapa kamu tidak bilang apa-apa?&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Ryan&lt;/b&gt;: Mungkin nanti.</description><link>http://habsq.blogspot.com/2010/05/bagaimana-saya-menjelaskan-rest-kepada.html</link><author>noreply@blogger.com (Ismail Habib)</author><thr:total>13</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-26918278.post-599722266116105436</guid><pubDate>Fri, 21 May 2010 18:47:00 +0000</pubDate><atom:updated>2010-05-21T20:48:15.098+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Game</category><category domain="http://www.blogger.com/atom/ns#">Internet</category><title>Pacman on google.com</title><description>30th anniversary of the legendary game: Pacman. Play it on &lt;a href=&quot;http://google.com/&quot;&gt;google.com&lt;/a&gt; now! ;)&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwAAvuyN8q5xa1C4Jj54mDzGPiIwe0JKahN4Iu7pPRPlUMxVQCWduY_dyFWwjxboCxEXzd6p34859XzPhkrIBUvRpWyahuJPXCT9aw-KSWhd0gJH35f7ANkvojq_ru0ZrMYR4Mmw/s1600/30+years+pacman.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;170&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwAAvuyN8q5xa1C4Jj54mDzGPiIwe0JKahN4Iu7pPRPlUMxVQCWduY_dyFWwjxboCxEXzd6p34859XzPhkrIBUvRpWyahuJPXCT9aw-KSWhd0gJH35f7ANkvojq_ru0ZrMYR4Mmw/s400/30+years+pacman.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;</description><link>http://habsq.blogspot.com/2010/05/pacman-on-googlecom.html</link><author>noreply@blogger.com (Ismail Habib)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwAAvuyN8q5xa1C4Jj54mDzGPiIwe0JKahN4Iu7pPRPlUMxVQCWduY_dyFWwjxboCxEXzd6p34859XzPhkrIBUvRpWyahuJPXCT9aw-KSWhd0gJH35f7ANkvojq_ru0ZrMYR4Mmw/s72-c/30+years+pacman.jpg" height="72" width="72"/><thr:total>14</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-26918278.post-971029042263600311</guid><pubDate>Fri, 23 Apr 2010 08:31:00 +0000</pubDate><atom:updated>2013-01-27T21:02:55.089+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">GWT</category><category domain="http://www.blogger.com/atom/ns#">Java</category><category domain="http://www.blogger.com/atom/ns#">Programming</category><category domain="http://www.blogger.com/atom/ns#">Software</category><title>Drawing Circle on Google Maps using GWT</title><description>I was a bit surprised to realize that Google Maps API does not provide us with a circle overlay. Oh well, I believe they will do that someday. As for now, we just have to be satisfied with what we have.&lt;br /&gt;
&lt;br /&gt;
We can do this in two ways. Drawing circle is easy. By using an image of circle and&amp;nbsp;stretch&amp;nbsp;it to the right size, or by using Polygon Overlay and approximate a circle. The most difficult thing is we have to be able to do transformation of points to latitude/longitude coordinate. No need to reinvent the wheel, somebody else have pointed out how to do this kind of things. Check out these two links:&lt;br /&gt;
&lt;a href=&quot;http://seewah.blogspot.com/2009/10/circle-overlay-on-google-map.html&quot;&gt;Drawing circle on Google Maps with an image&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://markmail.org/message/u2gu6ajnsu75c3kj#query:+page:1+mid:h724b66m3n7k773h+state:results&quot;&gt;Drawing circle on Google Maps&amp;nbsp;with an approximation (using Polygon)&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
However, these two codes are written for JavaScript. I&#39;m using the knowledge provided by both to rewrite it for GWT. I&#39;m using the approximation method, but it should be easy for you if you want to use image instead of Polygon.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: java&quot;&gt;public void drawCircleFromRadius(LatLng center, double radius,
   int nbOfPoints) {

 LatLngBounds bounds = LatLngBounds.newInstance();
 LatLng[] circlePoints = new LatLng[nbOfPoints];

 double EARTH_RADIUS = 6371000;
 double d = radius / EARTH_RADIUS;
 double lat1 = Math.toRadians(center.getLatitude());
 double lng1 = Math.toRadians(center.getLongitude());

 double a = 0;
 double step = 360.0 / (double) nbOfPoints;
 for (int i = 0; i &amp;lt; nbOfPoints; i++) {
  double tc = Math.toRadians(a);
  double lat2 = Math.asin(Math.sin(lat1) * Math.cos(d) + Math.cos(lat1)
    * Math.sin(d) * Math.cos(tc));
  double lng2 = lng1
    + Math.atan2(Math.sin(tc) * Math.sin(d) * Math.cos(lat1),
     Math.cos(d) - Math.sin(lat1) * Math.sin(lat2));
  LatLng point = LatLng.newInstance(Math.toDegrees(lat2), Math
   .toDegrees(lng2));
  circlePoints[i] = point;
  bounds.extend(point);
  a += step;
 }

 Polygon circle = new Polygon(circlePoints, &quot;white&quot;, 0, 0, &quot;green&quot;, 0.5);

 map.addOverlay(circle);
}
&lt;/pre&gt;</description><link>http://habsq.blogspot.com/2010/04/drawing-circle-on-google-maps-using-gwt.html</link><author>noreply@blogger.com (Ismail Habib)</author><thr:total>50</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-26918278.post-5052480271317508493</guid><pubDate>Tue, 23 Mar 2010 12:43:00 +0000</pubDate><atom:updated>2010-03-23T13:43:16.891+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Software</category><category domain="http://www.blogger.com/atom/ns#">Troubleshooting</category><title>Forcing a Screen Setting in Windows 7</title><description>I was trying to install a new screen on my laptop when I realized that it was not as easy as I expected. This screen was huge (compared to my laptop&#39;s screen) with a very high resolution (1920x1080) setting suggested. However, with 1920x1080, the only refresh rate available is only 29Hz and 30Hz, which would make my screen looks very flickeringly sharp (I don&#39;t even know if it is a word). Updating the driver of my VGA card and the screen doesn&#39;t help at all.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTTcR3j05wr39h5EyiETlef9akC8peRokxWOXKOk9-a4a7gTU2kVlZZqsC12xOZCsdyTaYWAo74bIgqq_UYXF4D9V74JOwnE3yfHcgsDCX-VC0c0-d-hFNbq03ME11_hb6VrIa8w/s1600-h/screen+adjust.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTTcR3j05wr39h5EyiETlef9akC8peRokxWOXKOk9-a4a7gTU2kVlZZqsC12xOZCsdyTaYWAo74bIgqq_UYXF4D9V74JOwnE3yfHcgsDCX-VC0c0-d-hFNbq03ME11_hb6VrIa8w/s320/screen+adjust.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;The fix was surprisingly easy and funny though. I went to the Screen Resolution adjustment, clicked on the &quot;advanced&quot; link. Open the &quot;Monitor&quot; tab, and unchecked &quot;hide modes that this monitor cannot display&quot;. The available modes then changed, and I picked 60Hz as the refresh rate. Things went went from that moment on.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Moral of this story: sometimes you are allowed to force your Windows to do something, especially when it underestimating your expensive hardware :P&lt;/div&gt;</description><link>http://habsq.blogspot.com/2010/03/forcing-screen-setting-in-windows-7.html</link><author>noreply@blogger.com (Ismail Habib)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTTcR3j05wr39h5EyiETlef9akC8peRokxWOXKOk9-a4a7gTU2kVlZZqsC12xOZCsdyTaYWAo74bIgqq_UYXF4D9V74JOwnE3yfHcgsDCX-VC0c0-d-hFNbq03ME11_hb6VrIa8w/s72-c/screen+adjust.jpg" height="72" width="72"/><thr:total>16</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-26918278.post-7590061341648194187</guid><pubDate>Tue, 24 Nov 2009 14:18:00 +0000</pubDate><atom:updated>2009-11-25T07:24:11.830+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Linux</category><category domain="http://www.blogger.com/atom/ns#">Software</category><category domain="http://www.blogger.com/atom/ns#">Troubleshooting</category><category domain="http://www.blogger.com/atom/ns#">Tutorial</category><title>Changing Screen Resolution in Ubuntu under VirtualBox</title><description>This problem has caused me a relatively severe headache today. I&#39;m doing a project which require me to use a Linux OS. Since I don&#39;t have Linux in my office PC, I decided to install one (Ubuntu 9.10) in a VirtualBox instead of creating a double booting configuration. The installation procedure was easy and painless, but then the problem is coming. The installed Ubuntu does not have any option to increase the screen resolution other than 800x600 and 640x480.&lt;br /&gt;
&lt;br /&gt;
I tried to install the suitable driver with no result except destroying my X Window which forces me to reinstall the Ubuntu again (thank God I use virtual machine...). Then I started looking around for a solution and several forums and websites point me to this:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Choose &lt;i&gt;Devices &lt;/i&gt;-&amp;gt; &lt;i&gt;Install Guest Additions&lt;/i&gt;... on the VirtualBox menu&lt;/li&gt;
&lt;li&gt;It will mount a CD which will appear on the Desktop&lt;/li&gt;
&lt;li&gt;Go to your terminal (&lt;i&gt;Applications &lt;/i&gt;-&amp;gt; &lt;i&gt;Accessories &lt;/i&gt;-&amp;gt; &lt;i&gt;Terminal&lt;/i&gt;)&lt;/li&gt;
&lt;li&gt;Go to the CD directory by typing &quot;&lt;i&gt;cd /media/cdrom0&lt;/i&gt;&quot; (without the quotes)&lt;/li&gt;
&lt;li&gt;Type &quot;&lt;i&gt;sudo sh ./VBoxLinuxAdditions-x86.run&lt;/i&gt;&quot;, again, without the quotes. At the first try I couldn&#39;t find this file instead just a directory &quot;OS2&quot;. If you experience the same thing, this is probably because you set your VirtualBox OS type as &quot;Ubuntu&quot; instead of &quot;Linux 2.6&quot;. In this case, shut down your VirtualBox, change the OS type and redo the whole stuffs from the beginning&lt;/li&gt;
&lt;li&gt;Restart your VirtualBox&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;br /&gt;
Now, this has successfully gave me another resolution, which is 1024x768. Not bad, but I&#39;m rather greedy and I want something more! (Hey, my PC could do better!). Continue with this:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Go to the terminal again&lt;/li&gt;
&lt;li&gt;Edit the xorg.conf by typing &quot;&lt;i&gt;sudo gedit /etc/X11/xorg.conf&lt;/i&gt;&quot; (yes, no quotes)&lt;/li&gt;
&lt;li&gt;If you can find some already existing screen resolution, then you can add more, otherwise you can include something like this:&lt;/li&gt;
&lt;/ul&gt;&lt;pre style=&quot;background-attachment: initial; background-clip: initial; background-color: #f2f5f6; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-color: rgb(221, 221, 221); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 5px; border-right-color: rgb(221, 221, 221); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; border-width: initial; overflow-x: auto; overflow-y: visible; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px;&quot;&gt;Section &quot;Screen&quot;
        Identifier &quot;Screen0&quot;
        Device     &quot;Videocard0&quot;
        DefaultDepth     24
        Subsection &quot;Display&quot;
                Viewport   0 0
                Depth     24
                &lt;b style=&quot;background-attachment: initial; background-clip: initial; background-color: #dddddd; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; font-size: 1em;&quot;&gt;Modes     &quot;1280x1024&quot; &quot;1024×768&quot;&lt;/b&gt;
        EndSubSection
EndSection&lt;/pre&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Be really careful when you&#39;re doing this. It is always nice to make a backup beforehand&lt;/li&gt;
&lt;li&gt;Restart your VirtualBox and enjoy the new screen resolution&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;br /&gt;
Reference:&lt;br /&gt;
1.&amp;nbsp;&lt;a href=&quot;http://www.mikesouthby.co.uk/2009/11/virtualboxubuntu-9-10-changing-screen-resolution/&quot;&gt;http://www.mikesouthby.co.uk/2009/11/virtualboxubuntu-9-10-changing-screen-resolution/&lt;/a&gt;&lt;br /&gt;
2.&amp;nbsp;&lt;a href=&quot;http://www.mjmwired.net/linux/2009/09/15/default-xorg-resolution/&quot;&gt;http://www.mjmwired.net/linux/2009/09/15/default-xorg-resolution/&lt;/a&gt;</description><link>http://habsq.blogspot.com/2009/11/change-screen-resolution-in-ubuntu.html</link><author>noreply@blogger.com (Ismail Habib)</author><thr:total>15</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-26918278.post-5964129176236308194</guid><pubDate>Sat, 14 Nov 2009 10:10:00 +0000</pubDate><atom:updated>2009-11-14T11:13:04.691+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Drawing</category><category domain="http://www.blogger.com/atom/ns#">Tutorial</category><title>Improving a Scanned Hand-Drawing</title><description>I did a lot of digital drawing and painting as a hobby. One of the most common problem I faced is the lack of quality of the scanned lines from the scanned drawing. Thus, an improvement on the scanned drawing is required before doing anything else. Before we start, I should warn you that this is the way that I found works, doesn&#39;t mean that there is not other way to do it. I&#39;m using Photoshop and Corel Draw to do this, but I suppose any other application with similar features should work fine.&lt;br /&gt;
&lt;br /&gt;
I prefer to trace a scanned hand-drawing before doing anything else. Tracing is nice because with tracing I can have an output in form of vector. Thus, further improvement could be made easily. However, tracing a scanned hand-drawing often caused many detail loss. Increasing trace resolution wouldn&#39;t help since the output will not posses simple, clear, and solid lines.&lt;br /&gt;
&lt;br /&gt;
To overcome this situation, I propose to do a preprocessing for the scanned hand-drawing. I&#39;m using a self hand-drawing with a manga-ish style. Forgive the quality, I&#39;m only an amateur :)&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLC6fDHssMxsqBflGoYl5-95nGSpCdpk-7rwGV7LnroQ_6PN3jC0r7zJbBWqfxYopQIt_A5A2bIzc_f2p3Yups5bSXhlK8UraHLWtJwHeGZtnNp3c7zcWg6CgQk7RsodG7be6H/s1600-h/scannan-grayscale.jpg&quot; onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5379964013386494290&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLC6fDHssMxsqBflGoYl5-95nGSpCdpk-7rwGV7LnroQ_6PN3jC0r7zJbBWqfxYopQIt_A5A2bIzc_f2p3Yups5bSXhlK8UraHLWtJwHeGZtnNp3c7zcWg6CgQk7RsodG7be6H/s400/scannan-grayscale.jpg&quot; style=&quot;cursor: pointer; display: block; height: 400px; margin: 0px auto 10px; text-align: center; width: 265px;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Once you scan your hand-drawing, we need to adjust the color intensity. I&#39;m using &quot;Level&quot; feature of Photoshop and adjust accordingly.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglZ78eBjG4mAwI8-bBQhDqkl4rc-uWUYzlFaoO7jr7kjuU3xDhNhLCwoqJ5IKlr3jbs5N_pxlw4tE7e8frqyDWXLdS3lZZH53G8wZw0hLY3JcNnRGys9nn0PVwtXR-GUzEVfIP/s1600-h/scannan-grayscale-levelled.jpg&quot; onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5379964024422559074&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglZ78eBjG4mAwI8-bBQhDqkl4rc-uWUYzlFaoO7jr7kjuU3xDhNhLCwoqJ5IKlr3jbs5N_pxlw4tE7e8frqyDWXLdS3lZZH53G8wZw0hLY3JcNnRGys9nn0PVwtXR-GUzEVfIP/s400/scannan-grayscale-levelled.jpg&quot; style=&quot;cursor: pointer; display: block; height: 400px; margin: 0px auto 10px; text-align: center; width: 265px;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
The next step is to apply a filter called &quot;Photocopy&quot; from Photoshop. I choose this because it will make the lines bolder and flatten (is this even the correct word?) the color.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkV_MX01hklaTAW84p0BuCezsmcWpgd92X_sXZKC0pEhAe0_riKJEzqPcRmCQOYhyphenhyphen8YpetBWklDcFo95Ivgju_AYvBe5cs3LIbud4EUp81JeHuAMwql6xjRQCF8tJH5KBGY9nX/s1600-h/scannan-grayscale-levelled-photocopy.jpg&quot; onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5379964028845187138&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkV_MX01hklaTAW84p0BuCezsmcWpgd92X_sXZKC0pEhAe0_riKJEzqPcRmCQOYhyphenhyphen8YpetBWklDcFo95Ivgju_AYvBe5cs3LIbud4EUp81JeHuAMwql6xjRQCF8tJH5KBGY9nX/s400/scannan-grayscale-levelled-photocopy.jpg&quot; style=&quot;cursor: pointer; display: block; height: 400px; margin: 0px auto 10px; text-align: center; width: 265px;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
The resulting image is good enough for tracing. I import the image and do the tracing with Corel Draw.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7-NYVz2Qo7Ha9mZZeb0R-ek0AL0_FpJoFqhzaxQtVEAaQb_xCNo71a8Ua9sagVxJlF7-gpKo_XQPL3izjeY_W75GJS5Xg_DHzM_PA1VmgCDZG49DfEOYhF3EQGkx58hsGdjA_/s1600-h/scannan-grayscale-levelled-photocopy-traced.jpg&quot; onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5379964038082286290&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7-NYVz2Qo7Ha9mZZeb0R-ek0AL0_FpJoFqhzaxQtVEAaQb_xCNo71a8Ua9sagVxJlF7-gpKo_XQPL3izjeY_W75GJS5Xg_DHzM_PA1VmgCDZG49DfEOYhF3EQGkx58hsGdjA_/s400/scannan-grayscale-levelled-photocopy-traced.jpg&quot; style=&quot;cursor: pointer; display: block; height: 400px; margin: 0px auto 10px; text-align: center; width: 265px;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
The result is clean and artistic. You can always make further&amp;nbsp;adjustment&amp;nbsp;easily since it is in form of vector.</description><link>http://habsq.blogspot.com/2009/11/improving-scanned-hand-drawing.html</link><author>noreply@blogger.com (Ismail Habib)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLC6fDHssMxsqBflGoYl5-95nGSpCdpk-7rwGV7LnroQ_6PN3jC0r7zJbBWqfxYopQIt_A5A2bIzc_f2p3Yups5bSXhlK8UraHLWtJwHeGZtnNp3c7zcWg6CgQk7RsodG7be6H/s72-c/scannan-grayscale.jpg" height="72" width="72"/><thr:total>17</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-26918278.post-8518829380541154203</guid><pubDate>Thu, 25 Dec 2008 09:47:00 +0000</pubDate><atom:updated>2008-12-25T10:53:58.773+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Game</category><category domain="http://www.blogger.com/atom/ns#">Software</category><title>Game of Imagination</title><description>It has been a while since I wrote my last post and losing my internet connection (followed by losing the enthusiasm of writing). Anyway, here I am trying to write something again and it&#39;s going to be something fun, yups: it is about a game, to be precise: games.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://walkofcredo.blogspot.com/2008/12/crayon-physics-deluxe.html&quot;&gt;A friend of mine&lt;/a&gt; posted this video about a game called: &lt;a href=&quot;http://www.crayonphysics.com/&quot;&gt;Crayon Physics Deluxe&lt;/a&gt;. I took a peek on it, and fell in love at the first sight. Crayon Physics Deluxe is a puzzle game where we have to solve a problem (mostly to guide a ball to a star) using physics rules, kind of remind me of the old-nice &lt;a href=&quot;http://en.wikipedia.org/wiki/The_Incredible_Machine&quot;&gt;Incredible Machine&lt;/a&gt; which I played a long time ago. However, the difference (and the most interesting part) is that Crayon Physics Deluxe allows the user to create objects freely using a &quot;pen&quot; and transforms them into world objects which automatically follow the physics rule. Take a look at this cool video on their website:&lt;br /&gt;&lt;br /&gt;&lt;a style=&quot;left: 0px ! important; top: 15px ! important;&quot; title=&quot;Click here to block this object with Adblock Plus&quot; class=&quot;abp-objtab-000556167588975276 visible ontop&quot; href=&quot;http://vimeo.com/moogaloop.swf?clip_id=1849263&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1&quot;&gt;&lt;/a&gt;&lt;object width=&quot;400&quot; height=&quot;321&quot;&gt;&lt;param name=&quot;allowfullscreen&quot; value=&quot;true&quot;&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://vimeo.com/moogaloop.swf?clip_id=1849263&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1&quot;&gt;&lt;embed src=&quot;http://vimeo.com/moogaloop.swf?clip_id=1849263&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1&quot; type=&quot;application/x-shockwave-flash&quot; allowfullscreen=&quot;true&quot; allowscriptaccess=&quot;always&quot; width=&quot;400&quot; height=&quot;321&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href=&quot;http://vimeo.com/1849263&quot;&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It looks like a very nice game, but I&#39;m not a type of guy who&#39;s willing to buy something just because it looks nice :) I tried to get more information and trial version of the game which eventually leads me into an another game called &lt;a href=&quot;http://www.zanydoodle.com/&quot;&gt;Zany Doodle&lt;/a&gt;, which luckily offers a trial version of the game. I tried the game and enjoyed it very much even though I only use a normal mouse instead of a touchscreen (which I believe will increase the game experience heavily). Moreover, I found out that the Crayon Physics Deluxe is actually originated from the free game Crayon Physics which is developed by the same person. However, the free Crayon Physics is nowhere as good as its paid counterpart, not even better than the free trial of Zany Doodle since it cannot create objects like a triangle or just a random line.&lt;br /&gt;&lt;br /&gt;Should I say anything more? Just download the Crayon Physics &lt;a href=&quot;http://rapidshare.com/files/176606080/crayon.zip&quot;&gt;here&lt;/a&gt; and the free trial of Zany Doodle &lt;a href=&quot;http://www.zanydoodle.com/download.php&quot;&gt;here&lt;/a&gt;. Enjoy!</description><link>http://habsq.blogspot.com/2008/12/game-of-imagination.html</link><author>noreply@blogger.com (Ismail Habib)</author><thr:total>28</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-26918278.post-7139422515753661595</guid><pubDate>Thu, 17 Jul 2008 12:59:00 +0000</pubDate><atom:updated>2008-07-17T15:16:19.352+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Internet</category><title>Scour - A Social Search Engine</title><description>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0qkcOhzGJ2i4iVaUlzGFDcc0ufgDQnUDko-Y_hDolZUm9dMZWrF3C-4FnpMdiEWcmaT6GBL5yM3M8ofbjZzjQTZYKuAO6MHSOIUJHy2VDdzogXb81ArjW2gHWGjHSz5IHc6X4IQ/s1600-h/logo.gif&quot;&gt;&lt;img style=&quot;margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0qkcOhzGJ2i4iVaUlzGFDcc0ufgDQnUDko-Y_hDolZUm9dMZWrF3C-4FnpMdiEWcmaT6GBL5yM3M8ofbjZzjQTZYKuAO6MHSOIUJHy2VDdzogXb81ArjW2gHWGjHSz5IHc6X4IQ/s400/logo.gif&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5223968237671950690&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;a style=&quot;font-weight: bold;&quot; href=&quot;http://www.scour.com/&quot; onclick=&quot;parent.location.href=&#39;http://scour.com/invite/habsq&#39;;return event.returnValue=false&quot;&gt;Scour&lt;/a&gt; (currently in beta) is another web 2.0 hype tagged as &quot;&lt;span style=&quot;font-style: italic;&quot;&gt;social search engine&lt;/span&gt;&quot; intended to give user more authority to determine results from searching process. Scour aggregates result from Google, Yahoo, and MSN and combine them with the votes from users to decide the order of the results. Besides voting, Scour also allows users to leave comments for every search results. Sounds like another Digg? Another worth mentioning feature from Scour is the reward system. Users will get a certain number of points for every search or another contribution they make (voting, commenting, inviting friends). After several thousand of points, users are able to convert them into a visa gift card. While this pay-per-search idea is nothing new, I wonder if the social part of Scour will able to keep them surviving in the next few years given the fact that they will probably have to compete with Google (&lt;a href=&quot;http://www.techcrunch.com/2008/07/14/google-bucket-testing-new-digg-like-search-interface/&quot;&gt;Google is developing their search engine with a similar idea to Scour&lt;/a&gt;, I bet without the reward system).&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIyGL-S0eaU-EIJm1ruuqo5lKUYai5fCD1m3OWigQEbzLR4Zhyphenhyphen7Z8GUtPah3JYyiBlU8esK2I5AA4Es3_WKnpd28x4apVSORW-eb1b2u2ah2cBDipipoROCMKL9yaWCrrYYiOaTg/s1600-h/cap.JPG&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIyGL-S0eaU-EIJm1ruuqo5lKUYai5fCD1m3OWigQEbzLR4Zhyphenhyphen7Z8GUtPah3JYyiBlU8esK2I5AA4Es3_WKnpd28x4apVSORW-eb1b2u2ah2cBDipipoROCMKL9yaWCrrYYiOaTg/s400/cap.JPG&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5223971123351578178&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;I have tried Scour for around three days now, and I&#39;m sure they want to improve on several things (it&#39;s a beta anyway). Currently the results are limited to 3 pages no matter what keyword I use to do the searching. The search results are also lack of highlighting (updated: not anymore!). They have also included a browser-integrated search bar, which is good for me since I want to try it without having to change the way I use Google. However, every time I click on a search result a frame appeared in the bottom of the page which allowed the users to give vote or comment on the result (this frame didn&#39;t appear when I tried to open the search result on a new tab instead of clicking it). This might be a good way to encourage users to participate in the voting/commenting activities, but I found it a little bit annoying. Hopefully they will find a better way to do it.</description><link>http://habsq.blogspot.com/2008/07/scour-social-search-engine.html</link><author>noreply@blogger.com (Ismail Habib)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0qkcOhzGJ2i4iVaUlzGFDcc0ufgDQnUDko-Y_hDolZUm9dMZWrF3C-4FnpMdiEWcmaT6GBL5yM3M8ofbjZzjQTZYKuAO6MHSOIUJHy2VDdzogXb81ArjW2gHWGjHSz5IHc6X4IQ/s72-c/logo.gif" height="72" width="72"/><thr:total>17</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-26918278.post-305492904128004631</guid><pubDate>Mon, 14 Jul 2008 11:44:00 +0000</pubDate><atom:updated>2008-07-14T13:46:31.498+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Internet</category><category domain="http://www.blogger.com/atom/ns#">Life Hack</category><category domain="http://www.blogger.com/atom/ns#">Software</category><title>Family Tree Builder</title><description>1. I have a big family which keeps on expanding&lt;br /&gt;2. I live far away from most of them&lt;br /&gt;3. I have terrible memory (being old and things like that... you know)&lt;br /&gt;&lt;br /&gt;Those are my top three arguments why I sometime (or often) forget about things related to my family. Some examples: the date of my parent&#39;s marriage, my brother in law&#39;s birthday, or even the name of my one year old cousin. Now I&#39;d like to say goodbye for all those fake arguments by introducing a geeky way to keep all family-related information in a sophisticated way: Family Tree Builder.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhn391GnlBNtWXnMc9XIj5hDfCuv-n-kPQAMOwLI7u64wcE-vHP_5pF-g8KVNJfwoFHTPVg2NCPlul1dIV8xtvgdE32I0ij-d8mJrUmQBSmMaHaynPuG0oaOP-AFLULnqOFqEINHQ/s1600-h/cap.JPG&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhn391GnlBNtWXnMc9XIj5hDfCuv-n-kPQAMOwLI7u64wcE-vHP_5pF-g8KVNJfwoFHTPVg2NCPlul1dIV8xtvgdE32I0ij-d8mJrUmQBSmMaHaynPuG0oaOP-AFLULnqOFqEINHQ/s400/cap.JPG&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5222834530820910914&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Family Tree Builder is a genealogy software (for Windows only) which can be downloaded for free at &lt;a href=&quot;http://www.myheritage.com/family-tree-builder&quot;&gt;http://www.myheritage.com/family-tree-builder&lt;/a&gt;. I like this software a lot, especially since it offers some nice features such as: integration with &lt;a href=&quot;http://www.myheritage.com&quot;&gt;myheritage.com&lt;/a&gt; (allows me to share and let others review the information on the web, though without capability of multi-user editing), photograph for every family member (and events), event reminder (birthday, marriage, etc), and also possibility to input unsure information for date (i.e. birthday around January 1982).</description><link>http://habsq.blogspot.com/2008/07/family-tree-builder.html</link><author>noreply@blogger.com (Ismail Habib)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhn391GnlBNtWXnMc9XIj5hDfCuv-n-kPQAMOwLI7u64wcE-vHP_5pF-g8KVNJfwoFHTPVg2NCPlul1dIV8xtvgdE32I0ij-d8mJrUmQBSmMaHaynPuG0oaOP-AFLULnqOFqEINHQ/s72-c/cap.JPG" height="72" width="72"/><thr:total>36</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-26918278.post-4603609832407666633</guid><pubDate>Fri, 04 Jul 2008 19:35:00 +0000</pubDate><atom:updated>2008-07-04T21:35:59.684+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Blog</category><title>Blogger Wish List</title><description>&lt;div xmlns=&#39;http://www.w3.org/1999/xhtml&#39;&gt;Amanda celebrates &lt;a href=&#39;http://www.bloggerbuster.com&#39;&gt;Blogger Buster&lt;/a&gt;&#39;s birthday by arranging &lt;a href=&#39;http://www.bloggerbuster.com/2008/06/competition-win-ultimate-blogging.html&#39;&gt;a nice competition&lt;/a&gt; to suggest some new features for &lt;a href=&#39;www.blogger.com&#39;&gt;Blogger&lt;/a&gt;. As a Blogger user myself, I couldn&#39;t careless about it, especially since it comes with a really nice incentive ;) Okay, so here are my thoughts about new features that should be implemented:&lt;br/&gt;&lt;br/&gt;&lt;b&gt;1. Give option to show only snippet of posts with &quot;read more&quot; button&lt;/b&gt;&lt;br/&gt;&lt;br/&gt;...or using the Blogger term: &quot;Show excerpts of my posts, with links to the full text&quot;. This is the most important feature that I think should be implemented ASAP by the Blogger team (other than in-post comment, which already introduced in Blogger Beta). This feature will allow me to show more posts in the front page and let the reader to pick the one he/she interested in instead having to scroll all the way to the bottom page and check for previous posts.&lt;br/&gt;&lt;br/&gt;&lt;b&gt;2. More variety of widgets&lt;/b&gt;&lt;br/&gt;&lt;br/&gt;I realize that some really useful widgets are missing in the Blogger, especially &quot;Top Commentators&quot; and &quot;Top Posts&quot;. Top Commentators should display the most active commenters in the whole blog along with a link to their blog (as an incentive for supporting the blog by actively commenting it). Top Posts could be based on number of comments, traffics, or (even better) by popularity of the post decided by several criterias such as comments, traffics, number of links, digg, technorati, etc. Another widgets that I could think of are &quot;Recent Posts&quot; and &quot;Recent Comments&quot; (It is possible but with limit of 5 entries only). Emm... am I asking too much here? :D&lt;br/&gt;&lt;br/&gt;&lt;b&gt;3. Possibility to create additional pages&lt;/b&gt;&lt;br/&gt;&lt;br/&gt;I would love to have a special page for author, links, and archives. Yes, it is possible by applying some sort of hacks but still I prefer to have it as a explicit feature.&lt;br/&gt;&lt;br/&gt;&lt;b&gt;4. Shows &quot;possible related posts&quot; by category or content&lt;/b&gt;&lt;br/&gt;&lt;br/&gt;One of the best way to keep the reader stay in our blog after finished reading a post is by offering them to read another related articles. It is very nice if related posts are shown in relation with the content but related posts by category is also good enough for me.&lt;br/&gt;&lt;br/&gt;You can also suggest a new feature directly to the Blogger team &lt;a href=&#39;http://help.blogger.com/?page=wishlist&#39;&gt;here&lt;/a&gt;. I&#39;m waiting for the good news! ;)&lt;/div&gt;</description><link>http://habsq.blogspot.com/2008/07/blogger-wish-list.html</link><author>noreply@blogger.com (Ismail Habib)</author><thr:total>18</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-26918278.post-3285024767795813037</guid><pubDate>Tue, 01 Jul 2008 17:46:00 +0000</pubDate><atom:updated>2008-07-01T20:09:47.910+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">AI</category><category domain="http://www.blogger.com/atom/ns#">Article</category><title>The Limit of Artificial Intelligence (AI)</title><description>&lt;div xmlns=&#39;http://www.w3.org/1999/xhtml&#39;&gt;I always crazy about sci-fi futuristic movies. Humanoid robots, machines vs men (with the help of Arnold) wars, or robots taking over the whole earth and keeping men as batteries. Simply love them. Most of those movies introduced the existence of highly-intelligent machines. Sometimes they are shown as having a human-level intelligent, in other case they are even better. Well now the question is: is it even possible? To what extent the development of so called Artificial Intelligence (AI) will be?&lt;br/&gt;&lt;br/&gt;Back in 1960 something, experts predicted that in 20 years machine would be capable of doing everything human capable of, which is often called as &quot;Strong AI&quot;. With respect for those AI experts, we are now in 2008 and it&#39;s not even close. Strong AI is proven to be much more difficult and complicated to achieve. This misprediction has caused AI experts being addressed as a “liar”, and consequently being forced to changes the direction of AI research from “Strong AI” into a more short-term, specific domain of problem, which is called &quot;Applied AI&quot; or &quot;Weak AI&quot;. However, the dream of “human level AI” will never cease, and debate about it is always interesting to follow.&lt;br/&gt; &lt;br/&gt;There has been a great discussion about whether human level AI is likely to be achieved by a mere symbol processing like what most weak AI commonly use. By applying a huge collection of formal rules and in addition, scaling up processing capabilities and storage capacity, and there we are. This opinion is greatly opposed by some experts. As current system lacks of something that is called “understanding”, “minds”, “conscience”, or other things which is related to mental states.  The argument based on the idea that there is something more than just behavior to call a machine have an intelligent comparable to human. For example, let say that a machine capable of translating English to French. Even if the machine did it correctly, it is arguably incorrect to say that the machine actually “understand” English (or French).&lt;br/&gt;&lt;br/&gt;But who need minds anyway? Intelligent is all about behavior, and it alone is enough. To see it from a different perspective, I (and my ignorance) have a trouble to imagine what “minds” and “conscience” are. Are they just some terms used to express something unexplainable? Or perhaps it just simply does not exists from the very beginning?&lt;br/&gt;&lt;br/&gt;I have a nice discussion with one of my friend about this matter, and his view is somewhat different from what I expect, but nevertheless very fascinating to be followed. His first thought is that, even if human are capable of doing it, creating a machine with human level intelligent is unnecessary. Life is difficult enough, why would you like to increase the competition among human by introducing some humanoids? Other thing he expressed is that there is no way human will be able to do such a thing. An inventor would not be able to invent anything equal or beyond itself, as human is not God.&lt;br/&gt;&lt;br/&gt;p.s: I am not an AI researcher nor expert in this field. Just someone who has an interest in it.&lt;br/&gt;&lt;/div&gt;</description><link>http://habsq.blogspot.com/2008/07/limit-of-artificial-intelligence-ai.html</link><author>noreply@blogger.com (Ismail Habib)</author><thr:total>14</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-26918278.post-5869849311355887708</guid><pubDate>Sun, 29 Jun 2008 09:45:00 +0000</pubDate><atom:updated>2008-06-29T13:17:56.829+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Internet</category><title>Internet Time Machine</title><description>&lt;div xmlns=&#39;http://www.w3.org/1999/xhtml&#39;&gt;&lt;div align=&#39;left&#39;&gt;Remember my post about &lt;a href=&#39;http://www.geekyblogger.com/2008/06/google-and-yahoo-from-old-time.html&#39;&gt;Google and Yahoo From The Old Time&lt;/a&gt;? You didn&#39;t think that I made those screen capture from lo&lt;img height=&#39;72&#39; width=&#39;204&#39; style=&#39;float: left; margin-top: 10px; margin-bottom: 10px; margin-right: 10px;&#39; src=&#39;http://www.archive.org/images/wayback.gif&#39;/&gt;ng time ago, did you? Well, in fact I didn&#39;t. Going back in time is surely not possible, at least not for now. Luckily, a website called &lt;a href=&#39;http://www.archive.org/web/web.php&#39;&gt;Internet Archive WayBack Machine&lt;/a&gt; allows us to blast to the past and surfing through the Internet in the past. The idea is simple, it crawls web pages and puts them into archive. Obviously, it&#39;s not possible to archive every single web site running out there, but their attempt is quite incredible. Up until now, they claimed to have around 85 billion web pages archived from 1996.&lt;br/&gt;&lt;br/&gt;You could access the WayBack Machine directly from the website or use the button for browser by drag-and-drop this link: &lt;a href=&#39;javascript:location.href=&amp;apos;http://web.archive.org/web/*/&amp;apos;+document.location.href;&#39; title=&#39;WayBack&#39;&gt;Wayback&lt;/a&gt; to your browser toolbar. Enjoy the past.&lt;/div&gt;&lt;/div&gt;</description><link>http://habsq.blogspot.com/2008/06/internet-time-machine.html</link><author>noreply@blogger.com (Ismail Habib)</author><thr:total>18</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-26918278.post-6949723955687786315</guid><pubDate>Sat, 28 Jun 2008 13:23:00 +0000</pubDate><atom:updated>2008-06-30T10:22:43.250+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Misc</category><title>New Blog Name and Domain</title><description>&lt;div xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;Today is quite a day for me and my blog. I decided to change my blog name from &lt;span style=&quot;font-weight: bold;&quot;&gt;a programmer&#39;s thought&lt;/span&gt; into &lt;span style=&quot;font-weight: bold;&quot;&gt;a computer geek&#39;s blog&lt;/span&gt;. The reason is because the old name is not so relevant with the content of my blog. Thus, instead of focusing in programming-related post, I can freely put anything as long as it has something to do with computer *wink*.&lt;br /&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmtOuUEN3HdnUpQ0Xntds_zJf2SMeH5Xj_Yfju4HCeS_LOp9n_s_eQtXDqyU6-XyKqIbtSLkx3rBc-Ie13K69PqzYB-vPejpA8O6NoRWDkQ3s953i1BGBiKksgRcuOuhYEAv1A_A/s1600-h/geekblog.jpg&quot; onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot;&gt;&lt;img id=&quot;BLOGGER_PHOTO_ID_5216954231104215602&quot; alt=&quot;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmtOuUEN3HdnUpQ0Xntds_zJf2SMeH5Xj_Yfju4HCeS_LOp9n_s_eQtXDqyU6-XyKqIbtSLkx3rBc-Ie13K69PqzYB-vPejpA8O6NoRWDkQ3s953i1BGBiKksgRcuOuhYEAv1A_A/s400/geekblog.jpg&quot; style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;The domain is also changed. I used to use a subdomain from blogger &lt;a style=&quot;font-weight: bold;&quot; href=&quot;http://habsq.blogspot.com/&quot;&gt;habsq.blogspot.com&lt;/a&gt;, but then a friend of mine (yes, even a computer geek has friends) told me that it is better to use a domain of my own. Finding the right name for my blog is quite painful experience. Most of the name I thought has already been registered, especially because I prefer to have a .com or .net extension which sounds much cooler than those with .us or .info for example ;) Ultimately I decided to use the name &lt;a style=&quot;font-weight: bold;&quot; class=&quot;linkification-ext&quot; href=&quot;http://www.geekyblogger.com/&quot; title=&quot;Linkification: http://www.geekyblogger.com&quot;&gt;www.geekyblogger.com&lt;/a&gt; which doesn&#39;t sound too bad, don&#39;t you think so? I used &lt;a href=&quot;http://www.namecheap.com/&quot;&gt;NameCheap&lt;/a&gt; to register and it&#39;s quite cheap since I used a promotion code “ROSEMONTH” (thanks to Qiqinofa). So, please be nice to me and update your bookmark will you?&lt;br /&gt;&lt;br /&gt;I will keep my hosting in blogger until I decide that I really need my own hosting for this blog. For now, enjoy my blog!&lt;/div&gt;</description><link>http://habsq.blogspot.com/2008/06/new-blog-name-and-domain.html</link><author>noreply@blogger.com (Ismail Habib)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmtOuUEN3HdnUpQ0Xntds_zJf2SMeH5Xj_Yfju4HCeS_LOp9n_s_eQtXDqyU6-XyKqIbtSLkx3rBc-Ie13K69PqzYB-vPejpA8O6NoRWDkQ3s953i1BGBiKksgRcuOuhYEAv1A_A/s72-c/geekblog.jpg" height="72" width="72"/><thr:total>14</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-26918278.post-3451213902879382440</guid><pubDate>Tue, 24 Jun 2008 19:38:00 +0000</pubDate><atom:updated>2009-01-18T10:52:54.492+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Internet</category><category domain="http://www.blogger.com/atom/ns#">Life Hack</category><category domain="http://www.blogger.com/atom/ns#">Programming</category><category domain="http://www.blogger.com/atom/ns#">Tutorial</category><title>Modifying Google Translation Button to Open Translation in New Tab/Window</title><description>&lt;div xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;The &lt;a href=&quot;http://www.geekyblogger.com/2008/05/creating-one-click-web-page-translation.html&quot;&gt;translation button from Google&lt;/a&gt; has proved to be very useful in most situation (by me), especially since the &lt;a href=&quot;http://www.geekyblogger.com/2008/05/google-translation-now-with-language.html&quot;&gt;language detection was introduced&lt;/a&gt;. However, I feel that there is something lacking. The problem is that the translation generated replaces the current active window/tab while sometimes I prefer to have another window/tab open. The translation button itself is a JavaScript, so we can play with is just a little bit. Here is the original code for translation button (I use the code for translation into English):&lt;br /&gt;&lt;br /&gt;&lt;code&gt;javascript:&lt;br /&gt;var t = ((window.getSelection&amp;amp;&amp;amp;window.getSelection()) || (document.getSelection&amp;amp;&amp;amp;document.getSelection()) || (document.selection&amp;amp;&amp;amp;document.selection.createRange &amp;amp;&amp;amp; document.selection.createRange().text));&lt;br /&gt;var e = (document.charset || document.characterSet);&lt;br /&gt;if (t!=&#39;&#39;) {location.href=&#39;http://translate.google.com/translate_t?text=&#39; + t + &#39;&amp;amp;hl = en&amp;amp;langpair=auto|en&amp;amp;tbb=1&amp;amp;ie=&#39; + e;} else {location.href=&#39;http://translate.google.com/translate?u=&#39; + escape(location.href) + &#39;&amp;amp;hl = en&amp;amp;langpair=auto|en&amp;amp;tbb=1&amp;amp;ie=&#39; + e;};&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;In order to make the translation to be opened in a new window/tab, we just have to make a bit change in it:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;javascript:&lt;br /&gt;var t = ((window.getSelection&amp;amp;&amp;amp;window.getSelection()) || (document.getSelection&amp;amp;&amp;amp;document.getSelection()) || (document.selection&amp;amp;&amp;amp;document.selection.createRange &amp;amp;&amp;amp; document.selection.createRange().text));&lt;br /&gt;var e = (document.charset||document.characterSet);&lt;br /&gt;if (t!=&#39;&#39;) {var myWindow=window.open(&#39;http://translate.google.com/translate_t?text=&#39; + t + &#39;&amp;amp;hl=en&amp;amp;langpair=auto|en&amp;amp;tbb=1&amp;amp;ie=&#39;+e,&#39;Translation&#39;,&#39;&#39;)} else&lt;br /&gt;{var myWindow=window.open(&#39;http://translate.google.com/translate?u=&#39; + escape(location.href) + &#39;&amp;amp;hl=en&amp;amp;langpair=auto|en&amp;amp;tbb=1&amp;amp;ie=&#39; + e,&#39;Translation&#39;,&#39;&#39;)};&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;If you hate this kind of stuff, just drag and drop the link below to your browser toolbar:&lt;br /&gt;&lt;a href=&quot;javascript:var%20t=((window.getSelection&amp;amp;&amp;amp;window.getSelection())||(document.getSelection&amp;amp;&amp;amp;document.getSelection())||(document.selection&amp;amp;&amp;amp;document.selection.createRange&amp;amp;&amp;amp;document.selection.createRange().text));%20var%20e=(document.charset||document.characterSet);if(t!=&amp;amp;apos;&amp;amp;apos;){var%20myWindow=window.open(&amp;amp;apos;http://translate.google.com/translate_t?text=&amp;amp;apos;+t+&amp;amp;apos;&amp;amp;hl=en&amp;amp;langpair=auto|en&amp;amp;tbb=1&amp;amp;ie=&amp;amp;apos;+e,&amp;amp;apos;Translation&amp;amp;apos;,&amp;amp;apos;&amp;amp;apos;)}%20else%20{var%20myWindow=window.open(&amp;amp;apos;http://translate.google.com/translate?u=&amp;amp;apos;+escape(location.href)+&amp;amp;apos;&amp;amp;hl=en&amp;amp;langpair=auto|en&amp;amp;tbb=1&amp;amp;ie=&amp;amp;apos;+e,&amp;amp;apos;Translation&amp;amp;apos;,&amp;amp;apos;&amp;amp;apos;)};&quot;&gt;Translate to English&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I hope this is useful. Please let me know if you have a better idea. Obviously, any questions are welcome.&lt;br /&gt;&lt;br /&gt;edited: thanks for the suggestion&lt;br /&gt;&lt;h3&gt;Related Posts&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://www.geekyblogger.com/2008/05/creating-one-click-web-page-translation.html&quot;&gt;Creating a One-Click Web Page Translation Button&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.geekyblogger.com/2008/05/google-translation-now-with-language.html&quot;&gt;Google Translation Now With Language Detection&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</description><link>http://habsq.blogspot.com/2008/06/modifying-google-translation-button-to.html</link><author>noreply@blogger.com (Ismail Habib)</author><thr:total>61</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-26918278.post-6498792690510917282</guid><pubDate>Sun, 22 Jun 2008 13:43:00 +0000</pubDate><atom:updated>2008-06-23T17:47:42.767+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Blog</category><category domain="http://www.blogger.com/atom/ns#">Internet</category><category domain="http://www.blogger.com/atom/ns#">Software</category><title>ScribeFire: A Must Have Firefox Addon for Blogger</title><description>&lt;div xmlns=&#39;http://www.w3.org/1999/xhtml&#39;&gt;For the last two years I blog with mostly the same procedure. Open a word processor, write my article, find/create related pictures/videos, collect all required references, login to my blog account, copy-paste my article, format my article, upload/link images/videos, and publish it. Every blog-writing-cycle requires an enormous browsing, tab-switching, and some boring stuffs.&lt;br /&gt;&lt;br /&gt;I finally change the way I blog after two years of blogging, and its all thanks to &lt;a href=&#39;http://www.scribefire.com/&#39;&gt;ScribeFire&lt;/a&gt;. ScribeFire is an addon for the Mozilla Firefox Web Browser (which just reach the third version, in case you don&#39;t know) that let us to enhance our blogging experience. ScribeFire integrates the blogging capabilities with the browser. Posting, editing, and categorizing posts in your blog could be done much faster than usual.&lt;br /&gt;&lt;br /&gt;&lt;div align=&#39;center&#39;&gt;&lt;img src=&#39;http://lh6.ggpht.com/habsky/SF5Wz1vgZnI/AAAAAAAAAwQ/vyh9PDZNJOY/%5BUNSET%5D.jpg&#39; style=&#39;max-width: 800px; width: 510px; height: 167px;&#39;/&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Some reasons why I really love ScribeFire are:&lt;br /&gt;1. I don&#39;t need to login or open any web site just to start posting&lt;br /&gt;2. ScribeFire split my browser display which allows me to write and read website in parallel&lt;br /&gt;3. Copying links or pictures is as easy as drag and drop&lt;br /&gt;4. Works on multiple blogs&lt;br /&gt;5. Compatible with many blog services, including blogger and wordpress&lt;br /&gt;6. Creating links to my other posts (which I did a lot) is very easy and fast&lt;br /&gt;7. Compatible with Firefox 3 ;)&lt;br /&gt;&lt;br /&gt;So, are you a blogger? If yes, don&#39;t miss this great stuff!&lt;/div&gt;</description><link>http://habsq.blogspot.com/2008/06/scribefire-must-have-firefox-addon-for.html</link><author>noreply@blogger.com (Ismail Habib)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/habsky/SF5Wz1vgZnI/AAAAAAAAAwQ/vyh9PDZNJOY/s72-c/%5BUNSET%5D.jpg" height="72" width="72"/><thr:total>16</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-26918278.post-2873960568683928859</guid><pubDate>Mon, 16 Jun 2008 16:17:00 +0000</pubDate><atom:updated>2008-07-01T21:02:16.854+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Article</category><category domain="http://www.blogger.com/atom/ns#">ITS</category><category domain="http://www.blogger.com/atom/ns#">WSN</category><title>Wireless Sensor Network and Intelligent Transportation System</title><description>&lt;div xmlns=&#39;http://www.w3.org/1999/xhtml&#39;&gt;This is the third article related to &lt;a href=&#39;http://www.geekyblogger.com/search/label/ITS&#39;&gt;Intelligent Transportation System&lt;/a&gt;. You can see the &lt;a href=&#39;http://www.geekyblogger.com/2008/06/brainstorming-designing-intelligent.html&#39;&gt;first&lt;/a&gt; and &lt;a href=&#39;http://www.geekyblogger.com/2008/06/automated-highway-system-ahs.html&#39;&gt;second&lt;/a&gt; article first if you like to.&lt;br/&gt;&lt;br/&gt;It is widely known that knowing the position and speed of the vehicles on the road network in real-time is one of the major challenges that vehicle control and traffic management applications are facing [2]. Wireless Sensor Network (WSN) is considered as a potential technology that might be useful as an infrastructure component of an ITS since it received significant attention in the last decade and successful research put them in the forefront to answer this challenge [2].&lt;br/&gt;&lt;br/&gt;A wireless sensor network is a collection of nodes organized into a cooperative network. Each node consists of processing capability (one or more microcontrollers, CPUs or DSP chips), may contain multiple types of memory (program, data and flash memories), have a RF transceiver (usually with a single omni-directional antenna), have a power source (e.g., batteries, solar cells), and accommodate various sensors and actuators. The nodes communicate wirelessly and often self-organize after being deployed in an ad hoc fashion [1]. It is an infrastructure comprised of sensing(measuring), computing, and communication elements that gives the user the ability to instrument, observe, and react to events and phenomena in specified environment. The environment can be the physical world, or a biological system [3].&lt;br/&gt;&lt;br/&gt;Currently, wireless sensor networks are beginning to be deployed at an accelerated pace. It is not unreasonable to expect that in 10-15 years that the world will be covered with wireless sensor networks with access to them via the Internet. This can be considered as the Internet becoming a physical network. This new technology is exciting with unlimited potential for numerous application areas including environmental, medical, military, transportation, entertainment, crisis management, homeland defense, and smart spaces [1].&lt;br/&gt;&lt;br/&gt;Some typical applications of Wireless Sensor Network are tracking, monitoring, and controlling. In a typical application, a WSN is scattered in a region where it is meant to collect data through its sensor nodes. Existing and potential applications of sensor networks include, among others, military sensing, physical security, air traffic control, traffic surveillance, video surveillance, industrial and manufacturing automation, process control, inventory management, distributed robotics, weather sensing, environment monitoring, national border monitoring, and building and structures monitoring [3].&lt;br/&gt;&lt;br/&gt;&lt;span style=&#39;font-weight: bold;&#39;&gt;Key Technology&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;The basic functionalities for WSN depends on the application, which in this case is ITS. There are several type of sensor parameters, including: physical measurements, chemical and biological measurements, and event measurements. In ITS, the most important features are the vehicle states, which includes position, speed, direction. Other possibility of feature is classification, for example: is a vehicle in traffic a car, a truck, or a bus? Some possible sensors for ITS includes magnetoresistive, light, pressure, and video (visible or infrared).&lt;br/&gt;&lt;br/&gt;As for the transmission part, there are several wireless transmission technologies available. WSN can use some wireless technologies such as Bluetooth, ZigBee, Wireless LAN, WiMax, and 3G. The requirements of communication are related to the implementation of ITS. Some properties that have to be put into considerations are: range of communication, data throughput, and power consumption. In term of range, 3G covers the longest range, continue by WiMax, Wireless LAN, Bluetooth and Zigbee. Theoretically all those technologies are useful for ITS, however it is all depend on the topology and implementation of the system.&lt;br/&gt;&lt;br/&gt;ITS typically does not involved a high data rate communication, however if the system requires a responsive, real-time communication then using ZigBee is arguably not very suitable since it data rates is as low as 20 kbps. However, it is designed to run several years on a single set of batteries [3]. Bluetooth offers approximately 1 to 3 Mbps and Wireless LAN have a maximum data transmission rate of 54 Mbps, but none of them as energy-efficient as ZigBee.&lt;br/&gt;&lt;br/&gt;Each sensor node needs an operating system which capable of controlling hardware, provides hardware abstraction, and fill in the gap between application and hardware. TinyOS is one of the de facto standards of operating system designed specifically for WSN. It component library includes network protocols, distributed services, sensor drivers, and data acquisition tools. TinyOS’s event-driven execution model enables fine-grained power management, yet allows the scheduling flexibility made necessary by the unpredictable nature of wireless communication and physical world interfaces [3]. Some of its advantages are [3]:&lt;br/&gt;&lt;ul&gt;&lt;li&gt;It requires very little code and a small amount of data&lt;/li&gt;&lt;li&gt;Events are propagated quickly and the rate of posting a task and switching the corresponding context is very high&lt;/li&gt;&lt;li&gt;It enjoys efficient modularity&lt;/li&gt;&lt;/ul&gt;[1] California PATH. Vehicle Platooning and Automated Highways.&lt;br/&gt;[2] J. Sijs, Z. Papp, P.P.J. van den Bosch. Vehicle Motion-State-Estimation Using Distributed Sensing. 2007&lt;br/&gt;[3] Kazem Sohraby, Daniel Minoli. Wireless Sensor Network. 2007&lt;br/&gt;&lt;br/&gt;&lt;h3&gt;Related Posts&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&#39;http://www.geekyblogger.com/2008/06/brainstorming-designing-intelligent.html&#39;&gt;Brainstorming: Designing an Intelligent Transportation System (ITS)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&#39;http://www.geekyblogger.com/2008/06/automated-highway-system-ahs.html&#39;&gt;Automated Highway System (AHS)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</description><link>http://habsq.blogspot.com/2008/06/wireless-sensor-network-and-intelligent.html</link><author>noreply@blogger.com (Ismail Habib)</author><thr:total>16</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-26918278.post-5296035733635128084</guid><pubDate>Mon, 16 Jun 2008 15:34:00 +0000</pubDate><atom:updated>2008-06-30T06:47:03.832+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Software</category><title>Firefox 3, Download it Tomorrow!</title><description>&lt;div xmlns=&#39;http://www.w3.org/1999/xhtml&#39;&gt;Mozilla &lt;a href=&#39;http://developer.mozilla.org/devnews/index.php/2008/06/11/coming-tuesday-june-17th-firefox-3/&#39;&gt;announces that Firefox 3 will be available on Tuesday, 17 June 2008&lt;/a&gt;. Since &lt;a href=&#39;http://arstechnica.com/news.ars/post/20080529-mozilla-aims-for-record-breaking-firefox-3-launch.html&#39;&gt;Mozilla aims for record-breaking&lt;/a&gt;, we can help them by downloading Firefox 3, tomorrow... yes tomorrow! Don&#39;t forget it! ;D&lt;br/&gt;&lt;br/&gt;related post:&lt;br/&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&#39;http://www.spreadfirefox.com/en-US/worldrecord/?from=sfx&amp;amp;uid=0&amp;amp;aid=&#39;&gt;Spread Firefox | Download day 2008&lt;/a&gt; (external link)&lt;br/&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</description><link>http://habsq.blogspot.com/2008/06/firefox-3-download-tomorrow.html</link><author>noreply@blogger.com (Ismail Habib)</author><thr:total>15</thr:total></item></channel></rss>