<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8335110</id><updated>2012-01-22T10:08:14.545+07:00</updated><category term='drupaldeveloperindonesia'/><category term='sysadmin'/><category term='documentation'/><category term='cache'/><category term='xserver'/><category term='htacess'/><category term='jasper server'/><category term='searchengine'/><category term='help'/><category term='redhat'/><category term='agile'/><category term='cms'/><category term='developmentenvironment'/><category term='productivity'/><category term='semaphore'/><category term='timestamp'/><category term='recruitment'/><category term='X11'/><category term='usability'/><category term='binlog'/><category term='prefork'/><category term='linux'/><category term='apache'/><category term='webdeveloperindonesia'/><category term='mysql'/><category term='java'/><category term='scalability'/><category term='php'/><category term='webservices'/><category term='dba'/><category term='informationschema'/><category term='softwaredeveloperindonesia'/><category term='ux'/><category term='memory'/><category term='cloud'/><category term='website'/><category term='sendmail'/><category term='concurrency'/><category term='spring webflow'/><category term='seoindonesia'/><category term='timezone'/><category term='drizzle'/><category term='xrandr'/><category term='j2me'/><category term='libevent'/><category term='scrum'/><category term='innodb'/><category term='drupal'/><category term='projectmanagement'/><category term='ubuntu'/><category term='indonesia'/><category term='cvt'/><category term='profiling'/><category term='google'/><category term='subversion'/><category term='svn'/><title type='text'>Web Developer Indonesia</title><subtitle type='html'>Planning, Developing, Growing and Monitoring</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://rizzblow.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://rizzblow.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Web Developer Indonesia</name><uri>http://www.blogger.com/profile/07987143157274849677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_ss_NqUtJv6E/SwlAPKMT1LI/AAAAAAAAAEk/smjBetsq0mo/S220/rizky.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>47</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8335110.post-8626266957453031227</id><published>2010-10-26T14:48:00.004+07:00</published><updated>2010-11-04T09:32:10.145+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='redhat'/><category scheme='http://www.blogger.com/atom/ns#' term='timezone'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='webdeveloperindonesia'/><title type='text'>Configure Timezone in Linux Carefully</title><content type='html'>Yesterday i experienced bad thing in my RHEL cluster especially related to timezone. Unfortunately my applications depend highly with system time. As we know in Linux we usually configure our timezone machine using the following one of these ways:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. By symbolic link or copying /etc/localtime to/from distro timezone files which usually located in /usr/share/zoneinfo/*&lt;/div&gt;&lt;pre&gt;&lt;br /&gt;ln -sf /usr/share/zoneinfo/Asia/Singapore&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2. By configuring /etc/sysconfig/clock&lt;/div&gt;&lt;div&gt;&lt;pre&gt;ZONE="Asia/Singapore" UTC=false&lt;br /&gt;ARC=false&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;Both make user application written in php, python, and mysql running on the correct date/time based on the configured timezone. However this will cause a problem if we are not carefully configure it. One of example that i experience trouble was using combination of both method above differently and my auto update of RHEL package was active.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What i mean "differently" is i used BST for #2 and SGT (Singapore Time) for #1.  When system apply new update the symbolic/file of /etc/localtime will be overridden by the timezone file that i set in #2 method.  &lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335110-8626266957453031227?l=rizzblow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizzblow.blogspot.com/feeds/8626266957453031227/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8335110&amp;postID=8626266957453031227' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/8626266957453031227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/8626266957453031227'/><link rel='alternate' type='text/html' href='http://rizzblow.blogspot.com/2010/10/configure-timezone-in-linux-carefully.html' title='Configure Timezone in Linux Carefully'/><author><name>Web Developer Indonesia</name><uri>http://www.blogger.com/profile/07987143157274849677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_ss_NqUtJv6E/SwlAPKMT1LI/AAAAAAAAAEk/smjBetsq0mo/S220/rizky.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335110.post-2719339221451975187</id><published>2010-09-23T09:59:00.006+07:00</published><updated>2010-11-04T09:28:46.422+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xrandr'/><category scheme='http://www.blogger.com/atom/ns#' term='xserver'/><category scheme='http://www.blogger.com/atom/ns#' term='cvt'/><category scheme='http://www.blogger.com/atom/ns#' term='X11'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Xrandr to fix screen resolution</title><content type='html'>Headache in repairing Xconf.org ? and your screen resolution not listed in (System -&gt; Preferences -&gt; Monitor) and Need fast solution for your screen trouble. Actually in Ubuntu this can be easily repaired using tools that already included namely &lt;span style="font-weight:bold;"&gt;xrandr. &lt;/span&gt;&lt;span&gt;Firstly you need to make sure you have file &lt;/span&gt;&lt;b&gt;/etc/X11/xorg.conf&lt;/b&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ubuntu Karmic/Lucid by default doesn't have xorg.conf however this file can easily created using your console as follows:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1. Ctrl+Alt+F1 (switch to black screen)&lt;br /&gt;&lt;br /&gt;2. #sudo service gdm stop   (stop Xserver)&lt;br /&gt;&lt;br /&gt;3. #sudo Xorg -configure&lt;br /&gt;&lt;br /&gt;This will generatethe file in ~/xorg.conf.new.&lt;br /&gt;&lt;br /&gt;4. # sudo mv ~/xorg.conf.new /etc/X11/xorg.conf&lt;br /&gt;&lt;br /&gt;5. # sudo service gdm start&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;After xorg.conf file generated then you can manage to config your screen resolution using &lt;b&gt;xrandr. &lt;/b&gt;I this case i one to add new resolution 1440x900.&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;1. Type &lt;b&gt;xrandr -q&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;pre&gt;rizky@rizky:~$ xrandr -q&lt;br /&gt;Screen 0: minimum 320 x 200, current 1360x768, maximum 1360x768&lt;br /&gt;&lt;b&gt;VGA1&lt;/b&gt; connected 1440x900+0+0 (normal left inverted right x axis y axis) 0mm x 0mm&lt;br /&gt;1360x768 59.8&lt;br /&gt;1024x768 60.0&lt;br /&gt;800x600 60.3 56.2&lt;br /&gt;848x480 60.0&lt;br /&gt;640x480 59.9 59.9&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;2. Since  1440x900 not listed then you nee need to gain modeline using this command &lt;b&gt;cvt&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;pre&gt;rizky@rizky:~$ cvt 1440 900&lt;br /&gt;# 1440x900 59.89 Hz (CVT 1.30MA) hsync: 55.93 kHz; pclk: 106.50 MHz&lt;br /&gt;Modeline "1440x900_60.00"  106.50  1440 1528 1672 1904  900 903 909 934 -hsync +vsync&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;3. Type &lt;b&gt;xrandr --newmode "1440x900_60.00"  106.50  1440 1528 1672 1904  900 903 909 934 -hsync +vsync&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;4. Type &lt;b&gt;xrandr --addmode VGA1 1440x900&lt;/b&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;5. Check you resolution om System -&gt; Preferences -&gt; Monitor.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335110-2719339221451975187?l=rizzblow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizzblow.blogspot.com/feeds/2719339221451975187/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8335110&amp;postID=2719339221451975187' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/2719339221451975187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/2719339221451975187'/><link rel='alternate' type='text/html' href='http://rizzblow.blogspot.com/2010/09/xrandr-to-fix-screen-resolution.html' title='Xrandr to fix screen resolution'/><author><name>Web Developer Indonesia</name><uri>http://www.blogger.com/profile/07987143157274849677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_ss_NqUtJv6E/SwlAPKMT1LI/AAAAAAAAAEk/smjBetsq0mo/S220/rizky.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335110.post-3263125000363705447</id><published>2010-04-16T10:24:00.005+07:00</published><updated>2010-11-04T09:32:34.664+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='drupaldeveloperindonesia'/><category scheme='http://www.blogger.com/atom/ns#' term='webdeveloperindonesia'/><category scheme='http://www.blogger.com/atom/ns#' term='webservices'/><title type='text'>Extraordinary Drupal Architecture</title><content type='html'>You may know that &lt;a href="http://www.drupal.org"&gt;Drupal&lt;/a&gt; is CMS but you may don't know its Framework can enable your Drupal website into Large Scale Website which is able to publish your own API and share your API to your website partner and your user. &lt;br /&gt;&lt;br /&gt;In this post i only cover the architecture side of Drupal resulting 3 usages which one of them we usually use and know already; and some of them we never care and you always think it's hard to implement those things in Drupal. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ss_NqUtJv6E/S8fgq2LMYXI/AAAAAAAAAKg/KAwNJd4KQ-w/s1600/drupall_architecture.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 278px;" src="http://1.bp.blogspot.com/_ss_NqUtJv6E/S8fgq2LMYXI/AAAAAAAAAKg/KAwNJd4KQ-w/s400/drupall_architecture.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5460580099911606642" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The resulting usages from this architecture as follows: &lt;br /&gt;&lt;br /&gt;1. &lt;a href="http://drupal.org"&gt;Regular Web&lt;/a&gt;, This we know already and almost all CMS goal is for this. It outputs (X)HTML,RSS,XML requested by client via HTTP and drupal response using (X)HTML,RSS,XML&lt;br /&gt;&lt;br /&gt;2. &lt;a href="http://drupal.org/project/services"&gt;Web Services / Publish API Server&lt;/a&gt;, Many CMS today act only as client of web service however in drupal, we can publish API and act as Web service provider. And also drupal provides various format we can use such as JSON, JSONRPC, REST, SOAP, and XMLRPC.  &lt;br /&gt;&lt;br /&gt;3. &lt;a href="http://drupal.org/project/drush"&gt;Shell / Console application&lt;/a&gt;. You can run Drupal framework inside console. This application is really useful when you want to do large processing or manipulating nodes that need more time.    &lt;br /&gt; &lt;br /&gt;Those 3 features enable you web application into complex and excelent web application. Thanks to &lt;a href="http://www.drupal.org"&gt;Drupal Community&lt;/a&gt; have provided to us those free and easy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335110-3263125000363705447?l=rizzblow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizzblow.blogspot.com/feeds/3263125000363705447/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8335110&amp;postID=3263125000363705447' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/3263125000363705447'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/3263125000363705447'/><link rel='alternate' type='text/html' href='http://rizzblow.blogspot.com/2010/04/extraordinary-drupal-architecture.html' title='Extraordinary Drupal Architecture'/><author><name>Web Developer Indonesia</name><uri>http://www.blogger.com/profile/07987143157274849677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_ss_NqUtJv6E/SwlAPKMT1LI/AAAAAAAAAEk/smjBetsq0mo/S220/rizky.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_ss_NqUtJv6E/S8fgq2LMYXI/AAAAAAAAAKg/KAwNJd4KQ-w/s72-c/drupall_architecture.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335110.post-7373803293868593248</id><published>2010-04-05T14:56:00.003+07:00</published><updated>2010-04-05T15:20:45.813+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='seoindonesia'/><title type='text'>Got PageRank Now and listed first SERP</title><content type='html'>Finally after doing some tunes in keyword density and doing little backlink campaign, This blog obtains various achievement in some major Search Engine like google, yahoo, and bing, however it still needs time to achieve localization search.&lt;br /&gt;&lt;br /&gt;Fyi i had focused this blog on specific search term namely "web developer indonesia". Actually this search term is not popular term for search engine user. But this term is only my ego keyword to fight with other site using that search term.  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Google&lt;/span&gt;  &lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ss_NqUtJv6E/S7mczWbYP1I/AAAAAAAAAKI/0jcWr9Ya0Ls/s1600/achievement1.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 338px;" src="http://1.bp.blogspot.com/_ss_NqUtJv6E/S7mczWbYP1I/AAAAAAAAAKI/0jcWr9Ya0Ls/s400/achievement1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5456564829543743314" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Bing &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ss_NqUtJv6E/S7mc0ekNVjI/AAAAAAAAAKY/ugNXX-i0Rd0/s1600/achievement3.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 345px;" src="http://2.bp.blogspot.com/_ss_NqUtJv6E/S7mc0ekNVjI/AAAAAAAAAKY/ugNXX-i0Rd0/s400/achievement3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5456564848908129842" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Yahoo&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ss_NqUtJv6E/S7mcz-OEcYI/AAAAAAAAAKQ/WQB11dOpB_U/s1600/achievement2.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 389px;" src="http://3.bp.blogspot.com/_ss_NqUtJv6E/S7mcz-OEcYI/AAAAAAAAAKQ/WQB11dOpB_U/s400/achievement2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5456564840225337730" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335110-7373803293868593248?l=rizzblow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizzblow.blogspot.com/feeds/7373803293868593248/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8335110&amp;postID=7373803293868593248' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/7373803293868593248'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/7373803293868593248'/><link rel='alternate' type='text/html' href='http://rizzblow.blogspot.com/2010/04/got-pagerank-now-and-listed-first-serp.html' title='Got PageRank Now and listed first SERP'/><author><name>Web Developer Indonesia</name><uri>http://www.blogger.com/profile/07987143157274849677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_ss_NqUtJv6E/SwlAPKMT1LI/AAAAAAAAAEk/smjBetsq0mo/S220/rizky.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_ss_NqUtJv6E/S7mczWbYP1I/AAAAAAAAAKI/0jcWr9Ya0Ls/s72-c/achievement1.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335110.post-824901855525909121</id><published>2010-03-08T11:15:00.002+07:00</published><updated>2010-10-30T08:57:43.941+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='timezone'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><title type='text'>MySQL Timezone</title><content type='html'>Accuracy  of Date and time in Database Server is one of the most critical thing for any application you develop. They may cause trouble for your application when you have system with invalid date time information. MySQL depends on system OS timezone for its timezone.&lt;div&gt;&lt;pre&gt;mysql&gt; show variables like 'time_zone';&lt;br /&gt;+---------------+--------+&lt;br /&gt;| Variable_name | Value  |&lt;br /&gt;+---------------+--------+&lt;br /&gt;| time_zone     | SYSTEM |&lt;br /&gt;+---------------+--------+&lt;br /&gt;1 row in set (0.00 sec)&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family:Georgia, serif;font-size:130%;"&gt;&lt;span class="Apple-style-span" style=" white-space: normal;font-size:16px;"&gt;&lt;span class="Apple-style-span" style="font-family:monospace;font-size:100%;"&gt;&lt;span class="Apple-style-span" style=" white-space: pre;font-size:13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;This is a not problem when your target user of application is in the same timezone and but it will be a problem if it's different and you don't have root access to database server to be able to change based on your need.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Based on my experience a lot of developer rely on NOW() function in their query when they want to get current date time, and use date time data type and also don't know or even care the timezone configured in the server. So if your system time zone is "BST" and your target user is "Singapore" then the query contains NOW() function will follow the system timezone.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There are ways to avoid this trouble by using the following configuration.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. Set session variable of &lt;b&gt;time_zone&lt;/b&gt; firt time you open mysql connection. This happen when you don't have root access.&lt;/div&gt;&lt;div&gt;&lt;pre&gt;mysql&gt; set session time_zone="+08:00";&lt;br /&gt;Query OK, 0 rows affected (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&gt; show session variables like "time_zone";&lt;br /&gt;+---------------+--------+&lt;br /&gt;| Variable_name | Value  |&lt;br /&gt;+---------------+--------+&lt;br /&gt;| time_zone     | +08:00 |&lt;br /&gt;+---------------+--------+&lt;br /&gt;1 row in set (0.00 sec)&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;2. Set global variable of &lt;b&gt;time_zone&lt;/b&gt; , this is server settings.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;pre&gt;mysql&gt; set session time_zone="+08:00";&lt;br /&gt;Query OK, 0 rows affected (0.00 sec)&lt;/pre&gt;3. Avoid Now() function and use portable data type for storing datetime namely "timestamp" &lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335110-824901855525909121?l=rizzblow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizzblow.blogspot.com/feeds/824901855525909121/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8335110&amp;postID=824901855525909121' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/824901855525909121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/824901855525909121'/><link rel='alternate' type='text/html' href='http://rizzblow.blogspot.com/2010/03/mysql-timezone.html' title='MySQL Timezone'/><author><name>Web Developer Indonesia</name><uri>http://www.blogger.com/profile/07987143157274849677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_ss_NqUtJv6E/SwlAPKMT1LI/AAAAAAAAAEk/smjBetsq0mo/S220/rizky.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335110.post-3845908261906166760</id><published>2010-02-25T16:02:00.001+07:00</published><updated>2010-02-25T16:03:33.365+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='webdeveloperindonesia'/><title type='text'>Turning on Safe UPDATE and DELETE</title><content type='html'>I had call last nite that one of my friend lose his content of table accidentally. He said that his developer forgot to place validation of WHERE statement in DELETE query. So the query sent to server will be like this: &lt;br /&gt;&lt;br /&gt;DELETE FROM transactions WHERE 1;&lt;br /&gt;&lt;br /&gt;Actually mySQL is able to handle this sort of issue, since it has validation to check whether query DELETE or UPDATE  has missing WHERE statement However you need to activate it by turning on mySQL session variable namely sql_safe_updates;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mysql&gt; select @@sql_safe_updates;&lt;br /&gt;+--------------------+&lt;br /&gt;| @@sql_safe_updates |&lt;br /&gt;+--------------------+&lt;br /&gt;|                  0 |&lt;br /&gt;+--------------------+&lt;br /&gt;1 row in set (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&gt; set @@sql_safe_updates=1;&lt;br /&gt;Query OK, 0 rows affected (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&gt; select @@sql_safe_updates;&lt;br /&gt;+--------------------+&lt;br /&gt;| @@sql_safe_updates |&lt;br /&gt;+--------------------+&lt;br /&gt;|                  1 |&lt;br /&gt;+--------------------+&lt;br /&gt;1 row in set (0.00 sec)&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;And now lets try to issue delete statement without WHERE&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mysql&gt; DELETE FROM transaction_table;&lt;br /&gt;ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column&lt;br /&gt;mysql&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;&lt;br /&gt;You can see mySQL will disallow any incomplete DELETE or UPDATE query.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335110-3845908261906166760?l=rizzblow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizzblow.blogspot.com/feeds/3845908261906166760/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8335110&amp;postID=3845908261906166760' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/3845908261906166760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/3845908261906166760'/><link rel='alternate' type='text/html' href='http://rizzblow.blogspot.com/2010/02/turning-on-safe-update-and-delete.html' title='Turning on Safe UPDATE and DELETE'/><author><name>Web Developer Indonesia</name><uri>http://www.blogger.com/profile/07987143157274849677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_ss_NqUtJv6E/SwlAPKMT1LI/AAAAAAAAAEk/smjBetsq0mo/S220/rizky.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335110.post-6673271370641341445</id><published>2010-02-21T09:34:00.008+07:00</published><updated>2010-02-23T16:40:11.147+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='webdeveloperindonesia'/><title type='text'>Getting maximum value from group of rows without using MAX()</title><content type='html'>MAX() is a SQL function that commonly used to get maximum value for each rows by grouping defined column inside a table. The following example "Get Max Score of Each Student" intended to show MAX() function commonly used. &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mysql&gt; show create table student;&lt;br /&gt;+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;| Table   | Create Table                         |&lt;br /&gt;+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;| student | CREATE TABLE `student` (&lt;br /&gt;`studentid` int(11) NOT NULL,&lt;br /&gt;`subject` varchar(100) NOT NULL,&lt;br /&gt;`score` float NOT NULL&lt;br /&gt;) ENGINE=MyISAM DEFAULT CHARSET=latin1 |&lt;br /&gt;+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;1 row in set (0.00 sec)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;mysql&gt; select * from student;&lt;br /&gt;+-----------+---------------+-------+&lt;br /&gt;| studentid | subject       | score |&lt;br /&gt;+-----------+---------------+-------+&lt;br /&gt;|      1001 | Calculus      |  70.5 |&lt;br /&gt;|      1001 | Mathematics   |  93.5 |&lt;br /&gt;|      1001 | C Programming |   100 |&lt;br /&gt;|      1002 | Mathematics   |  50.5 |&lt;br /&gt;|      1002 | C Programming |  60.5 |&lt;br /&gt;|      1002 | Calculus      |  40.5 |&lt;br /&gt;|      1003 | Calculus      |   100 |&lt;br /&gt;|      1003 | Mathematics   |  60.5 |&lt;br /&gt;|      1003 | C Programming |    90 |&lt;br /&gt;+-----------+---------------+-------+&lt;br /&gt;9 rows in set (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&gt; select studentid, max(score) as high_score from student GROUP BY studentid;&lt;br /&gt;+-----------+------------+&lt;br /&gt;| studentid | high_score |&lt;br /&gt;+-----------+------------+&lt;br /&gt;|      1001 |        100 |&lt;br /&gt;|      1002 |       60.5 |&lt;br /&gt;|      1003 |        100 |&lt;br /&gt;+-----------+------------+&lt;br /&gt;3 rows in set (0.03 sec)&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;However, Somtimes we may find an issue from above result query when we want to know "which subject for each student having highest score ?". We may think to modify the query by adding new column in the query or inside group by.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mysql&gt; select studentid, subject, max(score) as high_score from student GROUP BY studentid;&lt;br /&gt;+-----------+-------------+------------+&lt;br /&gt;| studentid | subject     | high_score |&lt;br /&gt;+-----------+-------------+------------+&lt;br /&gt;|      1001 | Calculus    |        100 |&lt;br /&gt;|      1002 | Mathematics |       60.5 |&lt;br /&gt;|      1003 | Calculus    |        100 |&lt;br /&gt;+-----------+-------------+------------+&lt;br /&gt;3 rows in set (0.00 sec)&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;You can see above query is completely wrong result. And now see the result below by grouping 2 column. And this is also wrong.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mysql&gt; select studentid, subject,  max(score) as high_score from student GROUP BY studentid, subject;&lt;br /&gt;+-----------+---------------+------------+&lt;br /&gt;| studentid | subject       | high_score |&lt;br /&gt;+-----------+---------------+------------+&lt;br /&gt;|      1001 | C Programming |        100 |&lt;br /&gt;|      1001 | Calculus      |       70.5 |&lt;br /&gt;|      1001 | Mathematics   |       93.5 |&lt;br /&gt;|      1002 | C Programming |       60.5 |&lt;br /&gt;|      1002 | Calculus      |       40.5 |&lt;br /&gt;|      1002 | Mathematics   |       50.5 |&lt;br /&gt;|      1003 | C Programming |         90 |&lt;br /&gt;|      1003 | Calculus      |        100 |&lt;br /&gt;|      1003 | Mathematics   |       60.5 |&lt;br /&gt;+-----------+---------------+------------+&lt;br /&gt;9 rows in set (0.00 sec)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;There is a solution can be achieved without using SQL MAX() Function. And we are going to use LEFT JOIN to the same table:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt; SELECT s1.studentid, s1.subject, s1.score high_score&lt;br /&gt;FROM student s1&lt;br /&gt;LEFT JOIN student s2 ON s1.studentid = s2.studentid AND s1.score &lt;&gt; s2.score WHERE s2.studentid IS NULL; &lt;/strong&gt; &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mysql&gt; SELECT s1.studentid, s1.subject, s1.score high_score&lt;br /&gt;  -&gt; FROM student s1&lt;br /&gt;  -&gt; LEFT JOIN student s2 ON s1.studentid = s2.studentid AND s1.score &lt;&gt; s2.score WHERE s2.studentid IS NULL;&lt;br /&gt;+-----------+---------------+------------+&lt;br /&gt;| studentid | subject       | high_score |&lt;br /&gt;+-----------+---------------+------------+&lt;br /&gt;|      1001 | C Programming |        100 |&lt;br /&gt;|      1002 | C Programming |       60.5 |&lt;br /&gt;|      1003 | Calculus      |        100 |&lt;br /&gt;+-----------+---------------+------------+&lt;br /&gt;3 rows in set (0.01 sec)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now you have the correct result. Student 1001 and 1002 have highest score at C Programming and Student 1003 is at Calculus.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335110-6673271370641341445?l=rizzblow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizzblow.blogspot.com/feeds/6673271370641341445/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8335110&amp;postID=6673271370641341445' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/6673271370641341445'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/6673271370641341445'/><link rel='alternate' type='text/html' href='http://rizzblow.blogspot.com/2010/02/getting-maximum-value-from-group-of.html' title='Getting maximum value from group of rows without using MAX()'/><author><name>Web Developer Indonesia</name><uri>http://www.blogger.com/profile/07987143157274849677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_ss_NqUtJv6E/SwlAPKMT1LI/AAAAAAAAAEk/smjBetsq0mo/S220/rizky.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335110.post-2192683914107019743</id><published>2010-02-09T17:35:00.007+07:00</published><updated>2011-10-30T15:50:45.958+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='seoindonesia'/><title type='text'>Removing page from google index using Webmaster tools</title><content type='html'>&lt;div&gt;Sometimes you may want to exclude some pages from google index or remove those pages from google index. Google has provided great and free tools for webmaster to manage interaction between our site and google search namely &lt;a href="http://google.com/webmaster"&gt;Webmaster Tools&lt;/a&gt;. With one of these tools you are able to remove your page from google index by following these step:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. login http://www.google.com/webmaster and choose your registered site&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/_ss_NqUtJv6E/S3E8ItZGLZI/AAAAAAAAAJA/N-zAK41TO-w/s1600-h/webmastertools3.PNG"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5436192345534377362" src="http://4.bp.blogspot.com/_ss_NqUtJv6E/S3E8ItZGLZI/AAAAAAAAAJA/N-zAK41TO-w/s400/webmastertools3.PNG" style="cursor: hand; cursor: pointer; height: 130px; width: 400px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;2. Click the left menu Site configuration &amp;gt; Crawler access and Click Remove URL&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;3. Click New removal request&lt;/div&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/_ss_NqUtJv6E/S3E8IXjotkI/AAAAAAAAAI4/H_K8kLCyUZ4/s1600-h/webmastertools2.PNG"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5436192339673003586" src="http://1.bp.blogspot.com/_ss_NqUtJv6E/S3E8IXjotkI/AAAAAAAAAI4/H_K8kLCyUZ4/s400/webmastertools2.PNG" style="cursor: hand; cursor: pointer; height: 138px; width: 400px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;4. Choose your type of removal (in this post i choose "Individual URLs" and press Next&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;5. Enter the page or image you want remove for example : 2008_05_01_archive.html and press Submit. Your page or email will be listed with pending status and after this step you just wait google to remove your page from its index.&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/_ss_NqUtJv6E/S3E8H5lxpqI/AAAAAAAAAIw/q08Kt7Di82k/s1600-h/webmastertools1.PNG"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5436192331628914338" src="http://4.bp.blogspot.com/_ss_NqUtJv6E/S3E8H5lxpqI/AAAAAAAAAIw/q08Kt7Di82k/s400/webmastertools1.PNG" style="cursor: hand; cursor: pointer; height: 170px; width: 400px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;How if i got wrong url ? you can delete before it's excluded by google and you also to reinclude the page to its index with reinclude button. These 5 steps also need another simple action required by google to identify pages to be excluded namely you must add simple meta script to the page or to your robot.txt file otherwise google will deny your request.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Meta tag&lt;/div&gt;&lt;div&gt;&lt;pre&gt;&amp;lt;meta content='noindex' name='robots'/&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Robot.txt&lt;/div&gt;&lt;div&gt;&lt;pre&gt;Disallow: 2008_05_01_archive.html &lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335110-2192683914107019743?l=rizzblow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizzblow.blogspot.com/feeds/2192683914107019743/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8335110&amp;postID=2192683914107019743' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/2192683914107019743'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/2192683914107019743'/><link rel='alternate' type='text/html' href='http://rizzblow.blogspot.com/2010/02/removing-page-from-google-index-using.html' title='Removing page from google index using Webmaster tools'/><author><name>Web Developer Indonesia</name><uri>http://www.blogger.com/profile/07987143157274849677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_ss_NqUtJv6E/SwlAPKMT1LI/AAAAAAAAAEk/smjBetsq0mo/S220/rizky.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_ss_NqUtJv6E/S3E8ItZGLZI/AAAAAAAAAJA/N-zAK41TO-w/s72-c/webmastertools3.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335110.post-3888139607534633265</id><published>2010-01-11T13:02:00.004+07:00</published><updated>2010-02-09T08:51:19.535+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='drupaldeveloperindonesia'/><category scheme='http://www.blogger.com/atom/ns#' term='webdeveloperindonesia'/><title type='text'>Drupal works perfect with Load Balancer</title><content type='html'>Scaling website means the website is getting more and more traffic from visitor. One of steps to scale our web server infratructure is to implement Load Balancer and adding more web servers behind it. This help increasing concurrent connection and response time from our web server.&lt;br /&gt;&lt;br /&gt;Many Website CMS powered when adding &lt;a href="http://en.wikipedia.org/wiki/Load_balancing_%28computing%29"&gt;Load Balancer&lt;/a&gt; they fail to keep the user state (session/cookie) for example when user login, servers should keep user state until the user loguot or the state expire. On the other hand, Drupal works perfect and no need to patch any script of it when Load Balancer implemented.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="text-decoration: underline;"&gt;&lt;b&gt;Why?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Drupal store user session-id in central database rather than store it in each webserver as a plain text file. How can drupal do it ? Since PHP give user capability to override session handler, Drupal override php session handler in /includes/session.inc.&lt;br /&gt;&lt;br /&gt;PHP provides the following function to be able to control our session.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;session_set_save_handler('sess_open', 'sess_close', 'sess_read', 'sess_write', 'sess_destroy_sid', 'sess_gc');&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;sess_open, sess_close, sess_read, sess_write, sess_destroy_sid and sess_gc are callback function that drupal implemented. Those functions are available in include/session.inc&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335110-3888139607534633265?l=rizzblow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizzblow.blogspot.com/feeds/3888139607534633265/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8335110&amp;postID=3888139607534633265' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/3888139607534633265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/3888139607534633265'/><link rel='alternate' type='text/html' href='http://rizzblow.blogspot.com/2010/01/drupal-works-perfect-with-load-balancer.html' title='Drupal works perfect with Load Balancer'/><author><name>Web Developer Indonesia</name><uri>http://www.blogger.com/profile/07987143157274849677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_ss_NqUtJv6E/SwlAPKMT1LI/AAAAAAAAAEk/smjBetsq0mo/S220/rizky.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335110.post-4676896458325739704</id><published>2010-01-11T11:28:00.006+07:00</published><updated>2010-02-23T16:38:46.322+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='drupaldeveloperindonesia'/><category scheme='http://www.blogger.com/atom/ns#' term='webdeveloperindonesia'/><title type='text'>Enabling HTTPS on Drupal User Login using htaccess</title><content type='html'>You may find new requirement in your web project that require Drupal to use HTTPS when user login to the website. Fortunately this is hard to achieve by creating new custom module extention since all scripts related to user login and authentication/authorization written inside core module namely user.module.&lt;br /&gt;&lt;br /&gt;I have trick to do  this without hacking, touching core module or even create custom module. I use .htaccess  to automate redirection only for certain drupal login url pattern from HTTP to HTTPS and HTTPS to HTTP.&lt;br /&gt;&lt;br /&gt;Replace these scripts&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;RewriteCond %{REQUEST_FILENAME} !-d&lt;br /&gt;RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;with the following scripts:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#Redirect all non user url from https to http&lt;br /&gt;RewriteCond %{SERVER_PORT} ^443$&lt;br /&gt;RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;RewriteCond %{REQUEST_FILENAME} !-d&lt;br /&gt;RewriteCond $1 !^/user&lt;br /&gt;RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [R=301,L]&lt;br /&gt;&lt;br /&gt;#Redirect to Referer when user login&lt;br /&gt;RewriteCond %{SERVER_PORT} ^80$&lt;br /&gt;RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;RewriteCond %{REQUEST_FILENAME} !-d&lt;br /&gt;RewriteCond $1 ^user&lt;br /&gt;RewriteCond $1 !^user/register&lt;br /&gt;RewriteCond $1 !^user/(.+)/edit&lt;br /&gt;RewriteRule ^(.*)$  https://%{HTTP_HOST}/$1?dest=%{HTTP_REFERER} [R=301,L]&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335110-4676896458325739704?l=rizzblow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizzblow.blogspot.com/feeds/4676896458325739704/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8335110&amp;postID=4676896458325739704' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/4676896458325739704'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/4676896458325739704'/><link rel='alternate' type='text/html' href='http://rizzblow.blogspot.com/2010/01/enabling-https-on-drupal-user-login.html' title='Enabling HTTPS on Drupal User Login using htaccess'/><author><name>Web Developer Indonesia</name><uri>http://www.blogger.com/profile/07987143157274849677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_ss_NqUtJv6E/SwlAPKMT1LI/AAAAAAAAAEk/smjBetsq0mo/S220/rizky.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335110.post-1801383516404645203</id><published>2010-01-07T17:51:00.004+07:00</published><updated>2010-02-09T08:52:09.043+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='documentation'/><category scheme='http://www.blogger.com/atom/ns#' term='webdeveloperindonesia'/><title type='text'>Project Documentation Template</title><content type='html'>Documentation is one of hard part of web development project however if we manage it carefully and having nice template  this work will be easier. There is ReadySet, an Opensource template can be used to help our documentation more structure and neat. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://readyset.tigris.org/"&gt;http://readyset.tigris.org/&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335110-1801383516404645203?l=rizzblow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizzblow.blogspot.com/feeds/1801383516404645203/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8335110&amp;postID=1801383516404645203' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/1801383516404645203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/1801383516404645203'/><link rel='alternate' type='text/html' href='http://rizzblow.blogspot.com/2010/01/project-documentation-template.html' title='Project Documentation Template'/><author><name>Web Developer Indonesia</name><uri>http://www.blogger.com/profile/07987143157274849677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_ss_NqUtJv6E/SwlAPKMT1LI/AAAAAAAAAEk/smjBetsq0mo/S220/rizky.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335110.post-7498553931939249487</id><published>2010-01-07T13:39:00.006+07:00</published><updated>2010-02-09T08:56:50.520+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='projectmanagement'/><category scheme='http://www.blogger.com/atom/ns#' term='webdeveloperindonesia'/><category scheme='http://www.blogger.com/atom/ns#' term='scrum'/><title type='text'>The Best Scrum Video in 2009</title><content type='html'>I think this is the best &lt;a href="http://en.wikipedia.org/wiki/Scrum_(development)"&gt;Scrum&lt;/a&gt; video i ever watched.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;object width="560" height="340"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Q5k7a9YEoUI&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/Q5k7a9YEoUI&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335110-7498553931939249487?l=rizzblow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizzblow.blogspot.com/feeds/7498553931939249487/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8335110&amp;postID=7498553931939249487' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/7498553931939249487'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/7498553931939249487'/><link rel='alternate' type='text/html' href='http://rizzblow.blogspot.com/2010/01/best-scrum-video-in-2009.html' title='The Best Scrum Video in 2009'/><author><name>Web Developer Indonesia</name><uri>http://www.blogger.com/profile/07987143157274849677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_ss_NqUtJv6E/SwlAPKMT1LI/AAAAAAAAAEk/smjBetsq0mo/S220/rizky.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335110.post-1302476134633722242</id><published>2010-01-07T11:27:00.009+07:00</published><updated>2010-02-09T08:53:50.058+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cache'/><category scheme='http://www.blogger.com/atom/ns#' term='webdeveloperindonesia'/><title type='text'>Cache that Web Developer Must Know</title><content type='html'>Previously I would like to post and share about Cache (What, How,  and Why). However i found very interesting and really useful posts regarding to the Cache. Here are definition, Technique and algorithm that web developer must know.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. Introduction of Cache and the algorithm. &lt;/div&gt;&lt;div&gt;&lt;a href="http://javalandscape.blogspot.com/2009/03/intro-to-cachingcaching-algorithms-and.html"&gt;http://javalandscape.blogspot.com/2009/03/intro-to-cachingcaching-algorithms-and.html&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2. HTTP Cache using HTTP Header to improve request and reponse  cycle&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.ibm.com/developerworks/web/library/wa-aj-cache/index.html?ca=drs-"&gt;http://www.ibm.com/developerworks/web/library/wa-aj-cache/index.html?ca=drs-&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.mnot.net/cache_docs/#PROXY"&gt;http://www.mnot.net/cache_docs/#PROXY&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;3. Technique that usually implemented in cache&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.mysqlperformanceblog.com/2006/08/08/caching-techinques"&gt;http://www.mysqlperformanceblog.com/2006/08/08/caching-techinques&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;4. Cache Comparison such as APC, Memcache, MySQL, and File based cache.&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.mysqlperformanceblog.com/2006/08/09/cache-performance-comparison/"&gt;http://www.mysqlperformanceblog.com/2006/08/09/cache-performance-comparison/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335110-1302476134633722242?l=rizzblow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizzblow.blogspot.com/feeds/1302476134633722242/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8335110&amp;postID=1302476134633722242' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/1302476134633722242'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/1302476134633722242'/><link rel='alternate' type='text/html' href='http://rizzblow.blogspot.com/2010/01/cache-that-web-developer-must-know.html' title='Cache that Web Developer Must Know'/><author><name>Web Developer Indonesia</name><uri>http://www.blogger.com/profile/07987143157274849677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_ss_NqUtJv6E/SwlAPKMT1LI/AAAAAAAAAEk/smjBetsq0mo/S220/rizky.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335110.post-8067337685306105123</id><published>2009-12-26T23:58:00.003+07:00</published><updated>2010-02-09T08:54:04.911+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='webdeveloperindonesia'/><title type='text'>Building Continous Website Solution.</title><content type='html'>This holiday i use to think and do a research about how to build continuous Website solutions that can be delivered to anyone who want their website to be as follows:&lt;br /&gt;Scalable, Secure, High Performance, Usable, Accessible, and Profitable. And of course i know there are already a lot people living in Web Development. However my motivation to do this research cause many peoples still believe that website solutions are :&lt;br /&gt;&lt;br /&gt;1. The same as software solution.&lt;br /&gt;&lt;br /&gt;I saw some companies still use System Development Life Cycle it means after maintenance(final) phase they let the web site dead with none visit it. They don't even know how to drive traffic to their website  and have strong faith that is "as long as they build website with unique idea the search engine will find us and user will visit their website"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2. 85% of building website are thinking about coding, performance, platform, operating system, and database system.&lt;br /&gt;&lt;br /&gt;They always say one of this "PHP is slower than Ruby, Ruby is slower than Java, Java is slower than C/C++, C/C++ is slower than Assembly".  If We still consider micro micro seconds Why don't we code the web using assembly ?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3. Only talk  and focus on one of these :  usability, user interface, content generation, accessibility, online marketing.&lt;br /&gt;"Too many doing inbound link campaign then you forgot the content quality of your website. This means you are doing search engine spamming".&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So, What is Continuous Web Solution ?.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ss_NqUtJv6E/SzZEVRmjP6I/AAAAAAAAAGQ/iCs3NyUAIZg/s1600-h/draft-continous.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 230px;" src="http://1.bp.blogspot.com/_ss_NqUtJv6E/SzZEVRmjP6I/AAAAAAAAAGQ/iCs3NyUAIZg/s320/draft-continous.png" alt="" id="BLOGGER_PHOTO_ID_5419594333880008610" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The solution having continuity to achieve the client's goal. There are 3 simple stages namely&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1. Planing&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This stage needed to set the goal or objectives.  Reaching the goal you need resources like right people, proper schedule,  and proper budget.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2. Developing&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Coding is one of the tasks for this stage and in this stage you can use well known software development process like TDD or BDD. Before coding there must be some people doing and thinking about application architecture and design,  usability, accessibility, high quality content, and keyword research.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3. Growing &amp;amp; Monitoring&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is online marketing thingy like driving traffic using email marketing, search engine marketing, social media, and affiliate marketing. This stage also used to monitor each KPI set, performance/bug and sales volume of their website.&lt;br /&gt;&lt;br /&gt;These continuous solutions i believe can help client rather than hire each stages partially.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335110-8067337685306105123?l=rizzblow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizzblow.blogspot.com/feeds/8067337685306105123/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8335110&amp;postID=8067337685306105123' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/8067337685306105123'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/8067337685306105123'/><link rel='alternate' type='text/html' href='http://rizzblow.blogspot.com/2009/12/building-continous-internet-solution.html' title='Building Continous Website Solution.'/><author><name>Web Developer Indonesia</name><uri>http://www.blogger.com/profile/07987143157274849677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_ss_NqUtJv6E/SwlAPKMT1LI/AAAAAAAAAEk/smjBetsq0mo/S220/rizky.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_ss_NqUtJv6E/SzZEVRmjP6I/AAAAAAAAAGQ/iCs3NyUAIZg/s72-c/draft-continous.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335110.post-2290512965995333477</id><published>2009-12-10T12:06:00.007+07:00</published><updated>2011-04-23T21:44:05.429+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ux'/><category scheme='http://www.blogger.com/atom/ns#' term='webdeveloperindonesia'/><title type='text'>You are not user !!!</title><content type='html'>You may be like me facing many persons that have different background when building website. There are product owner, marketing, designer, and of course the developer.In fact, they have the same goal namely "making successful website". However process to achieve that is not as simple as we thought.&lt;br /&gt;&lt;br /&gt;Every person involved here have different roles and responsibilities such as for developer, they have responsibilities to translate requirement into high quality of code, and maintain those code. For Marketing, they do campaign by promoting a website either using offline or online activity and of course they must monitor the ROI.&lt;br /&gt;&lt;br /&gt;There is one thing that i always find and really sad is some person from one of those group &lt;strong&gt;pretending to be user&lt;/strong&gt;. This group seem really know and have expertise about web user and they always request to change some part of website without any reason and any data to be proved that one or more of part of website is sux. Sometimes this happens if one of the following reasons happen:&lt;br /&gt;&lt;br /&gt;1. None visit the website and those group of person start blaming production and user experience team. Actually this is marketing issue, not related to programming, ajax, or css or We may do wrong advertisement like doing advertisement on Radio. There are many marketing channel can be used here to drive more traffic such as SEM, PPC, Social Media, and Affiliation.&lt;br /&gt;&lt;br /&gt;2. ROI or defined target can not be achieved and they also will start blaming production and user experience team. We can blame user production &amp;amp; experience team if bounce rate was so high (&lt;a href="http://rizzblow.blogspot.com/2009/11/why-bounce-rate-was-so-high.html"&gt;depend highly on your navigation&lt;/a&gt;) or after doing conversion and A/B Testing. Otherwise this is also marketing issue&lt;br /&gt;&lt;br /&gt;3. There is "always-change" passions in decision maker from those group. This caused too many browsing experience so when they find something look nice on internet and they want to add that to the website like doing revamp, changing the flow, etc.&lt;br /&gt;I think this is stupid idea if uncontrolled. Cos this can break indexed page and your rank on search engine SERP.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Facing this type of person you need extra extra power and work however if you don't have power to control it, will be better if you quit asap from them.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Really good related article to read:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.sitepoint.com/blogs/2009/12/09/designing-for-conversion/"&gt;http://www.sitepoint.com/blogs/2009/12/09/designing-for-conversion/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.conversionrate.net/55-google-website-optimizer-tips"&gt;http://www.conversionrate.net/55-google-website-optimizer-tips&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335110-2290512965995333477?l=rizzblow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizzblow.blogspot.com/feeds/2290512965995333477/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8335110&amp;postID=2290512965995333477' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/2290512965995333477'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/2290512965995333477'/><link rel='alternate' type='text/html' href='http://rizzblow.blogspot.com/2009/12/you-are-not-user.html' title='You are not user !!!'/><author><name>Web Developer Indonesia</name><uri>http://www.blogger.com/profile/07987143157274849677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_ss_NqUtJv6E/SwlAPKMT1LI/AAAAAAAAAEk/smjBetsq0mo/S220/rizky.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335110.post-4290534943665467094</id><published>2009-11-29T21:08:00.000+07:00</published><updated>2011-04-23T21:42:34.839+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='website'/><category scheme='http://www.blogger.com/atom/ns#' term='webdeveloperindonesia'/><title type='text'>Why bounce rate was so high ?</title><content type='html'>This question is always issued when someone see this rate on their web analytic. However before you judge to revamp your website, better you think on yourself why this can happen. Honestly i experienced this problem mostly in monitoring website growth.  As technical person we can analyze this rate based on the other related data and not only feelings involved. You need to consider this thing before making changes on your system.&lt;br /&gt;&lt;br /&gt;1. Content, as long as your content is sux or limited whoever visit your website will bounce automatically. I believe only robot love your website. This mostly is user from search engine. &lt;br /&gt;&lt;br /&gt;2. Navigation structure, For example you have popular trafficked website abc123.com and you want to grow another new domain def456.com for different niche or business model. You put your new domain as part of your main menu in abc123.com. This, of course could generate high bounce rate especially when content not ready or only small number of content. &lt;br /&gt;&lt;br /&gt;Finally, you can decide what you need to do.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335110-4290534943665467094?l=rizzblow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizzblow.blogspot.com/feeds/4290534943665467094/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8335110&amp;postID=4290534943665467094' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/4290534943665467094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/4290534943665467094'/><link rel='alternate' type='text/html' href='http://rizzblow.blogspot.com/2009/11/why-bounce-rate-was-so-high.html' title='Why bounce rate was so high ?'/><author><name>Web Developer Indonesia</name><uri>http://www.blogger.com/profile/07987143157274849677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_ss_NqUtJv6E/SwlAPKMT1LI/AAAAAAAAAEk/smjBetsq0mo/S220/rizky.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335110.post-1745360398782477869</id><published>2009-11-25T22:26:00.006+07:00</published><updated>2009-11-26T00:31:03.629+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cms'/><category scheme='http://www.blogger.com/atom/ns#' term='drupal'/><title type='text'>Drupal, Joomla, and Wordpress  World Trends</title><content type='html'>Lately we must hear that &lt;a href="http://whitehouse.gov/"&gt;whitehouse.gov&lt;/a&gt; website migrate to &lt;a href="http://drupal.org"&gt;Drupal&lt;/a&gt;. This is Big Win for Drupal Community especially for Open Source &lt;a href="http://en.wikipedia.org/wiki/Content_management_system"&gt;CMS&lt;/a&gt; world. However there are many critics posted saying that is &lt;a href="http://www.slate.com/id/2233719/"&gt;disaster&lt;/a&gt;. Besides whitehouse.gov Drupal this years also regains &lt;a href="http://www.packtpub.com/nominate-best-open-source-php-cms"&gt;Packt 2009 Best Open Source PHP CMS&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I am wondering from which side and what reason they choosed Drupal. As &lt;a href="http://rizzblow.blogspot.com/"&gt;Web Developer&lt;/a&gt; Drupal is the best among other &lt;a href="http://en.wikipedia.org/wiki/Content_management_system"&gt;CMS&lt;/a&gt; like Joomla or Wordpress. Drupal has great feature as follows :&lt;br /&gt;&lt;br /&gt;1. Huge amount of community.&lt;br /&gt;2. Availability of Modules.&lt;br /&gt;3. &lt;a href="http://www.acquia.com/"&gt;Have Commercial Support&lt;/a&gt;. &lt;br /&gt;4. Easy to extend or create new custom module.&lt;br /&gt;5. Can work with MySQL and Postgresql.&lt;br /&gt;6. &lt;a href="http://drupal.org/node/89809"&gt;Many high profile websites powered by Drupal&lt;/a&gt;.&lt;br /&gt;7. Open Source.&lt;br /&gt;&lt;br /&gt;But how about for the people don't know about coding or PHP ? Let's see the trend of 3 popular CMS Drupal, Joomla, and Wordpress using Google Trend. This trend reflects how many people from google search try to find information about those 3 CMS.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ss_NqUtJv6E/Sw1UhnP10hI/AAAAAAAAAFM/aBWRfDXGI0w/s1600/djw.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 143px;" src="http://3.bp.blogspot.com/_ss_NqUtJv6E/Sw1UhnP10hI/AAAAAAAAAFM/aBWRfDXGI0w/s320/djw.png" alt="" id="BLOGGER_PHOTO_ID_5408071663989674514" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Based on the Trend above, Drupal is 3rd. so Can i say "Drupal is only friendly CMS for web developer who know about coding and PHP" ? &lt;br /&gt;&lt;br /&gt;Ups .. Indonesia seems biggest users of Joomla and Wordpress.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ss_NqUtJv6E/Sw1XPNkSf5I/AAAAAAAAAFU/zEVIIz_wTU4/s1600/iwj.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 251px;" src="http://2.bp.blogspot.com/_ss_NqUtJv6E/Sw1XPNkSf5I/AAAAAAAAAFU/zEVIIz_wTU4/s320/iwj.png" alt="" id="BLOGGER_PHOTO_ID_5408074646393356178" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335110-1745360398782477869?l=rizzblow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizzblow.blogspot.com/feeds/1745360398782477869/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8335110&amp;postID=1745360398782477869' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/1745360398782477869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/1745360398782477869'/><link rel='alternate' type='text/html' href='http://rizzblow.blogspot.com/2009/11/drupal-joomla-and-wordpress-world.html' title='Drupal, Joomla, and Wordpress  World Trends'/><author><name>Web Developer Indonesia</name><uri>http://www.blogger.com/profile/07987143157274849677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_ss_NqUtJv6E/SwlAPKMT1LI/AAAAAAAAAEk/smjBetsq0mo/S220/rizky.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_ss_NqUtJv6E/Sw1UhnP10hI/AAAAAAAAAFM/aBWRfDXGI0w/s72-c/djw.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335110.post-9131403676448577440</id><published>2009-11-18T12:01:00.008+07:00</published><updated>2009-12-01T09:32:52.476+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='productivity'/><category scheme='http://www.blogger.com/atom/ns#' term='usability'/><category scheme='http://www.blogger.com/atom/ns#' term='searchengine'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>Utilizing Google Search To Search Keyword From Content of a Website</title><content type='html'>Sometimes you may have favorite blogs having good posted content and you want to search something that may be useful or needed for you. Almost all of the blog powered by some blog engines such as wordpress, drupal and any other blog engine have a search box feature to enable visitor to search the content inside. However you can't rely on this search since most of the result appeared is not what you expected execept that blog affiliates google custom search like &lt;a href="http://www.mashable.com/"&gt;mashable.com&lt;/a&gt; have. Why the content results is not what you expected ? this caused by the weakness of relevance, synonyms and other common search engine features and fyi this search depends heavily on simple database query utilizing "LIKE %%' syntax.&lt;br /&gt;&lt;br /&gt;Google Search can help you to perform a search deeply to specific website you want with the power of google in their features like page rank, relevance, synonim, more targeted content etc.&lt;br /&gt;&lt;br /&gt;In this example, i use &lt;a href="http://www.uxbooth.com/"&gt;uxbooth.com &lt;/a&gt;site since this site is so many talks about Usability then we test their Search Usability :-p.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I would like to search with "long tail" and "usability" keyword. See what happened in their search result and try to click top 5 links from the result and check whether the search term you type inside the content.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_ss_NqUtJv6E/SwOCTuAOPvI/AAAAAAAAAEI/OvD6r0SMmeQ/s1600/FireShot+Pro+capture+%23019+-+%27Usability+I+UX+Booth%27+-+www_uxbooth_com__s%3Dusability.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5405307253052817138" style="WIDTH: 229px; HEIGHT: 320px" alt="" src="http://2.bp.blogspot.com/_ss_NqUtJv6E/SwOCTuAOPvI/AAAAAAAAAEI/OvD6r0SMmeQ/s320/FireShot+Pro+capture+%23019+-+%27Usability+I+UX+Booth%27+-+www_uxbooth_com__s%3Dusability.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_ss_NqUtJv6E/SwOCS2ir94I/AAAAAAAAAEA/VlDUqZcjhTI/s1600/FireShot+Pro+capture+%23018+-+%27Long+Tail+I+UX+Booth%27+-+www_uxbooth_com__s%3Dlong%2Btail.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5405307238164985730" style="WIDTH: 230px; HEIGHT: 320px" alt="" src="http://4.bp.blogspot.com/_ss_NqUtJv6E/SwOCS2ir94I/AAAAAAAAAEA/VlDUqZcjhTI/s320/FireShot+Pro+capture+%23018+-+%27Long+Tail+I+UX+Booth%27+-+www_uxbooth_com__s%3Dlong%2Btail.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Let's compare those with the google result where previously i typed site:http://www.uxbooth.com usability and site:http://www.uxbooth.com long tail into google search box.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_ss_NqUtJv6E/SwOCT08TMOI/AAAAAAAAAEQ/1hLO_sBKgC4/s1600/FireShot+Pro+capture+%23020+-+%27site_http___www_uxbooth_com+usability+-+Google+Search%27+-+www_google_com_search_hl%3Den%26client%3Dfirefox-a%26rls%3Dorg_mozilla%253Aen-US%253Aofficial%26q%3Dsite%253Ahttp%25.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5405307254915412194" style="WIDTH: 320px; HEIGHT: 266px" alt="" src="http://4.bp.blogspot.com/_ss_NqUtJv6E/SwOCT08TMOI/AAAAAAAAAEQ/1hLO_sBKgC4/s320/FireShot+Pro+capture+%23020+-+%27site_http___www_uxbooth_com+usability+-+Google+Search%27+-+www_google_com_search_hl%3Den%26client%3Dfirefox-a%26rls%3Dorg_mozilla%253Aen-US%253Aofficial%26q%3Dsite%253Ahttp%25.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_ss_NqUtJv6E/SwOCUEv1eVI/AAAAAAAAAEY/H4xmVixHiPg/s1600/FireShot+Pro+capture+%23021+-+%27site_http___www_uxbooth_com+long+tail+-+Google+Search%27+-+www_google_com_search_hl%3Den%26client%3Dfirefox-a%26rls%3Dorg_mozilla%253Aen-US%253Aofficial%26q%3Dsite%253Ahttp%25.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5405307259158100306" style="WIDTH: 320px; HEIGHT: 184px" alt="" src="http://3.bp.blogspot.com/_ss_NqUtJv6E/SwOCUEv1eVI/AAAAAAAAAEY/H4xmVixHiPg/s320/FireShot+Pro+capture+%23021+-+%27site_http___www_uxbooth_com+long+tail+-+Google+Search%27+-+www_google_com_search_hl%3Den%26client%3Dfirefox-a%26rls%3Dorg_mozilla%253Aen-US%253Aofficial%26q%3Dsite%253Ahttp%25.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;You see rite ? Google has better result and targeted whether you try to click the link result their should be information about the search term you typed in.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Conclusion &lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;Thank to google, they have better result that mean less time needed to search useful information inside specific website. Don't forget to put "site:url" and followed with the keyword you wanna search when you want to search deeply to specific website using Google and you can combine that syntax with other useful google search syntax as explained detail in &lt;a href="http://www.google.com/support/websearch/bin/answer.py?answer=136861"&gt;Google help&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335110-9131403676448577440?l=rizzblow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizzblow.blogspot.com/feeds/9131403676448577440/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8335110&amp;postID=9131403676448577440' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/9131403676448577440'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/9131403676448577440'/><link rel='alternate' type='text/html' href='http://rizzblow.blogspot.com/2009/11/utilize-google-search-to-search-keyword.html' title='Utilizing Google Search To Search Keyword From Content of a Website'/><author><name>Web Developer Indonesia</name><uri>http://www.blogger.com/profile/07987143157274849677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_ss_NqUtJv6E/SwlAPKMT1LI/AAAAAAAAAEk/smjBetsq0mo/S220/rizky.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_ss_NqUtJv6E/SwOCTuAOPvI/AAAAAAAAAEI/OvD6r0SMmeQ/s72-c/FireShot+Pro+capture+%23019+-+%27Usability+I+UX+Booth%27+-+www_uxbooth_com__s%3Dusability.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335110.post-9067079900971548056</id><published>2009-10-14T14:33:00.009+07:00</published><updated>2010-02-09T08:54:35.941+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='innodb'/><category scheme='http://www.blogger.com/atom/ns#' term='semaphore'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='webdeveloperindonesia'/><category scheme='http://www.blogger.com/atom/ns#' term='concurrency'/><title type='text'>How to handle concurrency in PHP</title><content type='html'>I know this is too academic to be explained further however this post is intended to be the practical way about how to handle concurrency issue in PHP+MySQL.&lt;br /&gt;Sometimes you will face the problem when you develop application where there is a shared resource and used concurrently by many application process runing. If we are not aware about concurrency then that shared resouce could be broken or miscalculated when more than one process of your application hit the shared resource.&lt;br /&gt;&lt;br /&gt;For java, C/C++/C#, Visual Basic and even classic ASP developer, i believe they have experienced about concurrecy and ACID feature of their database like MS-SQL, Oracle, PostgreSQL when implementing into business application like finance, inventory, accounting, etc but I found difficulty when explaining concurrency for PHP developer that only have used PHP+MYSQL(MyISAM) and has religious faith to certain Content Management System or Content Management Framework like Drupal, Joomla, and any other that relying on MySQL(MyISAM).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;An example i use here is simple e-commerce stock control of product item. Stock plays important role here to control users when they try to buy/reserve/claim a product item. Logically user allowed to buy/reserve a product item if the product item is still available in the stock. Unless they will see or notified by system that product item is out of stock or sold out.&lt;br /&gt;&lt;br /&gt;Lets have alook to the script&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;&lt;br /&gt;define('MYSQL_USER', 'testuser');&lt;br /&gt;define('MYSQL_PWD', 'password');&lt;br /&gt;define ('MYSQL_HOST', '192.168.56.2');&lt;br /&gt;define('MYSQL_DB', 'concurrency');&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;function db_connect() {&lt;br /&gt;static $db;&lt;br /&gt;if (!isset($db)) {&lt;br /&gt;  $db =new mysqli(MYSQL_HOST,MYSQL_USER, MYSQL_PWD, MYSQL_DB);&lt;br /&gt;   if (mysqli_connect_errno()) {&lt;br /&gt;    printf("Connect failed: %s\n", mysqli_connect_error());&lt;br /&gt;    exit();&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt; return $db;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$stock=db_connect()-&gt;query('select ammount from stock where productid=1 and ammount &gt; 0');&lt;br /&gt;$row=$stock-&gt;fetch_row();&lt;br /&gt;&lt;br /&gt;if ($row[0]&gt;0){&lt;br /&gt;&lt;br /&gt;  db_connect()-&gt;query('UPDATE stock SET ammount=' . ($row[0] - 1)  .' WHERE productid=1');&lt;br /&gt;  db_connect()-&gt;query('INSERT INTO order_product VALUES (null, 1,uuid(),1)');&lt;br /&gt;&lt;br /&gt;  print '&amp;lt;h2&amp;gt;SUCCESS&amp;lt;/h2&amp;gt;';&lt;br /&gt;}else {&lt;br /&gt;&lt;br /&gt; print '&amp;lt;h2&amp;gt;STOCK is OUT&amp;lt;/h2&amp;gt;';&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The problem of example(script) above will appear when many user concurrently try to buy the same product. Let's say we have 5 product item in our stock and the number of user want to buy is 10, 50, 100, or 500 concurrently. Do you still rely on this script:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;&lt;br /&gt;stock=db_connect()-&gt;query('select ammount from stock where productid=1 and ammount &gt; 0');&lt;br /&gt;$row=$stock-&gt;fetch_row();&lt;br /&gt;&lt;br /&gt;if ($row[0]&gt;0){&lt;br /&gt;&lt;br /&gt;db_connect()-&gt;query('UPDATE stock SET ammount=' . ($row[0] - 1) .' WHERE productid=1');&lt;br /&gt;db_connect()-&gt;query('INSERT INTO order_product VALUES (null, 1,uuid(),1)'); //uuid function used to fake userid&lt;br /&gt;&lt;br /&gt; print '&amp;lt;h2&amp;gt;SUCCESS&amp;lt;/h2&amp;gt;';&lt;br /&gt;}else {&lt;br /&gt;&lt;br /&gt; print '&amp;lt;h2&amp;gt;STOCK is OUT&amp;lt;/h2&amp;gt;';&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I always find some developer believe that the script above is OK and they never think about concurrency and they believe the process will be sequential automatically :-p. Lets do concurrent request to above script using apache benchmark (ab) :&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Initial data of stock:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mysql&gt; select stockid, productid from stock;&lt;br /&gt;+---------+-----------+---------+&lt;br /&gt;stockid  productid  ammount&lt;br /&gt;+---------+-----------+---------+&lt;br /&gt;      1          1        5&lt;br /&gt;+---------+-----------+---------+&lt;br /&gt;1 row in set (0.00 sec)&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Initial data of Order of product:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;br /&gt;mysql&gt; show create table order_product \G&lt;br /&gt;*************************** 1. row ***************************&lt;br /&gt;      Table: order_product&lt;br /&gt;Create Table: CREATE TABLE `order_product` (&lt;br /&gt; `orderid` int(4) NOT NULL AUTO_INCREMENT,&lt;br /&gt; `productid` int(4) NOT NULL,&lt;br /&gt; `uid` char(36) NOT NULL,&lt;br /&gt; `orderstatus` int(4) NOT NULL DEFAULT '0',&lt;br /&gt; PRIMARY KEY (`orderid`),&lt;br /&gt; KEY `productid` (`productid`)&lt;br /&gt;) ENGINE=InnoDB DEFAULT CHARSET=latin1&lt;br /&gt;1 row in set (0.00 sec)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;mysql&gt; select * from order_product;&lt;br /&gt;Empty set (0.00 sec)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;lets flood using ab and set 50 concurrent requests:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;rizky@Elmo:~$ ab -c 50 -n 100 http://www.rb.com/test/db.php&lt;br /&gt;This is ApacheBench, Version 2.3 &lt;$Revision: 655654 $&gt;&lt;br /&gt;Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/&lt;br /&gt;Licensed to The Apache Software Foundation, http://www.apache.org/&lt;br /&gt;&lt;br /&gt;Benchmarking www.rb.com (be patient).....done&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Server Software:        Apache/2.2.11&lt;br /&gt;Server Hostname:        www.rb.com&lt;br /&gt;Server Port:            80     &lt;br /&gt;&lt;br /&gt;Document Path:          /test/db.php&lt;br /&gt;Document Length:        19 bytes&lt;br /&gt;&lt;br /&gt;Concurrency Level:      50&lt;br /&gt;Time taken for tests:   0.887 seconds&lt;br /&gt;Complete requests:      100    &lt;br /&gt;Failed requests:        95     &lt;br /&gt;  (Connect: 0, Receive: 0, Length: 95, Exceptions: 0)&lt;br /&gt;Write errors:           0                       &lt;br /&gt;Total transferred:      31175 bytes             &lt;br /&gt;HTML transferred:       2375 bytes              &lt;br /&gt;Requests per second:    112.77 [#/sec] (mean)   &lt;br /&gt;Time per request:       443.362 [ms] (mean)     &lt;br /&gt;Time per request:       8.867 [ms] (mean, across all concurrent requests)&lt;br /&gt;Transfer rate:          34.33 [Kbytes/sec] received                &lt;br /&gt;&lt;br /&gt;Connection Times (ms)&lt;br /&gt;             min  mean[+/-sd] median   max&lt;br /&gt;Connect:        0    4   5.1      2      27&lt;br /&gt;Processing:    10   22  11.9     20      96&lt;br /&gt;Waiting:       10   22  11.1     19      88&lt;br /&gt;Total:         14   26  15.3     22     115&lt;br /&gt;&lt;br /&gt;Percentage of the requests served within a certain time (ms)&lt;br /&gt; 50%     22                                          &lt;br /&gt; 66%     25                                          &lt;br /&gt; 75%     29                                          &lt;br /&gt; 80%     30                                          &lt;br /&gt; 90%     34                                          &lt;br /&gt; 95%     41                                          &lt;br /&gt; 98%     99                                          &lt;br /&gt; 99%    115                                          &lt;br /&gt;100%    115 (longest request)&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Check to our stock now:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mysql&gt; select * from stock;&lt;br /&gt;+---------+-----------+---------+&lt;br /&gt;stockid  productid  ammount&lt;br /&gt;+---------+-----------+---------+&lt;br /&gt;      1          1        0&lt;br /&gt;+---------+-----------+---------+&lt;br /&gt;1 row in set (0.00 sec)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Check how many order of product we have now :&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mysql&gt; select * from order_product;&lt;br /&gt;+---------+-----------+--------------------------------------+-------------+&lt;br /&gt;orderid  productid  uid                                   orderstatus&lt;br /&gt;+---------+-----------+--------------------------------------+-------------+&lt;br /&gt;      1          1  71df191e-b889-11de-b26d-08002705b03f            1&lt;br /&gt;      2          1  71edb0e6-b889-11de-b26d-08002705b03f            1&lt;br /&gt;      3          1  71edbb9a-b889-11de-b26d-08002705b03f            1&lt;br /&gt;      4          1  71edd79c-b889-11de-b26d-08002705b03f            1&lt;br /&gt;      5          1  71eddf80-b889-11de-b26d-08002705b03f            1&lt;br /&gt;      6          1  71ee06c2-b889-11de-b26d-08002705b03f            1&lt;br /&gt;      7          1  71eec0da-b889-11de-b26d-08002705b03f            1&lt;br /&gt;      8          1  71eee29a-b889-11de-b26d-08002705b03f            1&lt;br /&gt;      9          1  71f1328e-b889-11de-b26d-08002705b03f            1&lt;br /&gt;+---------+-----------+--------------------------------------+-------------+&lt;br /&gt;9 rows in set (0.00 sec)&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;How come there are 9 orders ? should be 5 right ? cos you only have 5 product item in stock. For developers who believe the order must be 5 using this methods i think need to change you view and need more books to eat. Anyway i think this's fair cos i have seen a lot of PHP book never explain about concurrency and off cource the PHP itself it's not intended to be multithreaded languange.&lt;br /&gt;&lt;br /&gt;Do you know &lt;strong&gt;&lt;u&gt;PHP IS ALSO UNIX&lt;/u&gt;&lt;/strong&gt;? YES. So We can use POSIX UNIX feature like semaphore to handle this concurrency problem. How ? Lets change the script using semaphore. You can read about semaphore, mutex, or race condition in unix programming book or freely at wikipedia.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;define ('MYSQL_USER', 'testuser');&lt;br /&gt;define('MYSQL_PWD', 'password');&lt;br /&gt;define ('MYSQL_HOST', 'localhost');&lt;br /&gt;define('MYSQL_DB', 'concurrency');&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;function db_connect() {&lt;br /&gt;static $db;&lt;br /&gt;if (!isset($db)) {&lt;br /&gt;         $db =new mysqli(MYSQL_HOST,MYSQL_USER, MYSQL_PWD, MYSQL_DB);&lt;br /&gt;          if (mysqli_connect_errno()) {&lt;br /&gt;           printf("Connect failed: %s\n", mysqli_connect_error());&lt;br /&gt;           exit();&lt;br /&gt;          }&lt;br /&gt;}&lt;br /&gt; return $db;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function openlock() {&lt;br /&gt;$SEMKEY='123456'; //do you think better to change ftok()&lt;br /&gt;$seg = sem_get( $SEMKey, 1, 0666, -1) ;&lt;br /&gt;return $seg;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;function releaselock($sem){&lt;br /&gt;sem_release($sem);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function getlock($seg) {&lt;br /&gt;return sem_acquire($seg);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$sem=openlock();&lt;br /&gt;if (getlock($sem)) {&lt;br /&gt;$stock=db_connect()-&gt;query('select ammount from stock where productid=1 and ammount &gt; 0');&lt;br /&gt;$row=$stock-&gt;fetch_row();&lt;br /&gt;&lt;br /&gt;if ($row[0]&gt;0){&lt;br /&gt;&lt;br /&gt;  db_connect()-&gt;query('UPDATE stock SET ammount=' . ($row[0] - 1)  .' WHERE productid=1');&lt;br /&gt;  db_connect()-&gt;query('INSERT INTO order_product VALUES (null, 1,uuid(),1)');&lt;br /&gt;&lt;br /&gt;    print '&amp;lt;h2&amp;gt;SUCCESS&amp;lt;/h2&amp;gt;';&lt;br /&gt;}else {&lt;br /&gt;&lt;br /&gt; print '&amp;lt;h2&amp;gt;STOCK is OUT&amp;lt;/h2&amp;gt;';&lt;br /&gt;}&lt;br /&gt;releaselock($sem);&lt;br /&gt;}else {&lt;br /&gt;print '&lt;h2&gt;TRY AGAIN&lt;/h2&gt;';&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Semaphore is one of reliable way to protect variable or shared resource to be used simmultanously by many process although it does not prevent resource deadlock and it does not provide rollback or ACID feature.&lt;br /&gt;&lt;br /&gt;Other way you can do are by using mysql transactional storage engine like innodb and mysql get_lock() function.&lt;br /&gt;&lt;br /&gt;Using transaction in innodb:&lt;br /&gt;I think this is more reliable than other since transaction has ACID features that guaranty your data to be more consistent and durable.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;&lt;br /&gt;define('MYSQL_USER', 'testuser');&lt;br /&gt;define('MYSQL_PWD', 'password');&lt;br /&gt;define ('MYSQL_HOST', '192.168.56.2');&lt;br /&gt;define('MYSQL_DB', 'concurrency');&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;function db_connect() {&lt;br /&gt;static $db;&lt;br /&gt;if (!isset($db)) {&lt;br /&gt;  $db =new mysqli(MYSQL_HOST,MYSQL_USER, MYSQL_PWD, MYSQL_DB);&lt;br /&gt;   if (mysqli_connect_errno()) {&lt;br /&gt;    printf("Connect failed: %s\n", mysqli_connect_error());&lt;br /&gt;    exit();&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt; return $db;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;db_connect()-&gt;query('SET autocommit=0');&lt;br /&gt;db_connect()-&gt;query('START TRANSACTION');&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$stock=db_connect()-&gt;query('select ammount from stock where productid=1 and ammount &gt; 0 FOR UPDATE');&lt;br /&gt;$row=$stock-&gt;fetch_row();&lt;br /&gt;&lt;br /&gt;if ($row[0]&gt;0){&lt;br /&gt;  db_connect()-&gt;query('UPDATE stock SET ammount=' . ($row[0] - 1)  .' WHERE productid=1');&lt;br /&gt;  db_connect()-&gt;query('INSERT INTO order_product VALUES (null, 1,uuid(),1)');&lt;br /&gt;  db_connect()-&gt;query('COMMIT');&lt;br /&gt;    print '&amp;lt;h2&amp;gt;SUCCESS&amp;lt;/h2&amp;gt;';&lt;br /&gt;}else {&lt;br /&gt;&lt;br /&gt; print '&amp;lt;h2&amp;gt;STOCK is OUT&amp;lt;/h2&amp;gt;';&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;?&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Using mysql get_lock function:&lt;br /&gt;I like this function we can define the timeout to acquire the lock in one of the argument.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;query('select get_lock("mylock", 10)');&lt;br /&gt;$lock=$mylock-&gt;fetch_row();&lt;br /&gt;return $lock[0];&lt;br /&gt;}&lt;br /&gt;function releaselock(){&lt;br /&gt;db_connect()-&gt;query('select release_lock("mylock")');&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function isfreelock() {&lt;br /&gt;$mylock=db_connect()-&gt;query('select is_free_lock("mylock")');&lt;br /&gt;$lock=$mylock-&gt;fetch_row();&lt;br /&gt;return $lock[0];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;if (getlock()) {&lt;br /&gt;$stock=db_connect()-&gt;query('select ammount from stock where productid=1 and ammount &gt; 0');&lt;br /&gt;$row=$stock-&gt;fetch_row();&lt;br /&gt;&lt;br /&gt;if ($row[0]&gt;0){&lt;br /&gt;&lt;br /&gt;  db_connect()-&gt;query('UPDATE stock SET ammount=' . ($row[0] - 1)  .' WHERE productid=1');&lt;br /&gt;  db_connect()-&gt;query('INSERT INTO order_product VALUES (null, 1,uuid(),1)');&lt;br /&gt;&lt;br /&gt;  print '&amp;lt;h2&amp;amp;gtSUCCESS&amp;lt;/h2&gt;';&lt;br /&gt;}else {&lt;br /&gt;&lt;br /&gt; print '&amp;lt;h2&amp;amp;gtSTOCK is OUT&amp;lt;/h2&gt;';&lt;br /&gt;}&lt;br /&gt;releaselock();&lt;br /&gt;}else {&lt;br /&gt;print '&amp;lt;h2&amp;gt;TRY AGAIN&amp;lt;/h2&gt;';&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;You can test the script above using ab and you can set number of concurrent request you like.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335110-9067079900971548056?l=rizzblow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizzblow.blogspot.com/feeds/9067079900971548056/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8335110&amp;postID=9067079900971548056' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/9067079900971548056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/9067079900971548056'/><link rel='alternate' type='text/html' href='http://rizzblow.blogspot.com/2009/10/how-to-handle-concurrency-in-php.html' title='How to handle concurrency in PHP'/><author><name>Web Developer Indonesia</name><uri>http://www.blogger.com/profile/07987143157274849677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_ss_NqUtJv6E/SwlAPKMT1LI/AAAAAAAAAEk/smjBetsq0mo/S220/rizky.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335110.post-424824791168696952</id><published>2009-10-09T13:57:00.002+07:00</published><updated>2009-10-12T12:22:06.105+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='drizzle'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><title type='text'>Finally i have Drizzle installed</title><content type='html'>After figthing with compilation on my Jaunty Ubuntu then i can have my own drizzle.&lt;br /&gt;&lt;br /&gt;Start the server:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;rizky@Elmo:/usr/local$ sudo drizzled --no-defaults --user=drizzle  --basedir=/usr/local/  --datadir=/usr/local/drizzle/data/ &gt;&gt; /usr/local/drizzle/drizzle.err &amp;amp;&lt;br /&gt;[1] 9792&lt;br /&gt;rizky@Elmo:/usr/local$ InnoDB: The InnoDB memory heap is disabled&lt;br /&gt;InnoDB: Mutexes and rw_locks use GCC atomic builtins.&lt;br /&gt;091009 13:55:52  InnoDB: highest supported file format is Barracuda.&lt;br /&gt;091009 13:55:52 InnoDB Plugin 1.0.3 started; log sequence number 48107&lt;br /&gt;Listening on 0.0.0.0:4427&lt;br /&gt;Listening on :::4427&lt;br /&gt;drizzled: Forcing close of thread 0  user: '(null)'&lt;br /&gt;drizzled: ready for connections.&lt;br /&gt;Version: '2009.09.1144' Source distribution (trunk)&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Connect as client&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;rizky@Elmo:~$ drizzle&lt;br /&gt;Welcome to the Drizzle client..  Commands end with ; or \g.&lt;br /&gt;Your Drizzle connection id is 2&lt;br /&gt;Server version: 2009.09.1144 Source distribution (trunk)&lt;br /&gt;&lt;br /&gt;Type 'help;' or '\h' for help. Type '\c' to clear the buffer.&lt;br /&gt;&lt;br /&gt;drizzle&gt; select version();&lt;br /&gt;+--------------+&lt;br /&gt;| version()    |&lt;br /&gt;+--------------+&lt;br /&gt;| 2009.09.1144 |&lt;br /&gt;+--------------+&lt;br /&gt;1 row in set (0 sec)&lt;br /&gt;&lt;br /&gt;drizzle&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;There are alot different in feature than mysql &lt;a href="http://drizzle.org/wiki/MySQL_Differences"&gt;http://drizzle.org/wiki/MySQL_Differences&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335110-424824791168696952?l=rizzblow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizzblow.blogspot.com/feeds/424824791168696952/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8335110&amp;postID=424824791168696952' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/424824791168696952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/424824791168696952'/><link rel='alternate' type='text/html' href='http://rizzblow.blogspot.com/2009/10/finally-i-have-drizzle-installed.html' title='Finally i have Drizzle installed'/><author><name>Web Developer Indonesia</name><uri>http://www.blogger.com/profile/07987143157274849677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_ss_NqUtJv6E/SwlAPKMT1LI/AAAAAAAAAEk/smjBetsq0mo/S220/rizky.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335110.post-3988528246924329822</id><published>2009-09-29T10:33:00.004+07:00</published><updated>2011-04-09T15:06:55.785+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='informationschema'/><title type='text'>How many tables in a certain database ?</title><content type='html'>My friend asked me regarding how to count the number of table in a certain MySQL database. As we might know that we can do this using many ways however that i believe there is a fastest way to do this rather than making script or parsing SHOW TABLES statement.&lt;br /&gt;&lt;br /&gt;MySQL provides Information_Schema containing meta information about your databases, tables, fields, index, privileges, views, and many more meaning we can query it to capture the number of table in a database using the following query :&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;SELECT count(*) FROM `TABLES` WHERE TABLE_SCHEMA='name-of-database'&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335110-3988528246924329822?l=rizzblow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizzblow.blogspot.com/feeds/3988528246924329822/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8335110&amp;postID=3988528246924329822' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/3988528246924329822'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/3988528246924329822'/><link rel='alternate' type='text/html' href='http://rizzblow.blogspot.com/2009/09/how-many-tables-in-certain-database.html' title='How many tables in a certain database ?'/><author><name>Web Developer Indonesia</name><uri>http://www.blogger.com/profile/07987143157274849677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_ss_NqUtJv6E/SwlAPKMT1LI/AAAAAAAAAEk/smjBetsq0mo/S220/rizky.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335110.post-3084153632146397863</id><published>2009-09-11T09:21:00.008+07:00</published><updated>2009-10-09T13:30:25.518+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='spring webflow'/><category scheme='http://www.blogger.com/atom/ns#' term='jasper server'/><title type='text'>When My Jasper Server Got Trouble</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;span style=";font-family:trebuchet ms;font-size:100%;"  &gt;As Business Intelligence tool, it's so frequently used by my company's client to keep track daily, monthly activities  in their portal such as membership growth, number of each classifieds ads, trend of specific ad category and many more. These functionalities easily generated in Jasper Server. &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:trebuchet ms;font-size:100%;"  &gt;Recently i face some error reported with the following error appears when user try to login:&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;pre&gt;&lt;br /&gt;java.lang.NoClassDefFoundError: Could not initialize class org.springframework.webflow.util.RandomGuid&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;root error: org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.lang.NoClassDefFoundError: Could not initialize class org.springframework.webflow.util.RandomGuid&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;From the error text above i previously tot that it caused by no class loaded in lib (library) directory or undefined $CLASSPATH  where in Java world there are two kind of classes related exception that i often face :  java.lang.ClassNotFoundException and java.lang.NoClassDefFoundErro&lt;/span&gt;r. But when i went trough to RandomGuid of spring webflow source code :&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;a href="http://www.docjar.com/html/api/org/springframework/webflow/util/RandomGuid.java.html"&gt;http://www.docjar.com/html/api/org/springframework/webflow/util/RandomGuid.java.html&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;especially line #130&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;pre&gt;&lt;span style="font-size:100%;"&gt;&lt;b&gt;&lt;a name="x125"&gt;125&lt;/a&gt;&lt;/b&gt;   &lt;/span&gt;&lt;span style=";font-size:100%;color:brown;"  &gt;&lt;b&gt;static&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt; {&lt;br /&gt;&lt;b&gt;&lt;a name="x126"&gt;126&lt;/a&gt;&lt;/b&gt;     secureRandom = &lt;/span&gt;&lt;span style=";font-size:100%;color:brown;"  &gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt; &lt;a href="http://www.docjar.com/docs/api/java/security/SecureRandom.html"&gt;SecureRandom&lt;/a&gt;();&lt;br /&gt;&lt;b&gt;&lt;a name="x127"&gt;127&lt;/a&gt;&lt;/b&gt;     &lt;/span&gt;&lt;span style=";font-size:100%;color:brown;"  &gt;&lt;b&gt;long&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt; secureInitializer = secureRandom.nextLong();&lt;br /&gt;&lt;b&gt;&lt;a name="x128"&gt;128&lt;/a&gt;&lt;/b&gt;     random = &lt;/span&gt;&lt;span style=";font-size:100%;color:brown;"  &gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt; &lt;a href="http://www.docjar.com/docs/api/java/util/Random.html"&gt;Random&lt;/a&gt;(secureInitializer);&lt;br /&gt;&lt;b&gt;&lt;a name="x129"&gt;129&lt;/a&gt;&lt;/b&gt;     &lt;/span&gt;&lt;span style=";font-size:100%;color:brown;"  &gt;&lt;b&gt;try&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt; {&lt;br /&gt;&lt;b&gt;&lt;a name="x130"&gt;130&lt;/a&gt;&lt;/b&gt;       id = &lt;a href="http://www.docjar.com/docs/api/java/net/InetAddress.html"&gt;InetAddress&lt;/a&gt;.getLocalHost().toString();&lt;br /&gt;&lt;b&gt;&lt;a name="x131"&gt;131&lt;/a&gt;&lt;/b&gt;     }&lt;br /&gt;&lt;b&gt;&lt;a name="x132"&gt;132&lt;/a&gt;&lt;/b&gt;     &lt;/span&gt;&lt;span style=";font-size:100%;color:brown;"  &gt;&lt;b&gt;catch&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt; (&lt;a href="http://www.docjar.com/docs/api/java/net/UnknownHostException.html"&gt;UnknownHostException&lt;/a&gt; e) {&lt;br /&gt;&lt;b&gt;&lt;a name="x133"&gt;133&lt;/a&gt;&lt;/b&gt;       e.printStackTrace();&lt;br /&gt;&lt;b&gt;&lt;a name="x134"&gt;134&lt;/a&gt;&lt;/b&gt;     }&lt;br /&gt;&lt;b&gt;&lt;a name="x135"&gt;135&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;a name="x136"&gt;136&lt;/a&gt;&lt;/b&gt;   }&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style=";font-family:trebuchet ms;font-size:100%;"  &gt;&lt;br /&gt;There's attempt to get Localhost by invoking InetAddress.getLocalHost().toString() then i believe the problem must be caused by undefined hostname in /etc/hosts so i put the following definition&lt;br /&gt;&lt;br /&gt;127.0.0.1 localhost.localdomain &lt;/span&gt;&lt;span style=";font-family:trebuchet ms;font-size:100%;"  &gt;localhost &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:trebuchet ms;font-size:100%;"  &gt;&lt;br /&gt;on /etc/hosts of jasper server and i can login now without error prompted.&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335110-3084153632146397863?l=rizzblow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizzblow.blogspot.com/feeds/3084153632146397863/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8335110&amp;postID=3084153632146397863' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/3084153632146397863'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/3084153632146397863'/><link rel='alternate' type='text/html' href='http://rizzblow.blogspot.com/2009/09/when-my-jasper-server-got-trouble.html' title='When My Jasper Server Got Trouble'/><author><name>Web Developer Indonesia</name><uri>http://www.blogger.com/profile/07987143157274849677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_ss_NqUtJv6E/SwlAPKMT1LI/AAAAAAAAAEk/smjBetsq0mo/S220/rizky.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335110.post-5865042780674452266</id><published>2009-09-04T08:23:00.003+07:00</published><updated>2009-10-09T13:37:48.258+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='profiling'/><title type='text'>Profiling your query in MySQL</title><content type='html'>This week i have a new task to plan to migrate some data by merging it from one site reebonz.com.hk to the other one namely reebonz.com. Reebonz is online exclusive shopping site where everyday have branded events running in.&lt;br /&gt;&lt;br /&gt;There are two major requirements given of this migration namely without down time , only take &lt; 2 hours and no fail. Since there are many table has relationship each other so i can't just copy or insert directly to the destination tables. What i will do is heavily depended on all query injection using INSERT INTO ... SELECT statement where the inside its SELECT statement there will be JOIN some table either INNER, LEFT or OUTER. &lt;br /&gt;&lt;br /&gt;The two problems may be raised that i also currently face are the engine used is not transaction enabled engine, so i can't do atomic operation like COMMIT or ROLLBACK and i am afraid that the table could possibly be corrupted.  I need good plan to make me confident for doing this. One of the plan that i do before executing the merging process is Profiling all query i use. MySQL has a good feature for this besides EXPLAIN command as query execution plan.  To enable profiling in MySQL you can issue this command:  Check the status first  &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mysql&gt; select @@profiling;&lt;br /&gt;+-------------+&lt;br /&gt;| @@profiling |&lt;br /&gt;+-------------+&lt;br /&gt;| 0 |&lt;br /&gt;+-------------+&lt;br /&gt;1 row in set (0.00 sec)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;That means the profiling need to be activated by issuing&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mysql&gt; set @@session.profiling=1;&lt;br /&gt;Query OK, 0 rows affected (0.01 sec)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Then I execute my query:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;SELECT hk.uid, hk.email_notification_promo&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;FROM (&lt;br /&gt;SELECT b1.mail, b2.activation_status com_status, FROM_UNIXTIME( b1.created ) com_created, FROM_UNIXTIME( b1.access ) com_access&lt;br /&gt;FROM users&lt;br /&gt;..&lt;br /&gt;WHERE b1.uid = b2.uid&lt;br /&gt;AND (&lt;br /&gt;...&lt;br /&gt;)&lt;br /&gt;)com RIGHT OUTER JOIN (&lt;br /&gt;&lt;br /&gt;SELECT a1.*,&lt;br /&gt;...&lt;br /&gt;FROM ..&lt;br /&gt;WHERE a1.uid = a2.uid AND (&lt;br /&gt;...&lt;br /&gt;)&lt;br /&gt;) hk&lt;br /&gt;ON com.mail = hk.mail WHERE com.mail IS NULL&lt;/pre&gt;&lt;br /&gt;For first time this query will take so long. After that query successfully executed then you can issue this command:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mysql&gt; show profiles;&lt;br /&gt;+----------+-------------+------------------------&lt;br /&gt;| Query_ID | Duration | Query&lt;br /&gt;+----------+-------------+-------------------------&lt;br /&gt;| 1 | 0.00810900 | SHOW SESSION variables&lt;br /&gt;| 2 | 0.00095100 | SELECT b1.mail, b2.activ&lt;br /&gt;FROM users b1, bs_user b2&lt;br /&gt;WHERE b1.uid = b2.uid&lt;br /&gt;AND (&lt;br /&gt;b1.mail NOT LIKE '%@efusion-group.com'&lt;br /&gt;AND b1.mail NOT LIKE '%@efusion.com.sg'&lt;br /&gt;AND b1.mail NOT LIKE '%@reebonz.com'&lt;br /&gt;AN |&lt;br /&gt;| 3 | 17.10912400 | SELECT hk.uid, hk.name,&lt;br /&gt;| 4 | 0.00036000 | show profiles 2&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;and then&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mysql&gt; show profile all for query 2&lt;br /&gt;-&gt; ;&lt;br /&gt;+--------------------------------+----------+----------+------------+-------------------+---------------------+--------------+---------------+---------------+-------------------+-------------------+-------------------+-------+-----------------------+--------------+-------------+&lt;br /&gt;| Status | Duration | CPU_user | CPU_system | Context_voluntary | Context_involuntary | Block_ops_in | Block_ops_out | Messages_sent | Messages_received | Page_faults_major | Page_faults_minor | Swaps | Source_function | Source_file | Source_line |&lt;br /&gt;+--------------------------------+----------+----------+------------+-------------------+---------------------+--------------+---------------+---------------+-------------------+-------------------+-------------------+-------+-----------------------+--------------+-------------+&lt;br /&gt;| starting | 0.000289 | 0.000000 | 0.000000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | NULL | NULL | NULL |&lt;br /&gt;| checking query cache for query | 0.000408 | 0.000000 | 0.000000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 4 | 0 | send_result_to_client | sql_cache.cc | 1262 |&lt;br /&gt;| freeing items | 0.000195 | 0.000000 | 0.000000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 0 | mysql_parse | sql_parse.cc | 5827 |&lt;br /&gt;| logging slow query | 0.000023 | 0.000000 | 0.000000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | log_slow_statement | sql_parse.cc | 1628 |&lt;br /&gt;| cleaning up | 0.000036 | 0.000000 | 0.000000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | dispatch_command | sql_parse.cc | 1595 |&lt;br /&gt;+--------------------------------+----------+----------+------------+-------------------+---------------------+--------------+---------------+---------------+-------------------+-------------------+-------------------+-------+-----------------------+--------------+-------------+&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;You can see from the result above the time need to execute the query and also cpu usage, however currently it has no memory usage feature but i can rely on this information for my migration purpose.&lt;br /&gt;&lt;br /&gt;Another tune for this process is by disabling the slow query log and enabling query cache. The process &lt;span style="font-family:courier new;"&gt;logging slow query &lt;/span&gt;above no need to run and the query check the availability cache first if exist so no need to execute fully just grab from cache.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335110-5865042780674452266?l=rizzblow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizzblow.blogspot.com/feeds/5865042780674452266/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8335110&amp;postID=5865042780674452266' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/5865042780674452266'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/5865042780674452266'/><link rel='alternate' type='text/html' href='http://rizzblow.blogspot.com/2009/09/profiling-your-query-in-mysql.html' title='Profiling your query in MySQL'/><author><name>Web Developer Indonesia</name><uri>http://www.blogger.com/profile/07987143157274849677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_ss_NqUtJv6E/SwlAPKMT1LI/AAAAAAAAAEk/smjBetsq0mo/S220/rizky.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335110.post-3603054623238401010</id><published>2009-08-18T13:38:00.001+07:00</published><updated>2010-02-09T08:55:05.180+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='drupaldeveloperindonesia'/><category scheme='http://www.blogger.com/atom/ns#' term='indonesia'/><category scheme='http://www.blogger.com/atom/ns#' term='webdeveloperindonesia'/><title type='text'>Our First Drupal Mashup Lauched</title><content type='html'>After fighting with integration of many web service, finally we can launch our first &lt;a href="http://drupal.org/"&gt;Drupal&lt;/a&gt; mashup application for Singapore Community Site home &lt;a href="http://home.tampineseast.org.sg/"&gt;http://home.tampineseast.org.sg&lt;/a&gt;. This site is collective integration of the following web services or APIs:&lt;br /&gt;&lt;br /&gt;1. Authentication 3rd parties service with Facebook Connect, Google OpenID, and Yahoo Open ID.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ss_NqUtJv6E/S1QCbispdjI/AAAAAAAAAHI/gbPcKB1ghiE/s1600-h/tedc_login.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 153px; height: 200px;" src="http://2.bp.blogspot.com/_ss_NqUtJv6E/S1QCbispdjI/AAAAAAAAAHI/gbPcKB1ghiE/s200/tedc_login.PNG" border="0" alt="" id="BLOGGER_PHOTO_ID_5427966123082085938" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2. Video with Youtube.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ss_NqUtJv6E/S1QCoC-NzII/AAAAAAAAAHQ/kaicyFQCtTs/s1600-h/tedc_video.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 114px; height: 200px;" src="http://4.bp.blogspot.com/_ss_NqUtJv6E/S1QCoC-NzII/AAAAAAAAAHQ/kaicyFQCtTs/s200/tedc_video.PNG" border="0" alt="" id="BLOGGER_PHOTO_ID_5427966337904135298" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;3. Geolocation with Google Map and Google Earth.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ss_NqUtJv6E/S1QC0nEGIsI/AAAAAAAAAHg/XZcmQZvA6Vk/s1600-h/earth.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 200px; height: 122px;" src="http://3.bp.blogspot.com/_ss_NqUtJv6E/S1QC0nEGIsI/AAAAAAAAAHg/XZcmQZvA6Vk/s200/earth.PNG" border="0" alt="" id="BLOGGER_PHOTO_ID_5427966553750905538" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ss_NqUtJv6E/S1QC0dU6RSI/AAAAAAAAAHY/y-6JbllRPoQ/s1600-h/tedc_gmap.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 200px; height: 191px;" src="http://2.bp.blogspot.com/_ss_NqUtJv6E/S1QC0dU6RSI/AAAAAAAAAHY/y-6JbllRPoQ/s200/tedc_gmap.PNG" border="0" alt="" id="BLOGGER_PHOTO_ID_5427966551137076514" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;4. Directory Service with Yellow pages Singapore.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ss_NqUtJv6E/S1QDd6aEP7I/AAAAAAAAAIQ/4Rs9bshbypw/s1600-h/tedc_yp.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 66px; height: 200px;" src="http://2.bp.blogspot.com/_ss_NqUtJv6E/S1QDd6aEP7I/AAAAAAAAAIQ/4Rs9bshbypw/s200/tedc_yp.PNG" border="0" alt="" id="BLOGGER_PHOTO_ID_5427967263317966770" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;5. Photo with Flickr.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ss_NqUtJv6E/S1QDVWMo3OI/AAAAAAAAAII/JluAK2Z2GWQ/s1600-h/tedc_photo.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 135px; height: 200px;" src="http://4.bp.blogspot.com/_ss_NqUtJv6E/S1QDVWMo3OI/AAAAAAAAAII/JluAK2Z2GWQ/s200/tedc_photo.PNG" border="0" alt="" id="BLOGGER_PHOTO_ID_5427967116159016162" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;6. Comment and Status with Facebook.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ss_NqUtJv6E/S1QDKFyTwUI/AAAAAAAAAIA/Bgq_p7vXEFQ/s1600-h/tedc_profile_1.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 150px; height: 200px;" src="http://2.bp.blogspot.com/_ss_NqUtJv6E/S1QDKFyTwUI/AAAAAAAAAIA/Bgq_p7vXEFQ/s200/tedc_profile_1.PNG" border="0" alt="" id="BLOGGER_PHOTO_ID_5427966922775052610" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ss_NqUtJv6E/S1QDJsNNAmI/AAAAAAAAAH4/I_KVL_6Mr24/s1600-h/comments.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 130px; height: 200px;" src="http://2.bp.blogspot.com/_ss_NqUtJv6E/S1QDJsNNAmI/AAAAAAAAAH4/I_KVL_6Mr24/s200/comments.PNG" border="0" alt="" id="BLOGGER_PHOTO_ID_5427966915908534882" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ss_NqUtJv6E/S1QDJSbX2cI/AAAAAAAAAHw/OMBwqjNZwHU/s1600-h/tedc_friend_list.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 200px; height: 186px;" src="http://3.bp.blogspot.com/_ss_NqUtJv6E/S1QDJSbX2cI/AAAAAAAAAHw/OMBwqjNZwHU/s200/tedc_friend_list.PNG" border="0" alt="" id="BLOGGER_PHOTO_ID_5427966908988643778" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ss_NqUtJv6E/S1QDJJQ3LpI/AAAAAAAAAHo/1QjxH51bbSk/s1600-h/tedc_friends_status.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 150px; height: 200px;" src="http://2.bp.blogspot.com/_ss_NqUtJv6E/S1QDJJQ3LpI/AAAAAAAAAHo/1QjxH51bbSk/s200/tedc_friends_status.PNG" border="0" alt="" id="BLOGGER_PHOTO_ID_5427966906528640658" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335110-3603054623238401010?l=rizzblow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizzblow.blogspot.com/feeds/3603054623238401010/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8335110&amp;postID=3603054623238401010' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/3603054623238401010'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/3603054623238401010'/><link rel='alternate' type='text/html' href='http://rizzblow.blogspot.com/2009/08/our-first-drupal-mashup-lauched.html' title='Our First Drupal Mashup Lauched'/><author><name>Web Developer Indonesia</name><uri>http://www.blogger.com/profile/07987143157274849677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_ss_NqUtJv6E/SwlAPKMT1LI/AAAAAAAAAEk/smjBetsq0mo/S220/rizky.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_ss_NqUtJv6E/S1QCbispdjI/AAAAAAAAAHI/gbPcKB1ghiE/s72-c/tedc_login.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335110.post-3394053689742455437</id><published>2009-08-12T06:25:00.001+07:00</published><updated>2009-09-24T07:14:12.375+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='searchengine'/><title type='text'>Finding other websites using the same IP with You</title><content type='html'>Sometimes when we need to host our website to hosting company, we are always wondering how good the hosting company server and how good they manage bandwidth and also how many website reside on single IP/Server.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bing.com/"&gt;Bing.com&lt;/a&gt; has a feature making you possible to  know your neighbors that use the same IP/server by invoking the following command in its search box:&lt;br /&gt;&lt;br /&gt;IP:[the ip address]&lt;br /&gt;&lt;br /&gt;Here is example: i want to know who else use the same ip with &lt;a href="http://www.myesia.com/"&gt;myesia.com&lt;/a&gt; (this is website of CDMA operator in indonesia).&lt;br /&gt;&lt;br /&gt;First i need to know the IP of myesia.com by issuing nslookup :&lt;br /&gt;&lt;br /&gt;C:\Users\Rizky&gt;nslookup -type=A myesia.com&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;Non-authoritative answer:&lt;br /&gt;Name:    myesia.com&lt;br /&gt;Address:  203.130.198.38&lt;br /&gt;&lt;br /&gt;then i found 203.130.198.38 used to served myesia.com and finally i go to bing.com to search:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ss_NqUtJv6E/Srq2j7Q0gSI/AAAAAAAAACQ/7KSTXakg2u4/s1600-h/myesiacom-bing.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 243px;" src="http://4.bp.blogspot.com/_ss_NqUtJv6E/Srq2j7Q0gSI/AAAAAAAAACQ/7KSTXakg2u4/s320/myesiacom-bing.png" alt="" id="BLOGGER_PHOTO_ID_5384817032794767650" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It looks like a lot of website reside there. Is this good for you ? It depends on how your hosting company implement their resource/server and how you expect from this website, if they implement clustering then that will be OK for one IP serving many websites. On the other hand you will  share bandwith, disk, and memory with your neighbor. Or it's also OK if your website has no traffic :-P.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335110-3394053689742455437?l=rizzblow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizzblow.blogspot.com/feeds/3394053689742455437/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8335110&amp;postID=3394053689742455437' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/3394053689742455437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/3394053689742455437'/><link rel='alternate' type='text/html' href='http://rizzblow.blogspot.com/2009/08/finding-other-website-using-same-ip.html' title='Finding other websites using the same IP with You'/><author><name>Web Developer Indonesia</name><uri>http://www.blogger.com/profile/07987143157274849677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_ss_NqUtJv6E/SwlAPKMT1LI/AAAAAAAAAEk/smjBetsq0mo/S220/rizky.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_ss_NqUtJv6E/Srq2j7Q0gSI/AAAAAAAAACQ/7KSTXakg2u4/s72-c/myesiacom-bing.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335110.post-6984191722588270447</id><published>2009-08-08T14:24:00.002+07:00</published><updated>2010-02-09T08:55:28.091+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='webdeveloperindonesia'/><title type='text'>Reducing PHP Memory Usage</title><content type='html'>Previously i post about &lt;a href="http://rizzblow.blogspot.com/2009/09/basic-php-memory-usage.html"&gt;how to know php memory usage&lt;/a&gt; in that post i stated that php has useful function to retrieve memory usage of each request made by browser or http client. For simple php script the memory used is really small but when the application getting complex such as  CMS , DMS or even Portal, the memory usage of these type applications is getting larger and larger ( 64 - 128 M).  &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There is a way provided to reduce memory usage by implementing opcode cache.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="text-decoration: underline;"&gt;What is opcode cache ?&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Common process occured when running php script&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;LEXING ---&gt; PARSING ---&gt; COMPILING ---&gt;RUN&lt;/b&gt;&lt;/div&gt;&lt;div&gt;    (1)                     (2)                        (3)                       (4)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When the opcode cache enabled we omit  process LEXING (1), PARSING(2), and COMPILING(3) and this cause memory reduction.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In PHP there are well known opcode cache that can be used such as &lt;a href="http://id2.php.net/apc"&gt;apc&lt;/a&gt;, &lt;a href="http://xcache.lighttpd.net/"&gt;xcache&lt;/a&gt; and &lt;a href="http://eaccelerator.net/"&gt;accelerator&lt;/a&gt;. For Windows user especially XAMMP you can just enable it within php.ini and for linux we can do yum / apt-get / compile manually. Currently i use eaccelerator and it is true, can reduce memory 40 -50%   and make one of my clients portal run more scalable especially for HTTP server.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335110-6984191722588270447?l=rizzblow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizzblow.blogspot.com/feeds/6984191722588270447/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8335110&amp;postID=6984191722588270447' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/6984191722588270447'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/6984191722588270447'/><link rel='alternate' type='text/html' href='http://rizzblow.blogspot.com/2010/01/reducing-php-memory-usage.html' title='Reducing PHP Memory Usage'/><author><name>Web Developer Indonesia</name><uri>http://www.blogger.com/profile/07987143157274849677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_ss_NqUtJv6E/SwlAPKMT1LI/AAAAAAAAAEk/smjBetsq0mo/S220/rizky.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335110.post-5908735074547153831</id><published>2009-07-30T13:31:00.000+07:00</published><updated>2009-09-29T13:36:10.014+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='timestamp'/><category scheme='http://www.blogger.com/atom/ns#' term='cloud'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='drupal'/><title type='text'>MySQL Timestamp saves us</title><content type='html'>&lt;div&gt;Previously i never care about timestamp datatype, The two things that i know about it just saving date data type into an efficient manner (INTEGER) and the other thing is it has limitation of range date can be stored (The range is '1970-01-01 00:00:01' UTC to '2038-01-09&lt;br /&gt;03:14:07' UTC).&lt;br /&gt;&lt;br /&gt;Currently we are planning to change our infrastructure strategy where previously we host and manage servers by ourselft or build our own data center internally to Cloud Environment (one of rackspace services). we are running our site for south east asia, hongkong, and australia users and a problem appear regarding date/time differences between the countries i mentioned and the country (US) of cloud service resides. And some of our application inside depend heavily on date and time.&lt;br /&gt;&lt;br /&gt;The Cloud service we have no ssh access/root access of either in the OS or MySQL so both follow (US) timezone. This is problem for us and we try to think how can we present date info when our singaporean user visiting our site.&lt;br /&gt;&lt;br /&gt;Lucky, this site powered by drupal where almost all table in drupal having datetime type are using timestamp data type. However there a few table built by our developers using conventional datetime data type.&lt;br /&gt;&lt;br /&gt;Here is example node table from drupal. There are some field for storing datetime in INTEGER format namely created, accessed, and changed.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mysql&gt; show create table node \G&lt;br /&gt;&lt;br /&gt;*************************** 1. row ***************************&lt;br /&gt;&lt;br /&gt;       Table: node                                           &lt;br /&gt;&lt;br /&gt;Create Table: CREATE TABLE `node` (                          &lt;br /&gt;&lt;br /&gt;  `nid` int(10) unsigned NOT NULL AUTO_INCREMENT,            &lt;br /&gt;&lt;br /&gt;  `vid` int(10) unsigned NOT NULL DEFAULT '0',               &lt;br /&gt;&lt;br /&gt;  `type` varchar(32) NOT NULL DEFAULT '',                    &lt;br /&gt;&lt;br /&gt;  `language` varchar(12) NOT NULL DEFAULT '',                &lt;br /&gt;&lt;br /&gt;  `title` varchar(255) NOT NULL DEFAULT '',                  &lt;br /&gt;&lt;br /&gt;  `uid` int(11) NOT NULL DEFAULT '0',                        &lt;br /&gt;&lt;br /&gt;  `status` int(11) NOT NULL DEFAULT '1',                     &lt;br /&gt;&lt;br /&gt;  `created` int(11) NOT NULL DEFAULT '0',                    &lt;br /&gt;&lt;br /&gt;  `changed` int(11) NOT NULL DEFAULT '0',                    &lt;br /&gt;&lt;br /&gt;  `comment` int(11) NOT NULL DEFAULT '0',                    &lt;br /&gt;&lt;br /&gt;  `promote` int(11) NOT NULL DEFAULT '0',                    &lt;br /&gt;&lt;br /&gt;  `moderate` int(11) NOT NULL DEFAULT '0',                   &lt;br /&gt;&lt;br /&gt;  `sticky` int(11) NOT NULL DEFAULT '0',                     &lt;br /&gt;&lt;br /&gt;  `tnid` int(10) unsigned NOT NULL DEFAULT '0',              &lt;br /&gt;&lt;br /&gt;  `translate` int(11) NOT NULL DEFAULT '0',                  &lt;br /&gt;&lt;br /&gt;  PRIMARY KEY (`nid`),                                       &lt;br /&gt;&lt;br /&gt;  UNIQUE KEY `vid` (`vid`),                                  &lt;br /&gt;&lt;br /&gt;  KEY `node_changed` (`changed`),                            &lt;br /&gt;&lt;br /&gt;  KEY `node_created` (`created`),                            &lt;br /&gt;&lt;br /&gt;  KEY `node_moderate` (`moderate`),                          &lt;br /&gt;&lt;br /&gt;  KEY `node_promote_status` (`promote`,`status`),            &lt;br /&gt;&lt;br /&gt;  KEY `node_status_type` (`status`,`type`,`nid`),            &lt;br /&gt;&lt;br /&gt;  KEY `node_title_type` (`title`,`type`(4)),                 &lt;br /&gt;&lt;br /&gt;  KEY `node_type` (`type`(4)),                               &lt;br /&gt;&lt;br /&gt;  KEY `uid` (`uid`),                                         &lt;br /&gt;&lt;br /&gt;  KEY `tnid` (`tnid`),                                       &lt;br /&gt;&lt;br /&gt;  KEY `translate` (`translate`)                              &lt;br /&gt;&lt;br /&gt;) ENGINE=MyISAM AUTO_INCREMENT=2164 DEFAULT CHARSET=utf8&lt;br /&gt;&lt;br /&gt;1 row in set (0.00 sec)&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;And another thing that make us easier that drupal has already made timezone module and perfectly fit with our requirement so we just configure the timezone for our drupal site then we dont have problem anymore regarding how to present date and time to our users and our application.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_ss_NqUtJv6E/SsGqkbOacII/AAAAAAAAACY/NuiD1Ez3I9Q/s1600-h/timezone-drupal.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5386774172072046722" style="WIDTH: 181px; CURSOR: hand; HEIGHT: 320px" alt="" src="http://3.bp.blogspot.com/_ss_NqUtJv6E/SsGqkbOacII/AAAAAAAAACY/NuiD1Ez3I9Q/s320/timezone-drupal.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Finally i just can say, the timestamp is portable data for datetime when you need to build international web application. Whatever timezone you want you can dynamically set it for your application&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335110-5908735074547153831?l=rizzblow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizzblow.blogspot.com/feeds/5908735074547153831/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8335110&amp;postID=5908735074547153831' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/5908735074547153831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/5908735074547153831'/><link rel='alternate' type='text/html' href='http://rizzblow.blogspot.com/2009/07/mysql-timestamp-saves-us.html' title='MySQL Timestamp saves us'/><author><name>Web Developer Indonesia</name><uri>http://www.blogger.com/profile/07987143157274849677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_ss_NqUtJv6E/SwlAPKMT1LI/AAAAAAAAAEk/smjBetsq0mo/S220/rizky.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_ss_NqUtJv6E/SsGqkbOacII/AAAAAAAAACY/NuiD1Ez3I9Q/s72-c/timezone-drupal.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335110.post-4088523885019658298</id><published>2009-07-26T04:54:00.006+07:00</published><updated>2010-02-09T08:55:48.573+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='prefork'/><category scheme='http://www.blogger.com/atom/ns#' term='memory'/><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><category scheme='http://www.blogger.com/atom/ns#' term='webdeveloperindonesia'/><title type='text'>Basic PHP Memory Usage</title><content type='html'>&lt;span style="font-family:trebuchet ms;"&gt;Recently i am suffering out of memory at web server made and start swapping the process to the disk. This out of memory caused by many simultaneous connections and the apache configuration is not properly configured.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;I tried to find the away and analyze the memory usage of my php web application. I found there are two ways to get memory usage in PHP/Apache and may be useful to reconfigure the web server as follows:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;1. invoking php function&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;memory_get_usage()&lt;span style="font-family:Courier;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;echo "Start App";&lt;br /&gt;&lt;br /&gt;echo "First time memory allocated is:" . memory_get_usage() . "&lt;br /&gt;";&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;* Try to use memory by assigning variable $test_var&lt;br /&gt;&lt;br /&gt;*/&lt;br /&gt;$a = str_repeat("Hello", 4242);&lt;br /&gt;$test_var=array( "Name" =&gt; "Rizky Rukmana",&lt;br /&gt;              "Occupation" =&gt; "Development Manager"&lt;br /&gt;             )  ;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;echo "After assigning the memory allocated is: " . memory_get_usage() . "&lt;br /&gt;";&lt;br /&gt;&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;it will output:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;Start App&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;First time memory allocated is:60416&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;After assigning the memory allocated is: 81920&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;2. watching RSS of each apache process by running the following command Fortunately the server is using MPM prefork:&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;~ www1# ps -ylC httpd --sort:rss&lt;br /&gt;&lt;br /&gt;S UID PID PPID C PRI NI RSS SZ WCHAN TTY TIME CMD&lt;br /&gt;S 0 2552 1 0 78 0 11388 7421 - ? 00:00:01 httpd&lt;br /&gt;S 48 9021 2552 0 75 0 25316 11359 semtim ? 00:02:09 httpd&lt;br /&gt;S 48 9900 2552 0 75 0 25540 11359 semtim ? 00:01:54 httpd&lt;br /&gt;S 48 9374 2552 0 75 0 25548 11359 semtim ? 00:02:03 httpd&lt;br /&gt;S 48 9772 2552 0 75 0 25572 11359 semtim ? 00:01:48 httpd&lt;br /&gt;S 48 9882 2552 0 75 0 25580 11361 semtim ? 00:01:41 httpd&lt;br /&gt;S 48 9637 2552 0 75 0 25592 11366 semtim ? 00:02:02 httpd&lt;br /&gt;S 48 13613 2552 0 75 0 25624 11373 semtim ? 00:00:58 httpd&lt;br /&gt;S 48 7749 2552 0 75 0 25688 11365 - ? 00:02:39 httpd&lt;br /&gt;S 48 13619 2552 0 75 0 25688 11366 semtim ? 00:01:04 httpd&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Courier;font-size:85%;"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;RSS is resident set size, the non-swapped physical memory that a task has used (in kiloBytes). (alias rssize, rsz).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;From those options above i can collect the memory usage at web server and calculate to define maximum concurrent connection allowed and avoiding disk swapping.&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335110-4088523885019658298?l=rizzblow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizzblow.blogspot.com/feeds/4088523885019658298/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8335110&amp;postID=4088523885019658298' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/4088523885019658298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/4088523885019658298'/><link rel='alternate' type='text/html' href='http://rizzblow.blogspot.com/2009/09/basic-php-memory-usage.html' title='Basic PHP Memory Usage'/><author><name>Web Developer Indonesia</name><uri>http://www.blogger.com/profile/07987143157274849677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_ss_NqUtJv6E/SwlAPKMT1LI/AAAAAAAAAEk/smjBetsq0mo/S220/rizky.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335110.post-9187100397982730654</id><published>2009-06-04T10:36:00.001+07:00</published><updated>2010-02-09T17:47:04.360+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='seoindonesia'/><category scheme='http://www.blogger.com/atom/ns#' term='searchengine'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>Menjadikan Google sebagai Integrated Research Tools.</title><content type='html'>Semua orang telah mengenal google sebagai search engine dengan kemampuan pencarian dan hasil pencarian yang menakjubkan. Namun banyak orang yang hanya mengetahui dan menggunakan google hanya untuk mencari sesuatu yang diinginkan dengan mensupply keyword-keyword yang pas.&lt;br /&gt;&lt;br /&gt;Google memiliki berapa macam perangkat yang dapat membantu kita dalam menganalisa pengguna internet(demand) dan penyedia internet (supply).Perangkat tersebut diantaranya:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.google.com/trends"&gt;&lt;span style="font-weight: bold;"&gt;1. Google Trend,&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;Perangkat yang biasa saya gunakan untuk mengetahui trends dari search tertentu. Google Trend mampu menampilkan hasil berdasarkan negara dan per kota.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ss_NqUtJv6E/SslqbyxmgbI/AAAAAAAAACg/8zMAZZiNGrQ/s1600-h/google_treends.jpg"&gt;&lt;img style="cursor: pointer; width: 320px; height: 161px;" src="http://1.bp.blogspot.com/_ss_NqUtJv6E/SslqbyxmgbI/AAAAAAAAACg/8zMAZZiNGrQ/s320/google_treends.jpg" alt="" id="BLOGGER_PHOTO_ID_5388955454844338610" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2. &lt;a href="https://adwords.google.com/select/KeywordToolExternal"&gt;Google Keyword Tools&lt;/a&gt;,&lt;br /&gt;&lt;br /&gt;Perangkat yang juga biasa saya gunakan untuk mencari search volume dari search term dan hasil bisa diklasifikasikan berdasarkan negara (local) dan global search volume. Sebenarnya perngkat ini digunakan para internet marketer untuk menganalisa search term yang akan mereka iklan kan dengan menggunakan Google Adwords.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ss_NqUtJv6E/SslrQLOe9jI/AAAAAAAAACo/wmsQgU52DLg/s1600-h/adword_keyword_tools.jpg"&gt;&lt;img style="cursor: pointer; width: 320px; height: 203px;" src="http://2.bp.blogspot.com/_ss_NqUtJv6E/SslrQLOe9jI/AAAAAAAAACo/wmsQgU52DLg/s320/adword_keyword_tools.jpg" alt="" id="BLOGGER_PHOTO_ID_5388956354761127474" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3. Google Suggest,&lt;br /&gt;Perangkat yang membantu kita untuk mengetahui search term yang biasa digunakan orang. Google menyimpan search term yang sering dicari dan menampilkannya untuk membantu pengguna search engine dalam mendefinisikan keywordnya.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ss_NqUtJv6E/SslrQ_OoO6I/AAAAAAAAAC4/2RvLnALO7L8/s1600-h/google_suggest.jpg"&gt;&lt;img style="cursor: pointer; width: 320px; height: 261px;" src="http://3.bp.blogspot.com/_ss_NqUtJv6E/SslrQ_OoO6I/AAAAAAAAAC4/2RvLnALO7L8/s320/google_suggest.jpg" alt="" id="BLOGGER_PHOTO_ID_5388956368720378786" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;4. &lt;a href="https://www.google.com/analytics/"&gt;Google Analytics&lt;/a&gt;&lt;br /&gt;Perangkat yang digunakan untuk tracking pengunjung website seperti visits, page views dan tracking usability website seperi bounch rate. Walaupun perangkat ini tidak realtime memberikan data statistik dan memiliki jeda 3 jam - 1 harian namun perangkat ini sangat kaya akan keperluan analisa Key Performance Index dari sebuah website.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ss_NqUtJv6E/SslrQqBAL4I/AAAAAAAAACw/HKD6cTI6d0E/s1600-h/google_analytics.jpg"&gt;&lt;img style="cursor: pointer; width: 320px; height: 146px;" src="http://2.bp.blogspot.com/_ss_NqUtJv6E/SslrQqBAL4I/AAAAAAAAACw/HKD6cTI6d0E/s320/google_analytics.jpg" alt="" id="BLOGGER_PHOTO_ID_5388956363026083714" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;5. &lt;a href="http://www.google.com/alerts"&gt;Google Alerts&lt;/a&gt;&lt;br /&gt;Dengan perangkat ini kita dapat mengetahui conversation yang terjadi dari berbagai blog dan situs social media pada saat itu. Hanya dengan mensupply keyword yang hendak di track akan google akan mengirimi email notifikasi dari website-website yang cocok dengan keyword kita.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ss_NqUtJv6E/SslrRT7r48I/AAAAAAAAADA/yyOykvBEawM/s1600-h/google-alerts.jpg"&gt;&lt;img style="cursor: pointer; width: 320px; height: 300px;" src="http://4.bp.blogspot.com/_ss_NqUtJv6E/SslrRT7r48I/AAAAAAAAADA/yyOykvBEawM/s320/google-alerts.jpg" alt="" id="BLOGGER_PHOTO_ID_5388956374278071234" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Kelima perangkat plus google search (local+internasional) memungkinkan kita untuk membuat Integrated Research Tool yang free, reliable, dan mudah.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335110-9187100397982730654?l=rizzblow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizzblow.blogspot.com/feeds/9187100397982730654/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8335110&amp;postID=9187100397982730654' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/9187100397982730654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/9187100397982730654'/><link rel='alternate' type='text/html' href='http://rizzblow.blogspot.com/2009/10/menjadikan-google-sebagai-integrated.html' title='Menjadikan Google sebagai Integrated Research Tools.'/><author><name>Web Developer Indonesia</name><uri>http://www.blogger.com/profile/07987143157274849677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_ss_NqUtJv6E/SwlAPKMT1LI/AAAAAAAAAEk/smjBetsq0mo/S220/rizky.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_ss_NqUtJv6E/SslqbyxmgbI/AAAAAAAAACg/8zMAZZiNGrQ/s72-c/google_treends.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335110.post-3131826374279453597</id><published>2009-05-28T11:56:00.002+07:00</published><updated>2009-10-21T12:15:49.864+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='recruitment'/><title type='text'>New Pattern in Recruitment</title><content type='html'>Last week i was so busy to interview some people for developers and team leaders position. These guys will be posted on our new team to develop something related to marketing and sales system. We expect to get experienced developer in PHP, CRUD operation on MySQL, PHP Framework like Zend, Javascript, and CMS like Drupal. However after filtering the application then we decide to remove Framework or CMS skill from our expectation cos we think they can learn asap when they get hired and i dont mind for this decision since we still have alot time to invest to it.&lt;br /&gt;&lt;br /&gt;We have two processes when we recruit for technical/developer position namely written test (we give list od simple questions) and technical interview. If both ok then we recruit.&lt;br /&gt;&lt;br /&gt;Actually there was what i am wondering that mostly of the applications and CVs they sent to me is intended to fill team leader positions and of course i dont mind cos i need to prepare some questions for them according to the level applied. Before conducting the interview previously i saw thoroughly their written test and their CV position cos i (and may be my bos) expect so much to this position.&lt;br /&gt;&lt;br /&gt;OMG i saw some of them can't do written test and even wrong in writing select query :-P But ok, i still has faith cos i see some of them based on the CV have experience using other languange like java,vb or c. The interview begins and almost all of them has the same question and do you believe they have Almost the same answer ? :-P&lt;br /&gt;&lt;br /&gt;1.Why do you think you are fit to the position you applied (teamleader) ?&lt;br /&gt;[applicants] cos now i am system analyst or team leader.&lt;br /&gt;&lt;br /&gt;2. How good are you in PHP ?&lt;br /&gt;[applicants]Yes i know php.&lt;br /&gt;&lt;br /&gt;3. Why your written test seems not php and more like javac#cvbsimple english ?&lt;br /&gt;[applicants] Cos at momment we are not using php so forget.&lt;br /&gt;&lt;br /&gt;4. What language you currently really really remember?&lt;br /&gt;[applicants]java  c#  c&lt;br /&gt;&lt;br /&gt;5. Do you know inhiritance (java)  do you know polymorpsm (c#)  do you know malloc() (c)?&lt;br /&gt;[applicants] oh sorry currently i am involved in bussiness analyst part.&lt;br /&gt;&lt;br /&gt;6. How do you manage when your developer ask you about PHP,SQL since you dont know about PHP, SQL ?&lt;br /&gt;[applicants] Oh i am genius/Einstein i can learn fast.&lt;br /&gt;&lt;br /&gt;7. Ok bye&lt;br /&gt;&lt;br /&gt;I share my experience above cos i found new the pattern in this recruitment that someone want to get higher position but dont have competency at all. Finally, after consuming 3 weeks for recruiting process, there are 2-4 web developers/teamleader candidates that save me to end this process and they are really good in PHP and has design pattern knowledge.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335110-3131826374279453597?l=rizzblow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizzblow.blogspot.com/feeds/3131826374279453597/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8335110&amp;postID=3131826374279453597' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/3131826374279453597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/3131826374279453597'/><link rel='alternate' type='text/html' href='http://rizzblow.blogspot.com/2009/05/new-pattern-in-recruitment.html' title='New Pattern in Recruitment'/><author><name>Web Developer Indonesia</name><uri>http://www.blogger.com/profile/07987143157274849677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_ss_NqUtJv6E/SwlAPKMT1LI/AAAAAAAAAEk/smjBetsq0mo/S220/rizky.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335110.post-6813077675517210922</id><published>2009-01-02T13:33:00.005+07:00</published><updated>2009-12-30T10:22:12.832+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Refresh: Ubuntu Package Management</title><content type='html'>Tampaknya harus merefresh lagi memory mengenai ubuntu khususnya mengenai package management-nya karena terlalu banyak bermain Redhat Family : RHEL, Centos, dan Fedora.&lt;br /&gt;&lt;br /&gt;Seperti yang kita ketahui di RedHat Family terdapat perintah rpm dan yum untuk package management-nya begitu juga dengan apa yang terdapat di Ubuntu ia memiliki tools/perintah berbeda yaitu dpkg dan apt-get dalam package management-nya.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Berikut ini command singkat yang biasa kita pergunakan sehari-hari dalam memanage&lt;br /&gt;package di ubuntu:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;dpkg&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Perintah ini digunakan untuk meninstall package file tipe *.deb yang terdapat di local, network computer dan internet.&lt;br /&gt;&lt;br /&gt;Install package aplikasi dengan perintah dpkg -i&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;rizky@Elmo:/var/cache/apt/archives$ sudo dpkg -i nginx_0.6.35-0ubuntu1_i386.deb&lt;br /&gt;Selecting previously deselected package nginx.&lt;br /&gt;(Reading database ... 103766 files and directories currently installed.)&lt;br /&gt;Unpacking nginx (from nginx_0.6.35-0ubuntu1_i386.deb) ...&lt;br /&gt;Setting up nginx (0.6.35-0ubuntu1) ...&lt;br /&gt;&lt;br /&gt;Processing triggers for man-db ...&lt;br /&gt;rizky@Elmo:/var/cache/apt/archives$&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Remove/Uninstall package dengan perintah dpkg -r dan dpkg -P&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;rizky@Elmo:/var/cache/apt/archives$ sudo dpkg -i nginx_0.6.35-0ubuntu1_i386.deb&lt;br /&gt;Selecting previously deselected package nginx.&lt;br /&gt;(Reading database ... 103766 files and directories currently installed.)&lt;br /&gt;Unpacking nginx (from nginx_0.6.35-0ubuntu1_i386.deb) ...&lt;br /&gt;Setting up nginx (0.6.35-0ubuntu1) ...&lt;br /&gt;&lt;br /&gt;Processing triggers for man-db ...&lt;br /&gt;rizky@Elmo:/var/cache/apt/archives$&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Note: Dengan perintah dpkg -r hanya menghapus file binary dan file configurasi tidak akan dihapus. Pada contoh unintall aplikasi nginx diatas, nginx memiliki file config terletak di /etc/nginx.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;rizky@Elmo:/var/www$ ll /etc/nginx/&lt;br /&gt;total 32&lt;br /&gt;-rw-r--r-- 1 root root  909 2009-02-21 04:12 fastcgi_params&lt;br /&gt;-rw-r--r-- 1 root root 2837 2009-02-21 04:12 koi-utf&lt;br /&gt;-rw-r--r-- 1 root root 2223 2009-02-21 04:12 koi-win&lt;br /&gt;-rw-r--r-- 1 root root 2944 2009-02-21 04:12 mime.types&lt;br /&gt;-rw-r--r-- 1 root root  510 2009-02-21 04:12 nginx.conf&lt;br /&gt;drwxr-xr-x 2 root root 4096 2009-09-30 11:23 sites-available&lt;br /&gt;drwxr-xr-x 2 root root 4096 2009-09-30 11:19 sites-enabled&lt;br /&gt;-rw-r--r-- 1 root root 3610 2009-02-21 04:12 win-utf&lt;br /&gt;rizky@Elmo:/var/www$&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Semua file didalam directory tersebut tidak akan terhapus selama anda menggunakan perintah dpkg -r nginx Untuk mengapusnya secara otomatis semua file yang berhubungan dengan nginx baik binary file dan config file atau Purge, kita dapat melakukannya dengan perintah dpkg -P&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;rizky@Elmo:/var/cache/apt/archives$ sudo dpkg -P nginx&lt;br /&gt;(Reading database ... 103790 files and directories currently installed.)&lt;br /&gt;Removing nginx ...&lt;br /&gt;Stopping nginx: nginx.&lt;br /&gt;Purging configuration files for nginx ...&lt;br /&gt;Processing triggers for man-db ...&lt;br /&gt;rizky@Elmo:/var/cache/apt/archives$&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Check keberadaaan config file:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;rizky@Elmo:/var/cache/apt/archives$ sudo dpkg -P nginx&lt;br /&gt;(Reading database ... 103790 files and directories currently installed.)&lt;br /&gt;Removing nginx ...&lt;br /&gt;Stopping nginx: nginx.&lt;br /&gt;Purging configuration files for nginx ...&lt;br /&gt;Processing triggers for man-db ...&lt;br /&gt;rizky@Elmo:/var/cache/apt/archives$&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Status package&lt;br /&gt;&lt;br /&gt;dpkg -s berguna untuk mengetahui status sebuah package apakah package tersebut sudah terinstall (installed), telah didelete (deinstall), atau purge.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;rizky@Elmo:/var/cache/apt/archives$ dpkg -s nginx&lt;br /&gt;Package: nginx&lt;br /&gt;Status: purge ok not-installed&lt;br /&gt;Priority: optional&lt;br /&gt;Section: web&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Perintah lain&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;dpkg -S, perintah ini sangat berguna untuk mengetahui asal package dari sebuah file.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;rizky@Elmo:/etc/nginx$ sudo dpkg -S nginx.conf&lt;br /&gt;nginx: /etc/nginx/nginx.conf&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;dpkg -L, perinta ini juga sangat berguna untuk mengetahui struktur directory dari package yang telah terinstall. Kita dapat langsung mengetahui dimana sebuah package menyimpan config, library dan binaru filenya.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;rizky@Elmo:~$ sudo dpkg -L nginx&lt;br /&gt;/.&lt;br /&gt;/usr&lt;br /&gt;/usr/sbin&lt;br /&gt;/usr/sbin/nginx&lt;br /&gt;/usr/share&lt;br /&gt;/usr/share/doc&lt;br /&gt;/usr/share/doc/nginx&lt;br /&gt;/usr/share/doc/nginx/changelog.gz&lt;br /&gt;/usr/share/doc/nginx/README&lt;br /&gt;/usr/share/doc/nginx/copyright&lt;br /&gt;/usr/share/doc/nginx/NEWS.Debian.gz&lt;br /&gt;/usr/share/doc/nginx/changelog.Debian.gz&lt;br /&gt;/usr/share/man&lt;br /&gt;/usr/share/man/man1&lt;br /&gt;/usr/share/man/man1/nginx.1.gz&lt;br /&gt;/etc&lt;br /&gt;/etc/nginx&lt;br /&gt;/etc/nginx/sites-available&lt;br /&gt;/etc/nginx/sites-available/default&lt;br /&gt;/etc/nginx/sites-enabled&lt;br /&gt;/etc/nginx/conf.d&lt;br /&gt;/etc/nginx/fastcgi_params&lt;br /&gt;/etc/nginx/koi-utf&lt;br /&gt;/etc/nginx/koi-win&lt;br /&gt;/etc/nginx/mime.types&lt;br /&gt;/etc/nginx/nginx.conf&lt;br /&gt;/etc/nginx/win-utf&lt;br /&gt;/etc/init.d&lt;br /&gt;/etc/init.d/nginx&lt;br /&gt;/etc/logrotate.d&lt;br /&gt;/etc/logrotate.d/nginx&lt;br /&gt;/var&lt;br /&gt;/var/log&lt;br /&gt;/var/log/nginx&lt;br /&gt;/var/lib&lt;br /&gt;/var/lib/nginx&lt;br /&gt;/var/www&lt;br /&gt;/var/www/nginx-default&lt;br /&gt;/var/www/nginx-default/50x.html&lt;br /&gt;/var/www/nginx-default/index.html&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;apt-get, apt-cache&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;apt-get digunakan untuk installasi package aplikasi yang berada disebuah repository baik local, network atau central repository ubuntu. Repository dapat kita define sendiri dengan mengkonfigurasinya di /etc/apt/sources.list atau menggunakan repository dari apa yang telah didefinisikan didalamnya.&lt;br /&gt;&lt;br /&gt;Install package aplikasi dengan perintah apt-get install&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;rizky@Elmo:/var/cache/apt/archives$ sudo apt-get install nginx&lt;br /&gt;Reading package lists... Done&lt;br /&gt;Building dependency tree&lt;br /&gt;Reading state information... Done&lt;br /&gt;The following packages were automatically installed and are no longer required:&lt;br /&gt;  libruby1.9 libreadline-ruby1.9&lt;br /&gt;Use 'apt-get autoremove' to remove them.&lt;br /&gt;The following NEW packages will be installed:&lt;br /&gt;  nginx&lt;br /&gt;0 upgraded, 1 newly installed, 0 to remove and 185 not upgraded.&lt;br /&gt;Need to get 241kB of archives.&lt;br /&gt;After this operation, 618kB of additional disk space will be used.&lt;br /&gt;Get:1 http://id.archive.ubuntu.com jaunty/universe nginx 0.6.35-0ubuntu1 [241kB]&lt;br /&gt;Fetched 241kB in 6s (38.3kB/s)&lt;br /&gt;Selecting previously deselected package nginx.&lt;br /&gt;(Reading database ... 103766 files and directories currently installed.)&lt;br /&gt;Unpacking nginx (from .../nginx_0.6.35-0ubuntu1_i386.deb) ...&lt;br /&gt;Processing triggers for man-db ...&lt;br /&gt;Setting up nginx (0.6.35-0ubuntu1) ...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Note: apt-get memiliki cache aplikasi yang terinstall bertipe file *.deb di folder /var/cache/apt/archives/.&lt;br /&gt;&lt;br /&gt;Remove/Uninstall dan purge package dengan perintah apt-get remove dan apt-get purge&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;rizky@Elmo:/var/cache/apt/archives$ sudo apt-get remove nginx&lt;br /&gt;Reading package lists... Done&lt;br /&gt;Building dependency tree&lt;br /&gt;Reading state information... Done&lt;br /&gt;The following packages were automatically installed and are no longer required:&lt;br /&gt;  libruby1.9 libreadline-ruby1.9&lt;br /&gt;Use 'apt-get autoremove' to remove them.&lt;br /&gt;The following packages will be REMOVED:&lt;br /&gt;  nginx&lt;br /&gt;0 upgraded, 0 newly installed, 1 to remove and 185 not upgraded.&lt;br /&gt;After this operation, 618kB disk space will be freed.&lt;br /&gt;Do you want to continue [Y/n]? Y&lt;br /&gt;(Reading database ... 103790 files and directories currently installed.)&lt;br /&gt;Removing nginx ...&lt;br /&gt;Stopping nginx: nginx.&lt;br /&gt;Processing triggers for man-db ...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Pencarian package di listed repository dengan perintah apt-cache search&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;rizky@Elmo:~$ sudo apt-cache search php5-cli&lt;br /&gt;php5-cli - command-line interpreter for the php5 scripting language&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335110-6813077675517210922?l=rizzblow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizzblow.blogspot.com/feeds/6813077675517210922/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8335110&amp;postID=6813077675517210922' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/6813077675517210922'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/6813077675517210922'/><link rel='alternate' type='text/html' href='http://rizzblow.blogspot.com/2009/01/refresh-ubuntu-package-management.html' title='Refresh: Ubuntu Package Management'/><author><name>Web Developer Indonesia</name><uri>http://www.blogger.com/profile/07987143157274849677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_ss_NqUtJv6E/SwlAPKMT1LI/AAAAAAAAAEk/smjBetsq0mo/S220/rizky.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335110.post-2699506064267913123</id><published>2008-11-02T22:15:00.000+07:00</published><updated>2010-11-28T22:23:30.711+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sendmail'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Argument list too long when invoke rm</title><content type='html'>When you face this error it means your rm command unable to delete or remove so many files in certain directory where in my case i found when i delete sendmail spool inside /var/spool/mqueue and /var/spool/clientmqueue. To solve this problem you can change it using this command:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;pre&gt;[rizky@elmo mqueue]# sudo find . -name "*" | xargs rm -rf&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335110-2699506064267913123?l=rizzblow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizzblow.blogspot.com/feeds/2699506064267913123/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8335110&amp;postID=2699506064267913123' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/2699506064267913123'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/2699506064267913123'/><link rel='alternate' type='text/html' href='http://rizzblow.blogspot.com/2008/11/argument-list-too-long-when-invoke-rm.html' title='Argument list too long when invoke rm'/><author><name>Web Developer Indonesia</name><uri>http://www.blogger.com/profile/07987143157274849677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_ss_NqUtJv6E/SwlAPKMT1LI/AAAAAAAAAEk/smjBetsq0mo/S220/rizky.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335110.post-8020575754893516763</id><published>2008-10-24T09:22:00.005+07:00</published><updated>2010-02-09T08:56:17.341+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='drupaldeveloperindonesia'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='scalability'/><title type='text'>MySQL Scalability Planning for Our Drupal</title><content type='html'>Recently our client portal were reaching maximum number of MySQL connection and suffering connection lost and a lot of connection waiting for database MySQL server. After we investigate deeply those problem caused by:&lt;br /&gt;&lt;br /&gt;1. Traffic (page views) getting higher.&lt;br /&gt;2. A lot of writing process like UPDATE, doing table locking.&lt;br /&gt;3. Bad Index plan.&lt;br /&gt;4. Only have 1 database to serve all.&lt;br /&gt;&lt;br /&gt;There are MySQL scalability patterns as many MySQL experts share on the net and i can use to scale our DB. One of pattern i plan to use is to distribute database traffic load between WRITE traffic and READ traffic using MySQL Replication. This pattern has long story and has very good reputation in Web 2.0 development. However there are challenged and pitfalls when implements Replications.&lt;br /&gt;&lt;br /&gt;Anyway what is WRITE traffic? it means all query doing writing physically to the tables will be said as WRITE traffic. For instance, UPDATE, INSERT query. And READ traffic is all query that only doing read to the database. For instance, SELECT query.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;u&gt;Challenges and Pitfalls&lt;/u&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;There will be many scripts to be changed and also change mindset of developer when they write and read the database. Unfortunately we are using Drupal as our Framework. Drupal currently no has module natively or patch for people plaining to distribute the traffic load and this is big problem for us since we also use some contrib modules for our current Drupal and Those contrib module is not aware with WRITE and READ separation.&lt;br /&gt;&lt;br /&gt;After looking all the scripts inside Drupal and contrib modules and also our custom modules , I find a hope for doing this. Drupal has good database abstraction functions and all query either WRITE or READ exactly use db_query() function and Drupal also has capability in their database abstraction to build more than 1 connection.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;u&gt;Start Designing Implementing&lt;/u&gt;&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;This is our plan for temporary for our database server. However currently there is no High Availability Plan for our WRITE but we will plan this shortly.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_ss_NqUtJv6E/SwtaM_FVx3I/AAAAAAAAAFE/OP_iHaxoMvE/s1600/db-scale-1.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5407514956727175026" style="WIDTH: 320px; CURSOR: hand; HEIGHT: 286px" alt="" src="http://2.bp.blogspot.com/_ss_NqUtJv6E/SwtaM_FVx3I/AAAAAAAAAFE/OP_iHaxoMvE/s320/db-scale-1.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;For the coding side, firstly we have a method splinting db_query into two functions namely db_query_write() that will query to Master and db_query_ read() that will query to Slaves. However if we use this method it means that we need to change all scripts and this is very bad and not efficient To simplify this I just patch db_query() function to be able to detect automatically the SQL SCRIPT by using regular expression.&lt;br /&gt;&lt;br /&gt;Other things I add in script is by implementing two database connection in settings.php&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$db_url = array(&lt;br /&gt;&lt;br /&gt;   'default' =&gt; 'mysqli://userdb:dbpwd@masterdb.xxx.com:3306/mydb', //Master&lt;br /&gt;&lt;br /&gt;   'slave' =&gt; 'mysqli://userdb:dbpwd@slavelb.xxx.con:3306/mydb',&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;With scripts above I can easily get connection for both Master and Slaves.When I want to switch to slave I just invoke the function using this argument:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;db_set_active('slave');&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;To master&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;db_set_active();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;u&gt;CONCLUSION&lt;/u&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This plan is only intended to scale on database server side however when you run big site there is many thing also need to be optimized such as cache implementation, splitting static files, front-end optimization, CDNed, Message Queue implementation, etc.&lt;br /&gt;&lt;br /&gt;You can contact me at rizzblow 'at' gmail dot com if you want full script of this patches and I can help you design to scale you MySQL.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335110-8020575754893516763?l=rizzblow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizzblow.blogspot.com/feeds/8020575754893516763/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8335110&amp;postID=8020575754893516763' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/8020575754893516763'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/8020575754893516763'/><link rel='alternate' type='text/html' href='http://rizzblow.blogspot.com/2008/10/mysql-scalability-planning-for-our.html' title='MySQL Scalability Planning for Our Drupal'/><author><name>Web Developer Indonesia</name><uri>http://www.blogger.com/profile/07987143157274849677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_ss_NqUtJv6E/SwlAPKMT1LI/AAAAAAAAAEk/smjBetsq0mo/S220/rizky.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_ss_NqUtJv6E/SwtaM_FVx3I/AAAAAAAAAFE/OP_iHaxoMvE/s72-c/db-scale-1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335110.post-5950008089416530852</id><published>2008-10-05T15:34:00.003+07:00</published><updated>2010-11-04T13:16:42.346+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='binlog'/><title type='text'>Binlog yang semakin makan tempat</title><content type='html'>Binlog adalah log di-generate mysql yang biasanya digunakan untuk keperluan replikasi. Akhir-akhir ini serangan DDOS semakin deras mengalir ke salah satu web portal client baik yang sengaja dan tidak disengaja. Hal ini menyebabkan mysql men-generate binlog yang semakin cepat dan makan tempat. Binlog ini berisi tampungan statement-statement SQL yang pernah dieksekusi di Master MYSQL Server sebelum dibaca oleh IO Thread di SLAVE dan di-write sebagai RELAY LOG di SLAVE. BinLog ada jika kita mengaktifkanya dengan menepatkan variable log-bin=base-name di my.cnf atau --log-bin=base-name di console ketika service mysql start.&lt;br /&gt;&lt;br /&gt;Untuk mengecheck keberadaan binlogs, bisa menggunakan perintah berikut:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mysql&gt; show binary logs;&lt;br /&gt;+-------------------+------------+&lt;br /&gt;| Log_name          | File_size  |&lt;br /&gt;+-------------------+------------+&lt;br /&gt;| master-log.000001 | 1073818338 |&lt;br /&gt;| master-log.000002 | 1073818338 |&lt;br /&gt;| master-log.000003 | 1073818338 |&lt;br /&gt;| master-log.000004 | 1073818338 |&lt;br /&gt;| master-log.000005 | 1073818338 |&lt;br /&gt;| master-log.000006 | 1073818338 |&lt;br /&gt;| master-log.000007 | 1073818338 |&lt;br /&gt;| master-log.000008 | 1073818338 |&lt;br /&gt;| master-log.000009 | 1073818338 |&lt;br /&gt;| master-log.0000010 | 1073818338 |&lt;br /&gt;| master-log.0000011 | 1073818338 |&lt;br /&gt;| master-log.0000012 | 1073818338 |&lt;br /&gt;| master-log.0000013 | 1073818338 |&lt;br /&gt;| master-log.0000014 | 1073818338 |&lt;br /&gt;||master-log.000015 | 1073818338 |&lt;br /&gt;| master-log.000020 | 1073818338 |&lt;br /&gt;| master-log.000021 | 1073828820 |&lt;br /&gt;| master-log.000022 | 1073749079 |&lt;br /&gt;| master-log.000023 | 1073775050 |&lt;br /&gt;| master-log.000024 | 1073795367 |&lt;br /&gt;| master-log.000025 | 1073822141 |&lt;br /&gt;| master-log.000026 | 1073835802 |&lt;br /&gt;| master-log.000027 |  411482420 |&lt;br /&gt;| master-log.000028 |  720980071 |&lt;br /&gt;+-------------------+------------+&lt;br /&gt;28 rows in set (0.00 sec)&lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;&lt;br /&gt;Dan bisa juga dengan command :&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mysql&gt; show master status;&lt;br /&gt;+-------------------+-----------+--------------+------------------+&lt;br /&gt;| File              | Position  | Binlog_Do_DB | Binlog_Ignore_DB |&lt;br /&gt;+-------------------+-----------+--------------+------------------+&lt;br /&gt;| master-log.000028 | 720996589 | Rizky-DB       |                  |&lt;br /&gt;+-------------------+-----------+--------------+------------------+&lt;br /&gt;1 row in set (0.00 sec)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Angka 1073818338 diatas berarti ukuran binlog telah mencapai maximal dan akan membuat file binlog baru dengan pattern penamaan master-log.0000xx dan proses seterusnya akan dilakukan hal yang sama. Di MySQL kita harus care minimal dengan 2 variable berikut untuk me-manage binlog:&lt;br /&gt;&lt;br /&gt;max_binlog_size, dynamic variable untuk menentukan maximum ukuran file dari binlog yang di generate.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mysql&gt; show variables like 'max_binlog_size';&lt;br /&gt;+-----------------+------------+&lt;br /&gt;| Variable_name   | Value      |&lt;br /&gt;+-----------------+------------+&lt;br /&gt;| max_binlog_size | 1073741824 |&lt;br /&gt;+-----------------+------------+&lt;br /&gt;1 row in set (0.00 sec)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;dan expire_logs_days,Umur maximum binlog jika melebih mysql akan menghapus binlog yang di nyatakan expire.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mysql&gt; show variables like 'expire_logs_days';&lt;br /&gt;+------------------+-------+&lt;br /&gt;| Variable_name    | Value |&lt;br /&gt;+------------------+-------+&lt;br /&gt;| expire_logs_days | 0     |&lt;br /&gt;+------------------+-------+&lt;br /&gt;1 row in set (0.00 sec)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Penentuan value dari variable diatas dapat di sesuaikan atas kebutuhan anda yang mana saat ini di server mengunakn setting default :-p&lt;br /&gt; max_binlog_size = 1073741824&lt;br /&gt; expire_logs_days=0 // Never Expire&lt;br /&gt;&lt;br /&gt;Dengan angka diatas pertumbuhan binlog sangat tinggi ketika website di DDOS dan server akan mengalami krisis disk space. Untuk menghindari hal ini kita bisa men-set kedua variable menjadi reasonable yaitu dengan mengimplementasikan binlog expiry.Untungnya kedua variable diatas adalah dynamic variable jadi kita di tak perlu melakukan restart service untuk mengconfigure ulang bin-log kita.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mysql&gt;SET GLOBAL expire_logs_days=5; // dimana binlog akan di purge/remove setelah berumur 5 hari &lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335110-5950008089416530852?l=rizzblow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizzblow.blogspot.com/feeds/5950008089416530852/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8335110&amp;postID=5950008089416530852' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/5950008089416530852'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/5950008089416530852'/><link rel='alternate' type='text/html' href='http://rizzblow.blogspot.com/2008/10/binlog-yang-semakin-makan-tempat.html' title='Binlog yang semakin makan tempat'/><author><name>Web Developer Indonesia</name><uri>http://www.blogger.com/profile/07987143157274849677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_ss_NqUtJv6E/SwlAPKMT1LI/AAAAAAAAAEk/smjBetsq0mo/S220/rizky.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335110.post-2977883381320064623</id><published>2008-08-23T08:39:00.001+07:00</published><updated>2009-09-24T03:50:14.633+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='sysadmin'/><category scheme='http://www.blogger.com/atom/ns#' term='dba'/><title type='text'>Beberapa Counter/Statistik Variable yang berguna di MySQL</title><content type='html'>&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Pada suatu saat kita mungkin ingin mengetahui dan memonitor statistik(counter) beberapa informasi seperti berapa jumlah koneksi yang telah dibuat atau gagal,berapa jumlah DELETE statement yang telah diexecute dan seberapa efektif implementasi Query Cache kita dari MySQL server.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;Di MySQL informasi-informasi ini dengan mudah didapatkan dengan melakukan Query ke Status Variables dari MySQL. Berikut beberapa variable untuk mengetahui informasi diatas:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt; &lt;span style="font-weight: bold;"&gt;&lt;u&gt;Connection statistik atau counter.&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;+--------------------------+-------+&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;| Variable_name            | Value |&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;+--------------------------+-------+&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;| Aborted_connects         | 73    |&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;| Connections              | 670043|&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;| Max_used_connections     | 100   |&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;| Aborted_Clients          | 30    |&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;- Connection&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;span style="font-family:courier new;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;jumlah koneksi yang datang ke MySQL baik yang berhasil atau gagal.&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;- &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;span style="font-family:courier new;"&gt;Aborted_connects &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;jumlah koneksi yang gagal yang biasanya disebabkan karena salah password atau karena tidak memiliki privilidge.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;span style="font-family:courier new;"&gt;- &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;span style="font-family:courier new;"&gt;Aborted_Clients &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;jumlah koneksi yang gagal yang biasanya disebabkan karena koneksi putus.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;span style="font-family:courier new;"&gt;- &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;span style="font-family:courier new;"&gt;Max_used_connections&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;span style="font-family:courier new;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;jumlah maximum  koneksi simultan yang pernah dibuat.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;u&gt;Executed Statement statistik atau counter.&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;mysql&gt; show status like 'com%';&lt;br /&gt;+---------------------------+-------+&lt;br /&gt;| Variable_name             | Value |&lt;br /&gt;+---------------------------+-------+&lt;br /&gt;| Com_admin_commands        | 0     |&lt;br /&gt;| Com_assign_to_keycache    | 0     |&lt;br /&gt;| Com_alter_db              | 0     |&lt;br /&gt;| Com_alter_db_upgrade      | 0     |&lt;br /&gt;| Com_alter_event           | 0     |&lt;br /&gt;| Com_alter_function        | 0     |&lt;br /&gt;| Com_alter_procedure       | 0     |&lt;br /&gt;| Com_alter_server          | 0     |&lt;br /&gt;| Com_alter_table           | 0     |&lt;br /&gt;| Com_alter_tablespace      | 0     |&lt;br /&gt;| Com_analyze               | 0     |&lt;br /&gt;| Com_backup_table          | 0     |&lt;br /&gt;| Com_begin                 | 0     |&lt;br /&gt;| Com_binlog                | 0     |&lt;br /&gt;| Com_call_procedure        | 0     |&lt;br /&gt;| Com_change_db             | 0     |&lt;br /&gt;| Com_change_master         | 0     |&lt;br /&gt;| Com_check                 | 0     |&lt;br /&gt;| Com_checksum              | 0     |&lt;br /&gt;| Com_commit                | 0     |&lt;br /&gt;| Com_create_db             | 0     |&lt;br /&gt;| Com_create_event          | 0     |&lt;br /&gt;| Com_create_function       | 0     |&lt;br /&gt;| Com_create_index          | 0     |&lt;br /&gt;| Com_create_procedure      | 0     |&lt;br /&gt;| Com_create_server         | 0     |&lt;br /&gt;| Com_create_table          | 0     |&lt;br /&gt;| Com_create_trigger        | 0     |&lt;br /&gt;| Com_create_udf            | 0     |&lt;br /&gt;| Com_create_user           | 0     |&lt;br /&gt;| Com_create_view           | 0     |&lt;br /&gt;| Com_dealloc_sql           | 0     |&lt;br /&gt;| Com_delete                | 0     |&lt;br /&gt;| Com_delete_multi          | 0     |&lt;br /&gt;| Com_do                    | 0     |&lt;br /&gt;| Com_drop_db               | 0     |&lt;br /&gt;| Com_drop_event            | 0     |&lt;br /&gt;| Com_drop_function         | 0     |&lt;br /&gt;| Com_drop_index            | 0     |&lt;br /&gt;| Com_drop_procedure        | 0     |&lt;br /&gt;| Com_drop_server           | 0     |&lt;br /&gt;| Com_drop_table            | 0     |&lt;br /&gt;| Com_drop_trigger          | 0     |&lt;br /&gt;| Com_drop_user             | 0     |&lt;br /&gt;| Com_drop_view             | 0     |&lt;br /&gt;| Com_empty_query           | 0     |&lt;br /&gt;| Com_execute_sql           | 0     |&lt;br /&gt;| Com_flush                 | 0     |&lt;br /&gt;| Com_grant                 | 0     |&lt;br /&gt;| Com_ha_close              | 0     |&lt;br /&gt;| Com_ha_open               | 0     |&lt;br /&gt;| Com_ha_read               | 0     |&lt;br /&gt;| Com_help                  | 0     |&lt;br /&gt;| Com_insert                | 0     |&lt;br /&gt;| Com_insert_select         | 0     |&lt;br /&gt;| Com_install_plugin        | 0     |&lt;br /&gt;| Com_kill                  | 0     |&lt;br /&gt;| Com_load                  | 0     |&lt;br /&gt;| Com_load_master_data      | 0     |&lt;br /&gt;| Com_load_master_table     | 0     |&lt;br /&gt;| Com_lock_tables           | 0     |&lt;br /&gt;| Com_optimize              | 0     |&lt;br /&gt;| Com_preload_keys          | 0     |&lt;br /&gt;| Com_prepare_sql           | 0     |&lt;br /&gt;| Com_purge                 | 0     |&lt;br /&gt;| Com_purge_before_date     | 0     |&lt;br /&gt;| Com_release_savepoint     | 0     |&lt;br /&gt;| Com_rename_table          | 0     |&lt;br /&gt;| Com_rename_user           | 0     |&lt;br /&gt;| Com_repair                | 0     |&lt;br /&gt;| Com_replace               | 0     |&lt;br /&gt;| Com_replace_select        | 0     |&lt;br /&gt;| Com_reset                 | 0     |&lt;br /&gt;| Com_restore_table         | 0     |&lt;br /&gt;| Com_revoke                | 0     |&lt;br /&gt;| Com_revoke_all            | 0     |&lt;br /&gt;| Com_rollback              | 0     |&lt;br /&gt;| Com_rollback_to_savepoint | 0     |&lt;br /&gt;| Com_savepoint             | 0     |&lt;br /&gt;| Com_select                | 1     |&lt;br /&gt;| Com_set_option            | 0     |&lt;br /&gt;| Com_show_authors          | 0     |&lt;br /&gt;| Com_show_binlog_events    | 0     |&lt;br /&gt;| Com_show_binlogs          | 0     |&lt;br /&gt;| Com_show_charsets         | 0     |&lt;br /&gt;| Com_show_collations       | 0     |&lt;br /&gt;| Com_show_column_types     | 0     |&lt;br /&gt;| Com_show_contributors     | 0     |&lt;br /&gt;| Com_show_create_db        | 0     |&lt;br /&gt;| Com_show_create_event     | 0     |&lt;br /&gt;| Com_show_create_func      | 0     |&lt;br /&gt;| Com_show_create_proc      | 0     |&lt;br /&gt;| Com_show_create_table     | 0     |&lt;br /&gt;| Com_show_create_trigger   | 0     |&lt;br /&gt;| Com_show_databases        | 0     |&lt;br /&gt;| Com_show_engine_logs      | 0     |&lt;br /&gt;| Com_show_engine_mutex     | 0     |&lt;br /&gt;| Com_show_engine_status    | 0     |&lt;br /&gt;| Com_show_events           | 0     |&lt;br /&gt;| Com_show_errors           | 0     |&lt;br /&gt;| Com_show_fields           | 0     |&lt;br /&gt;| Com_show_function_status  | 0     |&lt;br /&gt;| Com_show_grants           | 0     |&lt;br /&gt;| Com_show_keys             | 0     |&lt;br /&gt;| Com_show_master_status    | 0     |&lt;br /&gt;| Com_show_new_master       | 0     |&lt;br /&gt;| Com_show_open_tables      | 0     |&lt;br /&gt;| Com_show_plugins          | 0     |&lt;br /&gt;| Com_show_privileges       | 0     |&lt;br /&gt;| Com_show_procedure_status | 0     |&lt;br /&gt;| Com_show_processlist      | 0     |&lt;br /&gt;| Com_show_profile          | 0     |&lt;br /&gt;| Com_show_profiles         | 0     |&lt;br /&gt;| Com_show_slave_hosts      | 0     |&lt;br /&gt;| Com_show_slave_status     | 0     |&lt;br /&gt;| Com_show_status           | 5     |&lt;br /&gt;| Com_show_storage_engines  | 0     |&lt;br /&gt;| Com_show_table_status     | 0     |&lt;br /&gt;| Com_show_tables           | 0     |&lt;br /&gt;| Com_show_triggers         | 0     |&lt;br /&gt;| Com_show_variables        | 0     |&lt;br /&gt;| Com_show_warnings         | 0     |&lt;br /&gt;| Com_slave_start           | 0     |&lt;br /&gt;| Com_slave_stop            | 0     |&lt;br /&gt;| Com_stmt_close            | 0     |&lt;br /&gt;| Com_stmt_execute          | 0     |&lt;br /&gt;| Com_stmt_fetch            | 0     |&lt;br /&gt;| Com_stmt_prepare          | 0     |&lt;br /&gt;| Com_stmt_reprepare        | 0     |&lt;br /&gt;| Com_stmt_reset            | 0     |&lt;br /&gt;| Com_stmt_send_long_data   | 0     |&lt;br /&gt;| Com_truncate              | 0     |&lt;br /&gt;| Com_uninstall_plugin      | 0     |&lt;br /&gt;| Com_unlock_tables         | 0     |&lt;br /&gt;| Com_update                | 0     |&lt;br /&gt;| Com_update_multi          | 0     |&lt;br /&gt;| Com_xa_commit             | 0     |&lt;br /&gt;| Com_xa_end                | 0     |&lt;br /&gt;| Com_xa_prepare            | 0     |&lt;br /&gt;| Com_xa_recover            | 0     |&lt;br /&gt;| Com_xa_rollback           | 0     |&lt;br /&gt;| Com_xa_start              | 0     |&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;Contoh dari banyak variable diatas seperti:&lt;br /&gt;&lt;br /&gt;-&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;span style="font-family:courier new;"&gt;Com_select&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt; Jumlah SELECT statement yang berhasil atau gagal diexecute. Variable ini tergantung terhadap implementasi cache di MySQL jika cache itu aktifkan maka setiap statement SELECT yang dikirim ke MySQL akan dicek terlebih dahulu keberadaannya di Cache jika tidak ada makan variable ini akan di increment 1.&lt;br /&gt;-&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;span style="font-family:courier new;"&gt;Com_update&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;  Jumlah UPDATE statement yang berhasil atau gagal diexecute.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;u&gt;Cache statistik atau counter.&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;Variable ini bekerja jika anda mengaktifkan fitur cache di MySQL:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;span style="font-family:courier new;"&gt;+--------------------------+-------+&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;| Variable_name            | Value |&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;+--------------------------+-------+&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;| Qcache_hits              | 6753  |&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;-&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;span style="font-family:courier new;"&gt;Qcache_hits&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;  &lt;/span&gt;sebagaimana dijelaskan di &lt;span style="font-size:100%;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;span style="font-family:courier new;"&gt;Com_select&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, Setiap SELECT statement akan di check keberadaannya di cache jika tidak ada maka &lt;span style="font-size:100%;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;span style="font-family:courier new;"&gt;Com_select&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; akan di increment 1 namun jika terdapat di Query Cache maka variable &lt;span style="font-size:100%;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;span style="font-family:courier new;"&gt;Qcache_hits&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:trebuchet ms;"&gt; yang akan di increment 1.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Note: &lt;span style="color: rgb(255, 0, 0);"&gt;Status Variables ini akan hilang / direset kembali ketika kita melakukan restart service Mysql. &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335110-2977883381320064623?l=rizzblow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizzblow.blogspot.com/feeds/2977883381320064623/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8335110&amp;postID=2977883381320064623' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/2977883381320064623'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/2977883381320064623'/><link rel='alternate' type='text/html' href='http://rizzblow.blogspot.com/2009/09/beberapa-counterstatistik-variable-yang.html' title='Beberapa Counter/Statistik Variable yang berguna di MySQL'/><author><name>Web Developer Indonesia</name><uri>http://www.blogger.com/profile/07987143157274849677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_ss_NqUtJv6E/SwlAPKMT1LI/AAAAAAAAAEk/smjBetsq0mo/S220/rizky.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335110.post-4125458346338458922</id><published>2008-08-15T21:39:00.000+07:00</published><updated>2009-10-04T22:47:55.946+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><title type='text'>Thread dan Global Variable di MySQL</title><content type='html'>Ada beberapa hal yang lucu saya alami pada minggu-minggu ini yaitu ketika proses deployment aplikasi web yang kami buat ke production server. Saat itu MySQL mengalami OOM (out of memory) dengan swapping yang besar dan menyebabkan banyak thread yang defunct yang pada akhirnya MySQL berhenti.&lt;br /&gt;&lt;br /&gt;Kemudian pada saat itu juga saya dapat kepercayaan untuk melakukan beberapa tuning di MySQL. Karena telah mengetahui spesifikasi hardware server maka saya langsung memfokus diri pada MySQL dan saya yakin betul pasti ada konfigurasi yang salah.  Akhirnya kami menemukannya:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;max_connection=1024&lt;br /&gt;join_buffer_size=500M&lt;br /&gt;read_buffer_size=250M&lt;br /&gt;key_buffer_size=64M&lt;br /&gt;sort_buffer_size=500M&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Perlu diketahui, saya menggunakan MyISAM dikarenakan Framework yang digunakan hanya support Storage Engine tersebut (MyISAM) dan dari konfigurasi diatas sudah pasti dapat membuat MySQL berhenti kehabisan memory hal ini dikarenakan hampir semua Thread/Per session variable diatas diset terlalu tinggi dan sebaliknya Global variable diset sangat minimum.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Apa itu Thread/Per Session Variable ?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;MySQL adalah multithreaded server dimana setiap connection yang terbentuk oleh client yang melakukan request ke MySQL akan membuat thread baru untuknya sehingga untuk sebuah thread variable akan dialokasikan untuk thread tersebut. Nah untuk kasus diatas misalnya s&lt;span style="font-family:courier new;"&gt;ort_buffer_size &lt;/span&gt;adalah variable untuk alokasi memori buffer untuk keperluan sorting diassign sebesar 500MB, maximum concurrent user 1024 dan total memory server hanya 8GB maka dengan 3~4 concurrent user saja MySQL akan kehabisan memory.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Dan apa itu Global Variable ?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Variable yang digunakan untuk semua thread. Mungkin anda akan bertanya-tanya bahwa variable ini juga akan issue seperti race condition atau mutex. Tentu kedua issue tersebut sudah diketahui dan dipikirkan matang-matang oleh para engineer di MySQL dan mereka telah mempunyai cara yang canggih untuk mengatasinya. Pada contoh diatas adalah &lt;span style="font-family:courier new;"&gt;key_buffer_size&lt;/span&gt; variable yang digunakan untuk mengalokasikan buffer memory dari blok index.&lt;br /&gt;&lt;br /&gt;Referensi:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html"&gt;http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html &lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335110-4125458346338458922?l=rizzblow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizzblow.blogspot.com/feeds/4125458346338458922/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8335110&amp;postID=4125458346338458922' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/4125458346338458922'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/4125458346338458922'/><link rel='alternate' type='text/html' href='http://rizzblow.blogspot.com/2009/10/thread-dan-global-variable-di-mysql.html' title='Thread dan Global Variable di MySQL'/><author><name>Web Developer Indonesia</name><uri>http://www.blogger.com/profile/07987143157274849677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_ss_NqUtJv6E/SwlAPKMT1LI/AAAAAAAAAEk/smjBetsq0mo/S220/rizky.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335110.post-6968908228067493154</id><published>2008-08-01T14:41:00.002+07:00</published><updated>2010-02-09T08:53:06.718+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='webdeveloperindonesia'/><title type='text'>Mocca.com is online now</title><content type='html'>Finally &lt;a href="http://mocca.com/"&gt;mocca.com&lt;/a&gt;, Singapore online market place is now online with better look and better user experience. We did 1.5 month sprint development. This project is the big win for open source solution where previously mocca.com powered by Vignette CMS and we know it is difficult to extend and extremely not friendly for developer and for search engine.&lt;br /&gt;&lt;br /&gt;Previously mocca.com looked like:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ss_NqUtJv6E/S0rWiQS4WGI/AAAAAAAAAG4/rCRpvmJtzwI/s1600-h/mocca.old.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_ss_NqUtJv6E/S0rWiQS4WGI/AAAAAAAAAG4/rCRpvmJtzwI/s200/mocca.old.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5425384585099237474" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And now:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ss_NqUtJv6E/S0rWihc1m2I/AAAAAAAAAHA/KsJmkoYowNA/s1600-h/mocca.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_ss_NqUtJv6E/S0rWihc1m2I/AAAAAAAAAHA/KsJmkoYowNA/s200/mocca.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5425384589704403810" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335110-6968908228067493154?l=rizzblow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/6968908228067493154'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/6968908228067493154'/><link rel='alternate' type='text/html' href='http://rizzblow.blogspot.com/2008/08/moccacom-is-only-now.html' title='Mocca.com is online now'/><author><name>Web Developer Indonesia</name><uri>http://www.blogger.com/profile/07987143157274849677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_ss_NqUtJv6E/SwlAPKMT1LI/AAAAAAAAAEk/smjBetsq0mo/S220/rizky.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_ss_NqUtJv6E/S0rWiQS4WGI/AAAAAAAAAG4/rCRpvmJtzwI/s72-c/mocca.old.jpg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-8335110.post-7381631797775139576</id><published>2008-05-16T00:56:00.004+07:00</published><updated>2010-02-09T08:57:29.922+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='softwaredeveloperindonesia'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='libevent'/><title type='text'>Learning Asyncronous IO dengan LibEvent</title><content type='html'>Akhir-akhir ini semakin banyak orang yang concern dengan permasalahan blocking IO terhadap scalability dari beberapa web server konvensional yang selama ini kita kenal.&lt;br /&gt;&lt;br /&gt;Apa itu Syncronous Blocking IO ? Blocking IO atau Syncronous IO adalah suatu bentuk dari process Input/Output (Disk/Network) yang tidak mengizinkan proses lain untuk jalan bersamaan. Proses lain tersebut hanya boleh dijalankan ketika proses sebelumnya selesai. Bagi sebuah Multiproses/Multithreaded Web Server yang sibuk, blocking ini sangat tidak efisien dimana proses lain harus antri dan menunggu (idle).&lt;br /&gt;&lt;br /&gt;Contoh script dibawah ini :&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;br /&gt;   h = gethostbyname(hostname);&lt;br /&gt;   if (!h) {&lt;br /&gt;       fprintf(stderr, "Couldn't lookup %s: %s", hostname, hstrerror(h_errno));&lt;br /&gt;       return 1;&lt;br /&gt;   }&lt;br /&gt;   if (h-&gt;h_addrtype != AF_INET) {&lt;br /&gt;       fprintf(stderr, "No ipv6 support, sorry.");&lt;br /&gt;       return 1;&lt;br /&gt;   }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;gethostbyname() tidak akan return sampai ia selesai resolve variable hostname misalkan dalam hal ini saya assign hostname variable dengan www.yahoo.com.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;dan script dibawah ini juga:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;   /* Allocate a new socket */&lt;br /&gt;   fd = socket(AF_INET, SOCK_STREAM, 0);&lt;br /&gt;   if (fd &lt; sin_family =" AF_INET;" sin_port =" htons(80);" sin_addr =" *(struct"&gt;h_addr;&lt;br /&gt;   if (connect(fd, (struct sockaddr*) &amp;amp;sin, sizeof(sin))) {&lt;br /&gt;       perror("connect");&lt;br /&gt;       close(fd);&lt;br /&gt;       return 1;&lt;br /&gt;   }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;connect() tidak akan return sampai ia berhasil terkoneksi.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ada masalah dengan script diatas ? Tentu tidak karena hal diatas adalah yang biasa kita lakukan dalam socket programming. Meskipun demikian ada suatu saat dimana kita menginginkan sebuah program dapat menghandle multi koneksi secara bersamaan. gethostbyname dan connect dikebanyakan platform tidak thread safe.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Asyncrous IO memungkinkan process lain untuk berjalan. Di Linux dan kebanyakan Sistem Operasi Unix ada beberapa bentuk dari Asyncronous IO yang dapat dicapai seperti forking process, selec(), epoll(), dan poll(). Dari semua bentuk tersebut ada satu yang mungkin saat ini saya suka karena lebih mudah dan tergila-gila yaitu dengan callback yang ada di Libevent. Seperti yang kita ketahui libevent ini digunakan oleh memcache.&lt;br /&gt;&lt;br /&gt;Berikut contoh simple http server script dengan menggunakan callback:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;#include &amp;lt;sys/time.h&amp;gt;&lt;br /&gt;#include &amp;lt;sys/queue.h&amp;gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;&lt;br /&gt;#include &amp;lt;err.h&amp;gt;&lt;br /&gt;&lt;br /&gt;#include &amp;lt;event.h&amp;gt;&lt;br /&gt;#include &amp;lt;evhttp.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void x_handler(struct evhttp_request *req, void *arg)&lt;br /&gt;{&lt;br /&gt;       struct evbuffer *buf;&lt;br /&gt;       buf = evbuffer_new();&lt;br /&gt;&lt;br /&gt;       if (buf == NULL)&lt;br /&gt;           err(1, "failed to create response buffer");&lt;br /&gt;&lt;br /&gt;       evbuffer_add_printf(buf, "Requested: %sn", evhttp_request_uri(req));&lt;br /&gt;       evhttp_send_reply(req, HTTP_OK, "OK", buf);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main(int argc, char **argv)&lt;br /&gt;{&lt;br /&gt;   struct evhttp *httpd;&lt;br /&gt;&lt;br /&gt;   event_init();&lt;br /&gt;   httpd = evhttp_start("127.0.0.1",80);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   /* Set a callback for all other requests. */&lt;br /&gt;   evhttp_set_gencb(httpd, x_handler, NULL);&lt;br /&gt;&lt;br /&gt;   event_dispatch();&lt;br /&gt;/* Not reached in this code as it is now. */&lt;br /&gt;   evhttp_free(httpd);&lt;br /&gt;&lt;br /&gt;   return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Simple bukan ?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335110-7381631797775139576?l=rizzblow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizzblow.blogspot.com/feeds/7381631797775139576/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8335110&amp;postID=7381631797775139576' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/7381631797775139576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/7381631797775139576'/><link rel='alternate' type='text/html' href='http://rizzblow.blogspot.com/2008/05/learning-asyncronous-io-dengan-libevent.html' title='Learning Asyncronous IO dengan LibEvent'/><author><name>Web Developer Indonesia</name><uri>http://www.blogger.com/profile/07987143157274849677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_ss_NqUtJv6E/SwlAPKMT1LI/AAAAAAAAAEk/smjBetsq0mo/S220/rizky.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335110.post-1451344957199145436</id><published>2008-04-15T11:24:00.002+07:00</published><updated>2010-02-09T17:47:32.438+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='htacess'/><category scheme='http://www.blogger.com/atom/ns#' term='seoindonesia'/><category scheme='http://www.blogger.com/atom/ns#' term='website'/><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><title type='text'>With “www.”  or without “www.” prefix</title><content type='html'>I know this is small issue when you publish a website however you need to consider this as one of usability and accessibility of your website. Another reason to consider this is google or search engine could remove your site form their index cos they think that your site is duplicate.&lt;br /&gt;&lt;br /&gt;There many web user I found when accessing web never put www. prefix and just access directly using domain name like google.com, yahoo.com and reebonz.com on browser address. Some sites still provide 2 versions of their site using “www.” prefix and without “www.”. And the other sites provide only 1 version using www only so when their user access without www that site will be “server not found”.&lt;br /&gt;&lt;br /&gt;When you buy and read SEO books firstly they will guide you to choose which version of site you want to activate for instance, the will recommend you activate “www.” prefix thus all the pages crawled and indexed in google will use “www.”. How about without “www.” one ? They will recommend you to redirect it to www version permanently.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;u&gt;How to achieve this ?&lt;/u&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;1. Enable your apache virtual host configuration.&lt;/strong&gt; (If you host your file in shared hosting I believe you will have this already otherwise just edit httpd.conf).&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;br /&gt;NameVirtualHost *:80&lt;br /&gt;&lt;br /&gt;&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;  DocumentRoot /webroot/aaaacom&lt;br /&gt;  ServerName www.aaaa.com&lt;br /&gt;  ServerAlias aaaa.com #This enable to use without www&lt;br /&gt;  ErrorLog logs/aaaa.log&lt;br /&gt;  CustomLog logs/aaaa.log combined&lt;br /&gt;&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;2. Redirect permanently using 301 in .htaccess&lt;/strong&gt;&lt;br /&gt;&lt;pre&gt;  RewriteCond %{HTTP_HOST} ^aaaa\.com$ [NC]&lt;br /&gt;  RewriteRule ^(.*)$ http://www.aaaa.com.hk/$1 [L,R=301]&lt;/pre&gt;&lt;br /&gt;After all those changes saved you can check it using your browser. (Restart apache needed when you change #1).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335110-1451344957199145436?l=rizzblow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizzblow.blogspot.com/feeds/1451344957199145436/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8335110&amp;postID=1451344957199145436' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/1451344957199145436'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/1451344957199145436'/><link rel='alternate' type='text/html' href='http://rizzblow.blogspot.com/2008/04/with-www-or-without-www-prefix.html' title='With “www.”  or without “www.” prefix'/><author><name>Web Developer Indonesia</name><uri>http://www.blogger.com/profile/07987143157274849677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_ss_NqUtJv6E/SwlAPKMT1LI/AAAAAAAAAEk/smjBetsq0mo/S220/rizky.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335110.post-8314294168245591483</id><published>2008-02-19T12:10:00.001+07:00</published><updated>2009-10-05T12:25:36.504+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><title type='text'>Do i need doing mysql_close() when i have mysql_open()</title><content type='html'>&lt;span style="font-weight: bold; color: rgb(255, 0, 0);font-size:180%;" &gt;&lt;span style="font-family: arial;"&gt;No Need&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335110-8314294168245591483?l=rizzblow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizzblow.blogspot.com/feeds/8314294168245591483/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8335110&amp;postID=8314294168245591483' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/8314294168245591483'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/8314294168245591483'/><link rel='alternate' type='text/html' href='http://rizzblow.blogspot.com/2008/02/do-i-need-doing-mysqlclose-when-i-have.html' title='Do i need doing mysql_close() when i have mysql_open()'/><author><name>Web Developer Indonesia</name><uri>http://www.blogger.com/profile/07987143157274849677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_ss_NqUtJv6E/SwlAPKMT1LI/AAAAAAAAAEk/smjBetsq0mo/S220/rizky.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335110.post-641623068643876371</id><published>2008-02-02T00:47:00.005+07:00</published><updated>2010-11-04T13:17:15.567+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scalability'/><category scheme='http://www.blogger.com/atom/ns#' term='developmentenvironment'/><title type='text'>Making scalable development environment</title><content type='html'>This is my first month working with my current company. My superior asked me to build new team development environment to make the development process more efficient and effective. However i see most of the team haven't experienced working in  group of development and individually prefer to use single code base development so this is one of challenge i will face as team leader for implementing this.&lt;br /&gt;&lt;br /&gt;Firstly before implementing this i stated to the team regarding benefit will be gained when we have scalable development environment:&lt;br /&gt;&lt;br /&gt;1. Fast development&lt;br /&gt;2. Have maintainable code&lt;br /&gt;3. Easy to do refactoring&lt;br /&gt;4. Easy to change when marketing people require new features.&lt;br /&gt;&lt;br /&gt;Since we will choose application framework to be used so we can inherit or no need to think about the coding standard and application architecture.  Based on my experiences there are 3 major points for us to scale our development environment such as:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1. &lt;a href="http://rizzblow.blogspot.com/2008/01/building-our-own-svn-repository-in.html"&gt;Use Source Control.&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is very important one and i think i will push the team to use &lt;a href="http://rizzblow.blogspot.com/2008/01/building-our-own-svn-repository-in.html"&gt;SVN&lt;/a&gt; rather CSV. We can track history, doing diff, reverting, branching, merging, and someone can lock the file to be not used by others. To know how to install svn you can read to my previous post &lt;a href="http://rizzblow.blogspot.com/2008/01/building-our-own-svn-repository-in.html"&gt;How to build your own svn and subversion.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2. One step build.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This makes more confident when deploying new release or bug fixing. So if something happened like error we can rollback to the previous version and we can commit/upload the new release or bug fixing automatically without worrying from development to staging and to production.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3. Bug tracking.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I think this is of what the company have now. There is many opensource software for this.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;two of these are optional &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4. Unit Testing &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Do you think we need this ? OOP? Agile/Scrum/TDD/XP?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;5. Collaborative Project Management (Optional).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;MS Excel ? I think it will be better using software like phpprojekt or dotProject&lt;br /&gt;&lt;br /&gt;All of those points  will change the way programmer developing application to be more open, collaborative, and traceable.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335110-641623068643876371?l=rizzblow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizzblow.blogspot.com/feeds/641623068643876371/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8335110&amp;postID=641623068643876371' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/641623068643876371'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/641623068643876371'/><link rel='alternate' type='text/html' href='http://rizzblow.blogspot.com/2008/02/making-scalable-development-environment.html' title='Making scalable development environment'/><author><name>Web Developer Indonesia</name><uri>http://www.blogger.com/profile/07987143157274849677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_ss_NqUtJv6E/SwlAPKMT1LI/AAAAAAAAAEk/smjBetsq0mo/S220/rizky.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335110.post-3919224365777733018</id><published>2008-01-20T10:31:00.002+07:00</published><updated>2011-04-09T15:03:00.018+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='subversion'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='svn'/><title type='text'>Building Our Own SVN Repository in Ubuntu</title><content type='html'>You use ubuntu? You can folow these steps to make your own svn repository in order to achieve scalable development environment.&lt;br /&gt;&lt;br /&gt;Installation&lt;br /&gt;&lt;br /&gt;1. Install Subversion by issuing this command and type Y:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;rizky@grover:~$ sudo apt-get install subversion&lt;br /&gt;Reading package lists... Done&lt;br /&gt;Building dependency tree    &lt;br /&gt;Reading state information... Done&lt;br /&gt;The following extra packages will be installed:&lt;br /&gt;  libapr1 libaprutil1 libsvn1&lt;br /&gt;Suggested packages:&lt;br /&gt;  subversion-tools db4.7-util patch&lt;br /&gt;The following NEW packages will be installed:&lt;br /&gt;  libapr1 libaprutil1 libsvn1 subversion&lt;br /&gt;0 upgraded, 4 newly installed, 0 to remove and 0 not upgraded.&lt;br /&gt;Need to get 1,464kB of archives.&lt;br /&gt;After this operation, 6,935kB of additional disk space will be used.&lt;br /&gt;Do you want to continue [Y/n]?&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;2. Install Apache to make SVN accessible through the web and type Y.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;rizky@grover:~$ sudo apt-get install subversion&lt;br /&gt;Reading package lists... Done&lt;br /&gt;Building dependency tree    &lt;br /&gt;Reading state information... Done&lt;br /&gt;The following extra packages will be installed:&lt;br /&gt;  libapr1 libaprutil1 libsvn1&lt;br /&gt;Suggested packages:&lt;br /&gt;  subversion-tools db4.7-util patch&lt;br /&gt;The following NEW packages will be installed:&lt;br /&gt;  libapr1 libaprutil1 libsvn1 subversion&lt;br /&gt;0 upgraded, 4 newly installed, 0 to remove and 0 not upgraded.&lt;br /&gt;Need to get 1,464kB of archives.&lt;br /&gt;After this operation, 6,935kB of additional disk space will be used.&lt;br /&gt;Do you want to continue [Y/n]?&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;3. By default apache2 on ubuntu installation already have mod_dav however you need to enable this apache module in by issuing this command.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;rizky@grover:~$ sudo a2enmod dav&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;4. Install mod_dav_svn apache2 module by issuing this command&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;rizky@grover:~$ sudo apt-get install libapache2-svn&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;5.Dont forget to configure your ubuntu box ip address otherwise you only be able to use localhost address.&lt;br /&gt;&lt;br /&gt;Repository Creation&lt;br /&gt;&lt;br /&gt;6. Create new repository by issuing svnadmin command and create trunk directory&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;rizky@grover:~$sudo svnadmin create /svn/mydrupal&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;rizky@grover:~$sudo svn mkdir /svn/mydrupal/trunk -m 'initial trunk'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;7. Importing existing source code into repository. For instance i have drupal cms source code located at /home/rizky/Directory/drupal-6.0/.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;rizky@grover:~$sudo svn import file:///home/rizky/Directory/drupal-6.0 file:///svn/mydrupal -m 'initial loaded'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;8.Edit dav_svn.conf file and add the following script&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;location&amp;gt;&lt;br /&gt;DAV svn&lt;br /&gt;SVNPath /svn/mydrupal&lt;br /&gt;#SVNPathAuthz off&lt;br /&gt;AuthType basic&lt;br /&gt;AuthName "My Subversion Repository"&lt;br /&gt;AuthUserFile /etc/svn-auth&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Require valid-user&lt;br /&gt;&lt;br /&gt;&amp;lt;/location&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;9. Create basic authentication file and place/name it into as noted in #8 AuthUserFile /etc/svn-auth&lt;br /&gt;&lt;br /&gt;http://www.webreference.com/programming/apache_authentication/&lt;br /&gt;&lt;br /&gt;10. Start/Restart your apache&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;rizky@grover:~$sudo /etc/init.d/apache2 start&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Those are 10 steps to build your own SVN Repository and you can test what you did by browsing it using web browser http://192.168.56.2/svn/mydrupal. The IP of 192.168.56.2 is my ubuntu IP. For the first time you will be popup login form and type your user and password as noted on #9&lt;br /&gt;&lt;br /&gt;And do checkout using &lt;a href="http://tortoisesvn.tigris.org/"&gt;tortoiseSVN&lt;/a&gt; if your svn client use windows operating system.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335110-3919224365777733018?l=rizzblow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizzblow.blogspot.com/feeds/3919224365777733018/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8335110&amp;postID=3919224365777733018' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/3919224365777733018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/3919224365777733018'/><link rel='alternate' type='text/html' href='http://rizzblow.blogspot.com/2008/01/building-our-own-svn-repository-in.html' title='Building Our Own SVN Repository in Ubuntu'/><author><name>Web Developer Indonesia</name><uri>http://www.blogger.com/profile/07987143157274849677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_ss_NqUtJv6E/SwlAPKMT1LI/AAAAAAAAAEk/smjBetsq0mo/S220/rizky.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335110.post-6246686577893757662</id><published>2008-01-09T10:07:00.003+07:00</published><updated>2011-04-09T14:57:47.779+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='webdeveloperindonesia'/><title type='text'>Watch bandwidth usage real time in Linux</title><content type='html'>After &lt;a href="http://rizzblow.blogspot.com/2008/01/how-to-query-your-ethernetnic-detail-in.html"&gt;knowing your Ethernet information such as speed and Ethernet type&lt;/a&gt;. You may want to know and watch your bandwidth usage real time in your linux box.  In Linux you can issue this command &lt;b&gt;ifstat &lt;/b&gt;and you can watch your in/out packet.&lt;div&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;[root@bigbird ~]# ifstat&lt;br /&gt;     eth0                eth1                eth2     &lt;br /&gt;KB/s in  KB/s out   KB/s in  KB/s out   KB/s in  KB/s out&lt;br /&gt;  0.25      0.34      0.06      0.00     24.24    370.78&lt;br /&gt;  0.07      0.16      0.12      0.00     14.75    196.73&lt;br /&gt;  0.07      0.16      0.06      0.00      9.96    171.22&lt;br /&gt;  0.07      0.16      0.06      0.00     10.73     26.94&lt;br /&gt;  0.07      0.16      0.06      0.00     22.68    198.15&lt;br /&gt;  0.07      0.16      0.06      0.00     25.26    208.07&lt;br /&gt;  0.07      0.16      0.06      0.00     14.10    192.54&lt;br /&gt;  0.07      0.16      0.12      0.00      9.20    170.70&lt;br /&gt;  0.07      0.16      0.06      0.00      7.13     13.16&lt;br /&gt; 14.86    141.54      0.06      0.00      3.83     21.34&lt;br /&gt;  0.07      0.16      0.19      0.00      8.42     16.55&lt;br /&gt;  0.07      0.16      0.12      0.00     19.86    204.91&lt;br /&gt;  0.07      0.16      0.06      0.00     11.72     19.35&lt;br /&gt;  0.07      0.16      0.06      0.00     11.83    188.96&lt;br /&gt;  0.07      0.16      0.12      0.00     24.90    371.27&lt;br /&gt;  0.07      0.16      0.06      0.00     27.68    378.79&lt;br /&gt;  0.07      0.16      0.12      0.00      9.24     21.73&lt;br /&gt;  0.07      0.16      0.12      0.00     82.37   2512.45&lt;br /&gt;  0.07      0.16      0.06      0.00     20.97    215.73&lt;br /&gt;  0.07      0.54      0.06      0.00     39.96    550.80&lt;br /&gt;  0.07      0.16      0.19      0.00     14.98    183.67&lt;br /&gt;  0.07      0.16      0.06      0.00     30.29    225.40&lt;br /&gt;  0.07      0.16      0.12      0.00     20.01    351.26&lt;br /&gt;  0.07      0.16      0.12      0.00      8.03     14.74&lt;br /&gt;  0.07      0.16      0.06      0.00      8.86     11.19&lt;br /&gt;  0.07      0.29      0.12      0.00     22.27    217.92&lt;br /&gt;  0.07      0.16      0.06      0.00      3.71      7.57&lt;br /&gt;  0.07      0.41      0.12      0.00     60.30   1601.00&lt;br /&gt;  0.07      0.16      0.12      0.00     20.45    362.30&lt;br /&gt;  0.07      0.22      0.06      0.00      7.04     27.83&lt;br /&gt;  0.07      0.35      0.12      0.00     15.29    192.80&lt;br /&gt;  0.07      0.16      0.25      0.00     20.11    345.56&lt;br /&gt;  0.07      0.16      0.12      0.00     17.10    141.98&lt;br /&gt;  0.07      0.16      0.19      0.00     48.36   1562.07&lt;br /&gt;  0.07      0.16      0.12      0.00     33.38    736.35&lt;br /&gt;  0.07      0.16      0.12      0.00     15.13    180.79&lt;br /&gt;  0.07      0.16      0.13      0.00     36.73    572.21&lt;br /&gt;  0.07      0.16      0.12      0.00    127.61   3242.01&lt;br /&gt;  0.07      0.16      0.12      0.00     26.06    387.11&lt;br /&gt;  0.07      0.16      0.19      0.00     22.68    2&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Other tools can be used to watch your real time traffic are tcptrack and iftop.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-BmBlosmgVEk/TaAP8czsH5I/AAAAAAAAALw/40dxgqhoKZI/s1600/Screen%2Bshot%2B2011-04-09%2Bat%2BPM%2B03.48.30.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 215px;" src="http://4.bp.blogspot.com/-BmBlosmgVEk/TaAP8czsH5I/AAAAAAAAALw/40dxgqhoKZI/s320/Screen%2Bshot%2B2011-04-09%2Bat%2BPM%2B03.48.30.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5593488268393717650" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-dCls-IORBvc/TaARSv1-4qI/AAAAAAAAAMA/Tc7yb1kD-7c/s1600/Screen%2Bshot%2B2011-04-09%2Bat%2BPM%2B03.49.19.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 126px;" src="http://3.bp.blogspot.com/-dCls-IORBvc/TaARSv1-4qI/AAAAAAAAAMA/Tc7yb1kD-7c/s400/Screen%2Bshot%2B2011-04-09%2Bat%2BPM%2B03.49.19.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5593489750972359330" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335110-6246686577893757662?l=rizzblow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizzblow.blogspot.com/feeds/6246686577893757662/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8335110&amp;postID=6246686577893757662' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/6246686577893757662'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/6246686577893757662'/><link rel='alternate' type='text/html' href='http://rizzblow.blogspot.com/2008/01/watch-bandwidth-usage-real-time-in.html' title='Watch bandwidth usage real time in Linux'/><author><name>Web Developer Indonesia</name><uri>http://www.blogger.com/profile/07987143157274849677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_ss_NqUtJv6E/SwlAPKMT1LI/AAAAAAAAAEk/smjBetsq0mo/S220/rizky.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-BmBlosmgVEk/TaAP8czsH5I/AAAAAAAAALw/40dxgqhoKZI/s72-c/Screen%2Bshot%2B2011-04-09%2Bat%2BPM%2B03.48.30.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335110.post-7820005931219700162</id><published>2008-01-07T09:58:00.001+07:00</published><updated>2011-04-09T14:34:04.078+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='webdeveloperindonesia'/><title type='text'>How to query your Ethernet/NIC detail in Linux</title><content type='html'>You may want to know the speed of your Ethernet line and query what type ethernet your server currently use or have. In Linux this can be queried easy using command line &lt;b&gt;mii-tool&lt;/b&gt; and &lt;b&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;ethtool&lt;/span&gt;&lt;/b&gt;&lt;div&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;[root@bigbird ~]# mii-tool&lt;br /&gt;eth0: negotiated 100baseTx-FD, link ok&lt;br /&gt;eth1: negotiated 100baseTx-FD, link ok&lt;br /&gt;eth2: negotiated, link ok&lt;br /&gt;SIOCGMIIPHY on 'eth3' failed: Resource temporarily unavailable&lt;br /&gt;[root@296716-db2 ~]# ethtool eth0&lt;br /&gt;Settings for eth0:&lt;br /&gt;      Supported ports: [ TP ]&lt;br /&gt;      Supported link modes:   10baseT/Half 10baseT/Full&lt;br /&gt;                              100baseT/Half 100baseT/Full&lt;br /&gt;                              1000baseT/Full&lt;br /&gt;      Supports auto-negotiation: Yes&lt;br /&gt;      Advertised link modes:  10baseT/Half 10baseT/Full&lt;br /&gt;                              100baseT/Half 100baseT/Full&lt;br /&gt;                              1000baseT/Full&lt;br /&gt;      Advertised auto-negotiation: Yes&lt;br /&gt;      Speed: 100Mb/s&lt;br /&gt;      Duplex: Full&lt;br /&gt;      Port: Twisted Pair&lt;br /&gt;      PHYAD: 1&lt;br /&gt;      Transceiver: internal&lt;br /&gt;      Auto-negotiation: on&lt;br /&gt;      Supports Wake-on: g&lt;br /&gt;      Wake-on: d&lt;br /&gt;      Link detected: yes&lt;br /&gt;[root@bigbird ~]# ethtool eth1&lt;br /&gt;Settings for eth1:&lt;br /&gt;      Supported ports: [ TP ]&lt;br /&gt;      Supported link modes:   10baseT/Half 10baseT/Full&lt;br /&gt;                              100baseT/Half 100baseT/Full&lt;br /&gt;                              1000baseT/Full&lt;br /&gt;      Supports auto-negotiation: Yes&lt;br /&gt;      Advertised link modes:  10baseT/Half 10baseT/Full&lt;br /&gt;                              100baseT/Half 100baseT/Full&lt;br /&gt;                              1000baseT/Full&lt;br /&gt;      Advertised auto-negotiation: Yes&lt;br /&gt;      Speed: 100Mb/s&lt;br /&gt;      Duplex: Full&lt;br /&gt;      Port: Twisted Pair&lt;br /&gt;      PHYAD: 1&lt;br /&gt;      Transceiver: internal&lt;br /&gt;      Auto-negotiation: on&lt;br /&gt;      Supports Wake-on: g&lt;br /&gt;      Wake-on: d&lt;br /&gt;      Link detected: yes&lt;br /&gt;[root@bigbird ~]# ethtool eth2&lt;br /&gt;Settings for eth2:&lt;br /&gt;      Supported ports: [ TP ]&lt;br /&gt;      Supported link modes:   10baseT/Half 10baseT/Full&lt;br /&gt;                              100baseT/Half 100baseT/Full&lt;br /&gt;                              1000baseT/Full&lt;br /&gt;      Supports auto-negotiation: Yes&lt;br /&gt;      Advertised link modes:  10baseT/Half 10baseT/Full&lt;br /&gt;                              100baseT/Half 100baseT/Full&lt;br /&gt;                              1000baseT/Full&lt;br /&gt;      Advertised auto-negotiation: Yes&lt;br /&gt;      Speed: 1000Mb/s&lt;br /&gt;      Duplex: Full&lt;br /&gt;      Port: Twisted Pair&lt;br /&gt;      PHYAD: 1&lt;br /&gt;      Transceiver: internal&lt;br /&gt;      Auto-negotiation: on&lt;br /&gt;      Supports Wake-on: g&lt;br /&gt;      Wake-on: d&lt;br /&gt;      Link detected: yes&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335110-7820005931219700162?l=rizzblow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizzblow.blogspot.com/feeds/7820005931219700162/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8335110&amp;postID=7820005931219700162' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/7820005931219700162'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/7820005931219700162'/><link rel='alternate' type='text/html' href='http://rizzblow.blogspot.com/2008/01/how-to-query-your-ethernetnic-detail-in.html' title='How to query your Ethernet/NIC detail in Linux'/><author><name>Web Developer Indonesia</name><uri>http://www.blogger.com/profile/07987143157274849677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_ss_NqUtJv6E/SwlAPKMT1LI/AAAAAAAAAEk/smjBetsq0mo/S220/rizky.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335110.post-1665969978141230972</id><published>2007-10-21T09:48:00.002+07:00</published><updated>2011-04-09T14:32:20.914+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><title type='text'>How do i change mysql prompt ?</title><content type='html'>I was wondering from my hosting company about how come their mysql prompt can be changed. As we usually see when we login to mysql server using mysql command, the prompt is always like this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;rizky@bigbird:~$ mysql -u u211 -p -h xxxxxx&lt;br /&gt;mysql&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;After digging deeply into mysql documentation then i found the way to change mysql prompt where previously i tot such change only can be made by hacking mysql source script. Here are the following way to change mysql prompt.&lt;br /&gt;&lt;br /&gt;1. Using &lt;u&gt;prompt&lt;/u&gt; session variable into my.cnf.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;[mysql]&lt;br /&gt;prompt=(\\u@\\h) [\\d]&gt;\\_&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;2. Invoking mysql commandline variable&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mysql --prompt="(\u@\h) [\d]&gt; -u u211 "&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;3. Exporting MYSQL_PS1&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;rizky@bigbird:~$export MYSQL_PS1="(\u@\h) [\d]&gt; "&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;4. Invoking prompt command in mysql prompt&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mysql&gt; prompt (\u@\h) [\d]&gt;\_&lt;br /&gt;PROMPT set to '(\u@\h) [\d]&gt;\_'&lt;br /&gt;(root@1289.my.xxxx.com) [(mydb]&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;For #1 the change will be set every you start mysql service and others only per session.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335110-1665969978141230972?l=rizzblow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizzblow.blogspot.com/feeds/1665969978141230972/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8335110&amp;postID=1665969978141230972' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/1665969978141230972'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/1665969978141230972'/><link rel='alternate' type='text/html' href='http://rizzblow.blogspot.com/2009/11/how-do-i-change-mysql-prompt.html' title='How do i change mysql prompt ?'/><author><name>Web Developer Indonesia</name><uri>http://www.blogger.com/profile/07987143157274849677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_ss_NqUtJv6E/SwlAPKMT1LI/AAAAAAAAAEk/smjBetsq0mo/S220/rizky.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335110.post-7218756639392905284</id><published>2007-03-12T15:56:00.001+07:00</published><updated>2011-04-06T22:43:33.810+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='j2me'/><title type='text'>My first J2ME apps</title><content type='html'>Finally i have finished this project and ready to deploy, after 3 months learning many specs regarding mobile devices and doing coding based on the business requirement for J2ME side and also for the backend side.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ss_NqUtJv6E/Ssm9BajKxrI/AAAAAAAAADY/uMwLCkL0-4I/s1600-h/netbeans.jpg"&gt;&lt;img style="cursor: pointer; width: 320px; height: 189px;" src="http://3.bp.blogspot.com/_ss_NqUtJv6E/Ssm9BajKxrI/AAAAAAAAADY/uMwLCkL0-4I/s320/netbeans.jpg" alt="" id="BLOGGER_PHOTO_ID_5389046261129856690" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The application itself intended to be used by individual and/ or group of organization to refill (top up) their prepaid card. This application is new channel to make member (agent) to sell prepaid topup service directly to customer where conventionally use sms and web application. This application also intended to replace the conventional one and to make more scalable.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ss_NqUtJv6E/Ssm9A2PywNI/AAAAAAAAADQ/fZNOKJmqLg4/s1600-h/siputri.jpg"&gt;&lt;img style="cursor: pointer; width: 126px; height: 320px;" src="http://1.bp.blogspot.com/_ss_NqUtJv6E/Ssm9A2PywNI/AAAAAAAAADQ/fZNOKJmqLg4/s320/siputri.jpg" alt="" id="BLOGGER_PHOTO_ID_5389046251384914130" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Security is highest concern since this application interact with member's money that's why from the beginning i try to find the encryption engine like &lt;a href="http://www.bouncycastle.org/"&gt;&lt;cite&gt;&lt;b&gt;bouncycastle&lt;/b&gt;&lt;/cite&gt;&lt;/a&gt; that can work with both side J2ME side and Backend Side (PHP).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335110-7218756639392905284?l=rizzblow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizzblow.blogspot.com/feeds/7218756639392905284/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8335110&amp;postID=7218756639392905284' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/7218756639392905284'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/7218756639392905284'/><link rel='alternate' type='text/html' href='http://rizzblow.blogspot.com/2007/03/my-first-j2me-apps.html' title='My first J2ME apps'/><author><name>Web Developer Indonesia</name><uri>http://www.blogger.com/profile/07987143157274849677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_ss_NqUtJv6E/SwlAPKMT1LI/AAAAAAAAAEk/smjBetsq0mo/S220/rizky.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_ss_NqUtJv6E/Ssm9BajKxrI/AAAAAAAAADY/uMwLCkL0-4I/s72-c/netbeans.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335110.post-3772482601842724846</id><published>2007-03-12T11:39:00.001+07:00</published><updated>2011-04-06T22:31:03.221+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='help'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><title type='text'>How to get fastest help in mysql client console</title><content type='html'>You may be like me that sometimes feel so hard to memorize command, statement,or even privilege command in MySQL. As Administrator having many servers with various platform running.&lt;br /&gt;&lt;br /&gt;Lucky MySQL has help that make our life easier and faster when we are in console mode  using mysql client utility. No need to waste your time on google for finding information such as date function like DATE_ADD or DATE SUB where in your mysql command propmt you can just type the following command: &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mysql&gt; HELP DATE_ADD&lt;br /&gt;Name: 'DATE_ADD'    &lt;br /&gt;Description:        &lt;br /&gt;Syntax:             &lt;br /&gt;DATE_ADD(date,INTERVAL expr unit), DATE_SUB(date,INTERVAL expr unit)&lt;br /&gt;&lt;br /&gt;These functions perform date arithmetic. The date argument specifies&lt;br /&gt;the starting date or datetime value. expr is an expression specifying&lt;br /&gt;the interval value to be added or subtracted from the starting date.&lt;br /&gt;expr is a string; it may start with a "-" for negative intervals. unit&lt;br /&gt;is a keyword indicating the units in which the expression should be&lt;br /&gt;interpreted.&lt;br /&gt;&lt;br /&gt;URL: http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html&lt;br /&gt;&lt;br /&gt;Examples:&lt;br /&gt;mysql&gt; SELECT '2008-12-31 23:59:59' + INTERVAL 1 SECOND;&lt;br /&gt;        -&gt; '2009-01-01 00:00:00'&lt;br /&gt;mysql&gt; SELECT INTERVAL 1 DAY + '2008-12-31';&lt;br /&gt;        -&gt; '2009-01-01'&lt;br /&gt;mysql&gt; SELECT '2005-01-01' - INTERVAL 1 SECOND;&lt;br /&gt;        -&gt; '2004-12-31 23:59:59'&lt;br /&gt;mysql&gt; SELECT DATE_ADD('2000-12-31 23:59:59',&lt;br /&gt;    -&gt;                 INTERVAL 1 SECOND);&lt;br /&gt;        -&gt; '2001-01-01 00:00:00'&lt;br /&gt;mysql&gt; SELECT DATE_ADD('2010-12-31 23:59:59',&lt;br /&gt;    -&gt;                 INTERVAL 1 DAY);&lt;br /&gt;        -&gt; '2011-01-01 23:59:59'&lt;br /&gt;mysql&gt; SELECT DATE_ADD('2100-12-31 23:59:59',&lt;br /&gt;    -&gt;                 INTERVAL '1:1' MINUTE_SECOND);&lt;br /&gt;        -&gt; '2101-01-01 00:01:00'&lt;br /&gt;mysql&gt; SELECT DATE_SUB('2005-01-01 00:00:00',&lt;br /&gt;    -&gt;                 INTERVAL '1 1:1:1' DAY_SECOND);&lt;br /&gt;        -&gt; '2004-12-30 22:58:59'&lt;br /&gt;mysql&gt; SELECT DATE_ADD('1900-01-01 00:00:00',&lt;br /&gt;    -&gt;                 INTERVAL '-1 10' DAY_HOUR);&lt;br /&gt;        -&gt; '1899-12-30 14:00:00'&lt;br /&gt;mysql&gt; SELECT DATE_SUB('1998-01-02', INTERVAL 31 DAY);&lt;br /&gt;        -&gt; '1997-12-02'&lt;br /&gt;mysql&gt; SELECT DATE_ADD('1992-12-31 23:59:59.000002',&lt;br /&gt;    -&gt;            INTERVAL '1.999999' SECOND_MICROSECOND);&lt;br /&gt;        -&gt; '1993-01-01 00:00:01.000001'&lt;br /&gt;&lt;br /&gt;mysql&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;As you see above it also provides example in the result of command. We can also browse the mysql help by categorizing it into some category by issuing the following command:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mysql&gt; help date_add&lt;br /&gt;Name: 'DATE_ADD'    &lt;br /&gt;Description:        &lt;br /&gt;Syntax:             &lt;br /&gt;DATE_ADD(date,INTERVAL expr unit), DATE_SUB(date,INTERVAL expr unit)&lt;br /&gt;&lt;br /&gt;These functions perform date arithmetic. The date argument specifies&lt;br /&gt;the starting date or datetime value. expr is an expression specifying&lt;br /&gt;the interval value to be added or subtracted from the starting date.&lt;br /&gt;expr is a string; it may start with a "-" for negative intervals. unit&lt;br /&gt;is a keyword indicating the units in which the expression should be&lt;br /&gt;interpreted.&lt;br /&gt;&lt;br /&gt;URL: http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html&lt;br /&gt;&lt;br /&gt;Examples:&lt;br /&gt;mysql&gt; SELECT '2008-12-31 23:59:59' + INTERVAL 1 SECOND;&lt;br /&gt;        -&gt; '2009-01-01 00:00:00'&lt;br /&gt;mysql&gt; SELECT INTERVAL 1 DAY + '2008-12-31';&lt;br /&gt;        -&gt; '2009-01-01'&lt;br /&gt;mysql&gt; SELECT '2005-01-01' - INTERVAL 1 SECOND;&lt;br /&gt;        -&gt; '2004-12-31 23:59:59'&lt;br /&gt;mysql&gt; SELECT DATE_ADD('2000-12-31 23:59:59',&lt;br /&gt;    -&gt;                 INTERVAL 1 SECOND);&lt;br /&gt;        -&gt; '2001-01-01 00:00:00'&lt;br /&gt;mysql&gt; SELECT DATE_ADD('2010-12-31 23:59:59',&lt;br /&gt;    -&gt;                 INTERVAL 1 DAY);&lt;br /&gt;        -&gt; '2011-01-01 23:59:59'&lt;br /&gt;mysql&gt; SELECT DATE_ADD('2100-12-31 23:59:59',&lt;br /&gt;    -&gt;                 INTERVAL '1:1' MINUTE_SECOND);&lt;br /&gt;        -&gt; '2101-01-01 00:01:00'&lt;br /&gt;mysql&gt; SELECT DATE_SUB('2005-01-01 00:00:00',&lt;br /&gt;    -&gt;                 INTERVAL '1 1:1:1' DAY_SECOND);&lt;br /&gt;        -&gt; '2004-12-30 22:58:59'&lt;br /&gt;mysql&gt; SELECT DATE_ADD('1900-01-01 00:00:00',&lt;br /&gt;    -&gt;                 INTERVAL '-1 10' DAY_HOUR);&lt;br /&gt;        -&gt; '1899-12-30 14:00:00'&lt;br /&gt;mysql&gt; SELECT DATE_SUB('1998-01-02', INTERVAL 31 DAY);&lt;br /&gt;        -&gt; '1997-12-02'&lt;br /&gt;mysql&gt; SELECT DATE_ADD('1992-12-31 23:59:59.000002',&lt;br /&gt;    -&gt;            INTERVAL '1.999999' SECOND_MICROSECOND);&lt;br /&gt;        -&gt; '1993-01-01 00:00:01.000001'&lt;br /&gt;&lt;br /&gt;mysql&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335110-3772482601842724846?l=rizzblow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizzblow.blogspot.com/feeds/3772482601842724846/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8335110&amp;postID=3772482601842724846' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/3772482601842724846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335110/posts/default/3772482601842724846'/><link rel='alternate' type='text/html' href='http://rizzblow.blogspot.com/2007/03/how-to-get-fastest-help-in-mysql-client.html' title='How to get fastest help in mysql client console'/><author><name>Web Developer Indonesia</name><uri>http://www.blogger.com/profile/07987143157274849677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_ss_NqUtJv6E/SwlAPKMT1LI/AAAAAAAAAEk/smjBetsq0mo/S220/rizky.png'/></author><thr:total>0</thr:total></entry></feed>
