<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>Ferdianto.com: Latest Posts</title><link>http://beta.ferdianto.com</link><description>Blogging in the Clouds</description><language>en-us</language><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/ferdianto" type="application/rss+xml" /><item><title>Detecting Mobile User-Agent For OperaMini Client</title><link>http://feedproxy.google.com/~r/ferdianto/~3/NJn9TyYQ3fA/detecting-mobile-user-agent-for-operamini-client</link><description>&lt;p&gt;Mobile phone that use &lt;a href="http://www.opera.com/mini/"&gt;OperaMini&lt;/a&gt;sometimes don't sent user agent header to the server. Instead, they send:&lt;/p&gt;

&lt;pre&gt;
Opera/9.60 (J2ME/MIDP; Opera Mini/4.1.13068/488; U; en) Presto/2.2.0
&lt;/pre&gt;

&lt;p&gt;This can cause a problem for web application that rely on user-agent detection, such as application that use &lt;a href="http://wurfl.sourceforge.net/"&gt;WURFL&lt;/a&gt; So, after about an hour or two trying to debug the problem, I found some way to retrieve the original user-agent (device user-agent) instead of operamini user-agent.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;The solution is to check for the existence of &lt;code&gt;X-OperaMini-Phone-UA&lt;/code&gt; header. In PHP, it can be as simple as:&lt;/p&gt;

&lt;pre&gt;

$user_agent = isset( $_SERVER['HTTP_USER_AGENT'] ) ? $_SERVER['HTTP_USER_AGENT'] : '';
if ( stristr( $user_agent, 'Opera Mini' ) ) {
  //its opera mini, try the X-OperaMini-Phone-UA
  $user_agent = isset( $_SERVER['HTTP_X_OPERAMINI_PHONE_UA'] ) ? $_SERVER['HTTP_X_OPERAMINI_PHONE_UA'] : $user_agent;
}

//do your rest of the stuff here

&lt;/pre&gt;

&lt;p&gt;So, now phone detection using user_agent will work as normal, even if the user use Opera Mini browser.&lt;/p&gt;

&lt;!--plurk: gara2 operamini %(url)s--&gt;
&lt;!--twitter: opera mini made me write %(url)s--&gt;


&lt;script type="text/javascript" src="http://www.google-analytics.com/ga.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;
try { var pageTracker = _gat._getTracker("UA-5272681-5"); pageTracker._trackPageview(); } catch(err) {}
&lt;/script&gt;
            </description><pubDate>Wed, 20 May 2009 07:05:00 -0000</pubDate><guid isPermaLink="false">http://beta.ferdianto.com/2009/05/27/detecting-mobile-user-agent-for-operamini-client</guid><feedburner:origLink>http://beta.ferdianto.com/2009/05/27/detecting-mobile-user-agent-for-operamini-client</feedburner:origLink></item><item><title>Wordpress to Plurk Plugin</title><link>http://feedproxy.google.com/~r/ferdianto/~3/kk2MKcy_-sQ/wordpress-to-plurk-plugin</link><description>&lt;p&gt;Why not extends your blog reader by sharing your post permalink to &lt;a href="http://plurk.com/"&gt;Plurk&lt;/a&gt; or alert your &lt;a href="http://plurk.com/"&gt;Plurk&lt;/a&gt; friends about your post. Yes, you could do it with posting to plurk manually. But how about do it automatically each time you publish a blog post, wordpress will do the post for you. How? Simple, just install the &lt;a href="http://wordpress.org/extend/plugins/wp-plurk/"&gt;wp-plurk&lt;/a&gt; plugins.&lt;/p&gt;

&lt;p&gt;Have fun ;)&lt;/p&gt;

&lt;!--fb: just wrote %(url)s %(title)s--&gt;
&lt;!--twitter: just wrote %(url)s %(title)s--&gt;
&lt;!--plurk: [shares] %(url)s posting otomatis ke plurk?--&gt;
</description><pubDate>Sat, 16 May 2009 11:05:00 -0000</pubDate><guid isPermaLink="false">http://beta.ferdianto.com/2009/05/23/wordpress-to-plurk-plugin</guid><feedburner:origLink>http://beta.ferdianto.com/2009/05/23/wordpress-to-plurk-plugin</feedburner:origLink></item><item><title>Simple Routing Library</title><link>http://feedproxy.google.com/~r/ferdianto/~3/0fC6qGkAC-I/simple-routing-library</link><description>&lt;p&gt;Once I've wrote a simple routing library. You know, the one that you can use to make pretty urls such as: &lt;code&gt;http://ferdianto.com/2009/05/21/this-is-a-post&lt;/code&gt;. Actually, framework like &lt;a href="http://www.codeigniter.com/"&gt;CodeIgniter&lt;/a&gt; has internal support for friendly URLs. But, what if you already have an up-and-running application and decide to make pretty urls. This library is intentionally made simple so that it can be included in any framework or application you have.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;The library is inspired by &lt;a href="http://djangoproject.com/"&gt;Django&lt;/a&gt; &amp;mdash; web framework build in &lt;a href="http://python.org"&gt;python&lt;/a&gt; language. So, you only have to specify the URL pattern (perl-compatible-regex) and handler. Here's some simple usage:&lt;/p&gt;

&lt;pre&gt;
include 'route.php';

//a simple controller class
class HelloController
{
    function hello()
    {
        echo 'Hello World';
    }
}

//a simple controller class
class TestController
{
    function test()
    {
        echo 'test';
    }
}

//a simple controller function
function index()
{
    echo 'Hello World';
}

//a simple controller which accept parameters
function testparam()
{
    echo '&lt;pre&gt;',print_r( func_get_args() ),'&lt;/pre&gt;';
}


$urls = array( 
    //simple function
    '!^$!' =&gt; 'index',
    //using string as classname
    '!^test/$!' =&gt; array( 'TestController', 'test' ),
    //using object
    '!^hello/$!' =&gt; array( new HelloController, 'hello' ),
    //use parameterized regex
    '!^archives/(\d+)/(\d+)/(\d+)/(.+)$!' =&gt; 'testparam',
    //simple include
    '!^about$!' =&gt; 'about.php',
);

route($urls);
&lt;/pre&gt;

&lt;p&gt;Requirement for this library to work is &lt;a href="http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html"&gt;mod_rewrite&lt;/a&gt;. And the configuration is pretty simple, I've just use the wordpress .htaccess configuration. Here's the rewrite syntax:&lt;/p&gt;

&lt;pre&gt;
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ /index.php [L]
&lt;/pre&gt;

&lt;p&gt;Interested? You can download the source via link below.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://beta.ferdianto.com/media/route.php"&gt;http://beta.ferdianto.com/media/route.php&lt;/a&gt;&lt;/p&gt;

&lt;!--plurk:[shares] (%(url)s) %(title)s --&gt;
&lt;!--twitter: just updated my blog with %(url)s  --&gt;
&lt;!--fb: just updated my blog with %(url)s  --&gt;
</description><pubDate>Thu, 14 May 2009 14:05:00 -0000</pubDate><guid isPermaLink="false">http://beta.ferdianto.com/2009/05/21/simple-routing-library</guid><feedburner:origLink>http://beta.ferdianto.com/2009/05/21/simple-routing-library</feedburner:origLink></item><item><title>Using Apache And mod_rewrite to Redirect your Mobile User</title><link>http://feedproxy.google.com/~r/ferdianto/~3/U5jZXJydDJE/using-apache-and-modrewrite-to-redirect-your-mobile-user</link><description>&lt;p&gt;While I'm browsing using my K800i, very often that I've accidentally visit a non-mobile site with huge flash or huge content. That sucks, that costs, since mobile internet is rather expensive in my location. So after searching and testing, I've shared a simple hacks for your existing blog or web application to redirect mobile user that visiting your website to mobile-specific pages.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;The hacks is for apache webserver only, but nginx or lighttpd server can use the same concept using their config syntax. Put the following config snippet on your website either using .htaccess or directy editing the apache config.&lt;/p&gt;

