<?xml version="1.0"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">

<channel>
	<title>Fajran Iman Rusadi</title>
	<link>http://ngoprek.fajran.web.id</link>
	<language>en</language>
	<description>Fajran Iman Rusadi - http://ngoprek.fajran.web.id</description>

<item>
	<title>Mainan baru</title>
	<guid>http://ngoprek.fajran.web.id/2012/03/mainan-baru.html</guid>
	<link>http://ngoprek.fajran.web.id/2012/03/mainan-baru.html</link>
	<description>&lt;p&gt;... namanya Augmented Reality.&lt;/p&gt;

&lt;p&gt;Khusus tuk yg satu ini, saya akan menuliskan perjalanan saya di lapak sebelah: &lt;a href=&quot;http://arfriends.net&quot;&gt;arfriends.net&lt;/a&gt;. Situs tersebut adalah sebuah forum yang diharapkan akan menjadi tempat bertukar pikiran, berbagi ilmu, berbagi karya, dsb mengenai Augmented Reality di Indonesia.&lt;/p&gt;

&lt;p&gt;Tulisan pertama saya: &lt;a href=&quot;http://arfriends.net/topic/34-instalasi-flashdevelop&quot;&gt;Instalasi FlashDevelop&lt;/a&gt; :D&lt;/p&gt;

&lt;p&gt;Sebelum mulai bikin ini itu, mari kita persiapkan lingkungan kerja :D Nah FlashDevelop ceritanya menjadi IDE pilihan karena gratis (dan bebas!). Wah kok Flash? xD Sayangnya Flash saat ini masih menjadi satu platform yang bisa meraih 99% pengguna internet melalui komputer. HTML5 dan kawan2 memang menjanjikan, namun sepertinya masih belum tuk sekarang :)&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3064211089164695382-7503288872689438601?l=ngoprek.fajran.web.id&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Fri, 16 Mar 2012 00:02:44 +0000</pubDate>
</item>
<item>
	<title>Git Philosophy (lagi)</title>
	<guid>http://ngoprek.fajran.web.id/2012/02/git-philosophy-lagi.html</guid>
	<link>http://ngoprek.fajran.web.id/2012/02/git-philosophy-lagi.html</link>
	<description>&lt;p&gt;Mari kita awali ngomongin Git dengan mengulang &lt;a href=&quot;http://sarah.thesharps.us/public/advanced-git.pdf&quot;&gt;Git Philosophy&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Commit early, commit often&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;One commit represents one idea or one change.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Makes it easy to read patches&lt;/li&gt;
&lt;li&gt;Easy to revert unwanted changes later&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Your working directory, index, and local repo are your scratch pads.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3064211089164695382-1680926277431308610?l=ngoprek.fajran.web.id&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Mon, 27 Feb 2012 17:06:43 +0000</pubDate>
</item>
<item>
	<title>Distributed Version Control System</title>
	<guid>http://ngoprek.fajran.web.id/2012/02/distributed-version-control-system.html</guid>
	<link>http://ngoprek.fajran.web.id/2012/02/distributed-version-control-system.html</link>
	<description>&lt;p&gt;Wah udah lama saya ngga mengisi blog ini. Saya akan awali lagi mengisi blog ini dengan cerita sedikit mengenai pengalaman saya menggunakan distributed version control system alias DVCS.&lt;/p&gt;

