yet another blog about computer, technology, programming, and internet

Sunday, May 30, 2010

Bagaimana Saya Menjelaskan REST kepada Istri (How I Explained REST to My Wife)

Sunday, May 30, 2010 Posted by Ismail Habib , 13 comments
For the first time since this blog is created. I'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 here. Some people may think that the article is somewhat sexist. However, I do believe that he didn't do it on purpose ;) The rest of this post will be in Bahasa Indonesia.

--

Artikel di bawah ini adalah terjemahan dari artikel yang ditulis oleh Ryan Tomayko. Beberapa bagian tulisan di bawah ini mungkin tidak/kurang/belum akurat, namun akan saya coba untuk memperbaharuinya setiap kali saya menemukan kekurangan. Semoga bermanfaat.

Istri: Siapa itu Roy Fielding?

Ryan: Orang yang cerdas.

Istri: Oh, memangnya apa yang dia lakukan?

Ryan: Dia membantu menulis (mengkode) web server pertama dan melakukan banyak research untuk menjelaskan kenapa web bekerja seperti itu. Namanya ada di spesifikasi untuk protokol yang digunakan untuk menerima halaman web dari server ke browser.

Istri: Bagaimana cara kerjanya?

Ryan: Maksudnya, web?

Istri: Yup.

Ryan: 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.

Istri: Maksudnya HTTP seperti yang ada di awal teks yang aku ketik di browser?

Ryan: Ya. Itu menunjukkan browser tentang protokol apa yang digunakan. Yang kamu ketik itu adalah satu dari sekian terobosan penting dalam sejarah komputer.

Istri: Kok bisa?

Ryan: 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.

Istri: Untuk halaman web?

Ryan: 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 "REST". REST memberikan definisi dari "resource" dimana "resource" ini ditunjuk oleh HTTP.

Istri: Halaman web itu sebuah resource?

Ryan: Kira-kira begitulah. Sebuah halaman web adalah representasi dari sebuah resource. Resource itu sendiri adalah sebuah konsep. URL-itulah yang diketikkan ke browser...

Istri: Aku tahu apa itu URL.

Ryan: 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.

Istri: Apa ada jenis lain dari representasi?

Ryan: 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.

Istri: Seperti apa?

Ryan: Hmm. Ada konsep yang disebut orang sebagai "Web Services". Itu bisa berarti macam-macam tapi konsep dasarnya ialah bahwa mesin juga dapat menggunakan web seperti manusia.

Istri: Maksudnya seperti robot begitu?

Ryan: 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.

Istri: Kenapa tidak?

Ryan: 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.

Istri: Dan sekarang kamu perlu untuk berkomunikasi dengan semua mesin?

Ryan: 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.

Istri: Apa?

Ryan: 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.

Istri: Jadi bagaimana mesin memberitahu satu sama lain tentang lokasi hal-hal tersebut?

Ryan: 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?

Istri: Ya.

Ryan: 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.

Istri: Tapi ketika aku melihat halaman web, aku nggak berpikir seperti itu.

Ryan: Orang lain juga tidak. Kecuali Fielding dan sedikit orang lain. Itulah kenapa mesin masih payah.

Istri: Bagaimana dengan kata kerja, kata ganti, dan kata sifat?

Ryan: Lucu juga kamu tanya itu karena itu adalah hal penting lain dari REST. Eng, setidaknya kata kerja lah.

Istri: Aku cuma bercanda.

Ryan: Itu lucu, tapi sebenarnya bukan joke sama sekali. Kata kerja itu penting. Ada konsep yang sangat kuat dalam pemrograman yang siebut sebagai "polymorphism" dalam Computer Science. Itu adalah cara kami mengatakan bahwa benda yang berbeda bisa memiliki kata kerja yang sama yang dikenakan pada mereka.

Istri: Aku tak mengerti.

Ryan: 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?

Istri: Aku tak mengerti.

Ryan: Kamu bisa mengambil 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.

Istri: Oke... jadi?

Ryan: Nah, itu yang penting. Bagaimana jika kita tidak bisa mengatakan, "ambil gelas", atau "ambil koran", atau "ambil remote"; Bagaimana jika untuk itu kita harus menggunakan kata kerja yang berbeda untuk setiap kata benda? Kita tidak bisa menggunakan kata "ambil" secara unversal, tapi harus menggunakan kata baru untuk setiap kombinasi kata kerja/kata benda.

Istri: Wow! Itu aneh.

Ryan: 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 "mengendarai gelas" atau "minum mobil". Tapi sebagian kata kerja sangat universal seperti ambil (GET), taruh (PUT), dan hapus (DELETE).

Istri: Kamu tidak bisa menghapus gelas.

Ryan: Oke, tapi kamu bisa membuang gelas. Tapi itu cuma joke kan?

Istri: Yeah.

Ryan: 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.

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.

Istri: Sepertinya GET itu kata kerja yang penting.

Ryan: 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.

Istri: Keren. Tapi aku tidak paham kenapa ini bisa mengubah apapun. Kata benda dan kata kerja apa saja yang kamu mau?

Ryan: Kata benda sudah ada tapi tidak dalam format yang benar.

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.

Istri: Mengapa mesin tidak bisa mengeri halaman web biasa?

Ryan: 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.