&lt;pre&gt;
RewriteEngine On

#redirect mobile browser using HTTP_ACCEPT header
RewriteCond %{HTTP_ACCEPT} &amp;quot;text/vnd.wap.wml|application/vnd.wap.xhtml+xml&amp;quot; [NC]
RewriteCond %{HTTP_HOST} &amp;quot;!m.yourmobileurl.com&amp;quot; [NC]
RewriteRule (.*) http://m.yourmobileurl.com/$1 [L]

#some high-end phone sometimes support HTML, only its sucks
#add more browser user agent sig here
RewriteCond %{HTTP_USER_AGENT} (nokia|symbian|iphone|blackberry) [NC] 
RewriteCond %{HTTP_HOST} &amp;quot;!m.yourmobileurl.com&amp;quot; [NC]
RewriteRule (.*) http://m.yourmobileurl.com/$1 [L]
&lt;/pre&gt;

&lt;p&gt;Using HTTP_ACCEPT header is much more simple rather than hitting the HTTP_USER_AGENT variables. I guess there's the end of it, Have fun!&lt;/p&gt;
</description><pubDate>Wed, 06 May 2009 08:05:00 -0000</pubDate><guid isPermaLink="false">http://beta.ferdianto.com/2009/05/13/using-apache-and-modrewrite-to-redirect-your-mobile-user</guid><feedburner:origLink>http://beta.ferdianto.com/2009/05/13/using-apache-and-modrewrite-to-redirect-your-mobile-user</feedburner:origLink></item><item><title>Blog Updates - Mobile Version and English</title><link>http://feedproxy.google.com/~r/ferdianto/~3/uNAQPrkyV9w/blog-updates-mobile-version-and-english</link><description>&lt;p&gt;After reading &lt;a href="http://www.google.com/support/forum/p/Webmasters/thread?tid=690224d66351a4ad&amp;hl=en"&gt;this article&lt;/a&gt;, I've put some minor modification onto this blog so that mobile user can view this blog also. The design still simple, at least I can view it correctly in my k800i. You can try it also, just browse ferdianto.com on your mobile phone.&lt;/p&gt;

&lt;p&gt;The second change is: I decided to write my blog in english &amp;mdash; again. The only reason that most of the traffic that come to this blog was not from Indonesia, so.. I'll try to make this blog more accessible from the International viewer ;) And what about the local viewer? Here's a tip: &amp;quot;learn english&amp;quot;&lt;/p&gt;

&lt;p&gt;Ok, have fun ;)&lt;/p&gt;</description><pubDate>Fri, 01 May 2009 01:05:00 -0000</pubDate><guid isPermaLink="false">http://beta.ferdianto.com/2009/05/08/blog-updates-mobile-version-and-english</guid><feedburner:origLink>http://beta.ferdianto.com/2009/05/08/blog-updates-mobile-version-and-english</feedburner:origLink></item><item><title>HTTP Server Instant menggunakan Jetty</title><link>http://feedproxy.google.com/~r/ferdianto/~3/COadMw8H7gs/http-server-instant-menggunakan-jetty</link><description>&lt;p&gt;Salah satu keunggulan Java yang susah mencari bandingannya adalah melimpahnya library opensource. Library mulai dari yang sederhana semacam membaca konfigurasi, penanganan file upload atau yang lain. Library-library tersebut bisa dilihat di &lt;a href="http://java-source.net/"&gt;Java Source&lt;/a&gt;, sudah terkategorisasi secara rapi. Tinggal browse dan temukan library yang anda butuhkan. Tetapi saat ini yang ingin saya share adalah menambahkan kemampuan webserver di aplikasi java anda. Ya, anda ngga perlu coding sendiri hanya untuk membuat webserver. Ada 1 library yang hebat yang bernama &lt;a href="http://www.mortbay.org/jetty/"&gt;Jetty&lt;/a&gt;. Sebenarnya banyak web server yang bisa ditambahkan atau di embed di aplikasi anda dengan mudah, tetapi pilihan saya jatuh kepada Jetty. Mengapa?&lt;/p&gt; 

&lt;!-- more --&gt;

&lt;p&gt;Sederhana saja, karena sangat lengkap fiturnya (jsp, servlet, comet, cgi) , kecil ukurannya (untuk penggunaan standar hanya butuh sekitar 1mb), dokumentasi yang lengkap dan terkenal handal (&lt;a href="http://blogs.webtide.com/gregw/entry/google_appengine_uses_jetty"&gt;google&lt;/a&gt; dan &lt;a href="http://blogs.webtide.com/janb/entry/jetty_and_cloud_computing"&gt;hadoop&lt;/a&gt; pun menggunakannya)&lt;/p&gt;

&lt;p&gt;Cara penggunaan yang paling sederhana, cukup bikin servlet sederhana&lt;/p&gt;
&lt;pre&gt;