&lt;p&gt;Dari sekian DVCS yang ada, saya cuma pernah memakai &lt;a href=&quot;http://bazaar.canonical.com/en/&quot;&gt;Bazaar&lt;/a&gt;, &lt;a href=&quot;http://git-scm.com/&quot;&gt;Git&lt;/a&gt;, dan terakhir &lt;a href=&quot;http://mercurial.selenic.com/&quot;&gt;Mercurial&lt;/a&gt;. Saya bisa dibilang sudah meninggalkan Bazaar, yang saya kenal sambil mengembangkan &lt;a href=&quot;http://www.blankonlinux.or.id&quot;&gt;BlankOn&lt;/a&gt;, setelah saya mengenal Git. Sejak sekitar dua tahun lalu, saya mencoba menggunakan Mercurial. Sebelum saya menggunakan Bazaar, saya biasanya menggunakan &lt;a href=&quot;http://subversion.tigris.org/&quot;&gt;Subversion&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Yang sekarang bisa saya simpulkan mengenai pengalaman saya menggunakan ketiga DVCS ini adalah seperti berikut.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Perpindahan dari Subversion ke Bazaar tidak terlalu sulit bagi saya. Saat itu saya hanya perlu tahu konsep repositori lokal, yang secara praktis berarti harus memahami bahwa &lt;code&gt;commit&lt;/code&gt; itu hanya akan menyimpan perubahan ke repositori lokal dan &lt;code&gt;push&lt;/code&gt; itu dibutuhkan agar perubahan dikirim ke repositori bersama.&lt;/li&gt;
&lt;li&gt;Saya juga belajar bahwa repositori lokal ini dapat disalin ke direktori lain dan secara otomatis kita akan memiliki sebuah cabang repositori baru.&lt;/li&gt;
&lt;li&gt;Saat mencoba2 Git, saya menemukan sebuah konsep baru yaitu &lt;em&gt;staging area&lt;/em&gt;. Operasi &lt;code&gt;commit&lt;/code&gt; pada Git itu hanya akan menyimpan perubahan yang sudah dimasukkan ke dalam &lt;em&gt;staging area&lt;/em&gt;. Karena saya masih baru menggunakan Git, perintah &lt;code&gt;git commit -a&lt;/code&gt;, yang berarti &lt;code&gt;add&lt;/code&gt; dan &lt;code&gt;commit&lt;/code&gt; sekaligus, adalah perintah yang saya pakai untuk melakukan &lt;code&gt;commit&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Setelah beberapa waktu, saya menemukan operasi &lt;code&gt;commit&lt;/code&gt; secara interaktif dengan &lt;code&gt;git commit -i&lt;/code&gt;. Saya bisa memilih dulu berkas mana yg ingin saya &lt;code&gt;commit&lt;/code&gt; dan mana yg tidak.&lt;/li&gt;
&lt;li&gt;Selain &lt;code&gt;commit&lt;/code&gt; secara interaktif, Git juga memiliki operasi untuk memasukkan berkas ke &lt;em&gt;staging&lt;/em&gt; area secara parsial, yang artinya juga kita bisa melakukan &lt;code&gt;commit&lt;/code&gt; secara parsial, dengan perintah &lt;code&gt;git add -p&lt;/code&gt;. Kita akan dihadapkan dengan pertanyaan bertubi-tubi mengenai setiap perubahan yang kita buat: ingin dimasukkan ke &lt;em&gt;staging area&lt;/em&gt; atau tidak.&lt;/li&gt;
&lt;li&gt;Semakin sering saya menggunakan &lt;code&gt;git add -p&lt;/code&gt; semakin paham pula saya apa kegunaan dari &lt;em&gt;staging area&lt;/em&gt; dan mengapa ini adalah fitur Git yang sangat &lt;em&gt;powerful&lt;/em&gt; yang membedakan Git dengan yang lain&lt;/li&gt;
&lt;li&gt;Selain ini, saya juga tau bahwa cabang di Git dapat berada di dalam satu buah repositori lokal (alias direktori) yang sama.&lt;/li&gt;
&lt;li&gt;Setelah saya terbiasa dengan &lt;code&gt;commit&lt;/code&gt; parsial, saya mencoba menggunakan Mercurial. Operasi pertama yang saya cari: &lt;code&gt;commit&lt;/code&gt; parsial dan pembuatan cabang.&lt;/li&gt;
&lt;li&gt;Mercurial tidak memiliki &lt;em&gt;staging area&lt;/em&gt; sehingga operasi &lt;code&gt;commit&lt;/code&gt; akan menyimpan &lt;strong&gt;semua&lt;/strong&gt; perubahan yang dibuat. Sama dengan operasi &lt;code&gt;commit&lt;/code&gt; di Bazaar dan bahkan Subversion.&lt;/li&gt;
&lt;li&gt;Ada pengaya (&lt;em&gt;extension&lt;/em&gt;) Mercurial yang dapat membuat kita melakukan &lt;code&gt;commit&lt;/code&gt; secara selektif, yaitu &lt;a href=&quot;http://mercurial.selenic.com/wiki/RecordExtension&quot;&gt;Record Extension&lt;/a&gt;. Namun walau begitu, ini masih kalah canggih dibanding punyanya Git dalam urusan memilah-milah perubahan.&lt;/li&gt;
&lt;li&gt;Mercurial memiliki tiga jenis percabangan: cabang dengan nama alias &lt;em&gt;named branch&lt;/em&gt;, cabang tanpa nama alias &lt;em&gt;anonymous/unnamed branch&lt;/em&gt;, dan &lt;em&gt;bookmark&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Cabang dengan nama di Mercurial bersifat permanen: nama cabang akan selalu dibawa ke mana-mana termasuk saat perubahan dikirim ke repositori lain (&lt;code&gt;push&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Bookmark adalah jenis cabang di Mercurial yang mirip dengan percabangan di Git.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Kesimpulan lain: Git dapat itu mengubah pikiran dan cara pandang Anda mengenai bagaimana cara menggunakan version control system. Setelah Anda paham mengenai penggunaan Git, maka menggunakan (D)VCS lain itu bisa bikin stres :P *kisah nyata*&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3064211089164695382-8122371532179102107?l=ngoprek.fajran.web.id&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Mon, 27 Feb 2012 17:03:54 +0000</pubDate>
</item>
<item>
	<title>Ngoprek Microsoft Surface</title>
	<guid>http://ngoprek.fajran.web.id/2011/09/ngoprek-microsoft-surface.html</guid>
	<link>http://ngoprek.fajran.web.id/2011/09/ngoprek-microsoft-surface.html</link>
	<description>&lt;p&gt;Yang udah berhasil &lt;s&gt;dilakukan&lt;/s&gt; disalahgunakan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Boot ke USB CD/DVD. Password BIOS memang tidak dikasih, tapi ternyata kita bisa minta ke &lt;a href=&quot;http://technet.microsoft.com/en-us/library/ee692099(Surface.10).aspx&quot;&gt;Customer Support&lt;/a&gt; Microsoft.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Windows 7 dan 8 preview dapat terpasang dengan baik&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ubuntu dan BlankOn juga bisa dijalankan (walau tidak nyoba memasangnya). Skrinsut:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://i.minus.com/ib2E9DhZUAVFAa.jpg&quot; /&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Microsoft Surface 1.0 SDK (bukan versi Workstation Edition) ternyata sudah tersedia di partisi bawaan (Windows Vista). Awalnya saya kira Microsoft ngga ngasih installer apa2.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SDK tadi aslinya hanya bisa dipasang di Windows Vista Business 32bit yg dibawa oleh Microsoft Surface. Namun dengan sedikit &lt;a href=&quot;http://www.brianpeek.com/post/2009/03/10/install-the-surface-sdk-on-windows-7-and-or-x64.aspx&quot;&gt;utak-atik&lt;/a&gt;, SDK ini juga bisa dipasang di atas Windows 7, termasuk yg 64 bit. Seharusnya bisa juga dipasang di atas &lt;a href=&quot;http://nui.joshland.org/2011/09/windows-8-on-microsoft-surface-10-video.html&quot;&gt;Windows 8 Preview&lt;/a&gt;, namun saya masih gagal memasangnya.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://multitouchvista.codeplex.com/&quot;&gt;MultiTouchVista&lt;/a&gt; bisa dipakai untuk membuat windows 7 touch events. Sumber event bisa macem2 termasuk TUIO, multiple mouse, dan juga Surface Input! Saya belum berhasil melakukan kompilasi MultiTouchVista terbaru yg sudah berisi adapter Surface Input. Akhirnya terpaksa menggunakan TUIO dg didampingi konverter Surface Input ke TUIO.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Kalau touch events dari Surface Input sudah sampai ke Windows 7, maka kita udah bisa &quot;megang2&quot; si windows 7. IE sudah mendukung scroll dg menggeser halaman (bukan pada scroll bar) sedangkan Firefox 7 dan Chrome 13 (atau 14?) belum.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sekian.&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3064211089164695382-7344887489575724004?l=ngoprek.fajran.web.id&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Fri, 30 Sep 2011 17:42:46 +0000</pubDate>
</item>
<item>
	<title>Irgsh: Pabrik Paket BlankOn</title>
	<guid>http://ngoprek.fajran.web.id/2011/09/irgsh-pabrik-paket-blankon.html</guid>
	<link>http://ngoprek.fajran.web.id/2011/09/irgsh-pabrik-paket-blankon.html</link>
	<description>&lt;p&gt;Slide presentasi jarak jauh di &lt;a href=&quot;http://konf2011.blankonlinux.or.id/&quot;&gt;Konferensi BlankOn 2011&lt;/a&gt; mengenai &lt;a href=&quot;http://irgsh.blankonlinux.or.id&quot;&gt;Irgsh&lt;/a&gt;, yaitu nama pabrik paket yang dipakai di &lt;a href=&quot;http://www.blankonlinux.or.id&quot;&gt;BlankOn&lt;/a&gt;.&lt;/p&gt;

&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3064211089164695382-881786678589092098?l=ngoprek.fajran.web.id&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Sat, 24 Sep 2011 18:51:33 +0000</pubDate>
</item>
<item>
	<title>Port forwarding dg NAT</title>
	<guid>http://ngoprek.fajran.web.id/2011/09/port-forwarding-dg-nat.html</guid>
	<link>http://ngoprek.fajran.web.id/2011/09/port-forwarding-dg-nat.html</link>
	<description>&lt;p&gt;Ceritanya saya punya mesin, katakanlah bernama &lt;code&gt;C&lt;/code&gt;, yang cuma bisa diakses dari dalam jaringan lokal. Saya juga punya mesin bernama &lt;code&gt;M&lt;/code&gt; yang bisa diakses dari jaringan lokal DAN juga dari internet. Nah, berhubung si &lt;code&gt;C&lt;/code&gt; bisa diakses oleh &lt;code&gt;M&lt;/code&gt;, tentu saja saya bisa mengakses &lt;code&gt;C&lt;/code&gt; dari internet dg menghubungi &lt;code&gt;M&lt;/code&gt; terlebih dahulu.&lt;/p&gt;

&lt;p&gt;Cara yang biasa saya lakukan adalah dg membuat koneksi ke &lt;code&gt;M&lt;/code&gt; melalui SSH. Setelah di dalam &lt;code&gt;M&lt;/code&gt;, saya buka lagi koneksi ke &lt;code&gt;C&lt;/code&gt;, lagi-lagi melalui SSH. Intinya saya harus menyiapkan koneksi ke &lt;code&gt;M&lt;/code&gt; via SSH terlebih dahulu sebelum saya bisa menghubungi si &lt;code&gt;C&lt;/code&gt;. Caranya sendiri pernah saya tuliskan sebelumnya: &lt;a href=&quot;http://ngoprek.fajran.web.id/2008/11/tunnel-koneksi.html&quot;&gt;port forwarding dengan SSH&lt;/a&gt; atau dengan membuat &lt;a href=&quot;http://ngoprek.fajran.web.id/2009/01/mentunnel-koneksi-dengan-bantuan-tsocks.html&quot;&gt;socks proxy&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Lama-lama saya malas juga membuat koneksi SSH ke &lt;code&gt;M&lt;/code&gt; setiap saya ingin menghubungi &lt;code&gt;C&lt;/code&gt;. Mengingat saya memiliki akses administrator di mesin &lt;code&gt;M&lt;/code&gt;, akhirnya saya mencoba cara lain, yaitu port forwarding dg NAT alias Network Address Translation. Cara kerja NAT akan saya bahas di lain waktu (kalau ingat, kalau lagi gak malas, kalau mau :P) jadi skr lgs ke inti solusinya saja.&lt;/p&gt;

&lt;p&gt;Pertama-tama, aktifkan dulu IP forwarding. (oh iya.. perintah2 ini dikerjakan di mesin &lt;code&gt;M&lt;/code&gt;)&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# echo 1 &amp;gt; /proc/sys/net/ipv4/ip_forward
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Pastikan perintah di atas dijalankan oleh root.. atau versi dengan &lt;code&gt;sudo&lt;/code&gt; nya adalah seperti berikut.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Kalau IP forwarding sudah diatur, mari kita buat NAT, atau lebih tepatnya DNAT alias Destination NAT berhubung yang akan dibelokkan itu adalah alamat tujuan koneksi.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --source 1.2.3.4 --dport 12345 -j DNAT --to 10.20.30.40:22
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Saya ingin membuat NAT yg terbatas dari segi alamat sumber. Dalam contoh di atas, hanya koneksi dari alamat &lt;code&gt;1.2.3.4&lt;/code&gt; yang akan dialihkan. Selain dari itu, koneksi akan berhenti sampai di sini saja. Selain itu hanya koneksi yg nyampe di &lt;code&gt;eth0&lt;/code&gt; dg protokol &lt;code&gt;tcp&lt;/code&gt; di port &lt;code&gt;12345&lt;/code&gt; yang akan dilayani.&lt;/p&gt;

&lt;p&gt;Jika ada koneksi yg sesuai, koneksi ini lalu akan dibelokkan ke mesin dg IP &lt;code&gt;10.20.30.40&lt;/code&gt;, yaitu mesin &lt;code&gt;C&lt;/code&gt;, pada port &lt;code&gt;22&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Singkatnya, jika ada mesin dg IP &lt;code&gt;1.2.3.4&lt;/code&gt; membuat koneksi ke &lt;code&gt;eth0&lt;/code&gt; di mesin &lt;code&gt;M&lt;/code&gt; dg protokol &lt;code&gt;tcp&lt;/code&gt; dg &lt;code&gt;12345&lt;/code&gt;, maka koneksi akan dibelokkan ke mesin dg IP &lt;code&gt;10.20.30.40&lt;/code&gt; pada port &lt;code&gt;22&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Nah kalau sudah begini, saya dari rumah (yg pake IP &lt;code&gt;1.2.3.4&lt;/code&gt;) bisa membuat koneksi ke mesin &lt;code&gt;C&lt;/code&gt; melalui si &lt;code&gt;M&lt;/code&gt; tanpa harus membuat koneksi SSH dulu ke &lt;code&gt;M&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;rumah$ ssh M -p 12345
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Perintah SSH di atas akan langsung terhubung dg mesin &lt;code&gt;C&lt;/code&gt; walau koneksi ditujukan ke &lt;code&gt;M&lt;/code&gt; karena si &lt;code&gt;M&lt;/code&gt; akan membelokkan koneksi ke &lt;code&gt;C&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Selain tuk mengakses &lt;code&gt;C&lt;/code&gt; dg SSH langsung dari komputer rumah, yg seperti ini saya pakai juga tuk keperluan lain.. misalnya..&lt;/p&gt;

&lt;p&gt;Di mesin &lt;code&gt;M&lt;/code&gt; ini saya juga punya sebuah instance virtual machine (VM) dengan VirtualBox. Saya mengaktifkan layanan virtual desktop (dengan RDP) di VirtualBox ini berhubung mesin &lt;code&gt;M&lt;/code&gt; ini ada entah-di-mana sehingga saya tidak punya akses fisik langsung. Antara VM dengan host-nya (si &lt;code&gt;M&lt;/code&gt;) sudah terjalin hubungan baik melalui jaringan host-only di VirtualBox. Kalau saya ingin mengakses si VM maka, seperti tadi, saya harus mengakses &lt;code&gt;M&lt;/code&gt; terlebih dahulu. Dengan melakukan port forwarding, saya bisa mengakses si VM dari &lt;code&gt;C&lt;/code&gt; scr langsung.&lt;/p&gt;

&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3064211089164695382-3529308126634910168?l=ngoprek.fajran.web.id&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Tue, 20 Sep 2011 15:54:46 +0000</pubDate>
</item>
<item>
	<title>Pesan commit dari berkas</title>
	<guid>http://ngoprek.fajran.web.id/2011/09/pesan-commit-dari-berkas.html</guid>
	<link>http://ngoprek.fajran.web.id/2011/09/pesan-commit-dari-berkas.html</link>
	<description>&lt;p&gt;Saya sedang perlu melakukan banyak commit (seperti biasa, dengan git) berbeda dimana saya ingin memasukkan pesan commit dari sebuah berkas. Kalau saya baca manual dari &lt;code&gt;git-commit&lt;/code&gt;, sayangnya Git tidak memiliki fasilitas ini. Git hanya mendukung pemasukkan pesan melalui parameter &lt;code&gt;-m&lt;/code&gt; yang saya rasa sangat terbatas atau dengan membuat berkas yg dapat dijadikan sebagai template dari pesan commit. Pembuatan berkas template mungkin mendekati apa yg saya inginkan namun tetap saja saya harus berhadapan dengan teks editor lalu harus menyimpan dan menutupnya sebelum Git dapat melakukan commit. Saya menginginkan semuanya dapat berjalan secara otomatis.&lt;/p&gt;

&lt;p&gt;Lalu saya ingat kalau pada dasarnya saya bisa mengganti editor yang akan digunakan oleh Git untuk meminta pengguna memasukkan pesan commit. Pada saat melakukan commit, Git akan memanggil sebuah teks editor dan menunggu sampai teks editor itu ditutup. Berkas yang tadi dibuka oleh teks editor akan dibaca oleh Git lalu isinya dijadikan sebagai pesan commit. Mengatahui alur kerja ini, saya jadi berpikir mengapa tidak membuat teks editor &amp;#8220;palsu&amp;#8221; saja :D&lt;/p&gt;

&lt;p&gt;Teks editor yang digunakan oleh Git dapat diatur, antara lain, dengan mengatur nilai environment variabel &lt;code&gt;EDITOR&lt;/code&gt;. Sebagai contoh, jika ingin menggunakan Gedit untuk menulis pesan commit, kita bisa melakukan hal berikut.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ EDITOR=gedit git commit
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Sebuah berkas bernama &lt;code&gt;.git/COMMIT_EDITMSG&lt;/code&gt; akan dijadikan parameter saat teks editor tadi dipanggil sehingga berkas tersebut akan secara otomatis dibuka. Setelah teks editor ditutup, isi dari berkas tadi akan dibaca oleh Git dan dijadikan sebagai pesan commit. Kalau saya ingin membuat teks editor palsu, berarti yang saya harus lakukan adalah menulisi berkas yg diberikan oleh Git dengan pesan commit yang saya inginkan.&lt;/p&gt;

&lt;p&gt;Sekitar 6 baris kemudian, akhirnya jadi juga sebuah skrip sederhana yang akan menjadi teks editor palsu. Berikut ini kodenya. Wait.. tunggu.. setelah dipikir2 lagi.. aplikasi sejenis itu sudah ada! aplikasi tersebut adalah.. jreng jreng jreng.. &lt;code&gt;cp&lt;/code&gt; alias copy! hah?&lt;/p&gt;

&lt;p&gt;Begini ceritanya.. saat &lt;code&gt;git commit&lt;/code&gt; dipanggil, maka Git akan menjalankan hal berikut.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$EDITOR .git/COMMIT_EDITMSG
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Jika nilai &lt;code&gt;EDITOR&lt;/code&gt; adalah &lt;code&gt;gedit&lt;/code&gt;, maka yang akan dijalankan oleh Git adalah &lt;code&gt;gedit .git/COMMIT_EDITMSG&lt;/code&gt; yang akan meminta Gedit untuk membuka berkas &lt;code&gt;.git/COMMIT_EDITMSG&lt;/code&gt;. Setelah aplikasi yg disebut di &lt;code&gt;EDITOR&lt;/code&gt; dideteksi sudah ditutup, maka Git akan membaca berkas &lt;code&gt;.git/COMMIT_EDITMSG&lt;/code&gt; dan menggunakannya (saya udah nulis yg seperti ini berapa kali ya?).&lt;/p&gt;

&lt;p&gt;Kalau diteliti lebih lanjut, nilai &lt;code&gt;EDITOR&lt;/code&gt; itu juga bisa mengandung parameter lain. Sebagai contoh, Gedit memiliki opsi &lt;code&gt;--new-window&lt;/code&gt; yang kalau dipakai, maka berkas yang disebutkan akan dibuka di jendela Gedit baru, bukan sekedar di tab baru dari window yg sudah ada (asumsinya sudah ada window Gedit yg terbuka). Jika Gedit ingin dijalankan dengan opsi ini pada saat melakukan commit, maka yang berikut ini bisa dilakukan.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ EDITOR=&quot;gedit --new-window&quot; git commit
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Apakah hal tersebut berlaku untuk opsi (yg dimulai dengan &lt;code&gt;-&lt;/code&gt; atau &lt;code&gt;--&lt;/code&gt;) apakah bisa parameter lain termasuk nama berkas? Ternyata bisa! Coba saja yg berikut ini.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ EDITOR=&quot;gedit a b c&quot; git commit
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Maka selain &lt;code&gt;.git/COMMIT_EDITMSG&lt;/code&gt;, berkas &lt;code&gt;a&lt;/code&gt;, &lt;code&gt;b&lt;/code&gt;, dan &lt;code&gt;c&lt;/code&gt; juga akan dibuka oleh Gedit.&lt;/p&gt;

&lt;p&gt;Nah, kembali ke &lt;code&gt;cp&lt;/code&gt;, bagaimana kita bisa memanfaatkan &lt;code&gt;cp&lt;/code&gt; untuk melakukan commit dengan pesan yg dibaca dari sebuah berkas? Jawabannya adalah dengan menjadikan &lt;code&gt;cp&lt;/code&gt; sebagai &lt;code&gt;EDITOR&lt;/code&gt; dan berkas tadi sebagai parameter pertamanya. Saat commit dipanggil, Git akan memasukkan parameter kedua dan mengeksekusinya. Alhasil, perintah yang dipanggil adalah salin berkas yg disebut ke &lt;code&gt;.git/COMMIT_EDITMSG&lt;/code&gt; :D&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ EDITOR=&quot;cp /tmp/berkas-berisi-pesan-commit.txt&quot; git commit
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Voila! &lt;code&gt;git commit&lt;/code&gt; akan keluar seketika namun commit tetap sudah terjadi. Jika melihat log, isi berkas yg disebut akan menjadi pesan commit.&lt;/p&gt;

&lt;p&gt;Lho? kok bisa? bisa karena teks editor akan dibuka oleh Git dengan melakukan perintah berikut.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;cp /tmp/berkas-berisi-pesan-commit.txt .git/COMMIT_EDITMSG
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Perintah tadi akan jalan sekejap dan Git akan otomatis mendeteksi kalau perintah &lt;code&gt;cp&lt;/code&gt; sudah selesai dieksekusi. Isi &lt;code&gt;.git/COMMIT_EDITMSG&lt;/code&gt; akan diasumsikan sudah berisi pesan commit sehingga bisa digunakan oleh Git :D&lt;/p&gt;

&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3064211089164695382-5104841069606558308?l=ngoprek.fajran.web.id&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Fri, 16 Sep 2011 16:19:00 +0000</pubDate>
</item>
<item>
	<title>Komunikasi .NET dan Python melalui COM</title>
	<guid>http://ngoprek.fajran.web.id/2011/03/komunikasi-net-dan-python-melalui-com.html</guid>
	<link>http://ngoprek.fajran.web.id/2011/03/komunikasi-net-dan-python-melalui-com.html</link>
	<description>&lt;p&gt;Saat ini saya sedang membutuhkan akses ke sebuah pustaka yang hanya tersedia dalam platform Microsoft .NET. Berhubung apa yang saya buat semuanya tertulis dalam bahasa Python, tepatnya CPython, saya perlu mencari cara bagaimana agar saya bisa mengakses pustaka dalam .NET tersebut dari Python. Setelah ngubek sana sini, akhirnya ketemu juga (salah satu) caranya, yaitu melalui &lt;a href=&quot;http://www.microsoft.com/com/default.mspx&quot;&gt;Component Object Model&lt;/a&gt; alias COM. Singkatnya, COM ini memungkinkan berbagai aplikasi dengan berbagai bahasa untuk berkomunikasi.&lt;/p&gt;

&lt;h3&gt;Membuat komponen COM dengan C#&lt;/h3&gt;

&lt;p&gt;Dalam kasus yang saya hadapi, saya perlu mengakses pustaka .NET dari Python. Oleh karena itu saya membutuhkan sebuah komponen COM yang tertulis dalam, misalnya, C# yang dapat mengakses pustaka tersebut. Komponen dalam C# ini lalu saya atur agar bisa diakses melalui COM sehingga pada akhirnya aplikasi Python saya bisa mengakesenya.&lt;/p&gt;

&lt;p&gt;Kali ini saya akan mencontohkan cara membuat sebuah kelas dalam C# yang dapat diakses melalui COM. Kelas ini adalah sebuah kelas kalkulator yang berisi fungsi penjumlahan angka. Contoh ini saya adaptasi dari beberapa referensi bagus yang ada di [&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/aa645738(v=vs.71).aspx&quot;&gt;1&lt;/a&gt;,&lt;a href=&quot;http://support.microsoft.com/kb/828736&quot;&gt;2&lt;/a&gt;,&lt;a href=&quot;http://cppkid.wordpress.com/2009/01/02/how-to-call-a-managed-dll-from-unmanaged-code/&quot;&gt;3&lt;/a&gt;].&lt;/p&gt;

&lt;p&gt;Buat sebuah proyek C# baru bernama &lt;code&gt;Matematika&lt;/code&gt; dan kemudian buat sebuah sebuah kelas dengan isi seperti berikut.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;namespace Matematika {
    public interface IKalkulator {
        int tambah(int a, int b);
    }

    public class Kalkulator : IKalkulator {
        public int tambah(int a, int b) {
            return a + b;
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Interface adalah bagian penting dalam pembuatan komponen COM karena dalam COM pengaksesan komponen akan mengacu kepada interface yang dibuat.&lt;/p&gt;

&lt;p&gt;Untuk keperluan pendaftaran komponen, kita memerlukan sebuah kunci. Buka Visual Studio Command Prompt, pindah ke direktori proyek (direktori dimana kode sumber berada, bukan direktori Solution-nya visual studio) dan jalankan perintah berikut.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sn.exe -k Matematika.snk
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Setelah itu, buka berkas &lt;code&gt;AssemblyInfo.cs&lt;/code&gt; (ada di bawah Solution -&gt; Matematika -&gt; Properties) dan tambahkan 3 baris berikut.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[assembly: ComVisible(true)]
[assembly: AssemblyDelaySign(false)]
[assembly: AssemblyKeyFile(&quot;Matematika.snk&quot;)]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Lakukan kompilasi proyek untuk membuat berkas pustaka &lt;code&gt;Matematika.dll&lt;/code&gt;. Berkas pustaka ini akan berada di bawah direktori &lt;code&gt;bin\Release&lt;/code&gt; yang ada di bawah direktori proyek. &lt;/p&gt;

&lt;p&gt;Agar pustaka atau komponen COM ini dapat diakses dari aplikasi lain, kita harus mendaftarkan pustaka ini terlebih dahulu. Untuk ini, kita perlu menggunakan akses sebagai Administrator. Buka Visual Studio Command Prompt lagi namun kali ini sebagai Administrator (Klik kanan di shortcut dan pilih Run as Administrator). Masuk ke direktori tempat pustaka &lt;code&gt;Matematika.dll&lt;/code&gt; tadi berada (direktori &lt;code&gt;bin\Release&lt;/code&gt; di bawah direktori kerja) lalu jalankan perintah pendaftaran berikut.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;regasm.exe Matematika.dll /tlb:Matematika.tlb /codebase
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Setelah perintah di atas dijalankan, Anda akan mendapatkan pesan kalau pustaka sudah didaftarkan dan juga sebuah berkas baru bernama &lt;code&gt;Matematika.tlb&lt;/code&gt; yang berisi deskripsi mengenai seluruh interface dan struktur data yang ada.&lt;/p&gt;

&lt;p&gt;Sebelum lanjut ke cara mengakses komponen tadi, buka lagi berkas &lt;code&gt;AssemblyInfo.cs&lt;/code&gt; dan dapatkan tanda pengenal aplikasi yang barusan dibuat. Tanda pengenal ini adalah sebuah &lt;a href=&quot;http://en.wikipedia.org/wiki/Globally_unique_identifier&quot;&gt;GUID&lt;/a&gt; yang didefinisikan seperti berikut.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[assembly: Guid(&quot;9808bb58-40fe-4373-acc3-f577b55a2a99&quot;)]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Deretan angka dan huruf di atas, yaitu &lt;code&gt;9808bb58-40fe-4373-acc3-f577b55a2a9&lt;/code&gt;, akan menjadi (salah satu) tanda pengenal yang dibutuhkan saat mengakses komponen COM tadi.&lt;/p&gt;

&lt;h3&gt;Mengakses COM dari Python&lt;/h3&gt;

&lt;p&gt;Python tidak menyediakan dukungan terhadap COM secara langsung sehingga kita perlu memasang modul tambahan yang dapat membantu kita untuk mengakses COM. Saya menemukan ada dua modul yang bisa digunakan, yaitu &lt;a href=&quot;http://pypi.python.org/pypi/pywin32&quot;&gt;PyWin32&lt;/a&gt; dan &lt;a href=&quot;http://pypi.python.org/pypi/comtypes&quot;&gt;comtypes&lt;/a&gt;. Dalam petualangan beberapa hari terakhir ini, saya belum berhasil mengakses COM yang saya buat di .NET dengan bantuan PyWin32 namun comtypes dapat melakukannya dengan cukup mudah. Oleh karena itu, saya akan mencontohkan penggunaan comtypes untuk mengakses komponen COM yang tadi dibuat. Berhubung comtypes itu bukan bawaan asli dari Python, unduh dan pasang dulu modul ini dari &lt;a href=&quot;http://pypi.python.org/pypi/comtypes&quot;&gt;http://pypi.python.org/pypi/comtypes&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Kalau sudah, buat sebuah berkas &lt;code&gt;matematika.py&lt;/code&gt; yang berisi kode berikut.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;import comtypes
import comtypes.client as cc

guid = comtypes.GUID(&quot;{9808bb58-40fe-4373-acc3-f577b55a2a99}&quot;)
cc.GetModule((guid, 1, 0))

from comtypes.gen import Matematika

obj = cc.CreateObject(&quot;Matematika.Kalkulator&quot;, None, None,
                      Matematika.IKalkulator)

a = 10
b = 200
hasil = obj.tambah(a, b)

print a, '+', b, '=', hasil
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Setelah itu, jalankan dengan &lt;code&gt;python.exe&lt;/code&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;C:\tmp&gt;c:\Python26\python.exe matematika.py
# Generating comtypes.gen._9808BB58_40FE_4373_ACC3_F577B55A2A99_0_1_0
# Generating comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0
# Generating comtypes.gen.stdole
# Generating comtypes.gen._BED7F4EA_1A96_11D2_8F08_00A0C9A6186D_0_2_0
# Generating comtypes.gen.mscorlib
# Generating comtypes.gen.Matematika
10 + 200 = 210
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Dalam eksekusinya, comtypes akan membuat beberapa modul tambahan (yang berfungsi kode penghubung dengan komponen COM) secara otomatis seperti yang diperlihatkan dalam hasil di atas. Modul dan pesan ini hanya akan dibuat satu kali sehingga pada eksekusi selanjutnya pesan di atas tidak akan tampil lagi.&lt;/p&gt;

&lt;p&gt;Jika ada perubahan dalam kode C# yang kita buat, selama kita tidak mengubah interface, kita cukup melakukan kompilasi ulang dan pustaka baru akan langsung dipakai. Jika interface berubah, pustaka perlu didaftarkan ulang (dan berkas &lt;code&gt;.tlb&lt;/code&gt;-nya juga perlu dibuat ulang) agar perubahan dapat diketahui. Berdasarkan berkas &lt;code&gt;.tlb&lt;/code&gt; yang berubah, comtypes akan melakukan pembuatan ulang modul penghubung secara otomatis juga.&lt;/p&gt;

&lt;h3&gt;Referensi&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/aa645738(v=vs.71).aspx&quot;&gt;http://msdn.microsoft.com/en-us/library/aa645738(v=vs.71).aspx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://support.microsoft.com/kb/828736&quot;&gt;http://support.microsoft.com/kb/828736&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://cppkid.wordpress.com/2009/01/02/how-to-call-a-managed-dll-from-unmanaged-code/&quot;&gt;http://cppkid.wordpress.com/2009/01/02/how-to-call-a-managed-dll-from-unmanaged-code/&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3064211089164695382-291703022286180489?l=ngoprek.fajran.web.id&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Fri, 11 Mar 2011 09:22:42 +0000</pubDate>
</item>
<item>
	<title>Membuat Certificate Authority bertingkat</title>
	<guid>http://ngoprek.fajran.web.id/2011/02/membuat-certificate-authority.html</guid>
	<link>http://ngoprek.fajran.web.id/2011/02/membuat-certificate-authority.html</link>
	<description>&lt;p&gt;Mari langsung ke tutorial saja :D&lt;/p&gt;

&lt;h3&gt;Membuat Certificate Authority (CA) utama.&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Buat direktori kerja.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ mkdir ca-utama
$ cd ca-utama
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Salin skrip pembantu dari &lt;code&gt;/usr/lib/ssl/misc/CA.pl&lt;/code&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ cp /usr/lib/ssl/misc/CA.pl .
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Buat CA baru&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ./CA.pl -newca
CA certificate filename (or enter to create)


Making CA certificate ...
Generating a 1024 bit RSA private key
..........++++++
..........++++++
writing new private key to './demoCA/private/cakey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:ID
State or Province Name (full name) [Some-State]:Jakarta
Locality Name (eg, city) []:Jakarta
Organization Name (eg, company) [Internet Widgits Pty Ltd]:BlankOn   
Organizational Unit Name (eg, section) []:Infrastruktur
Common Name (eg, YOUR name) []:CA
Email Address []:


Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /usr/lib/ssl/openssl.cnf
Enter pass phrase for ./demoCA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number:
            f7:4a:da:34:c1:89:6d:f9
        Validity
            Not Before: Feb 24 15:48:30 2011 GMT
            Not After : Feb 23 15:48:30 2014 GMT
        Subject:
            countryName               = ID
            stateOrProvinceName       = Jakarta
            organizationName          = BlankOn
            organizationalUnitName    = Infrastruktur
            commonName                = CA
        X509v3 extensions:
            X509v3 Subject Key Identifier: 
                78:DE:57:D2:4D:3E:8A:F8:FD:B6:51:CD:A7:DB:29:B6:C8:EB:4B:42
            X509v3 Authority Key Identifier: 
                keyid:78:DE:57:D2:4D:3E:8A:F8:FD:B6:51:CD:A7:DB:29:B6:C8:EB:4B:42
                DirName:/C=ID/ST=Jakarta/O=BlankOn/OU=Infrastruktur/CN=CA
                serial:F7:4A:DA:34:C1:89:6D:F9


&lt;pre&gt;&lt;code&gt;        X509v3 Basic Constraints: 
            CA:TRUE
&lt;/code&gt;&lt;/pre&gt;

Certificate is to be certified until Feb 23 15:48:30 2014 GMT (1095 days)


Write out database with 1 new entries
Data Base Updated
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Sertifikat CA akan disimpan di &lt;code&gt;demoCA/cacert.pem&lt;/code&gt;. Untuk melihat informasi
detil mengenai sebuah sertifikat, kita bisa menggunakan &lt;code&gt;openssl&lt;/code&gt; seperti
berikut.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; $ openssl x509 -in demoCA/cacert.pem -text
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Salah satu karakteristik sertifikat CA adalah sertifikat ini dipakai untuk
menandatangani dirinya sendiri. Dalam informasi sertifikat, hal ini bisa
dilihat pada bagian &lt;code&gt;Subject&lt;/code&gt; dan &lt;code&gt;Issuer&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; $ openssl x509 -in demoCA/cacert.pem -text |grep 'Subject:\|Issuer'
         Issuer: C=ID, ST=Jakarta, O=BlankOn, OU=Infrastruktur, CN=CA
         Subject: C=ID, ST=Jakarta, O=BlankOn, OU=Infrastruktur, CN=CA
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Bisa dilihat isi keduanya sama, hal ini menunjukkan self-signed certificate
atau sertifikat yang ditandatangani sendiri.&lt;/p&gt;

&lt;h3&gt;Membuat sertifikat baru&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Buat permintaan sertifikat baru&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ./CA.pl -newreq
Generating a 1024 bit RSA private key
..................++++++
..................++++++
writing new private key to 'newkey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:ID
State or Province Name (full name) [Some-State]:Jakarta
Locality Name (eg, city) []:Jakarta
Organization Name (eg, company) [Internet Widgits Pty Ltd]:BlankOn
Organizational Unit Name (eg, section) []:Irgsh
Common Name (eg, YOUR name) []:CA Pabrik
Email Address []:


Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Request is in newreq.pem, private key is in newkey.pem
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tanda tangani permintaan sertifikat tersebut dengan CA yang ada&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ./CA.pl -sign
Using configuration from /usr/lib/ssl/openssl.cnf
Enter pass phrase for ./demoCA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number:
            f7:4a:da:34:c1:89:6d:fa
        Validity
            Not Before: Feb 24 15:56:26 2011 GMT
            Not After : Feb 24 15:56:26 2012 GMT
        Subject:
            countryName               = ID
            stateOrProvinceName       = Jakarta
            localityName              = Jakarta
            organizationName          = BlankOn
            organizationalUnitName    = Irgsh
            commonName                = CA Pabrik
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                05:B3:34:C6:A8:64:A8:C1:E1:5B:B6:03:93:5C:38:19:CA:41:DF:48
            X509v3 Authority Key Identifier: 
                keyid:78:DE:57:D2:4D:3E:8A:F8:FD:B6:51:CD:A7:DB:29:B6:C8:EB:4B:42


Certificate is to be certified until Feb 24 15:56:26 2012 GMT (365 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
Signed certificate is in newcert.pem
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Setelah ditandatangani, akan ada 3 buah berkas yaitu &lt;code&gt;newcert.pem&lt;/code&gt;,
&lt;code&gt;newkey.pem&lt;/code&gt;, dan &lt;code&gt;newreq.pem&lt;/code&gt;. Berkas &lt;code&gt;newreq.pem&lt;/code&gt; bisa dihapus karena sudah
tidak dipakai lagi. Berkas ini hanya berisi permintaan pembuatan sertifikat,
bukan sertifikat akhir. Berkas &lt;code&gt;newcert.pem&lt;/code&gt; dan &lt;code&gt;newkey.pem&lt;/code&gt; adalah dua berkas
yang harus diamankan karena berkas ini adalah berkas sertifikat dan kuncinya.&lt;/p&gt;

&lt;p&gt;Mari kita cek judul dan penerbit sertifikat baru ini.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    $ openssl x509 -in newcert.pem -text | grep 'Subject:\|Issuer:'
            Issuer: C=ID, ST=Jakarta, O=BlankOn, OU=Infrastruktur, CN=CA
            Subject: C=ID, ST=Jakarta, L=Jakarta, O=BlankOn, OU=Irgsh, CN=CA Pabrik
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Sekarang kita punya sebuah sertifikat baru yang telah ditandatangani oleh CA
yang kita buat di awal.&lt;/p&gt;

&lt;h3&gt;Menjadikan sertifikat baru sebagai CA kedua&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Siapkan direktori kerja baru&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ cd ..
$ mkdir ca-kedua
$ cd ca-kedua
$ cp /usr/lib/ssl/misc/CA.pl .
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Agar skrip &lt;code&gt;CA.pl&lt;/code&gt; dapat bekerja, kita harus mempersiapkan lingkungan
kerjanya dengan opsi &lt;code&gt;-newca&lt;/code&gt;. Namun alih-alih menyuruh skrip tersebut untuk
membuat sertifikat CA baru, kita bisa menggunakan sertifikat yang sudah ada.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ./CA.pl -newca
CA certificate filename (or enter to create)
../ca-utama/newcert.pem
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Salin berkas kunci sertifikat&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ cp ../ca-utama/newkey.pem demoCA/private/cakey.pem
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Siapkan nomor seri baru.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ echo 00 &amp;gt; demoCA/serial
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Sama seperti sebelumnya, sertifikat CA ada di &lt;code&gt;demoCA/cacert.pem&lt;/code&gt;. Mari kita cek isinya.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ openssl x509 -in demoCA/cacert.pem -text | grep 'Subject:\|Issuer:'
        Issuer: C=ID, ST=Jakarta, O=BlankOn, OU=Infrastruktur, CN=CA
        Subject: C=ID, ST=Jakarta, L=Jakarta, O=BlankOn, OU=Irgsh, CN=CA Pabrik
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Persis sama dengan sertifikat yang dibuat sebelumnya kan? Memang sertifikat itu
yang akan dipakai menjadi CA baru ini.&lt;/p&gt;

&lt;h3&gt;Buat sertifikat dengan CA tingkat kedua tadi&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Buat permintaan sertifikat seperti biasa&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ./CA.pl -newreq
Generating a 1024 bit RSA private key
............++++++
............++++++
writing new private key to 'newkey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:ID
State or Province Name (full name) [Some-State]:Jakarta
Locality Name (eg, city) []:Jakarta
Organization Name (eg, company) [Internet Widgits Pty Ltd]:BlankOn
Organizational Unit Name (eg, section) []:Pabrik
Common Name (eg, YOUR name) []:Pekerja64
Email Address []:


Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Request is in newreq.pem, private key is in newkey.pem
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tandatangani&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ./CA.pl -sign
Using configuration from /usr/lib/ssl/openssl.cnf
Enter pass phrase for ./demoCA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 0 (0x0)
        Validity
            Not Before: Feb 24 16:05:13 2011 GMT
            Not After : Feb 24 16:05:13 2012 GMT
        Subject:
            countryName               = ID
            stateOrProvinceName       = Jakarta
            localityName              = Jakarta
            organizationName          = BlankOn
            organizationalUnitName    = Pabrik
            commonName                = Pekerja64
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                15:0E:2E:71:C3:AF:4A:A4:99:01:D5:C8:3E:CF:EB:9F:08:3D:85:1D
            X509v3 Authority Key Identifier: 
                keyid:05:B3:34:C6:A8:64:A8:C1:E1:5B:B6:03:93:5C:38:19:CA:41:DF:48


Certificate is to be certified until Feb 24 16:05:13 2012 GMT (365 days)
Sign the certificate? [y/n]:y
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
Signed certificate is in newcert.pem&lt;/p&gt;

&lt;p&gt;Seperti biasa, kita akan menjumpai 3 berkas baru. Mari cek informasi sertifikat baru ini.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    $ openssl x509 -in newcert.pem -text | grep 'Subject:\|Issuer:'
            Issuer: C=ID, ST=Jakarta, L=Jakarta, O=BlankOn, OU=Irgsh, CN=CA Pabrik
            Subject: C=ID, ST=Jakarta, L=Jakarta, O=BlankOn, OU=Pabrik, CN=Pekerja64
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Dapat dilihat sertifikat baru ini ditandatangani oleh CA kedua yang kita buat.&lt;/p&gt;

&lt;h3&gt;Bertingkat&lt;/h3&gt;

&lt;p&gt;Mari kita lihat informasi 3 sertifikat yang telah kita buat.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;CA utama&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ openssl x509 -in ../ca-utama/demoCA/cacert.pem -text | grep 'Subject:\|Issuer:'
        Issuer: C=ID, ST=Jakarta, O=BlankOn, OU=Infrastruktur, CN=CA
        Subject: C=ID, ST=Jakarta, O=BlankOn, OU=Infrastruktur, CN=CA
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CA kedua&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ openssl x509 -in demoCA/cacert.pem -text | grep 'Subject:\|Issuer:'
        Issuer: C=ID, ST=Jakarta, O=BlankOn, OU=Infrastruktur, CN=CA
        Subject: C=ID, ST=Jakarta, L=Jakarta, O=BlankOn, OU=Irgsh, CN=CA Pabrik
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sertifikat biasa&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ openssl x509 -in newcert.pem -text | grep 'Subject:\|Issuer:'
        Issuer: C=ID, ST=Jakarta, L=Jakarta, O=BlankOn, OU=Irgsh, CN=CA Pabrik
        Subject: C=ID, ST=Jakarta, L=Jakarta, O=BlankOn, OU=Pabrik, CN=Pekerja64
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Apakah terlihat hubungan antara ketiga sertifikat di atas?&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3064211089164695382-9104466102812956749?l=ngoprek.fajran.web.id&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Fri, 25 Feb 2011 15:48:12 +0000</pubDate>
</item>
<item>
	<title>apt-web</title>
	<guid>http://ngoprek.fajran.web.id/2011/02/apt-web.html</guid>
	<link>http://ngoprek.fajran.web.id/2011/02/apt-web.html</link>
	<description>&lt;p&gt;Sudah tersedia melalui &lt;a href=&quot;https://chrome.google.com/webstore/detail/fdeigbbfbkfnojacgjplbojibikabbmk?hl=en-US&quot;&gt;Chrome Web Store&lt;/a&gt; :D&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3064211089164695382-3781441956972919555?l=ngoprek.fajran.web.id&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Thu, 10 Feb 2011 12:43:14 +0000</pubDate>
</item>
<item>
	<title>Metaclass di Python</title>
	<guid>http://ngoprek.fajran.web.id/2011/02/metaclass-di-python.html</guid>
	<link>http://ngoprek.fajran.web.id/2011/02/metaclass-di-python.html</link>
	<description>&lt;p&gt;Ternyata &lt;a href=&quot;http://docs.python.org/reference/datamodel.html#customizing-class-creation&quot;&gt;metaclass&lt;/a&gt; di Python itu sangat menarik karena kita bisa melakukan &lt;a href=&quot;http://www.voidspace.org.uk/python/articles/metaclasses.shtml&quot;&gt;ilmu hitam&lt;/a&gt; :D Salah satu ilmu hitam yang sedang/akan saya pakai adalah membuat deklarasi kelas yang baru saja dibuat menjadi lenyap secara tiba2 dan alih-alih kita mendapatkan sebuah objek/instance dari kelas tersebut.&lt;/p&gt;

&lt;p&gt;Mengapa saya memerlukan sesuatu yang &quot;aneh&quot; seperti ini? Singkatnya saya sedang membuat semacam domain specific language yang berbasiskan Python. Dengan menggunakan trik sulap di atas, saya bisa membuat bahasa yang saya buat tadi menjadi lebih mudah dipakai. Maaf kalo saya blom bisa menjelaskan dg lebih detail.&lt;/p&gt;

&lt;p&gt;Di Python, metaclass bisa digambarkan sebagai sebuah kode yang dijalankan saat sebuah kelas dideklarasikan. Dengan demikian kita bisa mengutak atik wujud sebuah kelas sebelum kelas teresebut siap dipakai. Contoh penggunaan dasarnya adalah sebagai berikut.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class MetaProvinsi(type):
    def __new__(cls, name, bases, attrs):
        return type.__new__(cls, name, bases, attrs)

class Provinsi(object):
    __metaclass__ = MetaProvinsi&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Pada contoh di atas, ada sebuah kelas bernama &lt;code&gt;Provinsi&lt;/code&gt; yang memiliki metaclass &lt;code&gt;MetaProvinsi&lt;/code&gt;. Kode pada fungsi &lt;code&gt;__new__&lt;/code&gt; di atas adalah bagian kode yang dapat diisi untuk mengubah wujud kelas &lt;code&gt;Provinsi&lt;/code&gt;. Fungsi ini menerima 4 buah parameter yaitu:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;cls&lt;/code&gt; yang menunjuk ke diri sendiri (yaitu &lt;code&gt;MetaProvinsi&lt;/code&gt;),&lt;/li&gt;
&lt;li&gt;&lt;code&gt;name&lt;/code&gt; yang berisi nama kelas yang dibuat (dalam contoh di atas, &lt;code&gt;name&lt;/code&gt; berisi &lt;/li&gt;&lt;/ol&gt;Provinsi),
&lt;li&gt;&lt;code&gt;bases&lt;/code&gt; yang berisi daftar kelas yang diturunkan oleh si &lt;code&gt;Provinsi&lt;/code&gt; (yaitu &lt;code&gt;object&lt;/code&gt;), dan&lt;/li&gt;
&lt;li&gt;&lt;code&gt;attrs&lt;/code&gt; yang berupa sebuah dictionary berisi daftar atribut (instance variables dan/atau methods) dari &lt;code&gt;Provinsi&lt;/code&gt;.&lt;/li&gt;


&lt;p&gt;Metaclass pada contoh di atas masih tidak melakukan hal apa-apa sehingga kelas &lt;code&gt;Provinsi&lt;/code&gt; tsb sebenarnya tidak mengalami perubahan apa-apa. Sekarang mari kita ubah sedikit contoh di atas.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class MetaKabupaten(type):
    def __new__(cls, name, bases, attrs):
        attrs['nama_kelas'] = name
        return type.__new__(cls, name, bases, attrs)

class Kabupaten(object):
    __metaclass__ = MetaKabupaten&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Kali ini kita mengubah dict &lt;code&gt;attrs&lt;/code&gt; dengan menambahkan sebuah isian dengan kunci &lt;code&gt;nama_kelas&lt;/code&gt; yang berisi nilai dari variabel &lt;code&gt;name&lt;/code&gt;, yaitu nama kelas yang baru saja dibuat yaitu &lt;code&gt;Kabupaten&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Apa bedanya contoh pertama dengan kedua? mari kita buat objek dari kelas &lt;code&gt;Provinsi&lt;/code&gt; dan &lt;code&gt;Kabupaten&lt;/code&gt; yang sudah dideklarasikan di atas.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;p = Provinsi()
print p.nama_kelas&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Andai kode di atas dijalankan, maka Python akan mengatakan bahwa atribut &lt;code&gt;nama_kelas&lt;/code&gt; tidak ditemukan pada objek dari kelas &lt;code&gt;Provinsi&lt;/code&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;AttributeError: 'Provinsi' object has no attribute 'nama_kelas'&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Alasannya sudah jelas karena pada saat mendeklarasikan kelas &lt;code&gt;Provinsi&lt;/code&gt; (maupun saat menginisialisasi kelas tersebut), kita tidak pernah membuat sebuah instance variable bernama &lt;code&gt;nama_kelas&lt;/code&gt;. Sekarang kita coba dengan kelas &lt;code&gt;Kabupaten&lt;/code&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;k = Kabupaten()
print k.nama_kelas&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Bukan sulap bukan sihir, Python dapat dijalankan sampai selesai dan kita mendapat sebuah keluaran di layar seperti berikut.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Kabupaten&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Keluaran tersebut dihasilkan dari &lt;code&gt;k.nama_kelas&lt;/code&gt; yaitu nilai sebuah instance variable bernama &lt;code&gt;nama_kelas&lt;/code&gt; dari objek &lt;code&gt;k&lt;/code&gt; yang dibangun dari kelas &lt;code&gt;Kabupaten&lt;/code&gt;. Kapan instance variable &lt;code&gt;nama_kelas&lt;/code&gt; tersebut hadir? Jawabannya adalah pada saat kelas &lt;code&gt;Kabupaten&lt;/code&gt; tersebut dibuat, lebih tepatnya dilakukan oleh metaclass &lt;code&gt;MetaKabupaten&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Sekian dulu pengantar penggunaan Metaclass dari saya. Lain kali saya contohkan ilmu hitam yg sedang saya pakai maupun contoh pe(nyalah)gunaan lainnya. Contoh kode bisa dilihat di &lt;a href=&quot;https://gist.github.com/814525&quot;&gt;https://gist.github.com/814525&lt;/a&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3064211089164695382-6926813797705052484?l=ngoprek.fajran.web.id&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Mon, 07 Feb 2011 16:24:12 +0000</pubDate>
</item>
<item>
	<title>IPv6</title>
	<guid>http://ngoprek.fajran.web.id/2011/02/ipv6.html</guid>
	<link>http://ngoprek.fajran.web.id/2011/02/ipv6.html</link>
	<description>&lt;p&gt;Website yang saya pelihara berikut sudah bisa diakses via IPv6, terima kasih tuk &lt;a href=&quot;http://www.dreamhost.com/r.cgi?263229&quot;&gt;Dreamhost&lt;/a&gt;. Selamat menikmati..&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://fajran.web.id&quot;&gt;fajran.web.id&lt;/a&gt;
&lt;a href=&quot;http://blog.fajran.web.id&quot;&gt;blog.fajran.web.id&lt;/a&gt;
&lt;a href=&quot;http://dahsy.at&quot;&gt;dahsy.at&lt;/a&gt;
&lt;a href=&quot;http://apt-web.dahsy.at&quot;&gt;apt-web.dahsy.at&lt;/a&gt;
&lt;a href=&quot;http://csui02.net&quot;&gt;csui02.net&lt;/a&gt;
&lt;a href=&quot;http://planet.csui02.net&quot;&gt;planet.csui02.net&lt;/a&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3064211089164695382-6426353074983368146?l=ngoprek.fajran.web.id&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Sun, 06 Feb 2011 07:04:25 +0000</pubDate>
</item>
<item>
	<title>Slide tutorial Git</title>
	<guid>http://ngoprek.fajran.web.id/2011/02/slide-tutorial-git.html</guid>
	<link>http://ngoprek.fajran.web.id/2011/02/slide-tutorial-git.html</link>
	<description>&lt;p&gt;Bulan Desember kemarin saya sempat membuat dua buah slide mengenai Git. Slide ini sempat dipakai tuk tutorial di kanal IRC &lt;a href=&quot;http://mibbit.com/?channel=%23debian-l10n-indonesian&amp;server=irc.oftc.net&quot;&gt;&lt;code&gt;#debian-l10n-indonesian&lt;/code&gt;&lt;/a&gt; di irc.debian.org. Sebenernya masih ada (minimal) 1 slide lagi yg pengen saya buat, yaitu mengenai percabangan di Git.. namun.. belom sempet lagi xD Ya sudah lah nikmati saja apa yg ada dulu. Semoga bermanfaat :)&lt;/p&gt;

&lt;p&gt;&lt;a title=&quot;View Pengenalan Git on Scribd&quot; href=&quot;http://www.scribd.com/doc/45052943/Pengenalan-Git&quot;&gt;Pengenalan Git&lt;/a&gt;&lt;p&gt;
                                                                                                                                   

&lt;p&gt;&lt;a title=&quot;View Berkolaborasi dengan Git on Scribd&quot; href=&quot;http://www.scribd.com/doc/45509577/Berkolaborasi-dengan-Git&quot;&gt;Berkolaborasi dengan Git&lt;/a&gt;&lt;/p&gt;

                                                                                                                                    &lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3064211089164695382-738357019557452284?l=ngoprek.fajran.web.id&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;&lt;/p&gt;&lt;/p&gt;</description>
	<pubDate>Fri, 04 Feb 2011 18:34:18 +0000</pubDate>
</item>
<item>
	<title>Python Trivia #2</title>
	<guid>http://ngoprek.fajran.web.id/2011/02/python-trivia-2.html</guid>
	<link>http://ngoprek.fajran.web.id/2011/02/python-trivia-2.html</link>
	<description>&lt;p&gt;Teka teki Python babak 2, masih ada hubungannya dg &lt;a href=&quot;http://ngoprek.fajran.web.id/2010/12/python-trivia.html&quot;&gt;babak pertama&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Salah satu cara cepat untuk membuat list dengan &lt;code&gt;n&lt;/code&gt; elemen adalah dg menggunakan operator kali seperti contoh di bawah&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; [1] * 5
[1, 1, 1, 1, 1]
&amp;gt;&amp;gt;&amp;gt; [None] * 5
[None, None, None, None, None]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Pada list yang dihasilkan, tentu saja kita bisa ngubah nilai elemennya&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = [1] * 5
&amp;gt;&amp;gt;&amp;gt; a
[1, 1, 1, 1, 1]
&amp;gt;&amp;gt;&amp;gt; a[3] = 200
&amp;gt;&amp;gt;&amp;gt; a
[1, 1, 1, 200, 1]&lt;/code&gt;&lt;/pre&gt;

Nah.. coba perhatikan kode berikut dan tebak apa nilai akhir dari variabel &lt;code&gt;b&lt;/code&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; b = [{}] * 5
&amp;gt;&amp;gt;&amp;gt; b
[{}, {}, {}, {}, {}]
&amp;gt;&amp;gt;&amp;gt; b[0]['a'] = 100&lt;/code&gt;&lt;/pre&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3064211089164695382-2841451828297473769?l=ngoprek.fajran.web.id&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Fri, 04 Feb 2011 11:39:05 +0000</pubDate>
</item>
<item>
	<title>Mengukur jarak</title>
	<guid>http://blog.fajran.web.id/2011/01/16/mengukur-jarak/</guid>
	<link>http://blog.fajran.web.id/2011/01/16/mengukur-jarak/</link>
	<description>&lt;p&gt;Buat yg ngga punya penggaris tuk ngukur jarak antara dua tempat, mari kita manfaatkan google maps untuk melakukannya :D pertama2.. install linux^W^W buka browser dan lalu buka google maps&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://blog.fajran.web.id/wp-content/uploads/2011/01/01.png&quot;&gt;&lt;img src=&quot;http://blog.fajran.web.id/wp-content/uploads/2011/01/01-450x304.png&quot; alt=&quot;&quot; title=&quot;01&quot; width=&quot;450&quot; height=&quot;304&quot; class=&quot;aligncenter size-medium wp-image-158&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Setidaknya ada 2 cara untuk nyari tau jarak, yang pertama adalah dg make fasilitas pencari arah alias get direction. Masukkan dua tempat yang ingin dicari tahu jaraknya lalu klik Get Direction. Kalau mau lebih bebas nentuin lokasi (baca: bisa milih lokasi scr visual dg klik/drag/drop), masukin aja lokasi yg sama untuk kedua isian tempat.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://blog.fajran.web.id/wp-content/uploads/2011/01/02.png&quot;&gt;&lt;img src=&quot;http://blog.fajran.web.id/wp-content/uploads/2011/01/02-450x304.png&quot; alt=&quot;&quot; title=&quot;Get Direction&quot; width=&quot;450&quot; height=&quot;304&quot; class=&quot;aligncenter size-medium wp-image-159&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kalau udah, drag icon A dan B di peta ke 2 tempat yg diinginkan. Jangan lupa pilih Walking agar pencarian jalan ngga harus ngikutin arah jalur yg ada. Kalau sudah, akan ada daftar Suggested Routes yg juga menampilkan jarak antara dua tempat yg dipilih.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://blog.fajran.web.id/wp-content/uploads/2011/01/03.png&quot;&gt;&lt;img src=&quot;http://blog.fajran.web.id/wp-content/uploads/2011/01/03-450x304.png&quot; alt=&quot;&quot; title=&quot;Pilih lokasi&quot; width=&quot;450&quot; height=&quot;304&quot; class=&quot;aligncenter size-medium wp-image-164&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kalau mau bikin rute sendiri, garis rute biru yg ada juga bisa pilih-titik-di-rute lalu klik-dan-geser ke lokasi lain.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://blog.fajran.web.id/wp-content/uploads/2011/01/03b.png&quot;&gt;&lt;img src=&quot;http://blog.fajran.web.id/wp-content/uploads/2011/01/03b-450x304.png&quot; alt=&quot;&quot; title=&quot;Rute Bebas&quot; width=&quot;450&quot; height=&quot;304&quot; class=&quot;aligncenter size-medium wp-image-167&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cara kedua adalah dg memanfaatkan fitur eksperimental yg ada di google maps labs.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://blog.fajran.web.id/wp-content/uploads/2011/01/04a.png&quot;&gt;&lt;img src=&quot;http://blog.fajran.web.id/wp-content/uploads/2011/01/04a-450x81.png&quot; alt=&quot;&quot; title=&quot;Google Maps Labs&quot; width=&quot;450&quot; height=&quot;81&quot; class=&quot;aligncenter size-medium wp-image-170&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nyalain fitur Distance Measurement Tool&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://blog.fajran.web.id/wp-content/uploads/2011/01/04.png&quot;&gt;&lt;img src=&quot;http://blog.fajran.web.id/wp-content/uploads/2011/01/04-450x304.png&quot; alt=&quot;&quot; title=&quot;Distance Measurement Tool&quot; width=&quot;450&quot; height=&quot;304&quot; class=&quot;aligncenter size-medium wp-image-171&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kalau sudah, nanti di bagian kiri bawah layar peta akan ada icon penggaris yg kalau diklik akan memunculkan Distance Measurement Tool untuk mencari tahu jarak&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://blog.fajran.web.id/wp-content/uploads/2011/01/05.png&quot;&gt;&lt;img src=&quot;http://blog.fajran.web.id/wp-content/uploads/2011/01/05-450x304.png&quot; alt=&quot;&quot; title=&quot;distance&quot; width=&quot;450&quot; height=&quot;304&quot; class=&quot;aligncenter size-medium wp-image-172&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Klik titik-titik pada peta untuk membuat rute. Nanti google maps akan scr otomatis menampilkan jarak rute tsb.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://blog.fajran.web.id/wp-content/uploads/2011/01/06.png&quot;&gt;&lt;img src=&quot;http://blog.fajran.web.id/wp-content/uploads/2011/01/06-450x304.png&quot; alt=&quot;&quot; title=&quot;Distance&quot; width=&quot;450&quot; height=&quot;304&quot; class=&quot;aligncenter size-medium wp-image-163&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dengan demikian anda telah menghemat uang untuk membeli penggaris^W meteran xD&lt;/p&gt;</description>
	<pubDate>Sun, 16 Jan 2011 16:02:50 +0000</pubDate>
</item>
<item>
	<title>Python Trivia</title>
	<guid>http://ngoprek.fajran.web.id/2010/12/python-trivia.html</guid>
	<link>http://ngoprek.fajran.web.id/2010/12/python-trivia.html</link>
	<description>&lt;p&gt;Coba compile dan jalanin kode berikut di otak. Jangan nyontek!&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class Kantong(object):
    def __init__(self, data=[]):
        self.data = data
    def add_data(self, angka):
        self.data.append(angka)
    def cetak(self):
        print 'Daftar angka:', self.data

satu = Kantong()
satu.add_data(1)
satu.add_data(2)
satu.cetak()

dua = Kantong()
dua.add_data(3)
dua.add_data(4)
dua.add_data(5)
dua.cetak()&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Apa keluarannya?&lt;/p&gt;

&lt;p&gt;Sekarang coba pake interpreter &lt;code&gt;python&lt;/code&gt; yang Anda punya. Jalankan dan lihat apa keluarannya.&lt;/p&gt;

&lt;p&gt;Sama kah dengan yang Anda pikirkan sebelumnya? Kalau sama, &lt;strong&gt;selamat!&lt;/strong&gt;. Kalau beda, coba cari tau apa masalahnya :D&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3064211089164695382-4501493323938862729?l=ngoprek.fajran.web.id&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Thu, 02 Dec 2010 15:25:09 +0000</pubDate>
</item>
<item>
	<title>Kinect dan OpenKinect</title>
	<guid>http://ngoprek.fajran.web.id/2010/11/kinect-dan-openkinect.html</guid>
	<link>http://ngoprek.fajran.web.id/2010/11/kinect-dan-openkinect.html</link>
	<description>&lt;p&gt;Mainan baru minggu ini: &lt;a href=&quot;http://www.xbox.com/en-US/kinect&quot;&gt;Kinect&lt;/a&gt; :D&lt;/p&gt;

&lt;p&gt;Dalam waktu singkat setelah produk baru dari microsoft ini diluncurkan, seseorang sudah berhasil &lt;a href=&quot;http://nuigroup.com/forums/viewthread/11154/&quot;&gt;membuat aplikasi&lt;/a&gt; yang dapat mengendalikan Kinect! Sementara di tempat lain di eropa, dalam waktu hanya 3 jam setelah peluncuran Kinect di Eropa, seseorang yang lain lagi juga telah berhasil &lt;a href=&quot;http://www.engadget.com/2010/11/10/open-source-kinect-camera-driver-now-available-for-download/&quot;&gt;membuat aplikasi sejenis&lt;/a&gt; yang juga dapat mengendalikan Kinect dan mengambil video yang ditangkap oleh Kinect. Walau kedua aplikasi/pustaka memiliki fungsi yang sama, yang kedua memiliki lisensi terbuka sehingga juga memenangkan &lt;a href=&quot;http://www.adafruit.com/blog/2010/11/10/we-have-a-winner-open-kinect-drivers-released-winner-will-use-3k-for-more-hacking-plus-an-additional-2k-goes-to-the-eff/&quot;&gt;kontes&lt;/a&gt; yang diselenggarakan oleh Adafruit, yaitu kontes membuat pustaka terbuka untuk Kinect. Pustaka ini dapat diunduh dengan bebas langsung di repositori kodenya: &lt;a href=&quot;https://github.com/OpenKinect/libfreenect&quot;&gt;https://github.com/OpenKinect/libfreenect&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Setelah saya mendapat pinjaman Kinect dari supervisor saya, saya juga langsung nyoba2 OpenKinect. Ternyata OpenKinect dapat bekerja dengan sangat baik, saya hanya perlu mengkompilasinya dan contoh yg disertakan dapat langsung dijalankan.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git clone git://github.com/OpenKinect/libfreenect.git
$ mkdir build
$ cd build
$ cmake ../libfreenect
$ make
$ sudo cp ../libfreenect/platform/linux/udev/51-kinect.rules /etc/udev/rules.d/
$ ./bin/glview&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;a href=&quot;http://2.bp.blogspot.com/_pPnjU84XXXs/TO084zD_NwI/AAAAAAAAFgw/9e3YJb3c6LU/s1600/Screenshot-Untitled%2BWindow-3.png&quot;&gt;&lt;img src=&quot;http://2.bp.blogspot.com/_pPnjU84XXXs/TO084zD_NwI/AAAAAAAAFgw/9e3YJb3c6LU/s400/Screenshot-Untitled%2BWindow-3.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5543153662840223490&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Apa sih yang unik dari Kinect ini? Kinect, selain memiliki sebuah kamera berwarna, memiliki kamera yang dapat digunakan untuk memetakan ruangan dalam ruang 3 dimensi. Hal ini dapat dilakukan karena kamera ini dapat memberikan informasi kedalaman/jarak/depth untuk setiap titik yang dipantau oleh kamera. Dengan informasi kedalaman ini, gambar yang ditangkap bukan lagi hanya gambar 2 dimensi, melainkan 3 dimensi. Operasi &quot;memutar&quot; gambar dalam ruang 3 dimensi juga dapat dilakukan. Contohnya ada pada video berikut.&lt;/p&gt;



&lt;p&gt;Dengan informasi kedalaman ini, objek-objek yang tertangkap oleh kamera juga dapat dibedakan satu sama lain dengan membandingkan informasi kedalaman yang ada. Hal ini berguna untuk memisahkan objek-objek penting dan tidak penting, tergantung keperluan yang ada. Contoh aplikasi dari teknik ini dicontohkan oleh video berikut. Dalam video ini, objek tangan dapat dikenali dengan mudah dan dipisahkan dari latar belakang dan objek lain yang ada. Objek tangan ini lalu digunakan sebagai pemandu untuk melakukan transformasi objek 3 dimensi virtual yang dibuat oleh komputer.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://vimeo.com/17045326&quot;&gt;Kinect Object Manipulation&lt;/a&gt; from &lt;a href=&quot;http://vimeo.com/user1329749&quot;&gt;Dominick D&amp;#039;Aniello&lt;/a&gt; on &lt;a href=&quot;http://vimeo.com&quot;&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Saya sendiri baru mencoba untuk membuat &quot;point cloud&quot; dari titik-titik yang ada dan meletakkannya dalam ruang 3 dimensi. Inilah hasilnya :D&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://3.bp.blogspot.com/_pPnjU84XXXs/TO0_v0T8ySI/AAAAAAAAFg4/xhMyEfUBby0/s1600/Screenshot-4.png&quot;&gt;&lt;img src=&quot;http://3.bp.blogspot.com/_pPnjU84XXXs/TO0_v0T8ySI/AAAAAAAAFg4/xhMyEfUBby0/s400/Screenshot-4.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5543156807091669282&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Salah satu kemungkinan pengembangan lebih lanjut dari point cloud ini adalah scanner 3 dimensi. Dengan meletakkan sebuah objek di depan Kinect lalu memutarnya sehingga seluruh bagian terekam, objek (virtual) yang sama dapat kita tampilkan di komputer dan juga dapat kita olah dengan bantuan aplikasi seperti Blender.&lt;/p&gt;

&lt;p&gt;Sekian dulu cerita tentang Kinect dan OpenKinect dari saya.. nantikan perkembangan selanjutnya di lain waktu =D&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3064211089164695382-5065984689686152653?l=ngoprek.fajran.web.id&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Wed, 24 Nov 2010 17:43:14 +0000</pubDate>
</item>
<item>
	<title>Cython dan mingw32</title>
	<guid>http://ngoprek.fajran.web.id/2010/11/cython-dan-mingw32.html</guid>
	<link>http://ngoprek.fajran.web.id/2010/11/cython-dan-mingw32.html</link>
	<description>&lt;p&gt;Sekedar catatan supaya ngga lupa dan supaya blog ini ada isi barunya xD&lt;/p&gt;

&lt;p&gt;Kalau make &lt;a href=&quot;http://www.cython.org/&quot;&gt;Cython&lt;/a&gt;, kita bisa menambahkan perintah berikut di awal skrip Python agar setiap skrip Cython langsung dikompilasi secara otomatis.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;import pyximport
pyximport.install()&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Namun proses kompilasi bisa berakhir dengan gagal dengan pesan berikut.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Unable to find vcvarsall.bat&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Oh iya, ini saya ngejalanin skripnya di atas Windows..&lt;/p&gt;

&lt;p&gt;Saya ngga tau apa penyebabnya, mungkin ada hubungannya dengan Visual Studio dan mingw32 yang tidak begitu akur atau bagaimanalah itu. Yang jelas, salah satu solusinya adalah dengan menambahkan parameter pada pemanggilan &lt;code&gt;pyximport.install()&lt;/code&gt; seperti berikut.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;mingw_setup_args={'options': {'build_ext': {'compiler': 'mingw32'}}}
import pyximport; pyximport.install(setup_args=mingw_setup_args)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Sumber: &lt;a href=&quot;http://stackoverflow.com/questions/943658/cython-pyximport-error-on-windows&quot;&gt;Stack Overflow&lt;/a&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3064211089164695382-5597083965289121107?l=ngoprek.fajran.web.id&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Thu, 18 Nov 2010 11:39:23 +0000</pubDate>
</item>
<item>
	<title>pyactivemq di Ubuntu</title>
	<guid>http://ngoprek.fajran.web.id/2010/10/pyactivemq-di-ubuntu.html</guid>
	<link>http://ngoprek.fajran.web.id/2010/10/pyactivemq-di-ubuntu.html</link>
	<description>&lt;p&gt;Bagi yang ingin menggunakan &lt;a href=&quot;http://code.google.com/p/pyactivemq/&quot;&gt;pyactivemq&lt;/a&gt; di Ubuntu 10.04, silakan mengambil paket2nya pada repostori berikut.. :D&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;deb http://ppa.launchpad.net/fajran/activemq/ubuntu lucid main 
deb-src http://ppa.launchpad.net/fajran/activemq/ubuntu lucid main&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;*mudah2an bikin paketnya bener*&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3064211089164695382-5178151843817074990?l=ngoprek.fajran.web.id&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Fri, 22 Oct 2010 10:37:57 +0000</pubDate>
</item>
<item>
	<title>Serial console di Ubuntu</title>
	<guid>http://ngoprek.fajran.web.id/2010/09/serial-console-di-ubuntu.html</guid>
	<link>http://ngoprek.fajran.web.id/2010/09/serial-console-di-ubuntu.html</link>
	<description>&lt;p&gt;&lt;span title=&quot;sangkil.science.uva.nl&quot;&gt;Dua&lt;/span&gt; &lt;span title=&quot;mangkus.science.uva.nl&quot;&gt;server&lt;/span&gt; baru di tempat saya kerja ini memiliki &lt;a href=&quot;http://en.wikipedia.org/wiki/Intelligent_Platform_Management_Interface&quot;&gt;IPMI&lt;/a&gt; untuk keperluan pengaturan server dari jauh. Salah satu fasilitas yang ditawarkan adalah &lt;a href=&quot;http://en.wikipedia.org/wiki/Serial_over_LAN&quot;&gt;serial over LAN&lt;/a&gt; yang memungkinkan saya untuk menggunakan serial port yang ada namun melalui jaringan.&lt;/p&gt;

&lt;p&gt;Konfigurasi standar yang disediakan oleh &lt;a href=&quot;http://www.ubuntu.com/server&quot;&gt;Ubuntu Server&lt;/a&gt; ternyata belum mengaktifkan &quot;tampilan&quot; melalui serial port. Setidaknya ada dua hal yang bisa saya atur agar menggunakan serial port untuk mengeluarkan tampilan (bukan cuma ke layar monitor), yaitu Linux itu sendiri (yaitu apa saja yg biasa tampil sebelum masuk shell dan saat shutdown) dan sebuah terminal yang dapat digunkan untuk login ke sistem.

&lt;p&gt;Agar Linux mengeluarkan pesan-pesan ke serial port, tambahkan konfigurasi di bawah ini ke dalam parameter pendefinisian kernel di boot loader.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;console=ttyS1,57600 console=tty0&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Pengguna Grub2 dapat mengubah berkas konfigurasinya di &lt;code&gt;/boot/grub/grub.cfg&lt;/code&gt; yaitu pada baris seperti berikut.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;linux   /boot/vmlinuz-2.6.32-24-server root=UUID=2fff5b23-53a6-415e-8bfd-8caa6218e4e9 ro console=ttyS1,57600 console=tty0  quiet&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Mengubah langsung di konfigurasi Grub memang bisa dilakukan, namun ada cara yang lebih tepat sehingga setiap ada perubahan konfigurasi Grub (misalnya gara-gara ada kernel baru yang dipasang), konfigurasi tambahan ini tetap bertahan. Untuk itu, ubah berkas &lt;code&gt;/etc/default/grub&lt;/code&gt; dan ubah nilai &lt;code&gt;GRUB_CMDLINE_LINUX&lt;/code&gt; dari kosong menjadi seperti di bawah ini.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;GRUB_CMDLINE_LINUX=&quot;console=ttyS1,57600 console=tty0&quot;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Setelah itu perbarui konfigurasi Grub dengan menjalankan perintah berikut.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo update-grub&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Agar serial port ini dapat digunakan juga untuk login ke sistem, maka perlu ada aplikasi yang memantau si serial port ini dan memberikan fasilitas login. Kalau membaca &lt;a href=&quot;http://f0x.cz.cc/content/remote-server-dell-poweredge-2950-menggunakan-ipmi&quot;&gt;tutorial&lt;/a&gt; yang ada, biasanya ada baris yang perlu ditambahkan di &lt;code&gt;/etc/inittab&lt;/code&gt; yang berisi eksekusi &lt;code&gt;getty&lt;/code&gt;. Namun berhubung Ubuntu sudah tidak menggunakan &lt;code&gt;/etc/inittab&lt;/code&gt; lagi dan mengantinya dengan konfigurasi Upstart, maka tentu saja ada cara yang lebih tepat :D&lt;/p&gt;

&lt;p&gt;Buatlah sebuah berkas &lt;code&gt;/etc/init/ttyS1.conf&lt;/code&gt; lalu isi dengan tulisan berikut.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;start on runlevel [23]
stop on runlevel [!23]

respawn
exec /sbin/getty -L ttyS1 57600 vt100&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Maka setiap Ubuntu dinyalakan, aplikasi &lt;code&gt;getty&lt;/code&gt; akan secara otomatis dinyalakan dan memantau serta memberikan fasilitas login pada serial port yang disebut, dalam hal ini adalah &lt;code&gt;ttyS1&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Setelah semua diatur, komputer bisa direstart agar &quot;konfigurasi default&quot; ini dapat dicoba. Kalau sudah berhasil, seharusnya perintah &lt;code&gt;sol activate&lt;/code&gt; dari mesin sebelah dengan &lt;code&gt;ipmitool&lt;/code&gt; bisa dijalankan.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://1.bp.blogspot.com/_pPnjU84XXXs/TKSf51qztwI/AAAAAAAAFfw/vipqNmeBaRM/s1600/sol.png&quot;&gt;&lt;img src=&quot;http://1.bp.blogspot.com/_pPnjU84XXXs/TKSf51qztwI/AAAAAAAAFfw/vipqNmeBaRM/s400/sol.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5522714859071059714&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3064211089164695382-4297535624011930412?l=ngoprek.fajran.web.id&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;&lt;/p&gt;</description>
	<pubDate>Thu, 30 Sep 2010 17:36:21 +0000</pubDate>
</item>
<item>
	<title>Benchmark</title>
	<guid>http://ngoprek.fajran.web.id/2010/09/benchmark.html</guid>
	<link>http://ngoprek.fajran.web.id/2010/09/benchmark.html</link>
	<description>&lt;p&gt;Satu hal yang hampir pasti dilakukan oleh tukang review komputer beserta komponen2nya adalah melakukan benchmark. Memang ada banyak aplikasi yang bisa dan biasa dipake untuk melakukan benchmark, tapi belum tentu hasilnya mencerminkan apa yang benar2 kita rasakan karena hal yang diuji berbeda dengan hal yang biasa kita lakukan.&lt;/p&gt;

&lt;p&gt;Bagi tukang koding, mungkin kompilasi sebuah aplikasi besar seperti &lt;a href=&quot;http://www.kernel.org&quot;&gt;Linux&lt;/a&gt; atau &lt;a href=&quot;http://www.vtk.org&quot;&gt;VTK&lt;/a&gt; bisa dijadikan cara melakukan benchmark komputer hehe..&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://2.bp.blogspot.com/_pPnjU84XXXs/TIVZlZjlIII/AAAAAAAAFd8/Lyx_uAzNO6g/s1600/Screenshot.png&quot;&gt;&lt;img src=&quot;http://2.bp.blogspot.com/_pPnjU84XXXs/TIVZlZjlIII/AAAAAAAAFd8/Lyx_uAzNO6g/s400/Screenshot.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5513911817835192450&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3064211089164695382-1719405013540026853?l=ngoprek.fajran.web.id&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Tue, 07 Sep 2010 00:14:20 +0000</pubDate>
</item>
<item>
	<title>Instalasi PyOpenCL</title>
	<guid>http://ngoprek.fajran.web.id/2010/07/instalasi-pyopencl.html</guid>
	<link>http://ngoprek.fajran.web.id/2010/07/instalasi-pyopencl.html</link>
	<description>&lt;p&gt;Dalam petualangan saya dengan OpenCL ini, saya sengaja mencari jalan pintas agar cepat akrab dengan OpenCL. Salah satu caranya adalah dengan menggunakan bahasa &quot;yang gak terlalu rewel&quot; seperti Python dalam membuat aplikasi yang nanti akan menggunakan OpenCL ini. Kode OpenCL sendiri tetap ditulis dalam bahasa yang digunakannya, yaitu subset bahasa C, namun aplikasi yang menggunakannya ditulis dalam bahasa Python. Untuk menggunakan OpenCL dari Python, kita bisa menggunakan &lt;a href=&quot;http://mathema.tician.de/software/pyopencl&quot;&gt;PyOpenCL&lt;/a&gt; yang akan saya tunjukan proses instalasinya.&lt;/p&gt;

&lt;p&gt;Bagi pengguna Ubuntu 10.04, saya sudah membuatkan paketnya dan meletakkannya di Launchpad PPA saya. Jalankan perintah berikut untuk memasang paket tsb.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo apt-add-repository ppa:fajran/opencl
$ sudo apt-get update
$ sudo apt-get install python-pyopencl
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;Bagi yang tidak menggunakan Ubuntu 10.04, lain kali akan saya tunjukkan cara instalasi manualnya. Tadinya mau ditulis juga tapi kok ada yang mengganjal :D &lt;a href=&quot;http://wiki.tiker.net/PyOpenCL/Installation&quot;&gt;Panduan resminya&lt;/a&gt; ada juga loh, jadi gak usah nunggu saya juga :P&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Untuk menguji apakah PyOpenCL sudah dapat digunakan, silakan coba jalankan kode Python berikut.&lt;/p&gt;

&lt;pre class=&quot;brush: python&quot;&gt;import pyopencl as cl

for platform in cl.get_platforms():
    print 'Platform:', platform.name
    for device in platform.get_devices():
        print '-', device.name
&lt;/pre&gt;

&lt;p&gt;Simpan dalam sebuah berkas, misalnya &lt;code&gt;opencl-devices.py&lt;/code&gt;, lalu jalankan.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ python opencl-devices.py
Platform: ATI Stream
- Intel(R) Core(TM)2 Duo CPU     P8600  @ 2.40GHz
Platform: NVIDIA CUDA
- GeForce 320M
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Sepertinya sekian dulu bagian awal dari petualangan bersama OpenCL. Seharusnya seluruh yang dibutuhkan untuk membuat aplikasi OpenCL sudah ada, mulai dari driver, pustaka OpenCL, dan juga bahasa pemrograman yang dapat digunakan.&lt;/p&gt;

&lt;p&gt;Setelah ini kita akan mencoba membuat aplikasi OpenCL dengan PyOpenCL.&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3064211089164695382-2343969589804575684?l=ngoprek.fajran.web.id&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Fri, 23 Jul 2010 23:08:42 +0000</pubDate>
</item>
<item>
	<title>OpenCL - persiapan</title>
	<guid>http://ngoprek.fajran.web.id/2010/07/opencl-persiapan.html</guid>
	<link>http://ngoprek.fajran.web.id/2010/07/opencl-persiapan.html</link>
	<description>&lt;p&gt;&lt;em&gt;wah udah lama gak nulis2 :P&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Tiba-tiba saya lagi pengen nulis mengenai petualangan dengan OpenCL berhubung saya lagi nyoba2 mainan yg satu ini. Jadi.. siap2 :D Tuk bagian pertama, mari kita lakukan persiapan agar bisa mulai main2..&lt;/p&gt;

&lt;p&gt;Kalau make Mac OS X Snow Leopard, silakan langsung tunggu tulisan berikutnya. Pustaka OpenCL sudah terpasang jadi ya tinggal pake saja :D&lt;/p&gt;

&lt;p&gt;Kalau make Linux dan kebetulan make vga card NVIDIA seri 8000an ke atas (intinya sudah dukung CUDA), maka coba pasang driver NVIDIA versi 190an ke atas (tepatnya saya kurang tahu) karena driver ini sudah menyertakan pustaka OpenCL. Paket &lt;code&gt;nvidia-current&lt;/code&gt; yang dibawa oleh Ubuntu 10.04 (versi 195.36.24-0ubuntu1~10.04) sudah menyertakan pustaka OpenCL juga loh.&lt;/p&gt;

&lt;p&gt;Kalau ngga make vga card NVIDIA tapi menggunakan ATI (Windows maupun Linux) err.. mulai seri berapa ya? &lt;em&gt;maap saya gak tau&lt;/em&gt;, maka pasang dulu &lt;a href=&quot;http://developer.amd.com/gpu/atistreamsdk/pages/default.aspx&quot;&gt;ATI Stream SDK&lt;/a&gt;. Baca &lt;a href=&quot;http://developer.amd.com/gpu/ATIStreamSDK/assets/ATI_Stream_SDK_Installation_Notes.pdf&quot;&gt;petunjuk instalasinya&lt;/a&gt; untuk informasi lebih lanjut. Nanti saya akan tuliskan juga langkah-langkah instalasinya bagi pengguna Linux. Instalasi driver ATI juga mungkin (seharusnya?) diperlukan. Berhubung saya ngga make vga card dari ATI, maka saya tidak bisa memastikan hal ini.&lt;/p&gt;

&lt;p&gt;Bagi pengguna Windows dan NVIDIA, silakan pasang &lt;a href=&quot;http://developer.nvidia.com/object/cuda_3_1_downloads.html&quot;&gt;CUDA Toolkit&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Bagi yang ngga make NVIDIA maupun ATI, jangan khawatir karena OpenCL juga bisa jalan di atas CPU, walau saya gak tau CPU seperti apa yang didukung :P Pasang saja ATI Stream SDK karena driver OpenCL dari ATI ini mendukung eksekusi OpenCL di atas CPU. Oh ya, ATI Stream SDK ini gak mensyaratkan penggunaan hardware apapun dari ATI. Saya aja bisa memakainya di atas komputer dg Intel Core2 Duo dan NVIDIA 320M.&lt;/p&gt;

&lt;p&gt;yak sekian dulu.. selamat bersiap2 :D&lt;/p&gt;

&lt;p&gt;sekedar pemicu tambahan..&lt;/p&gt;

&lt;pre class=&quot;brush: python&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; import pyopencl as cl
&amp;gt;&amp;gt;&amp;gt; for platform in cl.get_platforms():
...     for device in platform.get_devices():
...         print '- %s' % device.name
... 
- Intel(R) Core(TM)2 Duo CPU     P8600  @ 2.40GHz
- GeForce 320M&lt;/code&gt;&lt;/pre&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3064211089164695382-3363885561736213279?l=ngoprek.fajran.web.id&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Fri, 23 Jul 2010 22:21:17 +0000</pubDate>
</item>
<item>
	<title>Instalasi ATI Stream SDK di Linux</title>
	<guid>http://ngoprek.fajran.web.id/2010/07/instalasi-ati-stream-sdk-di-linux.html</guid>
	<link>http://ngoprek.fajran.web.id/2010/07/instalasi-ati-stream-sdk-di-linux.html</link>
	<description>&lt;p&gt;Andai ingin menjalankan aplikasi OpenCL namun tidak menggunakan VGA card yang mendukung (seperti NVIDIA dan ATI), Anda masih memiliki peluang untuk menjalankan aplikasi tersebut di atas CPU karena OpenCL memang memungkinkannya. Salah satu pustaka OpenCL yang mendukung hal ini adalah ATI Stream SDK. Menurut &lt;a href=&quot;http://developer.amd.com/gpu/atistreamsdk/pages/default.aspx#two&quot;&gt;daftar hardware yang didukung&lt;/a&gt; oleh SDK ini, CPU yang didukung adalah CPU yang memiliki &lt;a href=&quot;http://en.wikipedia.org/wiki/SSE3&quot;&gt;SSE3&lt;/a&gt;. Silakan cek artikel terkait di &lt;a href=&quot;http://en.wikipedia.org/wiki/SSE3&quot;&gt;Wikipedia&lt;/a&gt; untuk melihat daftar CPU yang memiliki SSE3.&lt;/p&gt;

&lt;p&gt;Apa yang akan saya tulis ini sebenarnya juga tertulis dalam &lt;a href=&quot;http://developer.amd.com/gpu/ATIStreamSDK/assets/ATI_Stream_SDK_Installation_Notes.pdf&quot;&gt;petunjuk instalasi&lt;/a&gt; yang disediakan oleh ATI. Jadi akan lebih baik jika panduan utama tersebut juga dilihat.&lt;/p&gt;

&lt;p&gt;Untuk memasang ATI Stream SDK ini, ada satu berkas yang harus dipasang di bawah direktori &lt;code&gt;/etc&lt;/code&gt; sehingga Anda memerlukan akses root. Berkas-berkas lainnya sendiri tidak perlu diletakkan didirektori khusus dan pada dasarnya bisa diletakkan di mana saja.&lt;/p&gt;

&lt;p&gt;Mari kita mulai memasang pustaka OpenCL ini..&lt;/p&gt;

&lt;p&gt;Pertama, unduh dulu ATI Stream SDK dari &lt;a href=&quot;http://developer.amd.com/gpu/atistreamsdk/pages/default.aspx&quot;&gt;http://developer.amd.com/gpu/atistreamsdk/pages/default.aspx&lt;/a&gt;. Ada dua berkas yang harus diunduh, yaitu ati-stream-sdk-v2.1-lnx32.tgz (atau yg versi 64 bit) dan icd-registration.tgz. Arsip untuk sistem 64 bit juga berisi berkas-berkas untuk sistem 32 bit. Jadi jika Anda memiliki mesin 32 bit dan 64 bit, cukup unduh arsip untuk sistem 64 bit saja.&lt;/p&gt;

&lt;p&gt;Kedua, ekstrak berkas SDK (saya menggunakan yang versi 64 bit) ke sebuah direktori, katakanlah &lt;code&gt;/home/iang/apps&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ mkdir /home/iang/apps
$ cd /home/iang/apps
$ tar xzf /path/ke/ati-stream-sdk-v2.1-lnx64.tgz
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Nanti akan terbentuk direktori &lt;code&gt;ati-stream-sdk-v2.1-lnx64&lt;/code&gt; dengan segala isinya.&lt;/p&gt;

&lt;p&gt;Ketiga, ekstrak berkas &lt;code&gt;icd-registration.tgz&lt;/code&gt; ke sebuah direktori. Anda akan menemukan direktori &lt;code&gt;etc/OpenCL/vendors/&lt;/code&gt; dengan sebuah berkas bernama &lt;code&gt;atiocl32.icd&lt;/code&gt; dan &lt;code&gt;atiocl64.icd&lt;/code&gt;. Kedua berkas ini harus disalin ke dalam &lt;code&gt;/etc/OpenCL/vendors/&lt;/code&gt; (inilah mengapa akses root diperlukan). Berkas ICD ini berisi daftar driver OpenCL yang terpasang.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo mkdir -p /etc/OpenCL/vendors/
$ sudo cp etc/OpenCL/vendors/* /etc/OpenCL/vendors/
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Percaya atau tidak, tahap instalasi sudah selesai! Jika Anda juga membaca panduan instalasi yang diberikan oleh AMD/ATI, maka bisa dilihat saya melewatkan tahapan ke 2, 3, dan 4. Ketiga tahap tersebut tetap akan penting untuk dilakukan namun belum kita perlukan sampai saat ini, namun nanti pada saat kita sudah siap melakukan kompilasi dan eksekusi aplikasi OpenCL.&lt;/p&gt;

&lt;p&gt;Bagi yang sudah tidak sabar untuk mencoba, Anda bisa mencoba mengkompilasi aplikasi contoh yang diberikan oleh ATI. Jalankan saja perintah berikut.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ cd /home/iang/apps/ati-stream-sdk-v2.1-lnx64/
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/iang/apps/ati-stream-sdk-v2.1-lnx64/lib/x86_64
$ make
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Semua aplikasi contoh akan dikompilasi dan jika memang semua yang dibutuhkan sudah ada di komputer Anda, maka perintah &lt;code&gt;make&lt;/code&gt; tadi akan selesai dengan sukses. Pada kasus saya, &lt;code&gt;make&lt;/code&gt; berakhir dengan kegagalan karena pustaka &lt;code&gt;aticalrt&lt;/code&gt; tidak ditemukan di komputer saya.&lt;/p&gt;

&lt;p&gt;Namun walaupun begitu, sebagian aplikasi sudah terkompilasi dan dapat saya coba.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ cd samples/opencl/bin/x86_64
$ ./Mandelbrot --size 512
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;a href=&quot;http://3.bp.blogspot.com/_pPnjU84XXXs/TEmca0QkpjI/AAAAAAAAFSI/Y-WO96OL4tk/s1600/Screenshot-Untitled+Window.png&quot;&gt;&lt;img src=&quot;http://3.bp.blogspot.com/_pPnjU84XXXs/TEmca0QkpjI/AAAAAAAAFSI/Y-WO96OL4tk/s400/Screenshot-Untitled+Window.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5497096804701087282&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3064211089164695382-2332461232870789038?l=ngoprek.fajran.web.id&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Fri, 23 Jul 2010 16:44:33 +0000</pubDate>
</item>
<item>
	<title>Ubuntu di MacBookPro 7,1</title>
	<guid>http://ngoprek.fajran.web.id/2010/06/ubuntu-di-macbookpro-71.html</guid>
	<link>http://ngoprek.fajran.web.id/2010/06/ubuntu-di-macbookpro-71.html</link>
	<description>&lt;p&gt;Gara-gara ada chip yg dipake oleh MacBookPro 7,1 (yaitu MCP89) yang ngga akur dengan Linux, maka SATA controller yang ada &lt;a href=&quot;http://ngoprek.fajran.web.id/2010/05/macbookpro71-dengan-linux-dan-windows-7.html&quot;&gt;tidak bekerja&lt;/a&gt;. Alhasil harddisk dan dvdrom ngga dikenali oleh Linux dan gak bisa nginstal Linux. Sebuah &lt;a href=&quot;https://bugzilla.kernel.org/show_bug.cgi?id=15923&quot;&gt;laporan bug&lt;/a&gt; juga akhirnya dibuka, mempertanyakan mengapa kok Linux gak bisa bekerja.&lt;/p&gt;

&lt;p&gt;Tiga puluh tiga komentar kemudian, sebuah patch akhirnya dibuat dan dikirim ke upstream. Patch ini mengakali masalah yang ada agar Linux menggunakan driver generic yang dapat digunakan sehingga harddisk dan dvdrom dapat dikenali dan dipakai. Seseorang pun akhirnya memasangkan patch tersebut ke kernel yang dipakai oleh Ubuntu dan &lt;a href=&quot;https://bugs.launchpad.net/linux/+bug/576601/comments/67&quot;&gt;membuat ulang cd instalasi&lt;/a&gt; Ubuntu 10.04 yang bekerja di MacBookPro 7,1!&lt;/p&gt;

&lt;p&gt;CD dengan patch ini dapat langsung diunduh di &lt;a href=&quot;http://macbookpro7-1.daviey.com/&quot;&gt;http://macbookpro7-1.daviey.com/&lt;/a&gt;. Bagi pengguna Internet di Indonesia, saya sudah menyalin berkas ISO CD tadi ke Kambing di &lt;a href=&quot;http://kambing.ui.ac.id/iso/misc/ubuntu-10.04-amd64-mbp7.1/&quot;&gt;http://kambing.ui.ac.id/iso/misc/ubuntu-10.04-amd64-mbp7.1/&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Perlu dicatat, karena cuma make driver generic (dan ternyata DMAnya juga belum nyala di patch pertama ini), kinerja pengaksesan harddisk akan terasa lambat. &lt;a href=&quot;https://bugzilla.kernel.org/show_bug.cgi?id=15923#c57&quot;&gt;Patch baru&lt;/a&gt; yang sudah memaksa DMA agar aktif sudah ada, mari kita tunggu ada yg ngepatch kernel yg dipake Ubuntu dan membuat cd instalasinya lagi *males bikin ndiri* hehe..&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3064211089164695382-1702764673805652340?l=ngoprek.fajran.web.id&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Wed, 23 Jun 2010 00:50:38 +0000</pubDate>
</item>
<item>
	<title>MacBookPro7,1 dengan Linux dan Windows 7</title>
	<guid>http://ngoprek.fajran.web.id/2010/05/macbookpro71-dengan-linux-dan-windows-7.html</guid>
	<link>http://ngoprek.fajran.web.id/2010/05/macbookpro71-dengan-linux-dan-windows-7.html</link>
	<description>&lt;p&gt;Satu kata tuk menggambarkannya: &lt;strong&gt;Bermasalah!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Linux (terlepas dari distro apapun itu) gak bisa jalan karena ternyata ada chipset yang digunakan oleh si MacBookPro (yaitu MCP89) yang tidak didukung oleh Linux, setidaknya sampe versi sebelum &lt;a href=&quot;http://www.kernel.org/pub/linux/kernel/v2.6/testing/ChangeLog-2.6.35-rc1&quot;&gt;2.6.35-rc1&lt;/a&gt;. Chip ini sepertinya menangani SATA sehingga kalau tidak didukung maka harddisk dan dvdrom drive tidak akan dikenali.&lt;/p&gt;

&lt;p&gt;Info lebih lanjut:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://bugzilla.kernel.org/show_bug.cgi?id=15923&quot;&gt;Laporan bug kernel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.launchpad.net/linux/+bug/576601&quot;&gt;Laporan di Launchpad&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.uluga.ubuntuforums.org/showthread.php?t=1458341&quot;&gt;Diskusi di forum Ubuntu&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Windows 7 juga sepertinya gak 100% lancar tuk dipasang. Kadang saat proses menyelesaikan instalasi (setelah boot pertama), Windows 7 akan diam membeku tidak bisa diapa-apakan lagi. Masalah yg sama juga bisa terjadi setelah login.&lt;/p&gt;

&lt;p&gt;Setelah mencoba menginstal Windows 7 beberapa kali, akhirnya saya &quot;beruntung&quot; bisa menyelesaikan proses instalasi termasuk melakukan aktivasi. Sesuai saran di &lt;a href=&quot;http://discussions.apple.com/thread.jspa?threadID=2405526&amp;tstart=0&quot;&gt;sebuah forum&lt;/a&gt;, saya harus memasang sebuah &lt;a href=&quot;http://support.microsoft.com/kb/979491&quot;&gt;hotfix&lt;/a&gt; dari Microsoft agar masalah Windows 7 yang membeku ini tidak terjadi lagi. Mari kita lihat..&lt;/p&gt;

&lt;p&gt;Info lebih lanjut: &lt;a href=&quot;http://discussions.apple.com/thread.jspa?threadID=2405526&amp;tstart=0&quot;&gt;Diskusi di forum Apple&lt;/a&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3064211089164695382-9036374723778463673?l=ngoprek.fajran.web.id&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Mon, 31 May 2010 16:15:30 +0000</pubDate>
</item>
<item>
	<title>Qt is so Qt - Icip-icip QtWebKit</title>
	<guid>http://ngoprek.fajran.web.id/2010/03/qt-is-so-qt.html</guid>
	<link>http://ngoprek.fajran.web.id/2010/03/qt-is-so-qt.html</link>
	<description>&lt;p&gt;Beberapa hari belakangan ini saya lg seneng ngoprek2 &lt;a href=&quot;http://qt.nokia.com/&quot;&gt;Qt&lt;/a&gt;. Lgs pake C++ berhubung sekalian pengen latihan berbahasa yg satu ini lagi. Salah satu modul yang disediakan oleh Qt adalah &lt;a href=&quot;http://qt.nokia.com/doc/4.6/qtwebkit.html&quot;&gt;QtWebKit&lt;/a&gt; yang membuka kemungkinan untuk melakukan integrasi &lt;a href=&quot;http://www.webkit.org&quot;&gt;WebKit&lt;/a&gt; (yayaya, ini html layout engine yg ituh..) dengan aplikasi yang kita buat.&lt;/p&gt;

&lt;p&gt;Cara menggunakannya cukup mudah. Berikut ini kira-kira kode yang diperlukan untuk membuat sebuah peramban web super sederhana berbasiskan WebKit.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#include &amp;lt;QtGui&amp;gt;
#include &amp;lt;QtWebKit&amp;gt;

int main(int argc, char **argv) {
    QApplication app(argc, argv);
    QWebView view;
    view.load(QUrl(&quot;http://ngoprek.fajran.web.id&quot;));
    view.show();
    return app.exec();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;a href=&quot;http://qt.nokia.com/doc/4.6/qwebview.html&quot;&gt;&lt;code&gt;QWebView&lt;/code&gt;&lt;/a&gt; di atas adalah sebuah widget (turunan dari &lt;a href=&quot;http://qt.nokia.com/doc/4.6/qwidget.html&quot;&gt;&lt;code&gt;QWidget&lt;/code&gt;&lt;/a&gt;) yang menampilkan &lt;a href=&quot;http://qt.nokia.com/doc/4.6/qwebpage.html&quot;&gt;&lt;code&gt;QWebPage&lt;/code&gt;&lt;/a&gt; dan lalu &lt;a href=&quot;http://qt.nokia.com/doc/4.6/qwebframe.html&quot;&gt;&lt;code&gt;QWebFrame&lt;/code&gt;&lt;/a&gt; dalam sebuah antar muka grafis. Berhubung widget ini tidak berada di dalam widget lain, maka sebuah window akan dibuatkan khusus untuk menampilkan widget ini.&lt;/p&gt;

&lt;p&gt;Salah satu proses integrasi yang dimungkinkan adalah pertukaran pesan dalam bentuk pemanggilan fungsi antara aplikasi yang ditulis dalam C++ dan aplikasi web yang dibuka. Aplikasi C++ bisa menyuruh aplikasi web untuk mengeksekusi sebuah skrip dalam javascript. Aplikasi C++ ini juga bisa memasukkan sebuah objek ke dalam halaman web yang nantinya bisa digunakan oleh aplikasi yang ada di dalamnya. Cara melakukan hal ini juga tidak terlalu susah, namun saya masih belum begitu paham tentang bagaimana menyusun data yang ingin dipertukarkan.&lt;/p&gt;

&lt;p&gt;Selama icip2 &lt;code&gt;QtWebkit&lt;/code&gt; saya juga menjumpai setidaknya 2 masalah. Yang pertama adalah tentang Font di CSS 3. Saya mencoba membuat halaman web yang menggunakan font yang kita atur sendiri. Namun mengapa apa yang saya coba di Firefox tidak bekerja di QtWebKit. Setelah gugling2 dikit, ternyata memang ada masalah di QtWebKit terkait dengan peletakan font. Jika kita sebut lokasi font dengan &lt;code&gt;local()&lt;/code&gt;, alias font yang terpasang di sistem, dan dengan &lt;code&gt;url()&lt;/code&gt;, atau lokasi lain, maka QtWebKit sama sekali tidak akan memasang font tersebut. Baca saja &lt;a href=&quot;https://bugs.webkit.org/show_bug.cgi?id=36351&quot;&gt;laporan bug-nya&lt;/a&gt; untuk informasi lebih lanjut.&lt;/p&gt;

&lt;p&gt;Masalah kedua adalah mengenai event penekanan tombol keyboard. Walau browser-browser yang ada juga &lt;a href=&quot;http://www.quirksmode.org/js/keys.html&quot;&gt;punya beberapa perbedaan&lt;/a&gt;, namun QtWebKit sama sekali berbeda. Nilai yang diberikan pada variabel &lt;code&gt;keyCode&lt;/code&gt; dari objek event yang terbentuk memiliki perbedaan dalam tombol-tombol panah. Nilai yang terbentuk pada browser biasa adalah 37, 38, 39, dan 40 untuk kiri, atas, kanan, dan bawah, namun QtWebKit memberikan nilai 28, 30, 29, dan 31. Saya belum menemukan laporan masalah untuk yang satu ini walau ada &lt;a href=&quot;https://bugs.kde.org/show_bug.cgi?id=192122&quot;&gt;laporan yang mirip&lt;/a&gt;. Sepertinya mesti bikin laporan baru hehehe..&lt;/p&gt;

&lt;p&gt;Saya juga membuka sebuah repositori ngoprek2 Qt di GitHub. Silakan buka &lt;a href=&quot;http://github.com/fajran/qtangoprek&quot;&gt;http://github.com/fajran/qtangoprek&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Untuk contoh kode integrasi antara QtWebKit dengan aplikasi Qt belum selesai saya buat. Seharusnya mudah tapi kok rumit karena banyak yang mesti ditulis agar contohnya menarik. hehe..&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3064211089164695382-7388421137519639298?l=ngoprek.fajran.web.id&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Mon, 29 Mar 2010 01:29:57 +0000</pubDate>
</item>
<item>
	<title>Spam jaman sekarang..</title>
	<guid>http://blog.fajran.web.id/2010/03/18/spam-jaman-sekarang-2/</guid>
	<link>http://blog.fajran.web.id/2010/03/18/spam-jaman-sekarang-2/</link>
	<description>&lt;p&gt;Situs social networking seperti Facebook biasanya menyediakan fasilitas untuk mengundang orang lain melalui email. Sayangnya.. fasilitas ini mulai disalahgunakan untuk kepentingan spamming.. cape deh.. -_-&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://blog.fajran.web.id/wp-content/uploads/2010/03/spam-450x296.png&quot; alt=&quot;spam&quot; /&gt;&lt;/p&gt;</description>
	<pubDate>Thu, 18 Mar 2010 07:54:41 +0000</pubDate>
</item>
<item>
	<title>Ubuntu versi netinst</title>
	<guid>http://ngoprek.fajran.web.id/2010/03/ubuntu-versi-netinst.html</guid>
	<link>http://ngoprek.fajran.web.id/2010/03/ubuntu-versi-netinst.html</link>
	<description>&lt;p&gt;Debian punya satu tipe CD bernama &lt;a href=&quot;http://www.debian.org/CD/netinst/&quot;&gt;netinst&lt;/a&gt; dapat digunakan untuk melakukan instalasi Debian secara minimalis. CD tersebut hanya berisi installer dan paket-paket dasar yang dibutuhkan untuk membangun sistem yang minimalis. Selain itu, ada juga versi business card yang hanya berisi installer sehingga akses ke repositori mutlak dibutuhkan untuk menginstal sistem, walau hanya melakukan instalasi minimalis.&lt;/p&gt;

&lt;p&gt;Kedua jenis CD ini sangat berguna untuk melakukan instalasi sistem yang &quot;bersih&quot; dimana sistem hanya berisi paket-paket yang memang (pada umumnya) mutlak diperlukan saja. Dengan demikian, sistem dapat &quot;dibangun&quot; secara incremental dengan memasang paket-paket lainnya yang memang dibutuhkan. Sebagai contoh, jika ingin membangun sebuah web server, yang sebenarnya dibutuhkan kan hanya sistem dasar dan web server saja. Aplikasi lain yang tidak berhubungan sebenarnya (atau bahkan sebaiknya) tidak perlu dipasang.&lt;/p&gt;

&lt;p&gt;Hari ini saya perlu memasang Ubuntu di dalam VirtualBox. Instalasi yang saya inginkan adalah instalasi yang super minimal seperti halnya yang dapat dihasilkan dengan menggunakan Debian versi netinst. Namun sayangnya Ubuntu tidak punya versi netinst sehingga saya harus menggunakan Ubuntu edisi server yang masih bisa digunakan untuk instalasi minimalis dengan tidak memasang paket-paket lainnya yang ditawarkan pada saat instalasi. Sayangnya lagi, saya sedang di kampus dengan koneksi wireless dan males nunggu 10-30 menit untuk mengunduh Ubuntu Server yang sekarang besarnya sudah sekitar 600MB.&lt;/p&gt;

&lt;p&gt;Namun ternyata.. setelah Googling sedikit.. Ubuntu punya versi netinst! lebih tepatnya business card! Berkas ISO versi ini sangat kecil, hanya sekitar 20MB. CD ini hanya berisi installer dan paket-paket dasar yang perlu diinstal akan langsung diambil dari repositori.&lt;/p&gt;

&lt;p&gt;Ada di manakah ISO CD Ubuntu versi super minimal ini? Memang sepertinya tidak ada keterangan resmi di &lt;a href=&quot;http://www.ubuntu.com&quot;&gt;website Ubuntu&lt;/a&gt;. Namun ada satu buah halaman wiki yang menerangkan hal ini. Silakan cek &lt;a href=&quot;https://help.ubuntu.com/community/Installation/MinimalCD&quot;&gt;https://help.ubuntu.com/community/Installation/MinimalCD&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Halaman indeks menuju tempat mengunduh CD minimalis ini bisa dilihat di &lt;a href=&quot;http://cdimage.ubuntu.com/netboot/&quot;&gt;http://cdimage.ubuntu.com/netboot/&lt;/a&gt;. Pilih versi dan arsitektur yang diinginkan dan unduh berkas &lt;code&gt;mini.iso&lt;/code&gt;. Ingat, Anda membutuhkan akses ke repositori untuk memasang Ubuntu versi minimalis dengan ISO CD ini.&lt;/p&gt; 

&lt;p&gt;Ah.. ternyata proses instalasi yang saya lakukan sambil menulis tulisan ini sudah hampir selesai.. sampai jumpa lagi! =D&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3064211089164695382-8411682592808609851?l=ngoprek.fajran.web.id&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Wed, 17 Mar 2010 11:44:50 +0000</pubDate>
</item>
<item>
	<title>Gerobak</title>
	<guid>http://ngoprek.fajran.web.id/2010/03/gerobak.html</guid>
	<link>http://ngoprek.fajran.web.id/2010/03/gerobak.html</link>
	<description>&lt;p&gt;Apa ini? singkatnya: &lt;a href=&quot;http://apt-web.dahsy.at/&quot;&gt;apt-web&lt;/a&gt; yang lebih personal. Coba buka &lt;a href=&quot;http://gerobak.dahsy.at/&quot;&gt;http://gerobak.dahsy.at/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ada yang mau bantuin ngetes? Ada yang mau nyumbang sebuah VPS atau server beneran? Ada yang mau bantuin bikin?&lt;/p&gt;

&lt;p&gt;Kok butuh VPS/server sendiri? Karena sepertinya Gerobak butuh sumber daya komputasi yang tidak kecil. Bisa bikin tetangga bahkan pemilik kontrakan ngomel2 kalau dipasang bareng-bareng dengan yang lain.&lt;/p&gt;

&lt;p&gt;Kode sumber: &lt;a href=&quot;http://github.com/fajran/gerobak&quot;&gt;http://github.com/fajran/gerobak&lt;/a&gt;. Lisensi: GNU AGPL 3&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3064211089164695382-2461406863493407636?l=ngoprek.fajran.web.id&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Wed, 10 Mar 2010 13:37:25 +0000</pubDate>
</item>
<item>
	<title>Dipijit lagi</title>
	<guid>http://ngoprek.fajran.web.id/2010/03/dipijit-lagi.html</guid>
	<link>http://ngoprek.fajran.web.id/2010/03/dipijit-lagi.html</link>
	<description>&lt;p&gt;Baru aja 7 bulan lewat dikit, kambing mengalami &lt;a href=&quot;http://ngoprek.fajran.web.id/2009/07/baru-aja-ngomongin-backup-beberapa.html&quot;&gt;musibah&lt;/a&gt; lagi :(&lt;/p&gt;

&lt;p&gt;Singkatnya, data ilang semua =D detilnya saya kurang tahu mengapa.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/dev/md0              5.5T  640G  4.9T  12% /mirror/data&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Terakhir total data yang ada itu sekitar 3TB, jadi.. masih jauh perjalanannya..&lt;/p&gt;

&lt;p&gt;Sekali lagi terima kasih kepada mirror-mirror tetangga &lt;a href=&quot;http://shol.vlsm.org&quot;&gt;shol&lt;/a&gt;, &lt;a href=&quot;http://mirror.unej.ac.id&quot;&gt;unej&lt;/a&gt;, &lt;a href=&quot;http://repo.ugm.ac.id&quot;&gt;ugm&lt;/a&gt;, &lt;a href=&quot;http://pandawa.ipb.ac.id&quot;&gt;ipb&lt;/a&gt;, &lt;a href=&quot;http://kebo.vlsm.org&quot;&gt;kebo&lt;/a&gt;, &lt;a href=&quot;http://komo.vlsm.org&quot;&gt;komo&lt;/a&gt;, &lt;a href=&quot;ftp://ftp.itb.ac.id&quot;&gt;itb&lt;/a&gt;, &lt;a href=&quot;http://dl2.foss-id.web.id/&quot;&gt;foss-id&lt;/a&gt; dll. Mohon maaf kalau bakal disedot kambing besar-besaran..&lt;/p&gt;

&lt;p&gt;Untuk info lebih lengkap mengenai &lt;a href=&quot;http://twitter.com/kambing/status/9604203793&quot;&gt;kejadian yang terjadi beberapa hari yang lalu&lt;/a&gt;, silakan baca &lt;a href=&quot;http://staff.blog.ui.ac.id/jp/2010/03/01/insider-info/&quot;&gt;http://staff.blog.ui.ac.id/jp/2010/03/01/insider-info/&lt;/a&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3064211089164695382-9220972982755587342?l=ngoprek.fajran.web.id&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Thu, 04 Mar 2010 05:11:05 +0000</pubDate>
</item>
<item>
	<title>Restrukturisasi repositori openSUSE di Kambing</title>
	<guid>http://ngoprek.fajran.web.id/2010/02/restrukturisasi-repositori-opensuse-di.html</guid>
	<link>http://ngoprek.fajran.web.id/2010/02/restrukturisasi-repositori-opensuse-di.html</link>
	<description>&lt;p&gt;&lt;strong&gt;tl;dr&lt;/strong&gt; Repositori openSUSE di Kambing tidak mengikuti struktur standar yang diberikan oleh openSUSE sehingga akan direstrukturisasi ulang agar mengikuti struktur asli.&lt;/p&gt;

&lt;p&gt;Kalau melihat &lt;code&gt;rsync.opensuse.org&lt;/code&gt;, openSUSE mengelompokkan repositorinya ke dalam beberapa modul rsync yang mungkin bisa dikelompokkan lagi menjadi hotstuff, updates, full, dan buildservice. Menurut dokumentasi tentang &lt;a href=&quot;http://en.opensuse.org/Mirror_Infrastructure&quot;&gt;mirror repositori openSUSE&lt;/a&gt;, kelompok hotstuff berisi berkas-berkas yang paling sering diminta dan kelompok full berisi apa saja yang ada di download.opensuse.org. Kelompok updates dan buildservice masing-masing berisi paket-paket perbaikan dan berkas-berkas dari &lt;a href=&quot;http://en.opensuse.org/Build_Service&quot;&gt;openSUSE Build Service&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Kali ini saya hanya akan membahas mengenai isi kelompok hotstuff dan full karena keduanya &lt;em&gt;mungkin&lt;/em&gt; yang paling sering banyak dipakai. Isi kelpompok updates sudah termasuk di dalam kedua kelompok tersebut sehingga tidak perlu dibahas secara khusus. Untuk kelompok buildservice, sepertinya isinya tidak terlalu relevan untuk pengguna akhir (cmiiw) jadi tidak akan dibahas juga.&lt;/p&gt;

&lt;p&gt;Kembali ke isi repositori. Kalau melihat isi kelompok hotstuff 160GB, kelompok ini hanya berisi repositori untuk openSUSE 11.1 (bukan yang terbaru kan nih?), update untuk 10.3 sampai 11.2, dan sebuah direktori &lt;code&gt;repositories&lt;/code&gt; yang sepertinya berisi paket-paket terbaru yang dikelompokkan berdasar kategori tertentu. Berbeda dengan kelompok hotstuff, kelompok full tidak memiliki direktori &lt;code&gt;repositories&lt;/code&gt; namun kelompok ini berisi memiliki repositori untuk openSUSE versi 11.0, 11.1, dan 11.3-Milestone1 yang masih dalam masa pengembangan.&lt;/p&gt;

&lt;p&gt;Bagi yang ingin melihatnya sendiri, coba jalankan perintah berikut.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ rsync -av rsync.opensuse.org::opensuse-hotstuff-160gb/ &amp;gt; opensuse-hotstuff-160gb.txt
$ rsync -av rsync.opensuse.org::opensuse-full/ &amp;gt; opensuse-full.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Tenang saja, perintah di atas tidak akan menyalin seluruh berkas yang ada melainkan hanya akan mengambil daftar berkas yang ada di dalamnya lalu dimasukkan ke dalam berkas &lt;code&gt;opensuse-hotstuff-160gb.txt&lt;/code&gt; dan &lt;code&gt;opensuse-full.txt&lt;/code&gt;. Buka kedua berkas tersebut untuk melihat apa yang ada di dalam repositori.&lt;/p&gt;

&lt;p&gt;Sekarang coba lihat repositori openSUSE di Kambing.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ rsync -av kambing.ui.ac.id::kambing/ &amp;gt; kambing.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Repositori di Kambing memiliki direktori &lt;code&gt;repositories&lt;/code&gt; dan juga repositori untuk openSUSE versi 11.0 sampai 11.3-Milestone1! Kok bisa? padahal kan keduanya seharusnya berada dalam kelompok berbeda (menurut rsync.opensuse.org). Jawabannya adalah karena Kambing menggabungkan kedua kelompok tersebut. Isi &lt;code&gt;opensuse-full&lt;/code&gt; yang ditambahkan dengan direktori &lt;code&gt;repositories&lt;/code&gt; dari &lt;code&gt;opensuse-hotstuff-160gb&lt;/code&gt;. Dengan melakukan hal ini sebenarnya Kambing telah membuat sesuatu yang tidak standar (mencampurkan dua repositori) dan sepertinya tidak baik untuk diteruskan.&lt;/p&gt;

&lt;p&gt;Dalam beberapa hari ke depan, Kambing akan tobat melakukan penyimpangan ini dan akan melakukan restrukturisasi ulang repositori openSUSE. Penggabungan dua repositori ini akan dihapuskan dan akan kembali dipecah menjadi dua buah repositori terpisah, sesuai aslinya. Berikut ini struktur baru yang akan dibuat.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://kambing.ui.ac.id/opensuse/&quot;&gt;http://kambing.ui.ac.id/opensuse/&lt;/a&gt; akan berisi mirror dari kelompok &lt;code&gt;opensuse-full&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://kambing.ui.ac.id/opensuse-hotstuff/&quot;&gt;http://kambing.ui.ac.id/opensuse-hotstuff/&lt;/a&gt; akan berisi direktori &lt;code&gt;repositories&lt;/code&gt; dari kelompok &lt;code&gt;opensuse-hotstuff-160gb&lt;/code&gt;. Isi direktori &lt;code&gt;distribution&lt;/code&gt; dan &lt;code&gt;updates&lt;/code&gt; tidak dimasukkan karena sudah ada di dalam &lt;code&gt;opensuse-full&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Berkas ISO tentu saja juga tidak akan dimasukkan karena memang sengaja dipisahkan di &lt;a href=&quot;ftp://kambing.ui.ac.id/iso/opensuse/&quot;&gt;ftp://kambing.ui.ac.id/iso/opensuse/&lt;/a&gt;. Isi direktori khusus ISO ini diambil dari &lt;code&gt;opensuse-full&lt;/code&gt; dengan mengatur agar hanya berkas ISO yang diambill. Tenang saja, struktur direktori tetap sama seperti aslinya.&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3064211089164695382-5128863957278057021?l=ngoprek.fajran.web.id&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Sat, 13 Feb 2010 10:59:21 +0000</pubDate>
</item>
<item>
	<title>knp pula ini?</title>
	<guid>http://ngoprek.fajran.web.id/2010/02/knp-pula-ini.html</guid>
	<link>http://ngoprek.fajran.web.id/2010/02/knp-pula-ini.html</link>
	<description>&lt;p&gt;apa aio di nginx dev version 0.8.33 + nfs bikin masalah kaya gini?&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ uptime
 21:46:23 up  8:00,  2 users,  load average: 1691.35, 1606.10, 1407.59&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;trus ini vsftpd instances nya banyak benerrr...&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ps ax|grep vsftpd|wc
   1792    8961   78843&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;coba restart ah.. mudah2an gak nyangkut pas lg nyala xD&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3064211089164695382-7957186803384470591?l=ngoprek.fajran.web.id&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Wed, 03 Feb 2010 15:55:17 +0000</pubDate>
</item>
<item>
	<title>facebook yang aneh</title>
	<guid>http://ngoprek.fajran.web.id/2010/01/facebook-yang-aneh.html</guid>
	<link>http://ngoprek.fajran.web.id/2010/01/facebook-yang-aneh.html</link>
	<description>&lt;p&gt;Barusan saya nyoba download atom feed yang disediakan oleh facebook dengan wget. Kok saya dialihkan ke &lt;a href=&quot;http://www.facebook.com/common/browser.php&quot;&gt;we-are-not-cool-enough&lt;/a&gt; page?&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ wget &quot;http://www.facebook.com/feeds/page.php?format=atom10&amp;amp;id=327778460225&quot;
--2010-01-31 19:31:57--  http://www.facebook.com/feeds/page.php?format=atom10&amp;amp;id=327778460225
Resolving www.facebook.com... 69.63.181.15
Connecting to www.facebook.com|69.63.181.15|:80... connected.
HTTP request sent, awaiting response... 302 Found
Location: http://www.facebook.com/common/browser.php [following]
--2010-01-31 19:32:01--  http://www.facebook.com/common/browser.php
Reusing existing connection to www.facebook.com:80.
HTTP request sent, awaiting response... 200 OK
Length: 11186 (11K) [text/html]
Saving to: `browser.php'&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Kalau saya set user agent menjadi &lt;code&gt;mozilla&lt;/code&gt; baru deh si facebook ngasih atom feed tanpa banyak omong.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ wget -U mozilla &quot;http://www.facebook.com/feeds/page.php?format=atom10&amp;amp;id=327778460225&quot;
--2010-01-31 19:50:38--  http://www.facebook.com/feeds/page.php?format=atom10&amp;amp;id=327778460225
Resolving www.facebook.com... 69.63.181.15
Connecting to www.facebook.com|69.63.181.15|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 13944 (14K) [application/atom+xml]
Saving to: `page.php?format=atom10&amp;amp;id=327778460225'&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Bukannya atom feed itu &lt;strong&gt;tidak&lt;/strong&gt; ditujukan untuk dirender oleh web browser? isinya juga bukan dokumen html, jadi buat apa pake acara ngecek browser segala?&lt;/p&gt;

&lt;p&gt;Udah saya tanyain juga &lt;a href=&quot;http://www.facebook.com/help/?question=330267&quot;&gt;di sono&lt;/a&gt;. Mudah2an aja dapet jawaban yg memuaskan. Tanya di &lt;a href=&quot;http://www.reddit.com/r/facebook/&quot;&gt;reddit&lt;/a&gt; jg sekalian kali ya?&lt;/p&gt;

&lt;p&gt;eh ternyata bukan saya aja yg terbingung-bingung. coba cek 
&lt;a href=&quot;http://serendipity.ruwenzori.net/index.php/2008/05/07/facebook-news-feed-rss-is-only-for-web-browsers-with-gui&quot;&gt;satu&lt;/a&gt;,
&lt;a href=&quot;http://stackoverflow.com/questions/1516794/im-having-trouble-parsing-a-facebook-feed-using-simplexml&quot;&gt;dua&lt;/a&gt;, dan
&lt;a href=&quot;http://drupal.org/node/684186&quot;&gt;tiga&lt;/a&gt;.&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3064211089164695382-911381127611157622?l=ngoprek.fajran.web.id&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Sun, 31 Jan 2010 20:04:05 +0000</pubDate>
</item>
<item>
	<title>django-loginurl</title>
	<guid>http://ngoprek.fajran.web.id/2010/01/django-loginurl.html</guid>
	<link>http://ngoprek.fajran.web.id/2010/01/django-loginurl.html</link>
	<description>&lt;p&gt;Setelah dibahas, akhirnya saya diperbolehkan merilis salah satu komponen yang saya kerjakan ke publik. Silakan langsung datangi salah satu tempat berikut.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://pypi.python.org/pypi/django-loginurl&quot;&gt;http://pypi.python.org/pypi/django-loginurl&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://github.com/fajran/django-loginurl/&quot;&gt;http://github.com/fajran/django-loginurl/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Apakah django-loginurl ini?&lt;/p&gt;

&lt;p&gt;Ini adalah sebuah aplikasi kecil untuk &lt;a href=&quot;http://www.djangoproject.com&quot;&gt;Django&lt;/a&gt; untuk membuat sebuah URL yang dapat digunakan untuk login. Jadi, hanya dengan membuka URL tersebut, kita dapat login secara otomatis sebagai user terkait pada sebuah website yang dibangun di atas Django.&lt;/p&gt;

&lt;p&gt;URL tadi itu terlihat seperti berikut.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;http://example.com/loginurl/sebuah-kunci-unik
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Setiap kunci dapat diatur berapa banyak penggunaan dan kapan kunci ini kadaluarsa. Sebagai contoh, dengan mengeset maksimal 1 kali penggunaan, berarti kita bisa membuat URL/kunci sekali pakai untuk login.&lt;/p&gt;

&lt;p&gt;Contoh skenario penggunaannya adalah menyediakan website yang memungkinkan user tidak perlu mengingat password. Saat login, user cukup memasukkan email yang sudah terdaftar dan nanti website akan mengirimi URL khusus untuk login sebagai user terkait.&lt;/p&gt;

&lt;p&gt;Contohnya agak maksa? ada loh kasus dimana hal seperti ini dibutuhkan :)&lt;/p&gt;

&lt;p&gt;oke deh.. selamat menikmati :D&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3064211089164695382-2759380018605165947?l=ngoprek.fajran.web.id&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Fri, 29 Jan 2010 05:32:14 +0000</pubDate>
</item>
<item>
	<title>Ada di mana?</title>
	<guid>http://ngoprek.fajran.web.id/2010/01/ada-di-mana.html</guid>
	<link>http://ngoprek.fajran.web.id/2010/01/ada-di-mana.html</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://www.getfirefox.com&quot;&gt;Firefox&lt;/a&gt; 3.5 menawarkan sebuah fasilitas bernama &lt;a href=&quot;https://developer.mozilla.org/en/using_geolocation&quot;&gt;Geolocation&lt;/a&gt; yang dapat digunakan untuk mencari tahu di mana pengguna browser tersebut berada. Selain Firefox 3.5 (atau yg lebih baru), fasilitas ini juga tersedia pada &lt;a href=&quot;http://gears.google.com/&quot;&gt;Google Gears&lt;/a&gt; dan &lt;a href=&quot;http://www.apple.com/iphone/iphone-3gs/safari.html&quot;&gt;Safari pada iPhone OS 3.0&lt;/a&gt;. Fasilitas ini didefinsikan pada spesifikasi &lt;a href=&quot;http://www.w3.org/TR/geolocation-API/&quot;&gt;Geolocation API&lt;/a&gt; yang dibuat oleh &lt;a href=&quot;http://www.w3.org/&quot;&gt;W3C&lt;/a&gt;. Dalam tulisan ini, saya akan menunjukkan bagaimana cara menggunakannya.&lt;/p&gt;

&lt;p&gt;Sebelum dapat menggunakan API yang disediakan, kita perlu mendapatkan/membuat sebuah objek yang disediakan oleh browser/plugin yang mengimplementasikan Geolocation API. Pada Firefox dan Safari iPhone OS, objek berada di bawah objek &lt;code&gt;navigator&lt;/code&gt; yang disediakan oleh browse, yaitu di &lt;code&gt;navigator.geolocation&lt;/code&gt;. Google Gears menyediakan objek ini dengan cara yg sedikit lebih rumit, yaitu dalam dua tahapan: inisialisasi Google Gears lalu mendapatkan objek Geolocation dari &lt;code&gt;google.gears.factory.create('beta.geolocation')&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;script type=&quot;text/javascript&quot; src=&quot;gears_init.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
var geo = undefined;
if (navigator.geolocation) {
    geo = navigator.geolocation;
}
else if (window.google &amp;amp;&amp;amp; google.gears) {
    try {
        geo = google.gears.factory.create('beta.geolocation');
    }
    catch (e) {
    }
}
if (geo == undefined) {
    // Geolocation API tidak tersedia
}
else {
    // Geolocation API tersedia
}
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Kode di atas akan menginisialisasi Google Gears dengan mencoba memasukkan berkas &lt;code&gt;gears_init.js&lt;/code&gt; lalu mendeteksi apakah objek untuk Geolocation tersedia pada browser atau Google Gears. Berkas &lt;code&gt;gears_init.js&lt;/code&gt; dapat diunduh pada &lt;a href=&quot;http://code.google.com/apis/gears/tools.html#gears_init&quot;&gt;website Google Gears&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Jika nilai &lt;code&gt;geo&lt;/code&gt; tidak bernilai &lt;code&gt;undefined&lt;/code&gt;, maka Anda telah mendapatkan sebuah objek yang mengimplementasikan Geolocation API. Anda dapat mendapatkan lokasi pengguna browser, tentu saja atas seizin pengguna tersebut. Mari kita coba..&lt;/p&gt;

&lt;p&gt;Objek tadi menyediakan sebuah method bernama &lt;code&gt;getCurrentPosition&lt;/code&gt; yang dapat digunakan untuk mengambil posisi saat ini. Method ini membutuhkan 2 buah parameter, yaitu callback jika operasi berjalan dengan sukses dan gagal.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;function posisi_ok(posisi) {
    // lokasi berhasil didapat
    var lintang = posisi.coords.latitude;
    var bujur = posisi.coords.longitude;
    var akurasi = posisi.coords.accuracy; // dalam meter

}

function posisi_error(error) {
    // masalah terjadi
}

function cari_lokasi() {
    geo.getCurrentPosition(posisi_ok, posisi_error);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Yak seperti itu saja! Untuk informasi lebih detil mengenai method/properti apa saja yang disediakan, silakan baca &lt;a href=&quot;http://www.w3.org/TR/geolocation-API/&quot;&gt;spesifikasinya&lt;/a&gt; atau &lt;a href=&quot;https://developer.mozilla.org/en/using_geolocation&quot;&gt;dokumentasi Mozilla&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Untuk demo, coba buka &lt;a href=&quot;http://arsip.fajran.web.id/ngoprek/geolocation/geolocation.html&quot;&gt;http://arsip.fajran.web.id/ngoprek/geolocation/geolocation.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Selanjutnya apa? dari informasi lokasi ini Anda dapat menggunakan layanan lain untuk mendapatkan alamat yang ada pada lokasi tersebut. Salah satu penyedia layanan yang disebut Reverse Geocoding ini adalah, coba tebak, Google! Coba baca dokumentasi mengenai hal ini pada bagian &lt;a href=&quot;http://code.google.com/apis/maps/documentation/services.html#ReverseGeocoding&quot;&gt;Google Maps API&lt;/a&gt; v2 atau &lt;a href=&quot;http://code.google.com/apis/maps/documentation/v3/services.html#Geocoding&quot;&gt;v3&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Untuk contoh aplikasi nyata (terlepas dari akurasi yang ada), coba buka &lt;a href=&quot;http://distributor.sebelah.web.id&quot;&gt;http://distributor.sebelah.web.id&lt;/a&gt; *pengumuman terselubung* hehehe&lt;/p&gt;

&lt;p&gt;Bagi yang sudah nyoba-nyoba mungkin bertanya-tanya mengenai akurasi dan/atau bagaimana kok alamat kita bisa diketahui. Bagi yang menggunakan alat dengan fasilitas GPS (misalnya iPhone) mungkin sudah jelas kalau lokasi bisa diperoleh dengan GPS. Namun bagaimana jika tidak ada GPS?&lt;/p&gt;

&lt;p&gt;Saat kita menjelajah Internet, setidaknya ada satu informasi yang kita bawa yang dapat dijadikan petunjuk untuk mendapatkan lokasi, yaitu IP address. Selain itu, jika kita menggunakan Wi-Fi di daerah yang memiliki banyak access point (misalnya perumahan), daftar access point sekitar yang terdeteksi juga dapat digunakan untuk mendapatkan lokasi yang lebih akurat. Tentu saja harus sudah ada orang yang mencatat access point ini ada di daerah mana, yaa seperti apa yang dilakukan oleh &lt;a href=&quot;http://www.skyhookwireless.com/&quot;&gt;Skyhook Wireless&lt;/a&gt;. Contoh sumber lain adalah informasi lokasi BTS yang digunakan oleh telepon genggam. Lokasi dari beberapa GPS terdekat dapat digunakan untuk melakukan perhitungan penentuan posisi.&lt;/p&gt;

&lt;p&gt;Spesifikasi dari W3C sendiri menyebutkan informasi lokasi ini dapat diperoleh dari sumber apa saja yang kira-kira dapat memberikan informasi lokasi, termasuk menanyakan langsung :D&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Common sources of location information include Global Positioning System (GPS) and location inferred from network signals such as IP address, RFID, WiFi and Bluetooth MAC addresses, and GSM/CDMA cell IDs, as well as user input. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Oh iya, saya sempat membandingkan akurasi yang saya dapat jika saya menggunakan koneksi Internet melalui kabel dan nirkabel. Hasilnya, jika menggunakan koneksi nirkabel, akurasi (baca: seberapa meleset) yang saya dapat bisa sampai 150 meter saja! dan memang selisihnya cuma 1 blok rumah saja hehe.. Ketika saya menggunakan koneksi kabel, akurasi mencapai 25 kilometer. Mengapa bisa begitu? asumsi saya ketika saya menggunakan koneksi nirkabel, informasi accesspoint yang ada di sekitar rumah saya juga ikut dikirim/digunakan dalam mencari lokasi. Ketika saya menggunakan koneksi kabel, hanya informasi alamat IP saja yang digunakan. Hasilnya pun sesuai dengan apa yang saya dapat ketika menggunakan layanan &lt;a href=&quot;http://www.maxmind.com/app/locate_my_ip&quot;&gt;GeoIP dari MaxMind&lt;/a&gt;.

&lt;p&gt;Sekian saja, selamat ngoprek! =D&lt;/p&gt;

&lt;p&gt;Referensi:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;http://www.mozilla.com/en-US/firefox/geolocation/&quot;&gt;Location-Aware Browsing&lt;/a&gt; atau terjemahannya &lt;a href=&quot;http://www.mozilla.com/id/firefox/geolocation/&quot;&gt;Penjelajahan Berbasis-Lokasi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;W3C: &lt;a href=&quot;http://www.w3.org/TR/geolocation-API/&quot;&gt;Geolocation API Specification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Mozilla: &lt;a href=&quot;https://developer.mozilla.org/en/using_geolocation&quot;&gt;Using geolocation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Google Gears: &lt;a href=&quot;http://code.google.com/apis/gears/api_geolocation.html&quot;&gt;Geolocation API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Safari iPhone: &lt;a href=&quot;http://developer.apple.com/iphone/library/documentation/AppleApplications/Reference/SafariWebContent/GettingGeographicalLocations/GettingGeographicalLocations.html#//apple_ref/doc/uid/TP40002051-CH5-SW2&quot;&gt;Getting Geographic Locations&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3064211089164695382-1340983508914065654?l=ngoprek.fajran.web.id&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;&lt;/p&gt;</description>
	<pubDate>Thu, 21 Jan 2010 15:44:40 +0000</pubDate>
</item>
<item>
	<title>SMTP Server Bohongan</title>
	<guid>http://ngoprek.fajran.web.id/2010/01/smtp-server-bohongan.html</guid>
	<link>http://ngoprek.fajran.web.id/2010/01/smtp-server-bohongan.html</link>
	<description>&lt;p&gt;Saat lagi bikin sesuatu yg perlu ngirim-ngirim email, kita mungkin perlu sebuah SMTP alias email server bohongan yg bisa dipake tuk ngirim email tapi email tersebut tidak terkirim ke mana2. Tujuannya memang hanya untuk menguji apakah yg kita buat dapat berkomunikasi dg SMTP server dg baik.&lt;/p&gt;

&lt;p&gt;Salah satu cara untuk menyediakannya adalah dengan menyiapkan sebuah SMTP server uji coba. Server ini sudah diatur sedemikian rupa sehingga tidak akan meneruskan email ke tujuannya, namun hanya akan menjadi &quot;blackhole&quot; saja.&lt;/p&gt;

&lt;p&gt;Namun jika hal tsb dirasa ribet, coba pasang Python =D ternyata si Python ini sudah menyediakan sebuah kelas yang namanya benar-benar bisa membuat mulut tersenyum: &lt;code&gt;DebuggingServer&lt;/code&gt; dari modul &lt;code&gt;smtpd&lt;/code&gt;! Seperti yg dapat diperkirakan, sebuah SMTP server dapat dibuat dan kelas ini hanya akan mencetak setiap email masuk ke layar!&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ python -m smtpd -n -c DebuggingServer localhost:1025&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Jalankan satu baris di atas dan SMTP server bohongan sudah siap dipakai :D&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3064211089164695382-4330627181417861658?l=ngoprek.fajran.web.id&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Mon, 11 Jan 2010 07:53:25 +0000</pubDate>
</item>
<item>
	<title>apt-web</title>
	<guid>http://ngoprek.fajran.web.id/2009/12/apt-web.html</guid>
	<link>http://ngoprek.fajran.web.id/2009/12/apt-web.html</link>
	<description>&lt;p&gt;Saat ini &lt;a href=&quot;http://github.com/fajran/apt-web/&quot;&gt;apt-web&lt;/a&gt; biasa diakses melalui sebuah URL panjang yaitu &lt;a href=&quot;http://labs.fajran.web.id/p/apt-web/&quot;&gt;http://labs.fajran.web.id/p/apt-web/&lt;/a&gt;. Untuk memudahkan mengingat alamat apt-web ini, saya telah memindahkannya ke tempat baru, yaitu..&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://apt-web.dahsy.at/&quot;&gt;apt-web.dahsy.at&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Jadi, silakan perbarui bookmark Anda! =D&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3064211089164695382-7910313984216573303?l=ngoprek.fajran.web.id&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Tue, 29 Dec 2009 16:28:53 +0000</pubDate>
</item>
<item>
	<title>Perkalian matrix</title>
	<guid>http://ngoprek.fajran.web.id/2009/12/perkalian-matrix.html</guid>
	<link>http://ngoprek.fajran.web.id/2009/12/perkalian-matrix.html</link>
	<description>&lt;p&gt;.. dalam satu baris! euh, maksudnya 1 statement.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;hasil = map(lambda index:
      sum(
        map(lambda n: n[0] * n[1],
          zip(
            [a[i * 4 + (index % 4)] for i in range(4)],  # baris
            [b[(index / 4) * 4 + i] for i in range(4)]   # kolom
          )   # pasangan elemen baris dan kolom
        )   # kalikan setiap pasangan
      ),  # jumlahkan
    range(4*4))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Input adalah dua buah matrix berukuran 4&amp;#8201;&amp;#215;&amp;#8201;4, yaitu &lt;code&gt;a&lt;/code&gt; dan &lt;code&gt;b&lt;/code&gt;, dan hasilnya tentu saja matrix 4&amp;#8201;&amp;#215;&amp;#8201;4 juga yang ada di dalam variabel &lt;code&gt;hasil&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Ketiga matrix ini ditulis dalam bentuk array 1 dimensi dari elemen-elemen yang ada dengan menjejerkan &lt;strong&gt;kolom-kolom&lt;/strong&gt; yang ada. Sebagai contoh, matrix di bawah ini &lt;/p&gt;

&lt;pre&gt;&lt;code&gt; 1   2   3   4
 5   6   7   8
 9  10  11  12
13  14  15  16
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;akan ditulis dalam variabel berupa &lt;code&gt;[1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15, 4, 8, 12, 16]&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Kalau mau dibalik (urut baris), tukar saja &lt;code&gt;a&lt;/code&gt; dan &lt;code&gt;b&lt;/code&gt;. Tuk perkalian matrix &lt;code&gt;n&lt;/code&gt; x &lt;code&gt;n&lt;/code&gt;, ganti saja &lt;code&gt;4&lt;/code&gt; menjadi &lt;code&gt;n&lt;/code&gt; tersebut.&lt;/p&gt;

&lt;p&gt;Mohon dikoreksi kalau ada yg salah. Hasil nyoba2 membandingkan hasilnya dg hasil perhitungan dg &lt;a href=&quot;http://www.gnu.org/software/octave/&quot;&gt;GNU Octave&lt;/a&gt; sih bener.. :D&lt;/p&gt;

&lt;p&gt;Jadi pengen latihan functional programming..&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3064211089164695382-8747872543261443569?l=ngoprek.fajran.web.id&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Wed, 23 Dec 2009 21:45:05 +0000</pubDate>
</item>
<item>
	<title>Python 32bit di Snow Leopard</title>
	<guid>http://ngoprek.fajran.web.id/2009/12/python-32bit-di-snow-leopard.html</guid>
	<link>http://ngoprek.fajran.web.id/2009/12/python-32bit-di-snow-leopard.html</link>
	<description>&lt;p&gt;Python 2.6.1 bawaan Snow Leopard ternyata secara default bekerja dalam mode 64bit. Pada beberapa kasus, hal ini bisa membawa masalah misalnya jika bekerja dengan pustaka lain yang tidak menyediakan versi 64bit. Contohnya adalah pustaka QuickTime yang digunakan oleh &lt;a href=&quot;http://www.pyglet.org/&quot;&gt;Pyglet&lt;/a&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ python coba-pyglet.py
Traceback (most recent call last):
  ...
  File &quot;build/bdist.macosx-10.6-universal/egg/pyglet/lib.py&quot;, line 226, in load_framework
  File &quot;/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/ctypes/__init__.py&quot;, line 423, in LoadLibrary
    return self._dlltype(name)
  File &quot;/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/ctypes/__init__.py&quot;, line 345, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: dlopen(/System/Library/Frameworks/QuickTime.framework/QuickTime, 6): no suitable image found.  Did find:
    /System/Library/Frameworks/QuickTime.framework/QuickTime: no matching architecture in universal wrapper
    /System/Library/Frameworks/QuickTime.framework/QuickTime: no matching architecture in universal wrapper
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Kalau dicek, memang pustaka tersebut tidak mengandung versi 64 bit.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ file /System/Library/Frameworks/QuickTime.framework/QuickTime
/System/Library/Frameworks/QuickTime.framework/QuickTime: Mach-O universal binary with 2 architectures
/System/Library/Frameworks/QuickTime.framework/QuickTime (for architecture i386):   Mach-O dynamically linked shared library i386
/System/Library/Frameworks/QuickTime.framework/QuickTime (for architecture ppc7400):    Mach-O dynamically linked shared library ppc
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Lalu caranya gimana? Ternyata manual python di Snow Leopard sudah memberitahukan informasi ini :D&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ export VERSIONER_PYTHON_PREFER_32_BIT=yes
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Cukup mengeset environment variable seperti di atas dan jalankan Python seperti biasa. Python akan dijalankan dalam mode 32 bit dan masalah di atas pun tidak ada.&lt;/p&gt;

&lt;p&gt;Kalau ingin diset secara default, maka jalankan perintah berikut.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ defaults write com.apple.versioner.python Prefer-32-Bit -bool yes
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Setiap Python yg dijalankan setelah ini akan secara otomatis berjalan di bawah mode 32 bit. Ganti nilai &lt;code&gt;yes&lt;/code&gt; menjadi &lt;code&gt;no&lt;/code&gt; untuk mematikannya alias mengembalikan agar berjalan dalam mode 64 bit secara default.&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3064211089164695382-1234383404348756354?l=ngoprek.fajran.web.id&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Wed, 23 Dec 2009 10:39:56 +0000</pubDate>
</item>
<item>
	<title>flickr browsr</title>
	<guid>http://ngoprek.fajran.web.id/2009/12/flickr-browsr.html</guid>
	<link>http://ngoprek.fajran.web.id/2009/12/flickr-browsr.html</link>
	<description>&lt;p&gt;Contoh aplikasi &lt;a href=&quot;http://github.com/fajran/kasuari/&quot;&gt;Kasuari&lt;/a&gt; yg lain: photo browser =D&lt;/p&gt;

&lt;p&gt;Saya nyoba ngambil 800 foto di &lt;a href=&quot;http://flickr.com/&quot;&gt;Flickr&lt;/a&gt;, lalu membuat kolase besar, dan menampilkannya dg Kasuari. Hasil akhir dapat dilihat di:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://labs.fajran.web.id/p/kasuari/flickr/&quot;&gt;http://labs.fajran.web.id/p/kasuari/flickr/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Masing-masing foto berukuran 1024x860 pixel sehingga 800 foto berarti sekitar 557 megapixel. Foto-foto ini diambil dg bantuan Flickr API tuk search berdasar interestingness.&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3064211089164695382-1376014710468192592?l=ngoprek.fajran.web.id&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Tue, 22 Dec 2009 19:26:04 +0000</pubDate>
</item>
<item>
	<title>3.7 Gigapixel (v2)</title>
	<guid>http://ngoprek.fajran.web.id/2009/12/37-gigapixel-v2.html</guid>
	<link>http://ngoprek.fajran.web.id/2009/12/37-gigapixel-v2.html</link>
	<description>&lt;p&gt;Tulisan ini merupakan kelanjutan dari &lt;a href=&quot;http://ngoprek.fajran.web.id/2009/08/37-gigapixel.html&quot;&gt;tulisan saya sebelumnya&lt;/a&gt; mengenai &lt;a href=&quot;http://github.com/fajran/kasuari&quot;&gt;Kasuari&lt;/a&gt;, sebuah skrip untuk menampilkan gambar super besar dg teknik multi-scale pada halaman web dengan bantuan Javascript dan Canvas.&lt;/p&gt;

&lt;p&gt;Saya baru saja menulis ulang skrip tersebut. Kali ini saya mematikan dulu fungsi pergerakan halus karena kok rasanya ngga terlalu menunjang sisi interaktivitas. Fungsi ini sebenarnya menunda pergerakan layar sehingga terlihat tidak menempel dengan pointer mouse. Karena penundaan ini, pergerakan terlihat &amp;#8220;terlambat&amp;#8221; dan tidak mengikuti pergerakan pointer mouse secara langsung. Penundaan ini mungkin bisa membuat pergerakan menjadi lebih &amp;#8220;dinamis&amp;#8221; dan tidak kaku tapi di lain pihak, pengguna bisa salah mengira kalau keterlambatan ini disebabkan oleh komputer yg lambat. Mungkin saya masih perlu bereksperimen dengan parameter2 yg ada.&lt;/p&gt;

&lt;p&gt;Selain itu, saya juga menambahkan satu buah fitur baru, yaitu pembesaran halus. Saat mendekatkan atau menjauhkan gambar yg membuat gambar terlihat lebih besar dan kecil, transisi dilakukan secara bertahap. Dengan demikian, pengguna bisa mengikuti proses yang terjadi (yaitu pembesaran/pengecilan gambar) sehingga diharapkan pengguna tidak kehilangan konteks.&lt;/p&gt;

&lt;p&gt;Saya juga menulis ulang aplikasi untuk mempersiapkan gambar yang akan dipakai oleh Kasuari. Awalnya aplikasi (yg saya tulis dg Python) ini hanya bisa menggunakan satu buah sumber gambar yang dijadikan gambar asli dalam resolusi penuh. Aplikasi akan memotong-motong gambar menjadi banyak gambar dengan ukuran lebih kecil (yaitu 256&amp;#8201;&amp;#215;&amp;#8201;256 piksel) dan lalu membuat gambar dalam skala (ukuran) yg lain dari gambar-gambar ini.&lt;/p&gt;

&lt;p&gt;Kekurangan dari aplikasi ini adalah jika gambar berukuran sangat besar, bisa saja gambar disediakan dalam beberapa potongan gambar yang lebih kecil. Oleh karena itu, aplikasi harus dapat memproses beberapa gambar ini dalam menyusun gambar yang dibutuhkan oleh Kasuari. &lt;/p&gt;

&lt;p&gt;Saya menggunakan pustaka &lt;a href=&quot;http://www.pythonware.com/products/pil/&quot;&gt;Python Imaging Library (PIL)&lt;/a&gt; untuk membantu mengolah gambar. Namun ternyata PIL ini memiliki masalah jika gambar yang ditangani memiliki ukuran yang besar. PIL bekerja sangat lambat dan butuh memori sangat besar. Mungkin karena gambar yang ada perlu dimasukkan ke memori terlebih dahulu secara keseluruhan sebelum dapat diproses lebih lanjut. Berhubung proses pemotongan gambar dilakukan perbaris, seharusnya ada cara yang lebih cerdas untuk mengatasi masalah ini.&lt;/p&gt;

&lt;p&gt;Akhirnya saya mencoba untuk menggunakan &lt;a href=&quot;http://www.ijg.org/&quot;&gt;libjpeg&lt;/a&gt; untuk membuat aplikasi pemotong gambar. Walaupun akhirnya saya harus menulis kode dalam bahasa C, namun hasil akhirnya cukup memuaskan. Aplikasi yang saya tulis ini dapat bekerja dengan cepat dan menggunakan memori secukupnya. &lt;/p&gt;

&lt;p&gt;Sebagai bahan uji coba, saya telah melanjutkan usaha gagal yang saya lakukan sebelumnya, yaitu mencoba menyediakan gambar berukuran 3.7 gigapixel dalam Kasuari. Gambar ini adalah peta dunia dari NASA yang memiliki resolusi 500m untuk setiap piksel yang ada. Ukuran gambar adalah 3.7 gigapixel (86400&amp;#8201;&amp;#215;&amp;#8201;43200) yang awalnya tersusun dari 8 buah gambar berukuran 21600&amp;#8201;&amp;#215;&amp;#8201;21600 piksel.&lt;/p&gt;

&lt;p&gt;Hasil akhir dapat dilihat di &lt;a href=&quot;http://labs.fajran.web.id/p/kasuari/bluemarble500m/&quot;&gt;http://labs.fajran.web.id/p/kasuari/bluemarble500m/&lt;/a&gt; :)&lt;/p&gt;

&lt;p&gt;Kode sumber Kasuari dan aplikasi pemotong gambar dapat dilihat di &lt;a href=&quot;http://github.com/fajran/kasuari&quot;&gt;http://github.com/fajran/kasuari&lt;/a&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3064211089164695382-6154709889104255066?l=ngoprek.fajran.web.id&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Tue, 22 Dec 2009 11:38:20 +0000</pubDate>
</item>
<item>
	<title>crypt_abg()</title>
	<guid>http://blog.fajran.web.id/2009/08/19/crypt_abg/</guid>
	<link>http://blog.fajran.web.id/2009/08/19/crypt_abg/</link>
	<description>&lt;p&gt;Tiba2 saya dapet pesan di ym disuru memecahkan sandi berikut. Ada yg mau bantuin?&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;mubh eaa tmnd&amp;#8221;gw da 2 hri gw gbsa lez cmz or agkt tlp u smw cz gw tba&amp;#8221; ckiid gtu&lt;/p&gt;
&lt;/blockquote&gt;</description>
	<pubDate>Wed, 19 Aug 2009 20:11:42 +0000</pubDate>
</item>
<item>
	<title>GPL dan jualan</title>
	<guid>http://blog.fajran.web.id/2009/08/01/gpl-dan-jualan/</guid>
	<link>http://blog.fajran.web.id/2009/08/01/gpl-dan-jualan/</link>
	<description>&lt;p&gt;Bolehkah menjual aplikasi dg lisensi GPL? jawabannya adalah BOLEH.&lt;/p&gt;

&lt;p&gt;Baca &lt;a href=&quot;http://www.gnu.org/licenses/gpl-faq.html#DoesTheGPLAllowMoney&quot;&gt;FAQnya&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Does the GPL allow me to sell copies of the program for money?&lt;/strong&gt;&lt;/p&gt;
  
  &lt;p&gt;Yes, the GPL allows everyone to do this. The &lt;a href=&quot;http://www.gnu.org/philosophy/selling.html&quot;&gt;right to sell copies&lt;/a&gt; is part of the definition of free software. Except in one special situation, there is no limit on what price you can charge. (The one exception is the required written offer to provide source code that must accompany binary-only release.)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Tuk contoh kasus, silakan baca artikel slashdot berikut: &lt;a href=&quot;http://ask.slashdot.org/story/09/08/01/169247/The-Ethics-of-Selling-GPLed-Software-For-the-iPhone&quot;&gt;http://ask.slashdot.org/story/09/08/01/169247/The-Ethics-of-Selling-GPLed-Software-For-the-iPhone&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Sat, 01 Aug 2009 16:44:49 +0000</pubDate>
</item>
<item>
	<title>Kambing (hampir) pulih kembali</title>
	<guid>http://staff.blog.ui.ac.id/fajran/2009/07/29/kambing-hampir-pulih-kembali/</guid>
	<link>http://staff.blog.ui.ac.id/fajran/2009/07/29/kambing-hampir-pulih-kembali/</link>
	<description>&lt;p&gt;Beberapa hari yang lalu, beberapa harddisk &lt;a href=&quot;http://kambing.ui.ac.id&quot;&gt;Kambing&lt;/a&gt; mengalami kerusakan. Sebenarnya sudah ada antisipasi harddisk rusak dengan cara mengunakan konfigurasi &lt;a href=&quot;http://en.wikipedia.org/wiki/RAID&quot;&gt;RAID 5&lt;/a&gt; pada disk array yg digunakan. Dengan konfigurasi ini, jika ada 1 buah harddisk rusak, maka sistem masih tetap dapat berjalan seperti biasa. Namun sayangnya dalam kasus Kambing ini, harddisk yg rusak ada 2 buah :( apa daya seluruh data yang ada hilang tanpa bekas.&lt;/p&gt;
&lt;p&gt;Setelah tabrakan beruntun ini, Kambing akhirnya dibangunkan kembali. Usaha pertama yang dilakukan tentu saja mengembalikan data-data yang ada seperti semula. Proses menyalinan data untungnya dapat dilakukan dengan mudah dengan digunakannya skrip &lt;a href=&quot;https://launchpad.net/sedot/&quot;&gt;Sedot&lt;/a&gt; yang sudah hampir setahun terakhir menjadi salah satu amunisi Kambing. Permasalahan kedua adalah bagaimana caranya agar data yang sebelumnya sebesar sekitar 2.4TB ini bisa dikembalikan dengan cepat. Beruntung sekali di Indonesia ini banyak sekali mirror perangkat lunak bebas dan terbuka. Berbekal koneksi yang lumayan kencang melalui INHERENT dan OpenIXP, mirror-mirror tetangga seperti &lt;a href=&quot;http://shol.vlsm.org&quot;&gt;Shol&lt;/a&gt;, &lt;a href=&quot;http://komo.vlsm.org&quot;&gt;Komo&lt;/a&gt;, &lt;a href=&quot;http://mirror.unej.ac.id&quot;&gt;Mirror Universitas Jember&lt;/a&gt;, &lt;a href=&quot;http://repo.ugm.ac.id&quot;&gt;Mirror Universitas Gadjah Mada&lt;/a&gt;, dan &lt;a href=&quot;http://kebo.vlsm.org&quot;&gt;Kebo milik EEPIS-ITS&lt;/a&gt; dapat digunakan sebagai sumber pengembalian data.&lt;/p&gt;
&lt;p&gt;Saat ini bisa dibilang Kambing sudah hampir normal seperti sediakala, baik dari data yang tersedia maupun kesibukan lalu lintas data. Satu proses yang belum selesai adalah sinkronisasi repositori openSUSE dimana ternyata Kambing mengambil data yang berbeda dibandingkan data yang ada di mirror tetangga. Sehingga mau tidak mau Kambing harus mengambil data ini langsung dari sumbernya, eh ngga juga sih, dari mirror lain di Jepang. Status terkini mengenai repositori yang ada di Kambing dapat dilihat di &lt;a href=&quot;http://kambing.ui.ac.id/status/&quot;&gt;http://kambing.ui.ac.id/status/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Sekian saja laporan terakhir dari si Kambing. Selamat menikmati kembali =)&lt;/p&gt;</description>
	<pubDate>Tue, 28 Jul 2009 17:36:20 +0000</pubDate>
</item>
<item>
	<title>What is a browser?</title>
	<guid>http://blog.fajran.web.id/2009/06/24/what-is-a-browser/</guid>
	<link>http://blog.fajran.web.id/2009/06/24/what-is-a-browser/</link>
	<description>&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Faktanya..&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Less than 8% of people who were interviewed on this day knew what a browser was&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ada yg mau bikin survey serupa? =D&lt;/p&gt;

&lt;p&gt;Jadi ingat survey yg mirip2 tentang &lt;a href=&quot;http://fajran.web.id/story/2008/05/31/firefox-or-internet-explorer&quot;&gt;Firefox or Internet Explorer?&lt;/a&gt;.&lt;/p&gt;</description>
	<pubDate>Wed, 24 Jun 2009 08:51:17 +0000</pubDate>
</item>
<item>
	<title>Bikin laporan itu..</title>
	<guid>http://blog.fajran.web.id/2009/06/08/bikin-laporan-itu/</guid>
	<link>http://blog.fajran.web.id/2009/06/08/bikin-laporan-itu/</link>
	<description>&lt;p&gt;.. rasanya lebih susah daripada ngoding.&lt;/p&gt;</description>
	<pubDate>Sun, 21 Jun 2009 23:08:34 +0000</pubDate>
</item>
<item>
	<title>The Programmer&#8217;s Bill of Rights</title>
	<guid>http://blog.fajran.web.id/2009/06/22/the-programmers-bill-of-rights/</guid>
	<link>http://blog.fajran.web.id/2009/06/22/the-programmers-bill-of-rights/</link>
	<description>&lt;p&gt;Diambil dari &lt;a href=&quot;http://www.codinghorror.com/blog/archives/000666.html&quot;&gt;http://www.codinghorror.com/blog/archives/000666.html&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Mengingatkan saya pada waktu ngerjain &lt;a href=&quot;http://grid.ui.ac.id&quot;&gt;TA&lt;/a&gt; saat &lt;a href=&quot;http://www.ui.ac.id&quot;&gt;S1&lt;/a&gt; dulu.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Programmer&amp;#8217;s Bill of Rights&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Every programmer shall have two monitors&lt;/strong&gt;. Check! &lt;a href=&quot;http://fajran.web.id/tutorial/x2x&quot;&gt;I got &amp;#8216;em&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Every programmer shall have a fast PC&lt;/strong&gt;. Dulu emang baru beli kompi lagi dan dibawa ke kampus berhubung lg TA.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Every programmer shall have their choice of mouse and keyboard&lt;/strong&gt;. Sampe bawa keyboard dan mouse dari rumah!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Every programmer shall have a comfortable chair&lt;/strong&gt;. Ah sialnya yg ini ngga.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Every programmer shall have a fast internet connection&lt;/strong&gt;. Koneksi &lt;a href=&quot;http://www.ui.ac.id&quot;&gt;UI&lt;/a&gt; saat itu mayan lahh.. walo siang2 kena cekek, tp malemnya bergiga-giga anime berhasil didonlod &gt;:D&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Every programmer shall have quiet working conditions&lt;/strong&gt;. Pas banget lah.. 3208 sunyi.. gak kaya ruang sebelah pas sore2 =))&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sekarang? Cukup setia ditemani &lt;a href=&quot;http://www.flickr.com/photos/fajran/3569722609/&quot;&gt;macbook1,1&lt;/a&gt;. &lt;a href=&quot;http://www.flickr.com/photos/fajran/3284958988/&quot;&gt;Layar segede gaban di kampus&lt;/a&gt; gak bisa dibawa pulang sih.&lt;/p&gt;</description>
	<pubDate>Sun, 21 Jun 2009 23:08:12 +0000</pubDate>
</item>
<item>
	<title>Augmented reality</title>
	<guid>http://blog.fajran.web.id/2009/06/14/augmented-reality/</guid>
	<link>http://blog.fajran.web.id/2009/06/14/augmented-reality/</link>
	<description>&lt;p&gt;Augmented reality adalah upaya untuk &amp;#8220;menggabungkan&amp;#8221; dunia nyata dan dunia virtual yg dibuat oleh komputer sehingga batas antara keduanya menjadi sangat tipis (&lt;a href=&quot;http://en.wikipedia.org/wiki/Augmented_reality&quot;&gt;wikipedia&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Barusan saya nemuin sebuah demo keren mengenai AR ini yang menggunakan nvidia tegra. Silakan intip video berikut.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Kalau mau nyoba langsung teknologi AR ini, coba juga kunjungi &lt;a href=&quot;http://ge.ecomagination.com/smartgrid/#/augmented_reality&quot;&gt;http://ge.ecomagination.com/smartgrid/#/augmented_reality&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ngomong2 ttg &lt;a href=&quot;http://www.google.com/search?q=nvidia+tegra&quot;&gt;nvidia tegra&lt;/a&gt;, kapan ya devicesnya pada bermunculan? &amp;#42;tak sabar&amp;#42;&lt;/p&gt;</description>
	<pubDate>Sun, 14 Jun 2009 14:04:53 +0000</pubDate>
</item>
<item>
	<title>Legal itu ..</title>
	<guid>http://blog.fajran.web.id/2009/06/07/legal-itu/</guid>
	<link>http://blog.fajran.web.id/2009/06/07/legal-itu/</link>
	<description>&lt;p&gt;.. bukan cuma berarti beli dari vendor.&lt;/p&gt;

&lt;p&gt;Tapi juga mengikuti ketentuan yang berlaku.&lt;/p&gt;

&lt;p&gt;Contoh: beli Mac OS X dari Apple. Oh jelas boleh sah. Legal? blom relevan tuk dibicarakan kalau cuma sampe sini saja.&lt;/p&gt;

&lt;p&gt;Sistem operasi tsb lalu dipasang di komputer. Pertanyaan berikutnya, komputer apa? keluaran Apple? kalo tidak, weitss.. jangan asal mengklaim sistem operasi itu legal.&lt;/p&gt;

&lt;p&gt;Dari &lt;a href=&quot;http://images.apple.com/legal/sla/docs/macosx105.pdf&quot;&gt;http://images.apple.com/legal/sla/docs/macosx105.pdf&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;2. Permitted License Uses and Restrictions.&lt;/strong&gt;&lt;/p&gt;
  
  &lt;p&gt;A. Single Use. This License allows you to install, use and run one (1) copy of the Apple Software on a single Apple-labeled computer at a time. You agree not to install, use  or run the Apple Software on any non-Apple-labeled computer, or to enable others to do so. This License does not allow the Apple Software to exist on more than one computer at a time, and you may not make the Apple Software available over a network where it could be used by multiple computers at the same time.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bagaimana dengan komputer &amp;#8220;biasa&amp;#8221; yang menjalankan Mac OS X alias Macintosh clone? Kalau baca di &lt;a href=&quot;http://en.wikipedia.org/wiki/Macintosh_clone#Macintosh_cloning_today&quot;&gt;wikipedia&lt;/a&gt;, praktik seperti ini memang tidak diperbolehkan/diizikan oleh Apple.&lt;/p&gt;

&lt;p&gt;Contoh lain: Database Oracle.&lt;/p&gt;

&lt;p&gt;Pada tahu kan kalau perangkat lunak ini bisa didownload secara bebas? Coba cek &lt;a href=&quot;http://www.oracle.com/technology/software/index.html&quot;&gt;http://www.oracle.com/technology/software/index.html&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Walau bebas didownload, bukan berarti bisa digunakan secara bebas. Coba cek tulisan yg tertulis di sana&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;All software downloads are free, and each comes with a Development License that allows you to use full versions of the products at no charge while developing and prototyping your applications (or for strictly self-educational purposes). In some cases, certain downloads (such as Beta releases) have licenses with slightly different terms.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Yang saya tangkap adalah produk Oracle hasil download tersebut hanya datang dengan lisensi pengembangan yang hanya mengizinkan penggunaan dalam tahap pengembangan juga. Ingin menggunakan tuk keperluan produksi? silakan beli lisensi yang sesuai.&lt;/p&gt;

&lt;p&gt;Tolong koreksi kalau saya salah.&lt;/p&gt;</description>
	<pubDate>Sat, 06 Jun 2009 19:39:39 +0000</pubDate>
</item>
<item>
	<title>Google Chrome</title>
	<guid>http://blog.fajran.web.id/2009/06/05/google-chrome/</guid>
	<link>http://blog.fajran.web.id/2009/06/05/google-chrome/</link>
	<description>&lt;p&gt;&lt;img src=&quot;http://blog.fajran.web.id/wp-content/uploads/2009/06/picture-11.png&quot; alt=&quot;Tiger is unsupported :(&quot; title=&quot;Tiger is unsupported :(&quot; width=&quot;474&quot; height=&quot;146&quot; class=&quot;aligncenter size-full wp-image-7&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Doh! Kapan ya &lt;a href=&quot;http://www.apple.com/macosx/snowleopard/&quot;&gt;Snow Leopard&lt;/a&gt; keluar?&lt;/p&gt;</description>
	<pubDate>Fri, 05 Jun 2009 13:44:45 +0000</pubDate>
</item>
<item>
	<title>Pilihan?</title>
	<guid>http://fajran.web.id/story/2009/05/23/pilihan</guid>
	<link>http://fajran.web.id/story/2009/05/23/pilihan</link>
	<description>&lt;p&gt;Andai cuma ada 1 pilihan, apakah itu sesuatu yg harus dipilih? &amp;#42;duh bingung nulisnya gmn&amp;#42;&lt;/p&gt;

&lt;p&gt;Yang pengen gw komentarin adalah apakah kita perlu menggunakan sebuah combo box untuk menampilkan SATU buah pilihan? Selain itu, apakah perlu menjadikan kata2 &amp;#8220;pilih&amp;#8221; sebagai salah satu &amp;#8220;pilihan palsu&amp;#8221; dalam combo box tersebut? Apakah perlu menjadikan &amp;#8220;pilihan palsu&amp;#8221; tersebut menjadi nilai yg &amp;#8220;terpilih&amp;#8221; secara default?&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://fajran.web.id/story/2009/05/23/pilihan&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Sat, 23 May 2009 11:24:39 +0000</pubDate>
</item>
<item>
	<title>Shortcut Firefox</title>
	<guid>http://fajran.web.id/story/2009/01/16/shortcut-firefox</guid>
	<link>http://fajran.web.id/story/2009/01/16/shortcut-firefox</link>
	<description>&lt;p&gt;Melengkapi dan melanjuti tulisan sejenis yang &lt;a href=&quot;http://fajran.web.id/story/2005/03/17/shortcut&quot;&gt;dulu pernah saya tulis&lt;/a&gt;. Yang akan saya tulis ini shortcut yang bisa dipakai di Firefox versi Linux dan Mac OS X (saya tulis di dalam kurung).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ke address bar: Ctrl+L (Cmd+L)&lt;/li&gt;
&lt;li&gt;Ke search bar: Ctrl+K (Cmd+K)&lt;/li&gt;
&lt;li&gt;Buka tab baru: Ctrk+T (Cmd+T)&lt;/li&gt;
&lt;li&gt;Tab berikutnya: Ctrl+Tab (Cmd+}) atau Ctrl+PgUp&lt;/li&gt;
&lt;li&gt;Tab sebelumnya: Ctrl+Shift+Tab (Cmd+{) atau Ctrl+PgDn&lt;/li&gt;
&lt;li&gt;Tutup tab: Ctrl+W (Cmd+W)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Segitu aja ah.. :D selanjutnya mau ngomentarin aja.&lt;/p&gt;
&lt;p&gt;Mana yg lebih enak, di Linux ato Mac OS X? Mana yg lebih enak, mencet Ctrl atau Cmd? Sebagai informasi, saya nekan tombol Ctrl dengan kelingking kiri sedangkan tombol Cmd dg jempol kiri. &lt;/p&gt;
&lt;p&gt;Jempol itu biasanya ada di sekitar spasi bagian paling kiri dan tombol Cmd itu ada persis di sebelah kirinya. Cuma nekuk jempol sedikit yang kebetulan sesuai dg arah gerak sendi si jempol. Kesimpulannya.. nyaman :D&lt;/p&gt;
&lt;p&gt;Nah.. bagaimana dg mencet tombol Ctrl dengan kelingking kiri? Kalau saya menekannya dg kelingking kiri tanpa mengubah posisi telapak tangan, maka si kelingking musti membentuk sudut kira2 90 derajat. Menurut saya, posisi ini rada2 tidak nyaman. Apalah kalau dikombinasikan dg menekan tombol T yang biasa saya tekan dengan telunjuk kiri. Telapak tangan kiri saya musti menekuk sana sini dulu tuk melakukannya. Kalau ingin menekan tombol Ctrl dg kelingking kiri dengan nyaman, saya harus menggeser telapak tangan saya dulu agak ke bawah. Rada buang2 energi =P&lt;/p&gt;
&lt;p&gt;Jadi.. mana yg lebih enak mencet Ctrl atau Cmd? menurut saya.. dengan keyboard macbook ini.. enakan mencet tombol Cmd =D&lt;/p&gt;
&lt;p&gt;Trus.. tuk urusan pindah2 tab. Bagi saya, kombinasi Ctrl+Tab dan Ctrl+Shift+Tab itu sangat tidak enak tuk dipraktekkan. Telapak dan jari2 tangan kanan saya harus aga2 berakrobat dikit tuk melakukannya. Kalau mau mencet Ctrl+PgUp atau Ctrl+PgDn, berhubung di keyboard saya ini kalau mau mencet PgUp atau PgDn harus menekan tombol Fn yang ada di sebelah kiri tombol Ctrl, maka saya harus menggeser telapak tangan saya agak ke bawah agar tombol2 tersebut bisa ditekan dengan nyaman. &lt;/p&gt;
&lt;p&gt;Beda rasanya dg mencet Cmd+{ atau Cmd+} di Firefox tuk Mac OS X kalau ingin pindah2 tab. Kedua telapak tangan saya sama sekali tidak harus berubah posisi. Jempol mencet Cmd, kelingking kiri mencet Shift, dan jari tengah/manis kanan saya mencet tombol [ atau ].&lt;/p&gt;
&lt;p&gt;sekian dulu komentar entah-penting-atau-tidak dari saya.. hehehe..&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://fajran.web.id/story/2009/01/16/shortcut-firefox&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Fri, 16 Jan 2009 20:54:39 +0000</pubDate>
</item>
<item>
	<title>Wawancara dengan pengembang adware</title>
	<guid>http://fajran.web.id/story/2009/01/14/wawancara-dengan-pengembang-adware</guid>
	<link>http://fajran.web.id/story/2009/01/14/wawancara-dengan-pengembang-adware</link>
	<description>&lt;p&gt;Bisa dibaca di &lt;a href=&quot;http://philosecurity.org/2009/01/12/interview-with-an-adware-author&quot;&gt;http://philosecurity.org/2009/01/12/interview-with-an-adware-author&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;keren euy! cerita bagaimana si pembuat adware itu bisa memanfaatkan &amp;#8220;fasilitas&amp;#8221; yang ada di Windows tuk keperluan &amp;#8220;macem2&amp;#8221;.. hehehe..&lt;/p&gt;

&lt;p&gt;ada bbrp kutipan menarik..&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;S: In your professional opinion, how can people avoid adware?&lt;/p&gt;
  
  &lt;p&gt;M: Um, run UNIX.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;lalu&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;S: How private is people’s information today?&lt;/p&gt;
  
  &lt;p&gt;M: Not at all.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;dan&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;S: Do you think that in our society we delude ourselves into thinking we have more privacy than we really do?&lt;/p&gt;
  
  &lt;p&gt;M: Oh, absolutely. If you think about it, when I use a credit card, the security model is the same as that of handing you my wallet and saying, “Take out whatever money you think you want, and then give it back.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;http://fajran.web.id/story/2009/01/14/wawancara-dengan-pengembang-adware&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Thu, 15 Jan 2009 00:16:47 +0000</pubDate>
</item>
<item>
	<title>Tantangan BlankOn 2009</title>
	<guid>http://fajran.web.id/story/2008/11/10/tantangan-blankon-2009</guid>
	<link>http://fajran.web.id/story/2008/11/10/tantangan-blankon-2009</link>
	<description>&lt;p&gt;Hayo sapa mau ikutan berkontribusi sambil nyari duit =D Bisa dikerjakan perorangan atau tim.&lt;/p&gt;
&lt;p&gt;***&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://dev.blankonlinux.or.id/wiki/TantanganBlankOn/2009&quot;&gt;Tantangan BlankOn&lt;/a&gt; adalah tantangan proyek &lt;a href=&quot;http://www.blankonlinux.or.id&quot;&gt;BlankOn&lt;/a&gt; untuk mahasiswa dan pelajar Indonesia. Mahasiswa dan pelajar Indonesia yang berminat dapat menjadi peserta tantangan dan menyelesaikan tantangan dalam waktu 3 bulan. Akan ada imbalan berupa uang tunai bagi peserta yang berhasil menyelesaikan tantangan dengan baik.&lt;/p&gt;
&lt;p&gt;Tujuan diadakannya kegiatan ini adalah untuk memerkenalkan BlankOn ke kalangan pelajar dan mahasiswa sekaligus melibatkan mereka dalam pengembangannya. Nilai hadiah tidak menyerminkan tingkat kesulitan namun tingkat pentingnya tantangan tersebut namun hingga saat ini belum dapat dikerjakan sendiri oleh tim pengembang yang ada karena keterbatasan waktu dan tenaga.&lt;/p&gt;
&lt;p&gt;Kecuali disyaratkan dalam masing-masing halaman tantangan, hasil pekerjaan asli (bukan patch atau karya turunan upstream) dilisensikan secara sukarela ke lisensi Perangkat Lunak Terbuka yang terdaftar di &lt;a href=&quot;http://www.opensource.org/licenses&quot;&gt;OSI&lt;/a&gt; atau &lt;a href=&quot;http://creativecommons.org/&quot;&gt;Creative Commons&lt;/a&gt; (pilih antara CC-BY-SA atau CC-BY-ND).&lt;/p&gt;
&lt;p&gt;Secara umum, tantangan dianggap berhasil dikerjakan apabila peserta dinilai mampu memenuhi 100% kriteria wajib dan 80% kriteria tambahan. Namun secara khusus tiap-tiap tantangan mungkin berbeda dalam kriteria penilaiannya, silakan kunjungi masing-masing halaman tantangan untuk lebih jelasnya. Penilaian dilakukan oleh para mentor.&lt;/p&gt;
&lt;p&gt;Total imbalan yang disediakan adalah Rp 20.000.000 yang disponsori oleh &lt;a href=&quot;http://airputih.or.id/&quot;&gt;Yayasan Air Putih&lt;/a&gt;. Tim BlankOn masih membuka kesempatan bagi siapa saja yang ingin menambahkan total nilai imbalan. Dari nilai yang diberikan akan didistribusikan secara proporsional ke daftar tantangan yang tersedia di bawah ini. Tidak tertutup kemungkinan untuk mensponsori tantangan lain yang belum ada di daftar tantangan di bawah.&lt;/p&gt;
&lt;p&gt;Daftar tantangan:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://dev.blankonlinux.or.id/wiki/TantanganBlankOn/2009/BlankOnMinimalis&quot;&gt;&lt;strong&gt;Meminimalkan BlankOn Minimalis&lt;/strong&gt;&lt;/a&gt;, jalan mulus di 128 MB.&lt;/p&gt;
&lt;p&gt;Imbalan: 6 juta rupiah&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://dev.blankonlinux.or.id/wiki/TantanganBlankOn/2009/Daluang&quot;&gt;&lt;strong&gt;Melengkapi parser sintaks Wikipedia pada Daluang&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Imbalan: 3 juta rupiah&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://dev.blankonlinux.or.id/wiki/TantanganBlankOn/2009/PabrikPaketOtomatis&quot;&gt;&lt;strong&gt;Rebranding paket-paket Ubuntu secara terotomatisasi&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Imbalan: 5 juta rupiah&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://dev.blankonlinux.or.id/wiki/TantanganBlankOn/2009/AksaraNusantara&quot;&gt;&lt;strong&gt;Metoda input dan fonta aksara Nusantara&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Imbalan: 2 juta rupiah&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://dev.blankonlinux.or.id/wiki/TantanganBlankOn/2009/BukuPanduan&quot;&gt;&lt;strong&gt;Buku panduan lengkap tentang penggunaan BlankOn 5.0&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Imbalan: 4 juta rupiah&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Informasi lebih lanjut: &lt;a href=&quot;http://dev.blankonlinux.or.id/wiki/TantanganBlankOn/2009&quot;&gt;http://dev.blankonlinux.or.id/wiki/TantanganBlankOn/2009&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://fajran.web.id/story/2008/11/10/tantangan-blankon-2009&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Mon, 10 Nov 2008 15:18:40 +0000</pubDate>
</item>
<item>
	<title>iangoprek</title>
	<guid>http://fajran.web.id/story/2008/11/09/iangoprek</guid>
	<link>http://fajran.web.id/story/2008/11/09/iangoprek</link>
	<description>&lt;p&gt;Biar tak membuat jorok blog yg dah jorok ini, &lt;code&gt;ngoprek.log&lt;/code&gt; saya pindahkan ke &lt;a href=&quot;http://ngoprek.fajran.web.id/&quot;&gt;http://ngoprek.fajran.web.id/&lt;/a&gt; =D&lt;/p&gt;</description>
	<pubDate>Sun, 09 Nov 2008 19:52:03 +0000</pubDate>
</item>
<item>
	<title>Nonton Film</title>
	<guid>http://fajran.web.id/story/2008/11/05/nonton-film</guid>
	<link>http://fajran.web.id/story/2008/11/05/nonton-film</link>
	<description>&lt;p&gt;Iseng-iseng malem-malem.. modal Python, PyGTK, Gstreamer, dan waktu satu jam. Jadilah program kecil dan tak lengkap tuk nonton film! eh tapi minimal udah bisa nonton, play/pause, dan geser2 waktu :D berhubung gak tau cara ngambil skrinsutnya, akhirnya si-skrin di-sut aje..&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://arsip.fajran.web.id/img/nontonfilm.jpg&quot; alt=&quot;nonton film&quot; /&gt;&lt;/p&gt;

&lt;p&gt;lisensi? public domain aja lah :D kodingan bisa diambil di &lt;a href=&quot;http://github.com/fajran/nontonfilm/tree/master&quot;&gt;http://github.com/fajran/nontonfilm/tree/master&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;tutorial? baca aja &lt;a href=&quot;http://pygstdocs.berlios.de/pygst-tutorial/index.html&quot;&gt;http://pygstdocs.berlios.de/pygst-tutorial/index.html&lt;/a&gt;. kodingan di sono jg dicomot2 kok =D&lt;/p&gt;

&lt;p&gt;uh ternyata blom bisa ngalahin &lt;a href=&quot;http://oss.bisnisweb.com/mdamt/vcd/&quot;&gt;Nonton VCD&lt;/a&gt; punyanya &lt;a href=&quot;http://www.mdamt.net/&quot;&gt;mdamt&lt;/a&gt; dalam waktu sejam ituh..&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://fajran.web.id/story/2008/11/05/nonton-film&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Thu, 06 Nov 2008 05:14:14 +0000</pubDate>
</item>
<item>
	<title>JadwalSholat Applet</title>
	<guid>http://fajran.web.id/story/2008/09/19/jadwalsholat-applet</guid>
	<link>http://fajran.web.id/story/2008/09/19/jadwalsholat-applet</link>
	<description>&lt;p&gt;Semenjak tinggal di Belanda, saya menjadi merasa perlu tuk menginstal aplikasi pengingat waktu sholat. Soalnya di sini, waktu sholat bisa selalu berubah setiap harinya. Kalau di Indonesia mah bisa dikira2 atau tinggal tunggu suara adzan dari mesjid terdekat :D&lt;/p&gt;

&lt;p&gt;Di Mac OS X, ada aplikasi &lt;a href=&quot;http://guidanceapp.com/&quot;&gt;Guidance&lt;/a&gt; yang bisa dipakai. Satu fitur yang saya suka adalah kemampuannya untuk menunjukkan waktu sholat (atau sisa waktu menuju sholat berikutnya) langsung di panel atas. Jadi cukup nengok dikit, udah ketahuan waktunya. Kalau perlu lebih detil, tinggal diklik dan semua terlihat.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://fajran.web.id/story/2008/09/19/jadwalsholat-applet&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Fri, 19 Sep 2008 07:03:28 +0000</pubDate>
</item>
<item>
	<title>Kode dan dokumentasi: apt-web</title>
	<guid>http://fajran.web.id/code/kode-dan-dokumentasi-aptweb</guid>
	<link>http://fajran.web.id/code/kode-dan-dokumentasi-aptweb</link>
	<description>&lt;p&gt;Sepertinya layanan &lt;a href=&quot;http://fajran.web.id/story/2007/11/27/download-file-yang-mana-aja&quot;&gt;untuk nyari tahu daftar URL paket yang harus diunduh&lt;/a&gt; yang saya buat cukup dipakai orang. Tiap hari ada aja yg make walau cuma satu, dua orang (menurut google analytics). Yaaa.. mudah2an saja bisa membawa manfaat bagi orang banyak :-)&lt;/p&gt;

&lt;p&gt;Sempat ada yang &lt;a href=&quot;http://fajran.web.id/story/2007/11/27/download-file-yang-mana-aja#comment-30346&quot;&gt;meninggalkan komentar&lt;/a&gt; untuk mempublikasikan kode sumbernya dalam bentuk arsip dan saya sudah membuatkannya (&lt;a href=&quot;http://labs.fajran.web.id/p/apt-web-src.080131.tgz&quot;&gt;unduh&lt;/a&gt;). Namun, agar lebih mempermudah urusan mengunduh kode sumbernya, saya barusan memindahkannya ke repositori kode sumber terbuka di &lt;a href=&quot;http://github.com&quot;&gt;github.com&lt;/a&gt; (maap.. lagi kesengsem ama distributed &lt;abbr title=&quot;Version Control System&quot;&gt;vcs&lt;/abbr&gt; =P). Selain itu saya juga sudah membuatkan dokumentasi singkat jika ingin ada yang menggunakannya untuk membuat layanan yang sama.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://fajran.web.id/code/kode-dan-dokumentasi-aptweb&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Sat, 06 Sep 2008 22:06:01 +0000</pubDate>
</item>
<item>
	<title>Sedot sampe tua! (tm)</title>
	<guid>http://fajran.web.id/story/2008/08/07/sedot-sampe-tua-tm</guid>
	<link>http://fajran.web.id/story/2008/08/07/sedot-sampe-tua-tm</link>
	<description>&lt;p&gt;Setelah merencanakan berbulan-bulan yang lalu, akhirnya beberapa hari yang lalu saya memulai membuat skrip sedot-sampe-tua versi baru. Skrip ini dapat digunakan bagi Anda sekalian yang ingin membuat cermin alias mirror :D Skrip ini sudah menjadi bagian dari amunisi yang mempersenjatai &lt;a href=&quot;http://kambing.ui.edu&quot;&gt;kambing.ui.edu&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Terinspirasi dari &lt;a href=&quot;http://geoul.sparcs.org/trac/&quot;&gt;skrip yang digunakan&lt;/a&gt; di &lt;a href=&quot;http://ftp.kaist.ac.kr&quot;&gt;ftp.kaist.ac.kt&lt;/a&gt;, skrip ini &lt;strong&gt;&lt;em&gt;direncanakan&lt;/em&gt;&lt;/strong&gt; akan memiliki beberapa fitur utama, yaitu skrip sedot itu sendiri dan pembuatan laporan seputar status penyedotan dan penggunaan harddisk. Skrip ini juga punya kerangka pembuatan pengaya alias plugin yang sudah memungkinkan &lt;a href=&quot;http://kambing.ui.edu&quot;&gt;kambing&lt;/a&gt; ikutan &lt;a href=&quot;http://fajran.web.id/story/2008/08/03/kambing-ngeplurk&quot;&gt;ngeplurk&lt;/a&gt; :D&lt;/p&gt;

&lt;p&gt;Fasilitas pembuatan laporan yang sudah ada masih sangat sederhana dan pasti akan diganti. Sudah sempat saya buat sih, namun dengan bodohnya saya menghapusnya T&amp;#95;&amp;#95;T. Terpaksa ditunda dulu sampai waktu yang tak dapat diprediksi :D&lt;/p&gt;

&lt;p&gt;Cukup sudah ceritanya, seperti kata Linus Torvalds, &amp;#8220;Talk is cheap. Show me the code&amp;#8221;, seluruh skrip dapat dilihat di halaman proyeknya di &lt;a href=&quot;https://launchpad.net/sedot&quot;&gt;https://launchpad.net/sedot&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Silakan disedot dengan bazaar dengan menuliskan perintah berikut.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ bzr branch lp:sedot
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Dokumentasi versi sangat minimalis dapat dilihat di bawah direktori &lt;code&gt;doc/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;happy hacking! :D&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://fajran.web.id/story/2008/08/07/sedot-sampe-tua-tm&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Thu, 07 Aug 2008 19:16:30 +0000</pubDate>
</item>

</channel>
</rss>