Istri: Jadi semua orang harus membuat format yang dapat dimengerti oleh mesin ke semua halaman web mereka?

Ryan: Kalau itu memang bermanfaat.

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.

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.

Istri: Jadi ini yang kamu dan semua orang komputer lakukan sekarang? Mendiskusikan bagaimana data itu seharusnya?

Ryan: 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.

Istri: Kenapa?

Ryan: Aku tidak tahu.

Istri: Kenapa kamu tidak bilang apa-apa?

Ryan: Mungkin nanti.

Friday, May 21, 2010

Friday, April 23, 2010

Drawing Circle on Google Maps using GWT

Friday, April 23, 2010 Posted by Ismail Habib , , , 50 comments
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.

We can do this in two ways. Drawing circle is easy. By using an image of circle and stretch 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:
Drawing circle on Google Maps with an image
Drawing circle on Google Maps with an approximation (using Polygon)

However, these two codes are written for JavaScript. I'm using the knowledge provided by both to rewrite it for GWT. I'm using the approximation method, but it should be easy for you if you want to use image instead of Polygon.

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 < 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, "white", 0, 0, "green", 0.5);

 map.addOverlay(circle);
}

Tuesday, March 23, 2010

Forcing a Screen Setting in Windows 7

Tuesday, March 23, 2010 Posted by Ismail Habib , 16 comments
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'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't even know if it is a word). Updating the driver of my VGA card and the screen doesn't help at all.


The fix was surprisingly easy and funny though. I went to the Screen Resolution adjustment, clicked on the "advanced" link. Open the "Monitor" tab, and unchecked "hide modes that this monitor cannot display". The available modes then changed, and I picked 60Hz as the refresh rate. Things went went from that moment on.

Moral of this story: sometimes you are allowed to force your Windows to do something, especially when it underestimating your expensive hardware :P

Tuesday, November 24, 2009

Changing Screen Resolution in Ubuntu under VirtualBox

Tuesday, November 24, 2009 Posted by Ismail Habib , , , 15 comments
This problem has caused me a relatively severe headache today. I'm doing a project which require me to use a Linux OS. Since I don'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.

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:

  • Choose Devices -> Install Guest Additions... on the VirtualBox menu
  • It will mount a CD which will appear on the Desktop
  • Go to your terminal (Applications -> Accessories -> Terminal)
  • Go to the CD directory by typing "cd /media/cdrom0" (without the quotes)
  • Type "sudo sh ./VBoxLinuxAdditions-x86.run", again, without the quotes. At the first try I couldn't find this file instead just a directory "OS2". If you experience the same thing, this is probably because you set your VirtualBox OS type as "Ubuntu" instead of "Linux 2.6". In this case, shut down your VirtualBox, change the OS type and redo the whole stuffs from the beginning
  • Restart your VirtualBox


Now, this has successfully gave me another resolution, which is 1024x768. Not bad, but I'm rather greedy and I want something more! (Hey, my PC could do better!). Continue with this:
  • Go to the terminal again
  • Edit the xorg.conf by typing "sudo gedit /etc/X11/xorg.conf" (yes, no quotes)
  • If you can find some already existing screen resolution, then you can add more, otherwise you can include something like this:
Section "Screen"
        Identifier "Screen0"
        Device     "Videocard0"
        DefaultDepth     24
        Subsection "Display"
                Viewport   0 0
                Depth     24
                Modes     "1280x1024" "1024×768"
        EndSubSection
EndSection

  • Be really careful when you're doing this. It is always nice to make a backup beforehand
  • Restart your VirtualBox and enjoy the new screen resolution


Reference:
1. http://www.mikesouthby.co.uk/2009/11/virtualboxubuntu-9-10-changing-screen-resolution/
2. http://www.mjmwired.net/linux/2009/09/15/default-xorg-resolution/

Saturday, November 14, 2009

Improving a Scanned Hand-Drawing

Saturday, November 14, 2009 Posted by Ismail Habib , 17 comments
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't mean that there is not other way to do it. I'm using Photoshop and Corel Draw to do this, but I suppose any other application with similar features should work fine.

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't help since the output will not posses simple, clear, and solid lines.

To overcome this situation, I propose to do a preprocessing for the scanned hand-drawing. I'm using a self hand-drawing with a manga-ish style. Forgive the quality, I'm only an amateur :)



Once you scan your hand-drawing, we need to adjust the color intensity. I'm using "Level" feature of Photoshop and adjust accordingly.



The next step is to apply a filter called "Photocopy" from Photoshop. I choose this because it will make the lines bolder and flatten (is this even the correct word?) the color.



The resulting image is good enough for tracing. I import the image and do the tracing with Corel Draw.



The result is clean and artistic. You can always make further adjustment easily since it is in form of vector.

Thursday, December 25, 2008

Game of Imagination

Thursday, December 25, 2008 Posted by Ismail Habib , 28 comments
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's going to be something fun, yups: it is about a game, to be precise: games.

A friend of mine posted this video about a game called: Crayon Physics Deluxe. 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 Incredible Machine 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 "pen" and transforms them into world objects which automatically follow the physics rule. Take a look at this cool video on their website:




It looks like a very nice game, but I'm not a type of guy who'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 Zany Doodle, 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.

Should I say anything more? Just download the Crayon Physics here and the free trial of Zany Doodle here. Enjoy!