<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Cinta Programming</title>
	<atom:link href="http://cintaprogramming.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://cintaprogramming.com</link>
	<description>A hacker does for love what others would not do for money.</description>
	<lastBuildDate>Mon, 05 Mar 2012 04:59:30 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Manipulasi bit bagian 3: bit shift</title>
		<link>http://cintaprogramming.com/2012/01/23/manipulasi-bit-bagian-3-bit-shift/</link>
		<comments>http://cintaprogramming.com/2012/01/23/manipulasi-bit-bagian-3-bit-shift/#comments</comments>
		<pubDate>Mon, 23 Jan 2012 11:08:12 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[bahasa]]></category>
		<category><![CDATA[bit]]></category>

		<guid isPermaLink="false">http://cintaprogramming.com/?p=111</guid>
		<description><![CDATA[Di bagian ini saya akan menunjukkan apa artinya menggeser bit ke kiri dan ke kanan. Waktu saya belajar konversi biner, saya mendapati bahwa cara paling mudah bagi saya dalam konversi desimal dan biner adalah dengan membayangkan &#8220;tabel&#8221; seperti ini: 128 &#8230; <a href="http://cintaprogramming.com/2012/01/23/manipulasi-bit-bagian-3-bit-shift/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Di bagian ini saya akan menunjukkan apa artinya menggeser bit ke kiri dan ke kanan. Waktu saya belajar konversi biner, saya mendapati bahwa cara paling mudah bagi saya dalam konversi desimal dan biner adalah dengan membayangkan &#8220;tabel&#8221; seperti ini:</p>
<table border="1">
<tr>
<td>128</td>
<td>64</td>
<td>32</td>
<td>16</td>
<td>8</td>
<td>4</td>
<td>2</td>
<td>1</td>
</tr>
</table>
<p>Misalnya saya ingin mengkonversi 1001 menjadi desimal, maka saya letakkan angka 1001 tersebut di bawah tabel:</p>
<table border="1">
<tr>
<td>128</td>
<td>64</td>
<td>32</td>
<td>16</td>
<td><b>8</b></td>
<td>4</td>
<td>2</td>
<td><b>1</b></td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td><b>1</b></td>
<td>0</td>
<td>0</td>
<td><b>1</b></td>
</tr>
</table>
<p>Kita lihat bit mana saja yang nilainya satu, lalu lihat angka di atas, dalam hal ini 8 dan 1, jika dijumlahkan, hasilnya adalah 9. Jadi 1001 biner = 9 desimal.</p>
<p>Dengan melihat tabel seperti itu, bisa kita bayangkan apa yang terjadi jika bit-bit biner semua digeser ke kiri satu posisi. Karena di geser satu posisi, maka kita menambahkan satu digit 0 di sebelah kanan, jadi 10010.</p>
<table border="1">
<tr>
<td>128</td>
<td>64</td>
<td>32</td>
<td><b>16</b></td>
<td>8</td>
<td>4</td>
<td><b>2</b></td>
<td>1</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td><b>1</b></td>
<td>0</td>
<td>0</td>
<td><b>1</b></td>
<td>0</td>
</tr>
</table>
<p>Nilainya sekarang menjadi 16 + 2 = 18 atau dua kali 9. Cara lain untuk memahami ini adalah dalam desimal (basis 10), jika kita menambahkan 0 di kanan maka nilainya menjadi 10 kali lipat, misalnya 18 &rarrow; 180 &rarrow; 1800. Demikian juga dalam biner, jika kita menggeser bit ke kiri, artinya kita menambahkan digit 0 di kanan, dan nilainya menjadi dua kalinya.</p>
<p>Proses di atas bisa diulangi berkali-kali. Dan proses tersebut tentunya bisa dibalik, menggeser ke kanan, dalam  desimal, jika kita potong satu digit terakhir, maka nilainya akan menjadi sepersepuluhnya, misalnya 180 &rarrow; 18. Atau tepatnya, sepersepuluh dengan pembulatan ke bawah, karena jika kita buang angka 5 dari 185 hasilnya adalah 18. Dalam notasi biner, jika kita geser ke kanan, maka nilainya akan menjadi setengahnya (juga dengan pembulatan ke bawah).</p>
<p>Jadi apa kegunaan bit shifting? Salah satu kegunaannya adalah untuk perkalian dan pembagian dengan dua. Kegunaan lainnya adalah untuk ekstraksi bit (mengambil bagian bit tertentu). Mengenai ekstraksi bit, akan saya bahas di bagian berikutnya.</p>
]]></content:encoded>
			<wfw:commentRss>http://cintaprogramming.com/2012/01/23/manipulasi-bit-bagian-3-bit-shift/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Manipulasi bit bagian 2: operator bit</title>
		<link>http://cintaprogramming.com/2012/01/10/manipulasi-bit-bagian-2-operator-bit/</link>
		<comments>http://cintaprogramming.com/2012/01/10/manipulasi-bit-bagian-2-operator-bit/#comments</comments>
		<pubDate>Tue, 10 Jan 2012 16:09:38 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[bit]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://cintaprogramming.com/?p=99</guid>
		<description><![CDATA[Dalam aljabar boolean kita berurusan dengan dua nilai: 0 dan 1 (atau false dan true). Dalam aljabar boolean, ada banyak operasi, tapi biasanya kita hanya peduli pada beberapa operasi dasar: AND, OR, NOT, dan XOR. Jika kita mengkonversi bilangan desimal &#8230; <a href="http://cintaprogramming.com/2012/01/10/manipulasi-bit-bagian-2-operator-bit/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Dalam <a href="http://en.wikipedia.org/wiki/Boolean_algebra">aljabar boolean</a> kita berurusan dengan dua nilai: 0 dan 1 (atau <code>false</code> dan <code>true</code>). Dalam aljabar boolean, ada banyak operasi, tapi biasanya kita hanya peduli pada beberapa operasi dasar: AND, OR, NOT, dan XOR. Jika kita mengkonversi bilangan desimal ke dalam bentuk biner, maka kita akan mendapatkan banyak angka 0 dan 1 (tergantung berapa besar bilangannya). </p>
<p>Dalam operasi bit, kita akan melakukan operasi pada tiap-tiap bit pada posisi yang sama. Jadi jika kita melakukan sebuah operasi pada dua angka 8 bit A dan B, maka: ambil bit pertama dari A, operasikan dengan bit pertama di B, lalu berikutnya ambil bit kedua dari A, lalu operasikan dengan bit kedua dari B, demikian seterusnya. </p>
<p>Di hampir semua bahasa pemrograman, operasi bit dilakukan sekaligus pada semua bit di sebuah register atau variabel. Berikut ini definisi beberapa operator bit yang sifatnya binary (Operasi dilakukan pada posisi bit yang sama di kedua variabel atau register tersebut):</p>
<ol>
<li>AND: jika ada dua bit di posisi yang sama  nilainya 1, maka nilai bit di posisi tersebut  menjadi 1, jika tidak maka 0 (1 AND 1 = 1, 1 AND 0 = 0, 0 AND 1 = 0, 0 AND 0 = 0).</li>
<li>OR:  jika salah satu bit atau kedua bit nilainya 1 di posisi yang sama, maka nilai bit di posisi tersebut  menjadi 1, jika tidak maka 0 (1 OR 1 = 1, 1 OR 0 = 1, 0 OR 1 = 1, 0 OR 0 = 0).</li>
<li>XOR: jika dua bit di posisi yang sama nilainya berbeda, maka nilai bit di posisi tersebut  menjadi 1, jika tidak maka 0 (1 XOR 1 = 0, 1 XOR 0 = 1, 0 XOR 1 = 1, 0 XOR 0 = 0).</li>
</ol>
<p>Ada juga operator unary, yaitu NOT: membalik bit 0 menjadi 1 dan sebaliknya.</p>
<p>Beberapa contoh: </p>
<ol>
<li>5 desimal xor 3 desimal : 0101 xor 0011 = 0110 = 6 desimal.</li>
<li>5 desimal or 3 desimal : 0101 or 0011 = 0111 = 7 desimal.</li>
</ol>
<p>Contoh lebih lengkap bisa dilihat di <a href="http://en.wikipedia.org/wiki/Bitwise_operation">Wikipedia</a>.</p>
<p>Mengetahui operator dasar AND sudah cukup untuk memeriksa apakah suatu bilangan sifatnya ganjil atau genap. Jika kita meng-AND-kan suatu bilangan dengan 1 dan hasilnya sama dengan 1 maka bilangan tersebut adalah ganjil, jika nol maka genap.</p>
<p>Di tulisan berikutnya saya akan membahas mengenai bit shift dan rotate.</p>
]]></content:encoded>
			<wfw:commentRss>http://cintaprogramming.com/2012/01/10/manipulasi-bit-bagian-2-operator-bit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Manipulasi bit bagian 1: representasi biner</title>
		<link>http://cintaprogramming.com/2012/01/08/manipulasi-bit-1/</link>
		<comments>http://cintaprogramming.com/2012/01/08/manipulasi-bit-1/#comments</comments>
		<pubDate>Sun, 08 Jan 2012 15:27:04 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[bahasa]]></category>
		<category><![CDATA[bit]]></category>
		<category><![CDATA[teknis]]></category>

		<guid isPermaLink="false">http://cintaprogramming.com/?p=95</guid>
		<description><![CDATA[Kemarin buku yang saya tunggu-tunggu akhirnya tiba juga: The Art of Computer Programming, Volumes 1-4A Boxed Set (Box Set). Dulu waktu kuliah, saya sudah membaca sebagian buku ini, tapi buku ini berat di matematika, jadi kebanyakan saya hanya membaca bagian &#8230; <a href="http://cintaprogramming.com/2012/01/08/manipulasi-bit-1/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Kemarin buku yang saya tunggu-tunggu akhirnya tiba juga: <a href="http://www.amazon.com/gp/product/0321751043/ref=as_li_qf_sp_asin_tl?ie=UTF8&#038;tag=yohannugro-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=0321751043">The Art of Computer Programming, Volumes 1-4A Boxed Set (Box Set)</a><img src="http://www.assoc-amazon.com/e/ir?t=yohannugro-20&#038;l=as2&#038;o=1&#038;a=0321751043" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />. Dulu waktu kuliah, saya sudah membaca sebagian buku ini, tapi buku ini berat di matematika, jadi kebanyakan saya hanya membaca bagian algoritmanya saja, sambil mencoba-coba sedikit latihannya. Terinspirasi dari banyak programmer di buku <a href="http://cintaprogramming.com/2011/12/29/review-buku-coders-at-work-reflections-on-the-craft-of-programming/">Coders at work</a> yang menyukai buku ini, dan minimal memakai buku ini sebagai referensi, maka saya sekarang berusaha membaca ulang koleksi buku Knuth, plus  membaca volume yang baru: Volume 4a.</p>
<p>Sebagai catatan: dalam wawancara Knuth sendiri tidak menyarankan seseorang membaca buku ini dari sampul ke sampul sampai habis. Saya membaca buku ini pertama skimming dulu, mencari topik menarik, setelah itu baru saya baca teliti bagian-bagian yang saya perlukan. Jadi jika Anda merasa berat membaca buku ini: coba langsung skip ke bagian yang menarik.<br />
<span id="more-95"></span></p>
<p>Ada satu bagian yang langsung menarik bagi saya di Volume 4A, judulnya: &#8220;Bitwise Tricks and Techniques&#8221;. Knuth menyatakan bahwa </p>
<blockquote><p>&#8220;&#8230; Boolean operations on binary numbers deserve to be much better known. Indeed, they&#8217;re an important component of every good programmer&#8217;s toolkit.&#8221;</p></blockquote>
<p> Kalau saya perhatikan di bangku kuliah, tidak banyak pelajaran mengenai manipulasi bit dan kegunaannya. Buat Anda yang tidak ingin membeli bukunya, Anda bisa mendapatkan bagian ini dari <a href="http://www-cs-staff.stanford.edu/~knuth/index.html">website Knuth</a> (<a href="http://www-cs-faculty.stanford.edu/~uno/fasc1a.ps.gz">fascicle 1a</a>).</p>
<p>Bagian buku itu menginspirasi saya untuk membuat beberapa tulisan tentang manipulasi bit, dan kegunaannya. Saya tidak akan mengulangi isi buku TAOCP, saya hanya akan menjelaskan beberapa hal dasar yang berguna sehari-hari. Di bagian pertama, saya hanya akan menjelaskan hal yang sangat dasar: representasi biner. Tujuannya: (1) untuk merefresh bagi yang sudah lupa (2) untuk mereka yang tidak mendapatkan pelajaran ini sama sekali.</p>
<p>Berbeda dari seri tutorial saya mengenai <a href="http://yohan.es/compiler">tutorial compiler</a>, saya menuliskan ini dengan cepat, dan mungkin kurang teliti. Saya harapkan ada masukan, dan pertanyaan supaya tulisan ini lebih baik. Nantinya setelah seri ini selesai, baru akan saya pindahkan kontennya ke situs <a href="http://yohan.es">yohan.es</a>. Dari dulu saya berniat menuliskan materi yang berhubungan dengan pemrograman, tapi jika saya menunggu sampai punya waktu untuk menulis lengkap dan baik, rasanya akan lama selesainya, jadi saya berusaha mendisiplinkan diri untuk menulis dengan cepat di blog ini. </p>
<p>Untuk teks yang berhubungan dengan formula matematika, saya akan menggunakan dua notasi, dengan kata, misalnya 2 pangkat N, dan dengan simbol yang dihasilkan menggunakan Latex (dalam contoh ini: <img src='http://cintaprogramming.com/wp-content/latex/d1d/d1db0d9c696a8c056e7117dbbb4ef6db-ffffff-000000-0.png' alt='2^n' title='2^n' class='latex' />). Alasannya kenapa saya tidak menggunakan superscipt dan subscript HTML adalah: saya pernah mendapati salah satu isi blog saya dicopy paste, dan semua 2 pangkat N berubah menjadi 2N. Semoga dengan ini hal tersebut tidak terjadi (dan jika terjadi, teks masih bisa dimengerti).</p>
<p>Sebelum masuk bagian paling dasar, mungkin ada yang bertanya: apa sih gunanya mengetahui manipulasi bit? Jika Anda memprogram sangat high level, hanya membuat aplikasi bisnis dengan Java atau PHP, maka mungkin Anda  akan sangat jarang menyentuh manipulasi bit. Tapi jika Anda memprogram low level, atau berusaha mengerti banyak algoritma, maka ini akan sangat berguna. Contoh penggunaan manipulasi bit adalah dalam enkripsi (misalnya permutasi bit) dan kompresi (misalnya huffman code, bit packing). Beberapa struktur data, misalnya bloom filter juga membutuhkan manipulasi bit dalam implementasinya.</p>
<p>Manipulasi bit dilakukan di level biner, jadi Anda perlu mengkonversi bilangan desimal menjadi biner untuk memahami apa yang terjadi. Saya buatkan beberapa daftar angka dari biner dari 1 sampai 10: </p>
<table border="1">
<thead>
<tr>
<td>Biner</td>
<td>Desimal</td>
</tr>
</thead>
<tbody>
<tr>
<td>0001</td>
<td>1</td>
</tr>
<tr>
<td>0010</td>
<td>2</td>
</tr>
<tr>
<td>0011</td>
<td>3</td>
</tr>
<tr>
<td>0100</td>
<td>4</td>
</tr>
<tr>
<td>0101</td>
<td>5</td>
</tr>
<tr>
<td>0110</td>
<td>6</td>
</tr>
<tr>
<td>0111</td>
<td>7</td>
</tr>
<tr>
<td>1000</td>
<td>8</td>
</tr>
<tr>
<td>1001</td>
<td>9</td>
</tr>
<tr>
<td>1010</td>
<td>10</td>
</tr>
</tbody>
</table>
<p>Dalam komputer modern, satu byte terdiri dari 8 bit (ini distandarkan sekitar tahun 1975). Untuk memudahkan pembacaan, saya akan memecah setiap 8 bit menjadi masing-masing 4 bit dengan spasi, misalnya angka 5 desimal dalam 8 bit: &#8220;0000 0101&#8243;. Dalam seri tulisan ini, saya akan menggunakan asumsi bahwa kita menggunakan urutan byte &#8220;<a href="http://en.wikipedia.org/wiki/Endianness">little endian</a>&#8220;. Urutan ini digunakan di Intel yang digunakan oleh kebanyakan orang saat ini.</p>
<p>Untuk menyatakan bilangan negatif, biasanya kita menggunakan <a href="http://en.wikipedia.org/wiki/Two's_complement">two&#8217;s complement</a>. Caranya adalah mengurangi 2 pangkat N (<img src='http://cintaprogramming.com/wp-content/latex/d1d/d1db0d9c696a8c056e7117dbbb4ef6db-ffffff-000000-0.png' alt='2^n' title='2^n' class='latex' />) dengan bilangan yang ingin kita negatifkan, dengan N adalah jumlah bit. Misalnya kita memakai satu byte (jumlah bit = N =  8), maka untuk menyatakan -1, kita menyimpannya sebagai ( 2 pangkat 8 ) minus 1, sama dengan 255 (<img src='http://cintaprogramming.com/wp-content/latex/b0d/b0d997a9a7d1133737e1ba3e5253a29a-ffffff-000000-0.png' alt='2^8-1 = 255' title='2^8-1 = 255' class='latex' />), atau dalam bit biner &#8220;1111 1111&#8243;. Di memori, angka yang tercantum adalah 255, tapi bisa dipandang sebagai 255 atau -1 tergantung dari interpretasi kita. Lihat contoh program berikut ini:</p>
<pre class="brush: cpp; title: ; notranslate">
#include &lt;stdio.h&gt;

int main()
{
        unsigned char x  = 255;
        char y = (char)x;
        printf(&quot;x = %d y = %d\n&quot;, x, y);
        return 0;
}
</pre>
<p>Jika kita kompilasi dan jalankan akan terlihat bahwa output x yang dideklarasikan sebagai <code>unsigned char</code> adalah 255 dan output y, yang nilainya disalin dari x, tapi dideklarasikan sebagai char adalah -1.</p>
<pre class="brush: bash; title: ; notranslate">
yohanes@koala:~$ gcc -Wall neg.c -o neg
yohanes@koala:~$ ./neg
x = 255 y = -1
</pre>
<p>Dengan cara yang sama, kita bisa mendapatkan bahwa -2 adalah 256-2 = 254. Secara umum, jika kita punya bilangan N bit yang sifatnya &#8220;signed&#8221;, kita bisa merepresentasikan  −((2 pangkat (N−1)))  sampai (2 pangkat (N−1))−1 atau: (<img src='http://cintaprogramming.com/wp-content/latex/d29/d297937f1a6eb61113ff0000c2546531-ffffff-000000-0.png' alt='-2^{n-1}' title='-2^{n-1}' class='latex' /> sampai <img src='http://cintaprogramming.com/wp-content/latex/8ac/8ac3b642ce597e3c87a27374eec5a299-ffffff-000000-0.png' alt='2^{n-1}-1' title='2^{n-1}-1' class='latex' />).</p>
<p>Perlu diperhatikan bahwa representasi two&#8217;s complement ini bergantung pada jumlah bit. Dalam bahasa C, sebuah char selalu 1 byte (standar), tapi sebuah int bisa 16 bit (2 byte), 32 bit (4 byte), dan sekarang 64 bit (8 byte), hal ini tergantung pada prosessor dan compiler yang digunakan. Misalnya C di DOS pada prosesor 8086 memakai ukuran <em>int</em> 16 bit.</p>
<p>Jika kita memakai sistem 32 bit, dengan satu int berukuran 32 bit, maka -1 adalah (2 pangkat 32) minus  1 = 4294967295 (<img src='http://cintaprogramming.com/wp-content/latex/166/16641ac21a7b88912efe333889df8174-ffffff-000000-0.png' alt='2^{32}-1 = 4294967295 ' title='2^{32}-1 = 4294967295 ' class='latex' />), atau dalam biner &#8220;<code>1111 1111 1111 1111 1111 1111 1111 1111</code>&#8220;. Jika kita ubah program sebelumnya menjadi seperti ini:</p>
<pre class="brush: cpp; title: ; notranslate">
#include &lt;stdio.h&gt;

int main()
{
        unsigned char x  = 255;
        char y = (char)x;
        int z = (int)y;
        int z2 = (int)x;
        unsigned int z3 = (unsigned int)z;
        printf(&quot;x = %d y = %d z= %d z2=%d\n&quot;,
                x, y, z, z2);
        printf(&quot;z3 = %u\n&quot;, z3);
        return 0;
}
</pre>
<p>Output program adalah:</p>
<pre>
x = 255 y = -1 z= -1 z2=255
z3 = 4294967295
</pre>
<p>Ajaib bukan, tidak pernah ada angka 4294967295 di dalam program, tapi nilai itu bisa keluar. Ini yang terjadi:</p>
<p>pernyataan pertama baik-baik saja, , nilai x adalah 255 </p>
<pre class="brush: cpp; title: ; notranslate">
x = 255;
</pre>
<p>Pada yang kedua,  y menjadi -1 karena y adalah signed char (8 bit)</p>
<pre class="brush: cpp; title: ; notranslate">
y = x;
</pre>
<p>Untuk pernyataan berikutnya, perlu diingat: z adalah signed, y adalah signed. Karena menyalin dari signed ke signed compiler melakukan
<li>sign extension</li>
<p> compiler tahu bahwa y bernilai -1 supaya nilainya tetap -1, maka compiler membuat z bernilai -1 (dalam versi 32 bit)</p>
<pre class="brush: cpp; title: ; notranslate">
z = y;
</pre>
<p>Untuk pernyataan berikutnya, z2 adalah signed, tapi 32 bit. Nilai x adalah 255, dan ini masih dalam range integer 32 bit.  Nilai z2 menjadi 255, karena nilai 255 bisa ditampung oleh integer 32 bit</p>
<pre class="brush: cpp; title: ; notranslate">
z2 = x;
</pre>
<p>Tambah satu variabel lagi: z3 adalah unsigned int, nilai -1 dari z di salin ke z3, tapi dinterpretasikan sebagai &#8220;unsigned&#8221; 32 bit. Artinya nilainya adalah 4294967295 (minus 1 dalam representasi 32 bit):</p>
<pre class="brush: cpp; title: ; notranslate">
z3 = z;
</pre>
<p>Sifat yang Anda lihat itu adalah sifat dalam bahasa C, dan sifat ini sangat dekat dengan sifat kebanyakan mesin. Saya tekankan bahwa itu adalah sifat C, karena berbagai bahasa punya sifat yang berbeda dalam menangani bilangan dan interpretasi bit. Di Java tidak ada tipe &#8220;unsigned&#8221;, jadi kita harus memanipulasi dengan cara lain (akan dibahas di bagian lain, karena melibatkan operator yang belum dibahas). Bahasa lain, seperti misalnya JavaScript hanya memiliki satu jenis tipe (namanya <code>Number</code>). </p>
<p>Demikian bagian pertama mengenai manipulasi bit, di bagian berikutnya saya akan membahas mengenai operator bit dasar (AND, OR, XOR, dan NOT) dan bit shifting.</p>
]]></content:encoded>
			<wfw:commentRss>http://cintaprogramming.com/2012/01/08/manipulasi-bit-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mengenal berbagai bahasa</title>
		<link>http://cintaprogramming.com/2012/01/07/mengenal-berbagai-bahasa/</link>
		<comments>http://cintaprogramming.com/2012/01/07/mengenal-berbagai-bahasa/#comments</comments>
		<pubDate>Sat, 07 Jan 2012 15:22:47 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[bahasa]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://cintaprogramming.com/?p=89</guid>
		<description><![CDATA[Anda mungkin sering membaca di berbagai buku, kalimat-kalimat semacam ini: &#8220;Prolog itu bagus untuk Artificial Intelligence&#8221;, &#8220;LISP bagus untuk AI&#8221;, &#8220;Fortran bagus untuk aplikasi numerik&#8221;, &#8220;C bagus untuk pemrograman sistem&#8221;. Tapi biasanya penulisnya tidak mendeskripsikan lebih lanjut apa maksud dari &#8230; <a href="http://cintaprogramming.com/2012/01/07/mengenal-berbagai-bahasa/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Anda mungkin sering membaca di berbagai buku, kalimat-kalimat semacam ini: &#8220;Prolog itu bagus untuk Artificial Intelligence&#8221;, &#8220;LISP bagus untuk AI&#8221;, &#8220;Fortran bagus untuk aplikasi numerik&#8221;, &#8220;C bagus untuk pemrograman sistem&#8221;. Tapi biasanya penulisnya tidak mendeskripsikan lebih lanjut apa maksud dari kalimat-kalimat tersebut, dan apa contohnya. Bukankah semua bahasa yang <a href="http://en.wikipedia.org/wiki/Turing_completeness">turing complete</a> itu sama saja?. Setelah lulus dari kuliah pun, banyak yang masih belum tahu: apakah pernyataan-pernyataan tersebut benar? kalau salah, yang benar seperti apa? apa contoh aplikasi di mana memprogram dengan Lisp/Prolog/Fortan akan lebih mudah atau lebih baik dari memprogram dengan bahasa lain?</p>
<p>Ketika orang diperkenalkan pada suatu bahasa, kebanyakan caranya adalah melalui pengenalan sintaks, lalu kemudian membuat aplikasi kecil dalam bahasa tersebut. Jika Anda belajar bahasa yang paradigmanya sama atau mirip, cara ini memang akan berhasil, tapi tidak jika paradigmanya berbeda.  Saya contohkan sedikit mengenai Lisp. Kebanyakan orang akan belajar mengenai apa itu atom, apa itu list, lalu operasi terhadap atom dan list (car, cdr, cons, list, dsb). Setelah itu kebanyakan akan membuat program manipulasi list sederhana. Di titik ini sebagian orang akan bertanya: di mana bagusnya Lisp, bagian mana yang membuat ini cocok untuk aplikasi AI?<br />
<span id="more-89"></span></p>
<p>Saran saya supaya bisa mengerti adalah dengan melihat beberapa program dalam suatu bahasa, sambil mencoba memikirkan: kalau ini saya tulis dalam bahasa yang saya kenal, kira-kira akan menjadi seperti apa?. Tentunya Anda harus mencari contoh yang agak realistis, jangan contoh terlalu sederhana seperti memanipulsai list. Misalnya jika Anda membaca buku <a href="http://mitpress.mit.edu/sicp/">Structure and Interpretation of Computer Programs</a>, sampai ke contoh <a href="http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-16.html#%_sec_2.3.2">Symbolic Differentiation</a> Anda bisa melihat bagimana mudah sekali memanipulasi simbol dalam Lisp. Bagaimana kira-kira jika Anda diminta menuliskan itu dalam Java? apa saja yang perlu Anda tulis? berapa kelas yang harus Anda buat untuk merepresentasikan parser, operator, simbol, dsb?</p>
<p>Bagian yang saya sebutkan di atas memang tidak langsung berhubungan dengan AI, tapi contoh tersebut memperlihatkan bagaimana mudahnya memanipulasi simbol dalam AI. Contoh manipulasi simbol yang termasuk dalam  AI adalah <a href="http://en.wikipedia.org/wiki/Automated_theorem_proving">Automated theorem proving</a>. Kode ATP pasti perlu memanipulasi persamaan matematika secara simbolik seperti program Symbolic Differentiation tesebut. </p>
<p>Saya ambil contoh bahasa lain: Prolog. Ketika Anda membuat program prolog, coba pikirkan betapa sulitnya menerjemahkan program sederhana seperti &#8220;pohon keluarga&#8221; ke bahasa prosedural atau object oriented. Program sederhana yang berisi: daftar nama; nama ayah dan nama ibu dari setiap orang; dan nama adik/kakak dari setiap orang. Kemudian diberikan sepasang nama X dan Y, X harus memanggil apa ke Y (kakek, ayah, paman?). Untuk Anda yang belum pernah melihat contoh kode Prolog, silakan lihat <a href="http://www.lix.polytechnique.fr/~liberti/public/computing/prog/prolog/prolog-tutorial.html">url ini</a>. Di bahasa dengan paradigma OOP, Anda perlu membuat tree, membuat method untuk menginsert tree, lalu melihat berbagai pola yang mungkin. Dalam Prolog, Anda cukup menyatakan apa yang dimaksud dengan &#8220;kakek&#8221;, apa yang dimaksud dengan &#8220;paman&#8221;. </p>
<p>Saat ini saya akan menskip pembahasan mengenai apakah benar Fortran lebih bagus untuk pemrosesan numerik, dan apakah C memang sangat bagus untuk system programming. Akan saya bahas lain waktu, tapi prinsipnya sama: apakah yang bisa saya lakukan dengan Fortran bisa saya lakukan dalam bahasa lain? jika iya apakah akan lebih baik, lebih mudah?</p>
<p>Setelah mengenal berbagai bahasa, Anda perlu menyadari bahwa: kita bisa memprogram sebuah aplikasi dalam berbagai bahasa. Sebuah aplikasi C atau Java atau yang lain bisa meng-embedd interpreter Prolog.Jika kita tahu ada bagian program yang terlalu rumit atau terlalu bertele-tele dinyatakan dalam bahasa C atau Java, dan mudah dilakukan dengan Prolog, maka kita bisa memanggil kode Prolog.</p>
<p>Secara umum: jika kita belajar bahasa X, kita bisa mengenal apa saja kelebihan bahasa tersebut, dan kemudian kita bisa menggunakan bahasa tersebut sesuai masalah yang kita hadapi. Mungkin bahasa tersebut hanya digunakan untuk bagian kecil dari program saja, tapi bisa menghemat waktu Anda, dan membuat program lebih mudah di mengerti.</p>
]]></content:encoded>
			<wfw:commentRss>http://cintaprogramming.com/2012/01/07/mengenal-berbagai-bahasa/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Masih Ingin Banyak Belajar</title>
		<link>http://cintaprogramming.com/2012/01/03/masih-ingin-banyak-belajar/</link>
		<comments>http://cintaprogramming.com/2012/01/03/masih-ingin-banyak-belajar/#comments</comments>
		<pubDate>Tue, 03 Jan 2012 15:07:49 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[umum]]></category>

		<guid isPermaLink="false">http://cintaprogramming.com/?p=86</guid>
		<description><![CDATA[Dari dulu ada banyak sekali hal-hal yang masih ingin saya pelajari yang berhubungan dengan pemrograman, ada banyak hal yang ingin saya buat. Setiap kali saya melihat sesuatu dilakukan, saya penasaran: bagaimana sih caranya teknologi itu bekerja? rasanya seperti apa sih &#8230; <a href="http://cintaprogramming.com/2012/01/03/masih-ingin-banyak-belajar/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Dari dulu ada banyak sekali hal-hal yang masih ingin saya pelajari yang berhubungan dengan pemrograman, ada banyak hal yang ingin saya buat. Setiap kali saya melihat sesuatu dilakukan, saya penasaran: bagaimana sih caranya teknologi itu bekerja? rasanya seperti apa sih memprogram benda seperti itu? Sekarang saya ingin menuliskan sebagin hal yang sudah saya pelajari/lakukan, dan hal-hal yang ingin saya lakukan. Sebagian ini bisa dianggap resolusi 2012.</p>
<p>Ini beberapa daftar keinginan saya dari mulai waktu jaman SMU dulu yang saya ingat saat ini yang sudah kesampaian:</p>
<ul>
<li>memprogram virus polimorfik</li>
<li>membuat antivirus</li>
<li>Membuat animasi dengan assembly yang kurang dari 100 byte (waktu itu saya membuat animasi API)</li>
<li>membuat program kompresi (cuma pernah huffman, belum yang lain)</li>
<li>membuat game mode grafik (dulu pernah membuat beberapa, tidak ada yang benar-benar selesai, tapi sudah cukup puas)</li>
<li>memproses gambar (teknik dasar manipulasi piksel)</li>
<li>membuat daemon</li>
<li>memprogram Wii (porting 2 emulator)</li>
<li>membuat server HTTP, proxy server</li>
<li>mengimplementasikan beberapa enkripsi, dan setidaknya memahami berbagai jenis enkripsi (tidak pusing lagi dengan istilah stream, block, cbc, dsb)</li>
<li>menulis program dengan FORTAN (cuma untuk tugas kuliah, setelah itu pernah menulis bagaimana menghubungkan gfortran dengan DELPHI)</li>
<li>membuat aplikasi desktop dengan GUI di Windows, Linux, OS X</li>
<li>menulis sendiri shellcode untuk exploit buffer overflow</li>
<li>memprogram set top box, yang punya fitur  DVD player (dengan Windows CE)</li>
<li>memprogram J2ME (pengalaman pertama memprogram mobile device dengan SL45, HP Java pertama)</li>
<li>memprogram serial port, modem, STK (Sim toolkit), SMS</li>
<li>membuat program yang berhubungan dengan SMS center</li>
<li>memprogram Palm OS, Symbian, BlackBerry</li>
<li>memprogram mesin EDC (mesin untuk swipe kartu kredit, mencetak tanda terima)</li>
<li>membaca source code Linux dan FreeBSD (serta NetBSD). Sudah berhasil memporting kernel Linux dan FreeBSD dan kodenya pernah direview oleh salah satu developer FreeBSD</li>
<li>membuat aplikasi web  dengan PHP, Java, Perl, Python</li>
<li>membuat aplikasi dengan HTML5 dan ActionScript</li>
<li>memprogram microcontroller (ATMEGA, PIC, dan MSP430)</li>
<li>memprogram jam tangan (MSP430)</li>
<li>Mempelajari assembly MIPS</li>
<li>Reverse engineering berbagai program</li>
<li>Membuat shareware yang dijual</li>
<li>Menjual aplikasi BlackBerry di appworld</li>
<li>membuat program untuk update ROM handphone (Acer E130)</li>
<li>membuat parser dan translator sederhana (salah satunya adalah interpreter BASIC dalam JavaScript)</li>
</ul>
<p>Masih ada beberapa yang ingin saya lakukan, tapi belum karena alasan ini dan itu:<br />
<span id="more-86"></span></p>
<ol>
<li>Membuat aplikasi Symbian yang dijual di OVI Store. Symbian sudah mencapai versi terakhir, dan saya sudah memprogram symbian dari dulu, tapi sampai sekarang belum pernah menjual di OVI Store. Mungkin tidak akan laku banyak, tapi ini bagian dari pengalaman.</li>
<li>Membuat program iOS yang dijual diappstore. Membuat sendiri dan diinstall dengan jailbreak sih sudah. Masih sayang kalau 99 USD dihabiskan tidak optimal.</li>
<li>Membuat aplikasi desktop yang di jual di Mac App Store. Sekarang ini sudah membuat aplikasi desktop untuk Mac, tapi untuk kantor, bukan pribadi.</li>
<li>Membuat program Android yang masuk ke Android Market. Sekarang ini saya sudah membuat aplikasi untuk beberapa proyek, tapi belum ada yang untuk publik.</li>
<li>Memprogram FPGA untuk membuat CPU sederhana. Sudah beli devkitnya,  dan baru mulai belajar.</li>
<li>Membuat sendiri compiler/interpreter yang lengkap, termasuk juga code generatornya</li>
<li>Membuat emulator NES (Game console pertama yang saya miliki). Memang sudah ada ratusan emulator di luar sana, tapi ini salah satu keinginan yang ada dari dulu.</li>
<li>Membuat aplikasi yang berguna dengan LISP. Entah berupa website, atau aplikasi apapun</li>
<li>Membuat aplikasi yang berguna dengan PROLOG. Entah berupa website, atau aplikasi apapun</li>
<li>Mempelajari lebih banyak mengenai parallel processing, terutama di low level, masalah multithread, multiprocess, sudah lulus, tapi masalah optimasi multi core (CUDA, OpenCL, dsb) belum</li>
<li>Ingin mempelajari FFT, terutama untuk sound processing, dengan tujuan lebih spesifik lagi: untuk membantu belajar bahasa Thai</li>
<li>Mendalami assembly ARM (sekarang ini dasarnya sudah ada, tapi masih jauh dari fasih dibanding assembly X86).</li>
<li>Mempelajari cara kerja JavaScript engine V8 dan WebKit. Setelah memprogram HTML5/JavaScript, dan membaca berbagai buku/tutorial, saya ingin melihat sendiri implementasi berbagai hal di level rendah (langsung ke sumbernya).</li>
<li>Mendalami QNX. Sekarang ini sudah cukup mendapat pencerahan mengenai userland QNX, tapi masih belum terlalu mengerti dengan berbagai aspek internalnya.</li>
<li>Membuat OS sendiri, compiler sendiri, text editor sendiri. Semoga yang ini suatu saat akan kesampaian, walaupun itu hanya OS sederhana, dengan compiler dan text editor sederhana.</li>
</ol>
<p>Beberapa hal sudah saya mulai (misalnya no 1 sampai 3), dan sisanya masih belum. Selain memprogram, saya juga ingin melakukan hal berikut:</p>
<ol>
<li>Membaca dan berlatih sebanyak-banyaknya dari buku The Art Of Computer Programming. Dulu pernah memulai, tapi berhenti. Tidak ada kata terlambat untuk memulai dari sekarang.</li>
<li>Menuliskan sebanyak-banyaknya mengenai algoritma, struktur data, dan pemrograman</li>
<li>Membuat video pelajaran pemrograman, baik itu yang sifatnya umum (dasar pemrograman), maupun yang khusus (misalnya mengenai C, C++, jaringan komputer)</li>
<li>Ingin benar-benar memakai dan mengadministrasi sistem FreeBSD, DragonFlyBSD, OpenBSD, dan/atau NetBSD. Meski saya sudah mengerti sampai level kernel, banyak hal di userspace yang saya tidak tahu</li>
</ol>
<p>Semoga saya masih diberi umur yang panjang untuk belajar semuanya itu. Selain itu, masih akan muncul banyak hal-hal baru yang perlu saya pelajari, jadi andaikan semuanya sudah berhasil, saya yakin masih banyak hal lain yang menunggu di masa depan.</p>
]]></content:encoded>
			<wfw:commentRss>http://cintaprogramming.com/2012/01/03/masih-ingin-banyak-belajar/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tools untuk debugging</title>
		<link>http://cintaprogramming.com/2012/01/01/tools-untuk-debugging/</link>
		<comments>http://cintaprogramming.com/2012/01/01/tools-untuk-debugging/#comments</comments>
		<pubDate>Sun, 01 Jan 2012 16:55:04 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[bahasa]]></category>
		<category><![CDATA[teknis]]></category>

		<guid isPermaLink="false">http://cintaprogramming.com/?p=81</guid>
		<description><![CDATA[Di posting ini saya sekedar ingin sharing metode dan tools yang biasa saya pakai untuk debugging program. Di lingkungan yang ideal, kita seharusnya punya debugger yang canggih, cepat dan reliable, tapi sayangnya sering kali ini tidak tersedia. Ini contoh beberapa &#8230; <a href="http://cintaprogramming.com/2012/01/01/tools-untuk-debugging/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Di posting ini saya sekedar ingin sharing metode dan tools yang biasa saya pakai untuk debugging program. Di lingkungan yang ideal, kita seharusnya punya debugger yang canggih, cepat dan reliable, tapi sayangnya sering kali ini tidak tersedia. Ini contoh beberapa lingkungan pengembangan yang &#8220;mengesalkan&#8221; yang pernah saya jumpai:</p>
<ul>
<li>Symbian versi awal (versi 6): untuk bisa mendebug, perlu IDE khusus dengan license khusus yang mahal. Symbian versi terbaru sudah semakin baik (tapi sekarang ini Symbian sudah akan berakhir).</li>
<li>BlackBerry: startup time debugger sangat lama, dan debugger sering error. Setiap kali menginstall versi program baru di BlackBerry, perlu restart (butuh sekitar 5 menit tiap kali restart). </li>
<li>Mendebug aplikasi Android di emulator. Startup emulator sangat lambat (bahkan di processor AMD quad core 3 ghz memori 16 GB) , lebih cepat mencoba langsung di HP. Masalahnya adalah ketika ada laporan: ada bug kecil di Android versi 2.2, tapi HP saya memakai Android 2.3</li>
<li>Debugging PHP di web hosting. Kadang ada masalah yang hanya muncul di web hosting, tapi tidak muncul ketika dicoba di server sendiri. Beberapa kemungkinan adalah karena versi PHP yang tidak sama, versi library yang tidak sama. Di server sendiri bisa mudah menginstall <a href="http://xdebug.org/">Xdebug</a>, tapi tidak tersedia di tempat hosting.</li>
<li>Nurit Point Of Sales. Device ini banyak bugnya, tidak tersedia debugger, dan jika crash, akan memprint isi memori di atas kertas thermal sekitar 1/2 meter.</li>
<li>Kernel FreeBSD. Ketika porting tahap awal, sangat sulit mendebug apa yang terjadi di level CPU. Masalahnya karena saya tidak menggunakan development board yang memiliki JTAG.</li>
</ul>
<p>Sebenarnya tidak semua lingkungan itu benar-benar mengesalkan jika kita punya uang, contohnya: jika saya punya uang beberapa ribu dollar, saya akan bisa mendebug Symbian dengan mudah. Jika saya punya beberapa HP Android berbagai versi, debugging Android juga lebih mudah. Jika saya punya development board resmi dengan JTAG, porting kernel akan lebih mudah. Jika saya hosting VPS dengan versi PHP saya sendiri, maka tidak akan ada masalah dengan PHP, dan andaikan ada masalah, saya bisa menginstall XDebug. Pada kenyataannya seringkali tidak tersedia dana untuk menyelesaikan berbagai masalah tersebut.<br />
<span id="more-81"></span><br />
Hal pertama yang saya lakukan sekarang adalah mencari lingkungan ternyaman untuk mengembangkan fitur utama. Biasanya ini di desktop. Misalnya ketika saya mengembangkan pembaca Alkitab, saya akan membuat dulu engine parsing file PDB di Desktop. Kadang saya menggunakan IDE, tapi lebih sering menggunakan command line. Setelah bisa dianggap selesai, baru saya membuat user interfacenya. Hal yang sama saya lakukan ketika membuat aplikasi HTML5 di tablet, saya mengembangkan dulu algoritma utama di browser desktop, baru setelah itu tampilan dipoles di device yang sesungguhnya. Jika mungkin, biasanya saya akan membuat skrip khusus, supaya aplikasinya bisa dibuild di desktop (setidaknya bagian algoritmanya) dan di device target.</p>
<p>Di berbagai compiler dan interpreter, biasanya ada opsi untuk menyalakan warning untuk menangkap kesalahan-kesalahan umum. Ini akan saya nyalakan sampai level maksimum. Untuk gcc saya menggunakan <code>-Wall</code>, untuk perl saya mengguanakan <code>use strict;</code>, untuk PHP saya menggunakan <code>error_reporting(E_ALL);</code>. Tapi tidak semua bahasa punya fitur ini (atau tidak perlu fitur semacam ini), misalnya Python. Sedangkan di Java, secara default warning akan muncul kecuali dimatikan.</p>
<p>Di desktop ada banyak tools yang bisa membantu mencari kesalahan program, misalnya <a href="http://pmd.sourceforge.net/">ada PMD untuk java</a>. Biasanya masalah ketika membuat algoritma utama di desktop adalah masalah memori dan kecepatan. Di desktop, semua terlihat cepat, tapi ketika dicoba di device, sangat lambat. Ini bisa jadi karena pemakaian memori yang terlalu banyak (garbage collector di HP tidak sebagus di desktop), atau memang algoritmanya kurang bagus. Untuk aplikasi Java, biasanya saya akan menggunakan fitur profiler bawaan SDK Java (<code>Java -XProf</code> dan <code>java -Xrunhprof</code>).</p>
<p>Untuk aplikasi native (C/C++), saya menggunakan <a href="http://valgrind.org/">valgrind</a> di Linux. Sebenarnya valgrind juga tersedia untuk beberapa OS lain, tapi dari pengalaman, versi Linux lebih reliable. Valgrind bisa dipakai untuk memeriksa aneka kesalahan dalam managemen memori. Valgrind juga punya fitur untuk mendeteksi kemungkinan terjadi deadlock pada program multithreading. Untuk program yang tidak terlalu rumit, kadang saya menggunakan <a href="http://bellard.org/tcc/">Tiny C compiler</a>, ada fitur pengecekan array yang sangat berguna (untuk mengecek <em>index out of bounds</em>, terutama array yang di stack, untuk array di heap, bisa dideteksi valgrind).</p>
<p>Untuk aplikasi native di Linux, kadang saya menggunakan juga &#8220;<a href="http://en.wikipedia.org/wiki/Strace">strace</a>&#8221; dan &#8220;<a href="http://en.wikipedia.org/wiki/Ltrace">ltrace</a>&#8220;. Fungsi kedua program tersebut adalah mencetak system call (strace) dan library call (ltrace)  dan hasilnya. Kedua program tersebut berguna untuk menemukan kesalahan-kesalahan dasar, seperti misalnya jika ternyata path file tidak ditemukan atau gagal dibaca karena masalah permission. Jika sudah terbiasa melihat output strace, maka akan bisa langsung melihat jika ada file yang tidak ditemukan.</p>
<p>Satu fitur menarik dari compiler gcc yang baru adalah stack protector. Tujuan utama fitur ini adalah mencegah agar program tidak bisa diekploitasi dengan buffer overflow. Jika ada buffer overflow, maka program akan berhenti. Fitur ini berguna karena akan membuat program &#8220;crash&#8221; di titik ketika terjadi buffer overflow, dan bukan di fungsi lain, jadi lebih mudah didebug.</p>
<p>Untuk aplikasi HTML5/JS, saya menggunakan Chrome dan/atau Firebug. Sekarang saya lebih banyak menggunakan Chrome, karena enginenya menggunakan webkit (sama seperti yang dipakai di iPad/iPhone/BlackBerry Playbook/Android), dan Inspector di Chrome sangat bagus. Saya belum banya memprogram hal kompleks dengan JavaScript, dan mungkin seharusnya saya mencoba memakai <a href="http://www.jslint.com/">JSLint</a> untuk mengecek kode Javascript saya.</p>
<p>Kadang walaupun sudah menggunakan tools terbaik, tetap saja ada bug-bug yang muncul. Misalnya: engine pembaca Alkitab sudah dites sempurna di desktop, tapi gagal di device sesungguhnya. Biasanya yang saya lakukan adalah menggunakan <code>print</code> untuk mencetak kondisi program saat itu. Mendebug dengan menggunakan print memang sangat primitif, tapi kadang-kadang cara seperti ini adalah cara terbaik, dan bahkan kadang-kadang itu satu-satunya cara. Misalnya ketika saya porting kernel Linux/FreeBSD, debugger belum bisa jalan, jadi satu-satunya cara mendebug adalah dengan menggunakan print. Dalam kasus BlackBerry, menjalankan simulator dengan mode debug butuh waktu lebih dari 1 menit, sedangkan tanpa mode debug, hanya butuh beberapa belas detik saja. </p>
<p>Biasanya saya akan membiarkan pesan-pesan debug di dalam program, tapi saya tambahkan <code>#ifdef DEBUG</code> (atau <code>if (debug)</code> di bahasa yang tidak memiliki preprocessor). Biasanya pesan debug ini akan terpakai lagi, jadi tidak saya hapus.</p>
<p>Jika masih belum ketemu bugnya, saya akan mencoba menggunakan debugger. Kadang-kadang mensetup lingkungan debugger tidak mudah, misalnya untuk mendebug PHP baris demi baris, perlu setup environment khusus, karena biasanya saya menulis kode PHP di text editor, tidak menggunakan IDE seperti PHPEclipse atau yang sejenis. Atau untuk mendebug aplikasi Flash/ActionScript, butuh flash player versi debug. Jika saya mengembangkan proyeknya untuk jangka panjang, biasanya saya menyempatkan diri mensetup environment untuk debugging.</p>
<p>Di Java (Desktop) ada fitur <code>setDefaultExceptionHandler</code> untuk mencegat exception apapun yang tidak tertangkap. Fitur ini sangat berguna untuk menemukan error tersembunyi (exception yang mungkin hanya terlihat jika dijalankan dengan console). Sayangnya fitur ini tidak tersedia di BlackBerry, jadi biasanya saya menambahkan try catch extra untuk menangkap error yang tidak terduga. Salah satu hal yang pernah saya temui adalah, ada exception yang dilempar yang tidak terdokumentasi di API (misalnya menurut dokumentasi, hanya akan melempar <code>IOException</code>, tapi ternyata bisa melempar <code>IllegalArgumentException</code>). </p>
<p>Jadi secara singkat yang saya lakukan:</p>
<ul>
<li>Mencoba membuat algoritma utama di lingkungan yang nyaman, dengan tools yang lengkap.</li>
<li>Menambah pesan debug (mencetak dengan print)</li>
<li>Agresif menambahkan try/catch, atau menambahkan banyak if untuk memastikan semua kondisi terpenuhi</li>
<li>Menggunakan level warning maksimum pada compiler/interpreter untuk menangkap kesalahan yang mungkin ditemui</li>
<li>Menggunakan tools-tools untuk menemukan kesalahan tanpa banyak berpikir, misalnya strace dan ltrace untuk melihat jalannya program, valgrind untuk mencari memory error, deadlock, dsb</li>
<li>Menggunakan debugger</li>
</ul>
<p>Saya berusaha menggunakan debugger semaksimal mungkin, karena biasanya saya hanya memakainya untuk error yang sangat sulit dicari. Beberapa fitur debugger yang sebaiknya diketahui oleh semua orang adalah:</p>
<ul>
<li>Fitur untuk step, stepover, stepout/finish (dan juga step n, step over n, karena sering saya lihat orang berkutat lama di debugger mengklik next-next-next).</li>
<li>Fitur untuk melihat stack trace/call trace.</li>
<li>Fitur untuk melihat isi memori dan variabel.</li>
<li>Fitur untuk mengubah isi memori dan variabel.</li>
<li>Fitur breakpoint dengan kondisi (misalnya break jika i>5).</li>
</ul>
<p>Biasanya debugger yang saya pakai adalah gdb tanpa interface khusus. Saya membiasakan memakai gdb karena ini bisa dipakai untuk debugging hampir apa saja, di OS apa saja, dan di mana saja (misalnya debugging di server remote).</p>
<p>Ternyata cerita mengenai debugging saja bisa sangat panjang, padahal banyak yang belum saya ceritakan (posting ini hanya bercerita secara umum, tidak sampai detail teknis). Mungkin detail teknis akan saya ceritakan di posting lain, terutama jika ada yang berminat detail debugging tertentu (misalnya spesifik debugging PHP atau Java).</p>
]]></content:encoded>
			<wfw:commentRss>http://cintaprogramming.com/2012/01/01/tools-untuk-debugging/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Review Buku &#8220;Coders at Work: Reflections on the Craft of Programming&#8221;</title>
		<link>http://cintaprogramming.com/2011/12/29/review-buku-coders-at-work-reflections-on-the-craft-of-programming/</link>
		<comments>http://cintaprogramming.com/2011/12/29/review-buku-coders-at-work-reflections-on-the-craft-of-programming/#comments</comments>
		<pubDate>Thu, 29 Dec 2011 15:08:41 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[umum]]></category>

		<guid isPermaLink="false">http://cintaprogramming.com/?p=72</guid>
		<description><![CDATA[Akhir-akhir ini saya sudah cukup jarang membaca buku programming. Saya lebih sering belajar hal baru dari tutorial dan dokumentasi di Internet. Saya lupa awalnya bagaimana, tapi saya menemukan (lagi) buku &#8220;Coders at Work: Reflections on the Craft of Programming&#8221;. Sebelumnya &#8230; <a href="http://cintaprogramming.com/2011/12/29/review-buku-coders-at-work-reflections-on-the-craft-of-programming/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Akhir-akhir ini saya sudah cukup jarang membaca buku programming. Saya lebih sering belajar hal baru dari tutorial dan dokumentasi di Internet. Saya lupa awalnya bagaimana, tapi saya menemukan (lagi) buku &#8220;Coders at Work: Reflections on the Craft of Programming&#8221;. Sebelumnya saya pernah menemukan versi bajakannya di internet, tapi tidak pernah saya selesaikan. Karena sekarang sudah punya Kindle, saya beli <a href="http://www.amazon.com/gp/product/B002RHN7RM/ref=as_li_tf_tl?ie=UTF8&#038;tag=yohannugro-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=B002RHN7RM">versi kindlenya</a><img src="http://www.assoc-amazon.com/e/ir?t=yohannugro-20&#038;l=as2&#038;o=1&#038;a=B002RHN7RM" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />, yang harganya lebih murah dari <a href="http://www.amazon.com/gp/product/1430219483/ref=as_li_tf_tl?ie=UTF8&#038;tag=yohannugro-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=1430219483">versi cetaknya</a><img src="http://www.assoc-amazon.com/e/ir?t=yohannugro-20&#038;l=as2&#038;o=1&#038;a=1430219483" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />.</p>
<p>Bukunya tidak terlalu tebal (632 halaman versi cetak), tapi karena sering terganggu, agak lama juga saya menyelesaikan buku ini.<br />
<span id="more-72"></span><br />
<a href="http://www.flickr.com/photos/yohanes/6593170891/" title="2011-12-29-214 by Yohanes &amp; Risna, on Flickr"><img src="http://farm8.staticflickr.com/7021/6593170891_001acb6e07_m.jpg" width="240" height="180" alt="2011-12-29-214"></a></p>
<p>Membaca ebook pemrograman di kindle dengan e-ink biasanya memang kurang enak, tapi buku ini tidak berisi kode, hanya wawancara, jadi seperti buku cerita. Ada 15 orang programmer yang diwawancara (daftar programmernya bisa dilihat <a href="http://www.codersatwork.com">di situs buku ini </a>). Pertanyaan-pertanyaannya hampir sama untuk semua programmer, misalnya &#8220;bagaimana Anda mulai memprogram&#8221;, &#8220;bagaimana caranya Anda memulai membuat sebuah program&#8221;, &#8220;bagaimana caranya mendebug program&#8221;, dan pertanyaan-pertanyaan semacam itu. Saya teringat dengan para pemula yang banyak bertanya pada saya bagaimana caranya mulai memprogram. Para pemula bisa belajar bagaimana orang-orang jagoan dalam buku ini mulai belajar memprogram. Ada yang mulai memprogram dari sejak kecil, ada yang baru mulai ketika kuliah, bahasa yang dipakai juga beragam. </p>
<p>Beberapa topik yang ditanyakan dan jawaban yang diberikan mungkin agak berat bagi pemula, misalnya mengenai hal-hal yang berhubungan dengan program verification. Pemula juga diharapkan tahu sedikit mengenai sejarah komputer dan bahasa pemrograman yang pernah ada. Misalnya ketika Knuth berbicara tentang kolom program di Fortran, Anda perlu tahu bahwa dulu fortran memakai format kolom yang rigid. Jika Anda membaca buku ini, dan ada topik yang tidak Anda mengerti, cobalah cari di Wikipedia, atau tinggalkan komentar di sini dan saya akan mencoba menjawabnya.</p>
<p>Saya menikmati buku ini karena bisa melihat berbagai sudut pandang para programmer hebat. Mungkin kesimpulan singkat yang bisa saya ambil adalah: ada banyak cara untuk mendekati berbagai masalah pemrograman (bagaimana merancang program, bagaimana membaca kode, bagaimana mendebug program, dsb), dan tidak ada cara yang mujarab, semua tergantung pada kemampuan dan cara berpikir masing-masing. Misalnya dalam membaca program ada yang top down, ada yang bottom up, ada yang secara acak, ada yang mendebug menggunakan debugger, menggunakan print, dan ada yang hanya dengan cara berpikir saja. </p>
<p>Setelah saya membaca buku ini, saran saya bagi yang baru belajar memprogram adalah: cobalah gaya Anda sendiri, sambil terus memperbaiki diri. Misalnya dalam hal mendebug program. Jika Anda mendebug program dengan cara mem-<em>print</em> sesuatu, dan itu berhasil, ya tidak apa-apa. Jangan minder ditertawakan jika belum bisa memakai debugger. Nikmatilah dulu bagian programmingnya. Nanti lama-lama ketika ada masalah yang tidak dapat ditemukan dengan sekedar <em>print</em>, coba belajar menggunakan debugger dengan baik. Yang penting adalah jangan kehilangan semangat programing, karena hal-hal di luar programming itu sendiri, misalnya merasa &#8220;Wah sebelum meneruskan program ini saya perlu belajar dulu <em>version control</em>, lalu <em>unit testing</em>, dsb&#8221; </p>
<p>Saya sendiri merasa lebih &#8220;rileks&#8221; setelah membaca buku ini, karena ternyata hal-hal yang saya lakukan yang kadang saya anggap bodoh (misalnya mendebug dengan <em>printf</em>) juga dilakukan oleh para programmer hebat di buku tersebut. Contoh lainnya: saya sempat tertarik pada <a href="http://en.wikipedia.org/wiki/Test-driven_development">Test Driven Development (TDD)</a>, tapi merasa tidak pernah punya waktu dan ketekunan untuk menulis semua test. Ternyata setelah saya renungkan, itu bukan style saya, dan tanpa mengikuti itupun saya bisa membuat program yang baik. Bahkan beberapa programmer di buku tersebut sangat menentang metode TDD.</p>
<p>Secara umum buku ini sangat bagus. Para pemula bisa menikmati dengan membaca beberapa pertanyaan awal kepada tiap orang (misalnya baca bagaimana tiap orang memulai programming), dan nanti ketika pemahamannya sudah meningkat, bisa membaca pertanyaan berikutnya. Bahkan para programmer veteran bisa menikmati buku ini, mungkin penuh nostalgia, merenungkan bagaimana dulu Anda belajar programming, sampai titik sekarang ini.</p>
<p><iframe src="http://rcm.amazon.com/e/cm?t=yohannugro-20&#038;o=1&#038;p=8&#038;l=as1&#038;asins=B005890G8Y&#038;ref=tf_til&#038;fc1=000000&#038;IS2=1&#038;lt1=_blank&#038;m=amazon&#038;lc1=0000FF&#038;bc1=000000&#038;bg1=FFFFFF&#038;f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://cintaprogramming.com/2011/12/29/review-buku-coders-at-work-reflections-on-the-craft-of-programming/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Belajar Pemrograman (di luar bangku kuliah)</title>
		<link>http://cintaprogramming.com/2011/11/04/belajar-pemrograman-di-luar-bangku-kuliah/</link>
		<comments>http://cintaprogramming.com/2011/11/04/belajar-pemrograman-di-luar-bangku-kuliah/#comments</comments>
		<pubDate>Fri, 04 Nov 2011 02:40:15 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[umum]]></category>

		<guid isPermaLink="false">http://cintaprogramming.com/?p=69</guid>
		<description><![CDATA[Ada beberapa orang yang membaca blog ini lalu mengirim email atau berkomentar. Kira-kira pertanyaannya begini: &#8220;Saya masih muda, tertarik pemrograman, harus mulai dari mana?&#8221;, &#8220;Saya dulu tidak kuliah informatika/komputer, tapi sekarang tertarik untuk memprogram, harus mulai dari mana?&#8221;, &#8220;Saya bingung &#8230; <a href="http://cintaprogramming.com/2011/11/04/belajar-pemrograman-di-luar-bangku-kuliah/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Ada beberapa orang yang membaca blog ini lalu mengirim email atau berkomentar. Kira-kira pertanyaannya begini: &#8220;Saya masih muda, tertarik pemrograman, harus mulai dari mana?&#8221;, &#8220;Saya dulu tidak kuliah informatika/komputer, tapi sekarang tertarik untuk memprogram, harus mulai dari mana?&#8221;, &#8220;Saya bingung mau mulai memakai bahasa apa&#8221;, &#8220;Compiler mana yang harus saya pakai?&#8221;, &#8220;Saya sudah mulai belajar memprogram, tapi saya nggak tau mau bikin software apa, ada ide?&#8221;.</p>
<p>Jawaban saya sebenarnya sangat sederhana: programlah yang Anda suka. Ini akan berpengaruh pada bahasa dan tools yang perlu Anda pakai. Misalnya Anda tertarik pemrograman karena ingin memprogram handphone Android Anda, maka belajarlah Java, belajar memakai IDE Eclipse (walau tidak wajib, tapi memakai Eclipse akan lebih bagus untuk pemula). Jika ingin memprogram iPhone, belilah Mac, belajar memakai XCode, dan belajar memprogram dalam Objective-C. Tapi sebenarnya itu juga tidak 100% benar, karena ada beberapa opsi dalam memprogram platform tertentu.</p>
<p>Di tahun 80-an, bahasa yang mudah dikuasai, dan bisa jalan di berbagai platform adalah BASIC. Sekarang yang mudah bagi pemula dan jalan di berbagai platform adalah HTML dan JavaScript. Jika niat Anda ingin membuat aplikasi yang jalan di berbagai platform, cobalah belajar HTML dan Javascript. Dengan tools/sdk seperti Titanium dan PhoneGap, Anda cukup belajar satu bahasa dan bisa berjalan di multi platform. </p>
<p>Lalu setelah belajar bahasa dan toolsnya, apa yang harus dibuat? itu terserah Anda. Cobalah membuat aplikasi yang Anda sendiri mau memakainya. Dengan membuat aplikasi untuk diri sendiri, Anda akan tau segala macam kekurangan aplikasi Anda. Jangan khawatir berpikir: aplikasi semacam ini sudah banyak, males ah bikinnya. Jika begitu cara berpikirnya, maka cuma akan ada beberapa lukisan bunga (ngapain ah ngelukis bunga, dah banyak yang bikin), dan tidak ada orang yang mau membuat apapun (misalnya tukang kayu akan bilang: ah ngapain bikin kursi sendiri, beli juga banyak). </p>
<p>Belajar memprogram itu enak karena umumnya tidak butuh bahan ekstra. Kalau lukisan Anda gagal, Anda perlu beli kanvas dan cat baru, kalau kursi buatan Anda gagal, Anda harus beli kayu lagi. Anda cuma butuh waktu untuk memperbaiki atau mengulang lagi jika program Anda salah.</p>
<p>Jadi intinya adalah: mulailah dari yang membuat Anda tertarik, maju terus, silakan coba-coba, jangan takut gagal. </p>
]]></content:encoded>
			<wfw:commentRss>http://cintaprogramming.com/2011/11/04/belajar-pemrograman-di-luar-bangku-kuliah/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Kenapa orang membuka source codenya?</title>
		<link>http://cintaprogramming.com/2011/07/29/kenapa-orang-membuka-source-codenya/</link>
		<comments>http://cintaprogramming.com/2011/07/29/kenapa-orang-membuka-source-codenya/#comments</comments>
		<pubDate>Fri, 29 Jul 2011 07:40:18 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[umum]]></category>

		<guid isPermaLink="false">http://cintaprogramming.com/?p=64</guid>
		<description><![CDATA[Saya membaca di sebuah majalah Indonesia yang berusaha menjelaskan kenapa orang mau membuat software open source. Di situ sedikit sekali disebutkan motivasi yang ada dan yang paling dibahas adalah developer atheis yang ingin berbuat kebajikan dalam hidup ini. Di posting &#8230; <a href="http://cintaprogramming.com/2011/07/29/kenapa-orang-membuka-source-codenya/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Saya membaca di sebuah majalah Indonesia yang berusaha menjelaskan kenapa orang mau membuat software open source. Di situ sedikit sekali disebutkan motivasi yang ada dan yang paling dibahas adalah developer atheis yang ingin berbuat kebajikan dalam hidup ini. Di posting ini saya hanya ingin menyatakan bahwa ada banyak motivasi lain bagi seseorang untuk membuat software open source, dan tidak perlu satu artikel penuh untuk membahas satu motivasi.</p>
<p><u>Ada alasan Komersial</u>. Banyak orang yang tidak tahu bahwa ada banyak cara menghasilkan uang dari open source. Berikut ini saya tunjukkan beberapa di antaranya:</p>
<ul>
<li>Developer membuat restriksi tertentu, misalnya jika ingin dipakai di aplikasi komersial, silakan bayar ke developer tersebut, atau buka source Anda. Contohnya lisensi GPL.</li>
<li>Developer menjual support untuk softwarenya (contoh: MySQL, gcc). Banyak pihak butuh support jika terjadi masalah di server mereka.</li>
<li>Developer punya versi yang lebih lengkap dan lebih bagus dari versi open sourcenya (contoh OpenBTS). Ini sedikit seperti model shareware, ada versi yang bisa dicoba, dan ada versi berbayarnya.</li>
<li>Developer punya plugin/module/library/theme untuk software open source yang bisa Anda beli (contoh: WordPress). Ini bisa banyak variannya, misalnya menjual tools khusus agar aplikasinya mudah dideploy di enterprise.</li>
<li>Developer menjual dokumentasi untuk softwarenya. Contohnya dokumentasi JPos harganya 50 USD. Programmer bisa mempelajari sendiri source codenya, tapi butuh waktu berapa jam? lebih murah membeli panduannya daripada berkutat dengan source code.</li>
<li>Website software tersebut ada iklannya, jadi developer mendapat uang dari iklan (banyak sekali proyek open source seperti ini).</li>
<li>Di software open source yang dipaketkan standar, ada iklannya (jika ingin versi tanpa iklan, silakan compile sendiri, contoh Free Download Manager)</li>
<li>Developer ingin supaya saingan saya yang closed source beralih ke software miliknya (kemudian membayar support atau membeli buku, atau melihat iklan di webnya, banyak contoh ini, misalnya OpenOffice). Sebagian orang juga berpikiran bahwa cara ini yang dipakai oleh Microsoft: biarkan saja sebagian orang membajak, asalkan perusahaan besar membayar lisensi Windows dan Office.</li>
<li>Developer ingin mempromosikan softwarenya untuk platform lain. Misalnya dulu Qt gratis di Linux, tapi komersial di Windows (sekarang gratis untuk semua platform).</li>
<li>Developer dibayar pihak lain atau bekerja sama dengan pihak lain, dan software tersebut sebenarnya mempromosikan produk mereka. Misalnya program yang hanya bisa melakukan koneksi ke database komersial tertentu. Firefox bekerja sama dengan Google (menjadikan Google sebagai search engine default).</li>
<li>Developer/perusahan ingin menguasai pasar dan akan mengambil keuntungan dari produk lain. Contohnya: Java. Oracle akan mengambil keuntungan dari berbagai application server for Java. Teknologi dasar Java sendiri bisa digratiskan dan diopensourcekan agar terkenal di berbagai platform.</li>
</ul>
<p><u>Ada alasan personal</u>. Alasan personal ini juga bisa banyak sekali:<br />
<span id="more-64"></span></p>
<ul>
<li>Masalah ideologi. Banyak orang yang fanatik dengan apapun, dari mulai soal serius seperti  agama, soal makanan (vegetarian, vegan, dsb), sampai yang tidak penting, seperti merk tas. Sebagian orang fanatik soal kebebasan software.</li>
<li>Masalah popularitas: ingin dikenal karena membuat sebuah software tertentu</li>
<li>Masalah keabadian nama: walaupun tidak dikenal luas, tapi nama saya ada di software terkenal yang dipakai semua orang, dan software itu akan &#8220;abadi&#8221; bebereapa puluh tahun ke depan.</li
<li>Membalas jasa: Developer pernah memakai software gratis buatan orang dan itu sangat berarti baginya, jadi dia ingin membagikan karyanya sebagai balasan.</li>
<li>Malas mengurus software: developer punya software yang tidak ingin dia jual (mungkin kurang dipoles), tapi kadang tetap butuh software itu, jadi dibiarkan saja menjadi open source, supaya orang lain yang me-<i>maintain</i>.</li>
<li>Malas membuat software: sebagian orang membuat bagian kecil software dan mengundang orang lain menyumbangkan kode (ingat, ini tidak selalu berhasil, kalau memang idenya jelek atau softwarenya jelek, belum tentu ada yang mau memakai apalagi berkontribusi)</li>
<li>Pamer: &#8220;saya bisa bikin software ini. Software saya lebih bagus dari software buatan orang lain.&#8221;</li>
<li>Dedikasi untuk orang yang dicinta. Ada software yang dibuat untuk anak, untuk istri, pacar, dsb.</li>
<li>Orang yang ingin berbuat sesuatu untuk agamanya. Misalnya saya membuat aplikasi Alkitab, sedangkan ada orang lain yang membuat aplikasi pengingat Shalat, dsb.</li>
<li>Software sudah tidak menguntungkan lagi, misalnya beberapa compiler yang sempat populer di tahun 80-an sekarang diopensourcekan, karena memang sudah tidak dipakai orang lagi. Pembuatnya hanya ingin orang lain bisa mempelajari karyanya, dan namanya bisa abadi di internet.</li>
<li>Orang atheis atau orang pendosa yang ingin berbuat kebaikan.</li>
</ul>
<p><u>Ada alasan terpaksa</u>. Sebagian  membuka source code mereka karena keterpaksaan:</p>
<ul>
<li>Developer membuat clone game komersial, tapi kalau dijual nanti dia bisa dituntut, jadi disebarkan saja gratis dan open source.</li>
<li>Developer memodifikasi program yang lisensinya menyatakan bahwa developer harus menyebarkan modifikasi tersebut.</li>
</ul>
<p>Jadi jangan heran kalau ada banyak software open source, banyak orang membuat software open source dengan motivasi masing-masing.</p>
]]></content:encoded>
			<wfw:commentRss>http://cintaprogramming.com/2011/07/29/kenapa-orang-membuka-source-codenya/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Asyiknya Open source</title>
		<link>http://cintaprogramming.com/2011/04/29/asyiknya-open-source/</link>
		<comments>http://cintaprogramming.com/2011/04/29/asyiknya-open-source/#comments</comments>
		<pubDate>Fri, 29 Apr 2011 17:10:33 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[hardware]]></category>
		<category><![CDATA[umum]]></category>

		<guid isPermaLink="false">http://cintaprogramming.com/?p=58</guid>
		<description><![CDATA[Sebagai orang yang cinta programming, saya sangat suka open source. Kali ini saya ingin menceritakan pengalaman pribadi saya dengan open source baru-baru ini. Sebagai orang yang sudah 3 kali mewakili Indonesia di Asia Open Source Symposium dan menjadi panitia ketika &#8230; <a href="http://cintaprogramming.com/2011/04/29/asyiknya-open-source/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Sebagai orang yang cinta programming, saya sangat suka open source. Kali ini saya ingin menceritakan pengalaman pribadi saya dengan open source baru-baru ini. Sebagai orang yang sudah 3 kali mewakili  Indonesia di Asia Open Source Symposium dan menjadi panitia ketika acara diadakan di Indonesia, saya sudah banyak mengemukakan dan mendengar masalah bagusnya open source sebagai ideologi dan untuk bisnis. Nah kali ini saya hanya akan membahas dari sudut pandang seorang pribadi yang cinta programming. Untuk Anda yang ingin mempertanyakan open source dari segi bisnis dan lain-lain, akan saya bahas lain waktu.</p>
<p>Saya baru membeli HP Android Acer BeTouch E130 beberapa minggu yang lalu. Device ini memiliki keyboard (bentuknya seperti Blackberry) dan harganya relatif murah. Sebenarnya banyak device android lain yang murah, tapi tanpa keyboard.</p>
<p><img src="http://yohan.es/android/emacs.png" /></p>
<p>Sebagai penggemar command line dan terminal, hal yang ingin saya lakukan adalah menjalankan Debian di device saya. Android menggunakan kernel Linux yang lisensinya GPL, sehingga saya bisa mendapatkan source kernelnya dan mengcompilenya. Saya bisa mengcompile sendiri modul ext3 sehingga saya bisa menginstall Debian dalam lingkungan chroot.</p>
<p>Ketika mulai bermain dengan debian, saya mulai menyadari bahwa keyboardnya kurang nyaman untuk mengetik karakter yang sering dibutuhkan di command line dan program, misanya karakter tilde (untuk shortcut home directory) karakter kurung siku buka dan tutup (untuk indexing array), karakter kurung kurawal buka dan tutup (untuk blok kode program), dsb.</p>
<p>Untungnya program terminal dan client ssh yang saya gunakan (Android Terminal Emulator dan ConnectBot) sifatnya opensource, jadi saya bisa memodifikasinya. Untungnya lagi, proyek keduanya ada di github, jadi saya hanya perlu mem-fork sourcenya dan mengubahnya. Sayapun bisa berbagi perubahan yang saya lakukan pada dunia dengan sangat mudah.</p>
<p>Setelah debian terinstall, dan dengan keyboard yang sudah lebih nyaman, saya bisa menginstall debian dan aneka program di dalamnya. Saya bisa menginstall hampir semua program yang ada di desktop saya, misalnya server SSH, compiler C, Java, interpreter PHP, Perl, Python.<br />
<span id="more-58"></span><br />
Saya menemukan adanya masalah dalam driver micro sd, yang hanya muncul jika ada penulisan sangat banyak dalam waktu singkat (hasilnya data bisa corrupt). Namun karena drivernya merupakan bagian dari kernel (yang open source), maka saya bisa memperbaikinya juga.</p>
<p>Sebenarnya cerita eksplorasi saya cukup panjang, lengkapnya saya tuliskan di <a href="http://yohan.es/android/">http://yohan.es/android/</a>.</p>
<p>Mungkin Anda pikir saya &#8220;gila&#8221;, untuk apa menginstall Debian lengkap di ponsel?. Jika Anda pikir saya gila, maka saya pikir Anda kurang mengerti keampuhan puluhan ribu program yang tersedia di debian (baik command line maupun grafik) di banding berbagai aplikasi yang tersedia di Android Market (atau aplikasi Android di luar market). </p>
<p>Saya berikan beberapa contoh: Memanipulasi gambar dalam berbagai format bisa dilakukan dengan ImageMagick (dan di Android atau bahkan iPhone tidak ada program yang setara dengan itu kemampuannya dalam hal support format file dan manipulasi yang bisa dilakukan), berbagai macam format dokumen dan ebook bisa dikonversi di command line. Berbagai macam arsip kompresi bisa dibuka di command line. Saya bisa membuat dokumen dengan lebih efektif menggunakan org-mode atau latex dan menghasilkan PDF yang lebih indah daripada yang bisa dibuat dengan word processor di Android.</p>
<p>Di sini juga terlihat kehebatan open source. Berapa lama Anda harus menunggu berbagai program di Windows untuk beralih ke 64 bit? Apakah Anda menunggu program komersial OS tertentu diporting ke OS Anda? (ada yang menantikan program tertentu dari OS X diporting ke Windows dan sebaliknya). Berbagai program open source bisa dikompilasi oleh siapa saja untuk mendukung platform/CPU baru, dan ini bisa dilihat buktinya dari Debian yang ada di ponsel saya, yang memiliki hampir semua software di debian untuk desktop amd64 yang saya miliki.</p>
<p>Saya memakai banyak produk Apple, tapi sangat menyayangkan bahwa Apple tidak mengijinkan compiler/interpreter di platform iOS (iPod Touch, iPad, iPhone). Padahal menurut saya memiliki compiler di HP bisa berguna untuk mencoba berbagai macam algoritma ketika sedang terpikir sesuatu. Perlu dicatat bahwa saya tidak selalu harus mengetik di layar yang kecil, saya bisa melakukan SSH ke device dari desktop untuk mengetik dan melakukan berbagai hal lain. Dengan adanya compiler di HP, saya juga bisa bereksperimen dengan prosessor ARM (misalnya untuk mempelajari assembly untuk explot <a href="http://yohan.es/security/buffer-overflow/">buffer overflow</a>.</p>
<p>Dulu komputer pertama yang saya miliki adalah <a href="http://en.wikipedia.org/wiki/Apple_IIe">Apple IIe</a> dengan prosessor 1 Mhz, RAM 64 kkb, ROM 16 KB (dengan disk drive yang hanya bisa menampung beberapa ratus KB per disket). Dengan itu saya belajar banyak mengenai pemrograman BASIC. Berikutnya komputer saya adalah Pentium I 120 Mhz, RAM 16 Mb dan harddisk 1 GB. Dengan komputer kedua ini, saya melakukan lebih banyak lagi, dari mulai belajar menggunakan word processor sampai membuat virus. Nah sekarang Acer BeTouch yang saya miliki ini memiliki kecepatan 416 Mhz, dengan RAM 256 Mb dan ROM 512 Mb (dan saya membeli micro SD 16 GB). Jika Anda pikir prosessor dengan kecepatan itu hanya bisa untuk digunakan menelpon dan bermain game saja, maka jiwa programmer Anda kurang besar.</p>
<p>Tanpa open source, saya tidak bisa mengubah-ubah firmware beberapa HP yang saya miliki. Saya tidak bisa memperbaiki bug-bug di berbagai aplikasi yang ada di HP saya. Saya tidak bisa mengubah perilaku yang tidak saya suka dari berbagai device non-open source yang saya miliki. </p>
<p>Bisa dilihat bahwa dengan open source, saya punya kebebasan, untuk melakukan apapun pada device saya. Jika Anda bukan programmer pun, Anda bisa melakukan cukup banyak hal untuk mengcustomize  device Anda dari hasil pekerjaan orang lain. Atau jika ada pekerjaan yang Anda inginkan, Anda bisa membayar programmer yang mampu melakukannya. Dalam kasus ponsel dengan OS tertutup, satu-satunya yang mampu mengubah sesuatu adalah pembuat ponselnya, dan Anda harus menunggu dan berharap bahwa perubahan yang Anda inginkan itu akan diimplementasikan.</p>
]]></content:encoded>
			<wfw:commentRss>http://cintaprogramming.com/2011/04/29/asyiknya-open-source/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>