public class OneServletContext
{
    public static void main(String[] args)
        throws Exception
    {
        Server server = new Server(8080);
        Context context = new Context(server,&amp;quot;/&amp;quot;,Context.SESSIONS);
        context.addServlet(new ServletHolder(new HelloServlet()), &amp;quot;/*&amp;quot;);
        
        server.start();
        server.join();
    }

    public static class HelloServlet extends HttpServlet
    {
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
        {
            response.setContentType(&amp;quot;text/html&amp;quot;);
            response.setStatus(HttpServletResponse.SC_OK);
            response.getWriter().println(&amp;quot;&amp;lt;h1&amp;gt;Hello SimpleServlet&amp;lt;/h1&amp;gt;&amp;quot;);
            response.getWriter().println(&amp;quot;session=&amp;quot;+request.getSession(true).getId());
        }
    }
}

&lt;/pre&gt;

&lt;p&gt;Sangat sederhana, ndak neko2. Bahkan, jetty juga bisa jadi container semacam tomcat, jadi bisa di run secara standalone. Cukup dengan extract instalasinya, dan jalankan:&lt;/p&gt;
&lt;pre&gt;
java -jar start.jar
&lt;/pre&gt;

&lt;p&gt;Jadi, apa yang anda tunggu, coba downloadlah dan coba membuat webserver milik anda sendiri. Untuk info lanjut bisa membaca di dokumentasi jetty di link dibawah.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://docs.codehaus.org/display/JETTY/Jetty+Documentation"&gt;http://docs.codehaus.org/display/JETTY/Jetty+Documentation&lt;/a&gt;&lt;/p&gt;
</description><pubDate>Thu, 23 Apr 2009 23:04:00 -0000</pubDate><guid isPermaLink="false">http://beta.ferdianto.com/2009/04/30/http-server-instant-menggunakan-jetty</guid><feedburner:origLink>http://beta.ferdianto.com/2009/04/30/http-server-instant-menggunakan-jetty</feedburner:origLink></item><item><title>Setup Modem PCI Serial di Linux</title><link>http://feedproxy.google.com/~r/ferdianto/~3/w_brNVTtgZk/setup-modem-pci-serial-di-linux</link><description>&lt;p&gt;Mencoba untuk mendokumentasikan dan berbagi pengalaman saat ngeset modem serial di Linux. Sebenarnya ngga susah sih, banyak resourcenya, cuman karena emang dilakukan secara manual pake konsol dan ssh, jadi terlihat sangat rumit, tetapi sebenarnya ngga susah kok. Begini critanya:&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;Pertama, cek apakah /dev/ttyS1 ... /dev/ttyS4 nya ada yang idle.&lt;/p&gt;
&lt;pre&gt;
# setserial /dev/ttyS0 -a
&lt;/pre&gt;

&lt;p&gt;Kalau device terpakai &amp;mdash; oleh mouse misalnya, biasanya akan memunculkan result sbb:&lt;/p&gt;

&lt;pre&gt;
/dev/ttyS0 : Device or resource busy
&lt;/pre&gt;

&lt;p&gt;Tapi kalau ngga busy alias available, maka akan kaya gini:&lt;/p&gt;
&lt;pre&gt;
/dev/ttyS0, Line 0, UART: 16550A, Port: 0x3f8, irq: 4
Baud_base: 115200, clos_delay: 50, divisor: 0
closing_wait: 3000, closing_wait2: infinite
Flags: spd_normal skip_test
&lt;/pre&gt;

&lt;p&gt;Nah, sekarang, cari tau info device PCI anda pakai command &lt;b&gt;lspci -vv&lt;/b&gt; biar mantab:&lt;/p&gt;

&lt;pre&gt;
# lspci -vv
00:00.0 Host bridge: Intel Corporation 82865G/PE/P DRAM Controller/Host-Hub Interface (rev 02)
	Subsystem: ASUSTeK Computer Inc. P5P800-MX Mainboard
	Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B-
	Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=fast &amp;gt;TAbort- &amp;lt;TAbort- &amp;lt;MAbort+ &amp;gt;SERR- &amp;lt;PERR-
	Latency: 0
	Region 0: Memory at fe800000 (32-bit, prefetchable) [size=4M]
	Capabilities: [e4] Vendor Specific Information

...

01:0b.0 Serial controller: NetMos Technology Unknown device 9820 (rev 01) (prog-if 02 [16550])
	Subsystem: LSI Logic / Symbios Logic Unknown device 0001
	Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B-
	Status: Cap- 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium &amp;gt;TAbort- &amp;lt;TAbort- &amp;lt;MAbort- &amp;gt;SERR- &amp;lt;PERR-
	Interrupt: pin A routed to IRQ 16
	Region 0: I/O ports at dff0 [size=8]
	Region 1: I/O ports at dfe0 [size=8]
	Region 2: I/O ports at dfa8 [size=8]
	Region 3: I/O ports at dfa0 [size=8]
	Region 4: I/O ports at df98 [size=8]
	Region 5: I/O ports at df80 [size=16]
&lt;/pre&gt;

&lt;p&gt;Tuh dapet info port address dan IRQ dari PCI modemnya. Tinggal ngeset serial port. Saya kebetulan pakai ttyS2 dan ttyS3. Begini caranya:&lt;/p&gt;

&lt;pre&gt;
# setserial /dev/ttyS2 port 0xdff0 UART 16550A irq 16 Baud_base 115200
# setserial /dev/ttyS3 port 0xdfa8 UART 16550A irq 16 Baud_base 115200
&lt;/pre&gt;

&lt;p&gt;Cukup perhatikan port yang saya ambil adalah port yg saya dapet dari lspci di:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Region 0 (dff0) untuk ttyS2&lt;/li&gt;
&lt;li&gt;Region 2 (dfa8) untuk ttyS3&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sedang IRQ nya cukup pakai punya lspci juga, yaitu 16. Untuk mengetes, bisa gunakan minicom. Sekian saya akhiri tulisan singkat ini, have fun with your linux ;)&lt;/p&gt;

&lt;p&gt;Eksternal resource saya dapatkan dari:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://tldp.org/HOWTO/Modem-HOWTO-6.html"&gt;http://tldp.org/HOWTO/Modem-HOWTO-6.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tldp.org/HOWTO/Serial-HOWTO-9.html"&gt;http://tldp.org/HOWTO/Serial-HOWTO-9.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.mahesajenar.com/"&gt;Orang ini&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Thu, 02 Apr 2009 01:04:00 -0000</pubDate><guid isPermaLink="false">http://beta.ferdianto.com/2009/04/09/setup-modem-pci-serial-di-linux</guid><feedburner:origLink>http://beta.ferdianto.com/2009/04/09/setup-modem-pci-serial-di-linux</feedburner:origLink></item><item><title>April Mop 2009</title><link>http://feedproxy.google.com/~r/ferdianto/~3/eqS9jqLoJ-k/april-mop-2009</link><description>&lt;h1&gt;Happy April Mop!&lt;/h1&gt;</description><pubDate>Wed, 01 Apr 2009 05:04:00 -0000</pubDate><guid isPermaLink="false">http://beta.ferdianto.com/2009/04/01/april-mop-2009</guid><feedburner:origLink>http://beta.ferdianto.com/2009/04/01/april-mop-2009</feedburner:origLink></item><item><title>BYOB - Bring Your Own Bags</title><link>http://feedproxy.google.com/~r/ferdianto/~3/aCJvNfYaRqc/byob-bring-your-own-bags</link><description>&lt;p&gt;Tadi sore, sekitar pukul 20, pas ngeliat &lt;acronym title="National Geographic Channel"&gt;NGC&lt;/acronym&gt;, ada iklan layanan yg judulnya B.Y.O.B, yg nyantol pertama adalah lagunya &lt;a href="http://www.last.fm/music/System+of+a+Down/_/B.Y.O.B."&gt;System of a Down&lt;/a&gt;, ternyata singkatan dari &amp;quot;Bring Your Own Bags&amp;quot;.&lt;/p&gt;

&lt;p&gt;Iklan ini menyarankan kalau pas pergi ke supermarket, minimarket, micromarket dan market-market yang lain, disarankan untuk bawa tas sendiri. Jangan meminta tas kresek atau tas kertas yang biasa kita dapat kalau kita membeli ke toko. Alasannya sederhana. Tas kresek terbuat dari plastik. Plastik itu bahan yang tidak bisa di daur oleh tanah. Otomatis nantinya akan jadi sampah yang ga bakalan hancur-hancur. Nah, jika semua orang di dunia setiap membeli sesuatu selalu dapat 1 tas kresek, bayangin aja, berapa banyak tas kresek yang harus dibuang tiap hari.&lt;/p&gt;

&lt;p&gt;OK, ga pake kresek, pakai yang karton, yang bisa di daur ulang. Eh, itu karton dari kertas. Nah kertas itu bikinnya dari kayu. Ga tambah bagus, tambah parah. Jadi, iklan ini make sense banget. Daripada kita hidup dikelilingi sampah, biasakan untuk bawa tas sendiri dari rumah ketika beli sesuatu.&lt;/p&gt;

&lt;p&gt;Saya udah coba hari ini, tadi pagi, pas beli rokok. Gampang sih kalau di toko2 kecil. Susahnya kalau pas beli di mal2 gedhe. Pasti disuruh nitipin, dan pasti dipaksa untuk bawa tas sablonan logo mall yg gedhe itu. Tapi, patut dicoba kok, take care ;)&lt;/p&gt;
</description><pubDate>Wed, 04 Mar 2009 01:03:00 -0000</pubDate><guid isPermaLink="false">http://beta.ferdianto.com/2009/03/11/byob-bring-your-own-bags</guid><feedburner:origLink>http://beta.ferdianto.com/2009/03/11/byob-bring-your-own-bags</feedburner:origLink></item><item><title>Zen of Python</title><link>http://feedproxy.google.com/~r/ferdianto/~3/QN9SGziT6FM/zen-of-python</link><description>&lt;p&gt;Sebenernya sudah lama nemu ini, sejak pertama kali kenalan &lt;a href="http://python.org" title="Python programming language"&gt;python&lt;/a&gt;, tapi cuman pengen share aja bagi yg belum mengenal python, kalau python punya easter egg yg lucu, namanya Zen Of Python. Mengandung ajaran2 yang sebaiknya dianut oleh programmer python. Begini isinya:&lt;/p&gt;

&lt;!--more--&gt;

&lt;pre&gt;
&amp;gt;&amp;gt;&amp;gt; import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
&amp;gt;&amp;gt;&amp;gt; 
&lt;/pre&gt;
</description><pubDate>Sun, 01 Mar 2009 02:03:00 -0000</pubDate><guid isPermaLink="false">http://beta.ferdianto.com/2009/03/08/zen-of-python</guid><feedburner:origLink>http://beta.ferdianto.com/2009/03/08/zen-of-python</feedburner:origLink></item><item><title>Jika Flash Banner Anda Menutupi Javascript</title><link>http://feedproxy.google.com/~r/ferdianto/~3/jlLAr8il6tk/jika-flash-banner-anda-menutupi-javascript</link><description>&lt;p&gt;Problem flash yang selalu berada diatas menu javascript atau tooltip javascript atau div lain, sangat mengesalkan. Menu anda menjadi tertutup flash. Solusi sederhana adalah memberikan parameter &lt;strong&gt;wmode = transparent&lt;/strong&gt;. Jadi flash anda tidak menutupi tag div atau yg lain. Masalah baru timbul, bagaimana jika flash ini dari banner / ads. Kita ngga mungkin modif flash HTML nya kan? Untuk itu saya ada beberapa script sederhana yang menambahkan parameter wmode di flash object.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;Script ini dijalankan saat onload, jadi begitu flash terload, maka script ini akan men-set atau menambahkan parameter wmode. Berikut scriptnya&lt;/p&gt;

&lt;pre&gt;

function addTransparentWmode(  ) {
  var objects = document.getElementsByTagName( 'OBJECT' );
  for(var i=0; i&amp;lt;objects.length; i++) {
    var params = objects[i].getElementsByTagName( 'PARAM' );
    var wmodeparam = null;
    for(var j=0; j&amp;lt;params.length; j++) {
      if ( params[j].getAttribute( 'NAME' ) == 'wmode' ) {
        wmodeparam = params[j];
        break;
      }
    }
    
    //add wmode param if not found
    if (wmodeparam == null) {
      wmodeparam = objects[i].ownerDocument.createElement('PARAM');
      wmodeparam.setAttribute( 'name', 'wmode' );
      objects[i].appendChild( wmodeparam );
    } else {
    }
    wmodeparam.setAttribute('value', 'transparent');
    //showhide
    objects[i].style.display = 'none';
    objects[i].style.display = 'block';
  }
  
  var embeds = document.getElementsByTagName( 'EMBED' );
  for(var k=0; k&amp;lt;embeds.length; k++) {
    embeds[k].setAttribute( 'wmode', 'transparent' );
    embeds[k].style.display = 'none';
    embeds[k].style.display = 'block';
  }
}
&lt;/pre&gt;

&lt;p&gt;Cara penggunaanya cukup masukkan di event onload anda.&lt;/p&gt;

&lt;pre&gt;
window.onload = function() { addTransparentWmode();  }
&lt;/pre&gt;

&lt;p&gt;Semoga berguna&lt;/p&gt;</description><pubDate>Sat, 28 Feb 2009 07:03:00 -0000</pubDate><guid isPermaLink="false">http://beta.ferdianto.com/2009/03/07/jika-flash-banner-anda-menutupi-javascript</guid><feedburner:origLink>http://beta.ferdianto.com/2009/03/07/jika-flash-banner-anda-menutupi-javascript</feedburner:origLink></item><item><title>[thinkagain] Naik motor sambil SMSan</title><link>http://feedproxy.google.com/~r/ferdianto/~3/wpQyeLMsSKQ/thinkagain-naik-motor-sambil-smsan</link><description>&lt;p&gt;Jika anda berpikir kalau sms-an sambil naik motor/mobil adalah keren, efektif dan hebat, &lt;strong&gt;THINK AGAIN&lt;/strong&gt;&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;Anda tidak akan melihat jalan, apakah didepan anda ada cewe cakep atau atau tikungan tajam, jambret2 akan langsung melirik HP anda, sudah pasti SMS anda pasti typo semua, dan orang akan menganggap anda kacung / kurir, karena takut bos anda marah2 gara2 SMS ga di reply. Worse of all, bisa jadi SMS yang terkirim adalah SMS terakhir anda, karena anda tidak memperhatikan bahwa didepan anda ada truk yang supirnya ngantuk dan lupa pasang handrem.&lt;/p&gt;</description><pubDate>Thu, 26 Feb 2009 01:03:00 -0000</pubDate><guid isPermaLink="false">http://beta.ferdianto.com/2009/03/05/thinkagain-naik-motor-sambil-smsan</guid><feedburner:origLink>http://beta.ferdianto.com/2009/03/05/thinkagain-naik-motor-sambil-smsan</feedburner:origLink></item><item><title>Aman di Internet</title><link>http://feedproxy.google.com/~r/ferdianto/~3/UECnURP-KsE/aman-di-internet</link><description>&lt;p&gt;Ada plesetan yang mengatakan, WWW bukan singkatan dari World Wide Web, melainkan singkatan dari World &lt;strong&gt;Wild&lt;/strong&gt; Web. Plesetan tersebut sebenarnya sangat mirip dengan kenyataan. Internet adalah dunia liar dimana semua orang bebas mem-posting apa keinginannya, ada beberapa orang yang selalu ingin tahu, menyebarkan virus, menangkap password orang lain dan menggunakan sesuai dengan keinginannya. Saya ada beberapa tips yang cukup manjur dalam membuat ber-internet sedikit lebih aman.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;Berikut tips-tips yang selalu saya lakukan:&lt;/p&gt;
&lt;ol&gt;

&lt;li&gt;
  &lt;h3&gt;Gunakan browser yang terpercaya&lt;/h3&gt;
  &lt;p&gt;Ada banyak browser yang beredar, tetapi yang terpercaya hanya sedikit. Secara pribadi saya menyukai &lt;a href="http://www.mozilla.com/en-US/firefox/" title="Firefox"&gt;Firefox&lt;/a&gt;. Karena selain plugin banyak, firefox adalah browser open-source. Dicoding oleh community &amp;mdash; but that just me. Ada pilihan browser lain semacam &lt;a href="http://www.opera.com/" title="Opera"&gt;Opera&lt;/a&gt;. Mereka punya fitur untuk mematikan javascript / java / flash&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
  &lt;h3&gt;Matikan Javascript untuk situs yang tidak dikenal&lt;/h3&gt;
  &lt;p&gt;Javascript adalah fitur yang biasa digunakan pembuat web untuk efek2 cantik. Tetapi bukan hanya itu, javascript juga digunakan untuk mengubah tampilan sebuah situs tidak dikenal mirip dengan tampilan klikbca atau membuat anda mendownload program yang tidak anda ketahui. Jadi untuk amannya matikan javascript. Di firefox, ada plugin yang bernama: &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/722" title="Noscript"&gt;Noscript&lt;/a&gt;, fungsinya adalah mematikan script dan mengenable javascript di situs2 yang anda inginkan &amp;mdash; &lt;a href="http://www.gmail.com/" title="Google Mail"&gt;gmail&lt;/a&gt; atau &lt;a href="http://www.facebook.com"&gt;Facebook&lt;/a&gt; tidak akan berjalan mulus tanpa javascript. Untuk opera, sudah ada opsinya.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
  &lt;h3&gt;Jangan pernah langsung percaya dengan link yang diberikan melalui Messenger atau E-Mail&lt;/h3&gt;
  &lt;p&gt;Ada kalanya teman anda memberikan sebuah link. Mungkin kata2 nya menarik. Tetapi, jangan langsung percaya. Bisa saja itu bukan dari teman anda, tetapi dari virus di komputer teman anda, yang secara otomatis mengirimkan link tersebut. Konfirmasikan dulu dengan teman anda.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
  &lt;h3&gt;Attachment Juga Ancaman&lt;/h3&gt;
  &lt;p&gt;Jangan langsung percaya dengan attachment e-mail yang ada di Inbox anda. Sama juga seperti link di chatroom / messenger, attachment menjadi media penyebaran spyware dan virus yang sangat efektif.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
  &lt;h3&gt;Manfaatkan SSL/HTTPS&lt;/h3&gt;
  &lt;p&gt;Google / yahoo mail punya fitur SSL / HTTPS. HTTPS adalah saluran terenkripsi, dimana data yang anda kirimkan dienkripsi dulu sebelum dikirim lewat internet. Manfaatkan sebaik2nya. Apalagi jika anda mengakses e-mail di cafe dengan hotspot tanpa password. Orang lain bisa dengan mudah membaca data password atau ucapan selamat ultah ke selingkuhan anda, yang anda kirimkan jika dikirim tanpa SSL&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
  &lt;h3&gt;Hemat bandwith dengan host files&lt;/h3&gt;
  &lt;p&gt;Hosts file adalah file di komputer lokal anda yang berisi data alamat internet dengan alamat network IP. Contoh isi dari hosts file bisa anda lihat di /etc/hosts untuk linux atau di C:\WINDOWS\system32\drivers\etc\ untuk windows. Silahkan buka dengan notepad anda. Kemungkinan isinya:
&lt;/p&gt;
&lt;pre&gt;
127.0.0.1 localhost
127.0.0.1 namakomputeranda
&lt;/pre&gt;
&lt;p&gt;127.0.0.1 selalu akan menjadi IP komputer anda. Dan kita bisa memanfaatkan file ini untuk tidak mendownload banner2 dari situs2 iklan yang biasanya berukuran besar. Silahkan download file hosts dari &lt;a href="http://www.mvps.org/winhelp2002/hosts.htm"&gt;MVPS&lt;/a&gt; dan kopikan ke komputer anda. Maka, browser akan menganggap doubleclick atau beberapa situs penyedia banner iklan beralamat di komputer anda, sehingga komputer anda tidak akan melakukan request network untuk mendapatkan banner. Tips ini dapat menghemat bandwith speedy / telkomsel flash anda.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;h3&gt;Manfaatkan SSH Shell&lt;/h3&gt;
&lt;p&gt;Jika anda mempunyai hosting dan mempunyai fitur SSH shell, manfaatkan shell anda sebagai proxy untuk berinternet / chatting. Cukup download putty jika anda berada di Windows. Gunakan perintah DOS:&lt;/p&gt;
&lt;pre&gt;
putty.exe -D$port $hostsshserver $portsshserver
&lt;/pre&gt;
&lt;p&gt;Atau di linux&lt;/p&gt;
&lt;pre&gt;
ssh -D$port $hostsshserver $portsshserver
&lt;/pre&gt;
&lt;p&gt;Kemudian login seperti biasa. Setelah login sukses, set browser anda untuk proxy Socks5 ke 127.0.0.1 dan port ke $port (port isikan dengan angka antara 1025 - 65535, sesuai yang anda masukkan saat login SSH), maka anda sudah cukup aman untuk berinternet, karena jalur anda sudah dilewatkan melalui saluran terenkripsi SSH. Trik ini berlaku juga untuk chatting dengan Yahoo messenger. Anda bisa memproxy messenger anda, sehingga aman untuk digunakan dan chat anda menjadi lebih aman.&lt;/p&gt;
&lt;/li&gt;

&lt;/ol&gt;
&lt;p&gt;Sekian dulu tips-tips berinternet dari saya, semoga berguna. Have fun ;)&lt;/p&gt;</description><pubDate>Tue, 24 Feb 2009 23:03:00 -0000</pubDate><guid isPermaLink="false">http://beta.ferdianto.com/2009/03/03/aman-di-internet</guid><feedburner:origLink>http://beta.ferdianto.com/2009/03/03/aman-di-internet</feedburner:origLink></item><item><title>Membuat Programming Lebih Menyenangkan</title><link>http://feedproxy.google.com/~r/ferdianto/~3/YA4ZfUOM-vM/membuat-programming-lebih-menyenangkan</link><description>&lt;p&gt;Saya adalah tipe orang yang sangat cepat bosan. Jadi ada kalanya saya sangat bosan dalam kegiatan yang menafkahi saya, yaitu memprogram. Bosan dengan mengetik source-code, membuat getter/setter, melakukan query SQL, dsb. Mengetik source semacam:&lt;/p&gt;

&lt;pre&gt;
$username = $_POST['username'];
$password = $_POST['password'];
$email = $_POST['email'];
if (empty($username)) {
  //
} else if (..) {
  //
}
&lt;/pre&gt;

&lt;p&gt;Menjadi sebuah neraka bagi saya, dan menutup IDE adalah salah satu obat. Untungnya, saya menemukan cara untuk membuat kegiatan satu ini menjadi lebih menarik dan menantang. Cara saya adalah mem-variasi model penulisan. Contoh kasus diatas, saya biasanya memodifikasi dengan:&lt;/p&gt;

&lt;pre&gt;
$posts = array( 'username', 'password', 'email', ... );
foreach($posts as $p) $$p = $_POST[$p];

do {
  if (!$username) {  $error = "Username kosong"; break; }
  if (!$password) {  $error = "Password kosong"; break; }
  //simpan SQL di sini
}
while(0);
&lt;/pre&gt; 

&lt;p&gt;Atau daripada menulis:&lt;/p&gt;
&lt;pre&gt;
cookiedata = {
  'name': request.COOKIES.get('name'),
  'email': request.COOKIES.get('email'),
  'url': request.COOKIES.get('url'),
}

#atau

key_name = 'tag:%s' % defaultfilters.slugify(tag.name)
newtag = models.Tag( key_name=key_name, name = tag.name, description = tag.description )
newtag.put()

&lt;/pre&gt;
&lt;p&gt;Saya akan mengubah ke:&lt;/p&gt;
&lt;pre&gt;

cookiedata = dict([(k, request.COOKIES.get(k, '')) for k in ['name', 'email', 'url']])

key_name = 'tag:%s' % defaultfilters.slugify(tag.name)
newtag = models.Tag(key_name=key_name, **dict([(prop, getattr(tag, prop)) for prop in models.Tag.properties()]))
newtag.save()

&lt;/pre&gt;

&lt;p&gt;Contoh lagi di Java, daripada saya menulis&lt;/p&gt;
&lt;pre&gt;

class ShutdownThread extends Thread {
  MyObject obj = null;
  public void run() {
    obj.closeAllConnections();
  }
  public void setObj(MyObject obj) {
    this.obj = obj.
  }
}

public static void main(String[] args) {
  MyObject obj = new MyObject();
  ShutdownHook hook = new ShutdownHook( obj )
  Runtime.getRuntime.addShutdownHook( hook );
}

&lt;/pre&gt;
&lt;p&gt;Saya akan menggunakan metode yg lebih menyenangkan&lt;/p&gt;

&lt;pre&gt;
public static void main(String[] args) {
  MyObject obj = new MyObject();
  Runtime.getRuntime.addShutdownHook( new Thread() { 
    MyObject obj;
    public  Thread set(MyObject obj) { this.obj = obj; return this; }
    public void run() { obj.closeAllConnections(); }
  }.set(obj) );
}

&lt;/pre&gt;
&lt;p&gt;Karena mengingatkan saya kepada betapa menyenangkannya javascript dan jQuery.&lt;/p&gt;
&lt;p&gt;Ya, memang lebih tidak mudah dibaca dan maintenance aplikasi akan sedikit lebih susah, tetapi at-least its fun. Dan sepertinya saya udah bosan ngeblog, jadi sampai di sini. Silahkan ceritakan solusi anda sendiri untuk mengatasi kebosanan anda di kerjaan anda sendiri.&lt;/p&gt;

</description><pubDate>Tue, 24 Feb 2009 16:03:00 -0000</pubDate><guid isPermaLink="false">http://beta.ferdianto.com/2009/03/03/membuat-programming-lebih-menyenangkan</guid><feedburner:origLink>http://beta.ferdianto.com/2009/03/03/membuat-programming-lebih-menyenangkan</feedburner:origLink></item><item><title>Javascript Siap Pakai</title><link>http://feedproxy.google.com/~r/ferdianto/~3/4Fn77Hw91yY/javascript-siap-pakai</link><description>&lt;p&gt;Saya hanya ingin share beberapa fungsi JS yang sering saya pakai. Ya, memang &lt;a href="http://www.jquery.com" title="jQuery"&gt;jQuery&lt;/a&gt; atau &lt;a href="http://www.prototypejs.org"&gt;Prototype&lt;/a&gt; selalu lebih menggiurkan. Tetapi, kalau hanya untuk toggle (show/hide sebuah div) kemudian anda menggunakan jQuery, bukankah itu adalah sebuah overkill? 50kb overhead (uncompressed) tidaklah murah. Jadi, saya share aja fungsi-fungsi javascript yang sering saya gunakan tanpa harus melangkah ke prototype atau jQuery.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;
Menyingkat &lt;code&gt;getElementByID&lt;/code&gt;. Metode itu memang sangat menyebalkan, panjang, dan notasi case-sensitive yang menyakitkan hati. Saya suka mempersingkat pemanggilan dengan menggunakan fungsi ini:
&lt;/p&gt;

&lt;pre&gt;
var EL = function() {
	if (arguments.length == 1) {
		var obj = document.getElementById(arguments[0]) || {length:0};
		if (obj) obj.length = 1;
		return obj;
	}

	var r = new Array();
	for (var i = 0; i &lt; arguments.length; i++) {
		var el = arguments[i];
		if (typeof el == 'string') {
			var obj = document.getElementById(el);
			if (obj) r.push(obj);
		}
	}
	return r;
}
&lt;/pre&gt;
&lt;p&gt;Metode ini selalu mengembalikan object. Contoh pemanggilan:&lt;/p&gt;
&lt;pre&gt;
EL( &amp;quot;submitButton&amp;quot; ).onclick = function() { /*masukkan fungsi anda di sini*/; return true; };
&lt;/pre&gt;

&lt;p&gt;Fungsi untuk mem-filter inputan, jadi sebuah textbox yang hanya menerima inputan angka, atau huruf atau apa aja yang kira2 kepikir.&lt;/p&gt;
&lt;pre id="filterInput"&gt;
function filterInput(input, pattern) {
	input.onkeypress = function(e) {
		if (!e) var e = window.event; //IE
		var code = ( e.keyCode &amp;&amp; e.keyCode ) || ( e.which &amp;&amp; e.which );
		var ch = String.fromCharCode(code);
		return code &lt; 32 || pattern.test(ch);
	};
}
&lt;/pre&gt;
&lt;p&gt;Fungsi &lt;a href="#filterInput"&gt;&lt;code&gt;filterInput&lt;/code&gt;&lt;/a&gt; akan melakukan capturing key yang diketikkan oleh user dan jika match dengan pattern (regex) yg ada akan meneruskan key yg diketik. Jika tidak match, dia akan diam saja. Contoh penggunaan:&lt;/p&gt;
&lt;pre&gt;
filterInput( EL("username"), /[a-zA-Z0-9_\.]/ );
&lt;/pre&gt;
&lt;p&gt;Username hanya boleh karakter a-z, A-Z, 0-9 dan boleh mengandung spesial karakter titik (.) atau underscore (_)&lt;/p&gt;

&lt;p&gt;Array on Steroid, extending object array, sehingga object array menjadi sangat powerful dengan metode2 yang kita definisikan sendiri.&lt;/p&gt;
&lt;pre&gt;
//diambil dari jQuery &lt;a href="http://www.jquery.com/"&gt;&lt;/a&gt;
Array.prototype.each = function(fn) {
	var n, i=0;
	if (this.length === undefined) {
		for (n in this)
			if (fn.call(this[n], n, this[n]) === false) break;
	} else {
		for (var value=this[0], i=0; i&lt;this.length &amp;&amp; fn.call(value, i, value) !== false; value = this[++i]) {}
	}
	return this;
}

//diambil dari &lt;a href="http://www.hunlock.com/blogs/Ten_Javascript_Tools_Everyone_Should_Have"&gt;&lt;/a&gt;
Array.prototype.find = function(s) {
	var r = false;
	for (i=0; i&lt;this.length; i++) {
		if (typeof(s) == 'function') {
			if (s.test(this[i])) { 
				if (!r) { r = [] }
				r.push(i);
			}
		} else {
			if (this[i]===s) {
				if (!r) { r = [] }
				r.push(i);
			}
		}
	}
	return r;
}
&lt;/pre&gt;
&lt;p&gt;Penggunaan sangat sederhanya. Contoh:&lt;/p&gt;
&lt;pre&gt;
//enable form username dan password
EL("username", "password").each(function() {
  this.enabled = true;
});
&lt;/pre&gt;

&lt;p&gt;Sementara itu dulu yg saya share, next time, akan saya share lebih banyak lagi.&lt;/p&gt;</description><pubDate>Tue, 24 Feb 2009 00:03:00 -0000</pubDate><guid isPermaLink="false">http://beta.ferdianto.com/2009/03/03/javascript-siap-pakai</guid><feedburner:origLink>http://beta.ferdianto.com/2009/03/03/javascript-siap-pakai</feedburner:origLink></item><item><title>Analytic dan Ajax</title><link>http://feedproxy.google.com/~r/ferdianto/~3/j_8Ho8OgfNI/analytic-dan-ajax</link><description>&lt;p&gt;Seperti kita tahu, &lt;a href="http://www.google.com/analytics/"&gt;Google Analytics&lt;/a&gt; adalah servis lengkap dari google untuk melakukan tracking terhadap user. Sederhananya, analytic adalah statistik situs dengan kemampuan canggih untuk menganalisa perilaku user di situs kita. Permasalahannya, jika situs kita menggunakan konsep ajax atau request dijalankan via &lt;code&gt;XMLHttpRequest&lt;/code&gt;, maka analytic tidak berlaku disini. Kita tidak bisa men-track user melalui request ajax, jika instalasi analytic dijalankan secara normal. Normal itu maksudnya, anda langsung kopi-paste kode yang ada di analytic dan memasukkan ke halaman anda.&lt;/p&gt;

&lt;p&gt;Cara yang paling umum dilakukan adalah secara manual memasukkan fungsi &lt;code&gt;_trackPageView&lt;/code&gt; setelah request ajax anda sukses dijalankan. &lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;Misal:&lt;/p&gt;
&lt;pre&gt;
xhr.onreadystatechange = function() {
  if (xhr.readyState == 4) { 
    pageTracker._trackPageView( '/path/request/ajax/anda'  );
  }
}
&lt;/pre&gt;

&lt;p&gt;Ini akan meng-capture semua request ajax anda dan perhitungan pageview akan lebih representatif dengan kondisi aktual. Baik request ajax dan request normal akan dicapture oleh analytic.&lt;/p&gt;

&lt;p&gt;Referensi yang lebih lengkap tentang analytic bisa anda dapatkan di alamat:&lt;br /&gt;
&lt;a href="http://code.google.com/apis/analytics/docs/gaJSApi.html"&gt;http://code.google.com/apis/analytics/docs/gaJSApi.html&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Have fun ;)&lt;/p&gt;
</description><pubDate>Mon, 23 Feb 2009 23:03:00 -0000</pubDate><guid isPermaLink="false">http://beta.ferdianto.com/2009/03/02/analytic-dan-ajax</guid><feedburner:origLink>http://beta.ferdianto.com/2009/03/02/analytic-dan-ajax</feedburner:origLink></item><item><title>Load balance dengan Nginx</title><link>http://feedproxy.google.com/~r/ferdianto/~3/WRb5FkwyPi8/load-balance-dengan-nginx</link><description>&lt;p&gt;Apakah website anda mengalami overload dengan ribuan request per hari? Atau aplikasi web anda super berat sehingga 1 server tidak mampu lagi menangani request yang datang? Mungkin solusi &lt;a href="http://en.wikipedia.org/wiki/Load_balancing_(computing)"&gt;Load Balancing&lt;/a&gt; dengan beberapa server bisa meringankan beban load yang tinggi. Permasalahnnya adalah: &lt;strong&gt;Bagaimana&lt;/strong&gt;&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;Salah satu aplikasi yang lumayan handal untuk kerjaan load balancer adalah &lt;a href="http://nginx.net/"&gt;Nginx&lt;/a&gt;, Nginx adalah HTTP server yang compact, mudah dikonfigurasi dan ringan di resource. Saya membuat contoh kasus sederhana dengan 2 python script yang bisa kita anggap 2 buah web server yg bekerja berdampingan.&lt;/p&gt;

&lt;p&gt;Script server1.py menggunakan &lt;a href="http://www.cherrypy.org/browser/trunk/cherrypy/wsgiserver/__init__.py"&gt;CherryPy&lt;/a&gt; sebagai httpserver.
&lt;pre&gt;
#server1.py
import wsgiserver, os
PORT = 8070
def my_crazy_app(environ, start_response):
    start_response('200 OK', [('Content-type','text/plain')])
    return [(&amp;quot;\n&amp;quot;.join([&amp;quot;%r: %r&amp;quot; % (k, environ[k]) for k in environ.keys()]))]
server = wsgiserver.CherryPyWSGIServer(
            ('0.0.0.0', PORT), my_crazy_app,
            server_name='www.cherrypy.example')
if __name__ == '__main__':
    try: 
        print &amp;quot;CherryPy WSGIServer started at port %d&amp;quot; % PORT
        server.start()
    except KeyboardInterrupt: 
        server.stop()
&lt;/pre&gt;

&lt;p&gt;Script server2.py menggunakan &lt;a href="http://docs.python.org/library/wsgiref.html"&gt;wsgiref&lt;/a&gt;-nya python sebagai http server.&lt;/p&gt;
&lt;pre&gt;
#server2.py
from wsgiref.simple_server import make_server

def hello_world_app(environ, start_response):
    start_response('200 OK', [('Content-type', 'text/plain')])
    return [(&amp;quot;\n&amp;quot;.join([&amp;quot;%r: %r&amp;quot; % (k, environ[k]) for k in environ.keys()]))]

httpd = make_server('', 8000, hello_world_app)
print &amp;quot;Serving on port 8000...&amp;quot;
httpd.serve_forever()
&lt;/pre&gt;

&lt;p&gt;Pemilihan bahasa dan dua modul diatas tanpa alasan tertentu. Hanya untuk simulasi load balancing saja. Sekarang, anda bisa menginstall nginx. Dan konfigurasi sebagai berikut:&lt;/p&gt;
&lt;pre&gt;
upstream test {
	server 127.0.0.1:8070; #cherrypy
	server 127.0.0.1:8000; #python wsgiref module
}

server {
	listen 80;
	server_name localhost;
	root /var/www/nginx-default;
	client_max_body_size 10m;

	location / {
		proxy_pass http://test/;
		proxy_redirect off;
		proxy_set_header  Host  $host;
		proxy_set_header  X-Real-IP  $remote_addr;
		proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
        }
}
&lt;/pre&gt;

&lt;p&gt;Restart Nginx anda, jalankan script server1.py dan server2.py, kemudian buka browser ke http://localhost/. Anda akan melihat output berganti2 dari server1.py ke server2.py. Begitu juga berlaku untuk apache anda &amp;mdash; karena kebanyakan orang memakai apache. Prosedurnya:&lt;/p&gt;
&lt;p&gt;Setting apache anda untuk jalan di port selain 8080 &amp;mdash; misalnya ke port 8080 &lt;strong&gt;Listen 8080&lt;/strong&gt;, kemudian konfigurasi nginx untuk load balance ke server2 anda, dan anda siap untuk menghandle request yang lebih banyak lagi.&lt;/p&gt;


</description><pubDate>Sun, 01 Feb 2009 01:02:00 -0000</pubDate><guid isPermaLink="false">http://beta.ferdianto.com/2009/02/08/load-balance-dengan-nginx</guid><feedburner:origLink>http://beta.ferdianto.com/2009/02/08/load-balance-dengan-nginx</feedburner:origLink></item><item><title>Tidur Malam</title><link>http://feedproxy.google.com/~r/ferdianto/~3/lEM96B1EopE/tidur-malam</link><description>&lt;p&gt;Hampir semua programmer yg saya kenal, punya hobi tidur pagi. Dan sepertinya tidur pagi ini banyak ruginya daripada untungnya, misalnya telat ngantor gara2 bangun kesiangan atau badan lemes dan kulit pucat karena ga pernah kena sinar matahari. Tetapi untungnya, kebiasaan tidur pagi ini ada untungnya juga. Ada 3 hal yang bisa dikemukakan sebagai pembenaran kegiatan diatas:&lt;/p&gt; 
&lt;ol&gt;
&lt;li&gt;
  &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Cortisol"&gt;Hormon stress cortisol&lt;/a&gt; paling banyak di produksi &lt;a href="http://www.ncbi.nlm.nih.gov/pubmed/176503?dopt=Abstract"&gt;sekitar jam 7 pagi&lt;/a&gt;. Jadi kalau bangun sekitar jam itu, kemungkinan akan mengalami ketegangan. Coba tambahkan beberapa menit tidur&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
  &lt;p&gt;8 jam untuk tidur tidaklah cukup. Sebenarnya, sebelum bola lampu ditemukan, rata2 lama orang tidur adalah &lt;a href="http://www.msnbc.msn.com/id/23052850/page/2/"&gt;10 jam&lt;/a&gt; per hari. Bukan 8 jam.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Terakhir, biasanya yg punya hobi tidur malam/pagi adalah mempunyai tingkat kreatifitas tinggi. Ada riset yang berkesimpulan bahwa orang yg hobi melekan &lt;a href="http://www.abc.net.au/science/news/stories/2006/1810399.htm"&gt;cenderung mempunyai skor tinggi&lt;/a&gt; di test kreatifitas daripada orang yg &amp;quot;normal&amp;quot;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
</description><pubDate>Sun, 28 Dec 2008 00:01:00 -0000</pubDate><guid isPermaLink="false">http://beta.ferdianto.com/2009/01/04/tidur-malam</guid><feedburner:origLink>http://beta.ferdianto.com/2009/01/04/tidur-malam</feedburner:origLink></item><item><title>Programmer dan Typo</title><link>http://feedproxy.google.com/~r/ferdianto/~3/N8u3YCu_rpI/programmer-dan-typo</link><description>&lt;p&gt;Setelah sekitar 3 hari tidak mengakses e-mail kantor &amp;mdash; libur natal dan tahun baru, hari ini saya beranikan diri untuk mengakses inbox kantor. Ngga sebanyak saat hari kerja normal. Tetapi yang &lt;strong&gt;paling&lt;/strong&gt; menyebalkan menurut saya adalah typo yang ada di body maupun subject e-mail. Sebenarnya saya ngga akan terlalu mempermasalahkan problem &amp;quot;Salah Ketik&amp;quot; ini jika saja orang yang typo bukan programmer.&lt;/p&gt;

&lt;p&gt;Mengapa saya membenci programmer yang suka typo? Karena senjata utama programmer adalah typing. Seorang ngga akan mungkin bisa menjadi programmer yang handal tanpa skill mengetik di keyboard. Well, memang mungkin, tetapi di jaman dulu, saat &lt;a href="http://en.wikipedia.org/wiki/Punched_card"&gt;Punched Card&lt;/a&gt; masih berjaya.  Kalau sekarang? Baik anda menggunakan IDE hebat semacam &lt;a href="http://www.eclipse.org/"&gt;Eclipse&lt;/a&gt;, &lt;a href="http://www.netbeans.org/"&gt;Netbeans&lt;/a&gt; ataupun Visual Studio, seorang programmer akan selalu terkutuk untuk mengetik.&lt;/p&gt;

&lt;p&gt;Jadi, skill mengetik adalah skill dasar, yang menurut saya &lt;strong&gt;sangat&lt;/strong&gt; berpengaruh dalam produktifitas seorang programmer. Mungkin saya akan usulkan untuk mencantumkan skill &lt;strong&gt;mengetik&lt;/strong&gt; di lowongan pekerjaan programmer di kantor saya, agar problem semacam ini ngga akan terjadi di masa depan.&lt;/p&gt;</description><pubDate>Sun, 21 Dec 2008 02:12:00 -0000</pubDate><guid isPermaLink="false">http://beta.ferdianto.com/2008/12/28/programmer-dan-typo</guid><feedburner:origLink>http://beta.ferdianto.com/2008/12/28/programmer-dan-typo</feedburner:origLink></item><item><title>Nopol Mobil Jakarta 3 Huruf</title><link>http://feedproxy.google.com/~r/ferdianto/~3/mN6gKw1gEMk/nopol-mobil-jakarta-3-huruf</link><description>&lt;p&gt;Pas ke jakarta kemaren, saya perhatikan kalau kode karakter nopol mobil di Jakarta menjadi 3 Huruf. Dan ketika saya baca di &lt;a href="http://andika-lives-here.blogspot.com/2005/05/nomor-polisi-kendaraan-jakarta.html"&gt;beberapa blog&lt;/a&gt; dan sebuah &lt;a href="http://www.kompas.com/read/xml/2008/09/13/06371229/nopol.mobil.jakarta.jadi.tiga.huruf"&gt;situs media&lt;/a&gt;, SAMSAT Jakarta menyatakan kalau memang kehabisan digit untuk nomer kendaraan. Heran aja, dikasih 4 digit plus 2 kombinasi karakter, tetapi bisa kehabisan. Memang seberapa banyak sih mobil dan motor di Jakarta? Jika saya coba hitung dari digitnya&lt;/p&gt;

&lt;pre&gt;
9999 x 27 x 26 = 7.019.298
&lt;/pre&gt;

&lt;p&gt;7 juta kendaraan. Pantesan aja jakarta macet. Cuman, yang saya permasalahkan adalah solusi untuk menambah jumlah huruf untuk Nopol baru. Ini yang menurut saya kurang cerdas. Secara akan membuat plat nomer yang udah jelek, menjadi lebih panjang dan lebih jelek lagi. Belum lagi akan menyusahkan orang untuk mengingat nomer kendaraan. Dengan menambah 1 digit di belakang&lt;/p&gt;

&lt;pre&gt;
9999 x 27 x 27 x 26 = 189.521.046
&lt;/pre&gt;

&lt;p&gt;189.5 Juta dengan kompleksitas nomer semacam: &lt;strong&gt;B 9919 JXR&lt;/strong&gt;. Panjang banget. Jadi plat metal yang dibuat dari plat drum bekas yang asalnya udah jelek, jadi tambah jelek dan &lt;strong&gt;panjang&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Apakah ada solusi lain? Ya, tentunya ada solusi yang mudah. Daripada menambah digit di belakang, kenapa tidak mengubah 4 digit angka tersebut menjadi bilangan &lt;a href="http://en.wikipedia.org/wiki/Base_36"&gt;basis 36&lt;/a&gt;? (Base-36 adalah bilangan 0-9, A-Z) Dengan base-36, mungkin 3 huruf dibelakang ngga akan diperlukan lagi. Kita hitung kemungkinan untuk base-36&lt;/p&gt;

&lt;pre&gt;
4 Digit untuk base36 adalah 1.679.615
Jadi total kendaraan yg muat adalah = 1.679.615 x 27 x 26 = 1.179.089.730
&lt;/pre&gt;

&lt;p&gt;1 milyar, tanpa hrs nambah panjang plat nomer, Contoh plat nomer yang valid adalah: &lt;strong&gt;B JXPY CR&lt;/strong&gt;. Juga menambah peluang untuk customizing plat nomer dengan nama pemiliknya semacam: &lt;strong&gt;B ANDI CX&lt;/strong&gt; atau &lt;strong&gt;B FER DI&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Moral: Mikir dulu sebelum nambahin digit.&lt;/p&gt;

</description><pubDate>Thu, 18 Dec 2008 14:12:00 -0000</pubDate><guid isPermaLink="false">http://beta.ferdianto.com/2008/12/25/nopol-mobil-jakarta-3-huruf</guid><feedburner:origLink>http://beta.ferdianto.com/2008/12/25/nopol-mobil-jakarta-3-huruf</feedburner:origLink></item></channel></rss>
