<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>jgiam.com</title>
	
	<link>http://jgiam.com</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Sun, 15 Aug 2010 14:54:57 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/jgiam" /><feedburner:info uri="jgiam" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>How not to run a webhosting company</title>
		<link>http://feedproxy.google.com/~r/jgiam/~3/F7x2gpBhD4Y/how-not-to-run-a-webhosting-company</link>
		<comments>http://jgiam.com/2010/08/15/how-not-to-run-a-webhosting-company#comments</comments>
		<pubDate>Sun, 15 Aug 2010 14:53:09 +0000</pubDate>
		<dc:creator>Jon G</dc:creator>
				<category><![CDATA[Techie Corner]]></category>

		<guid isPermaLink="false">http://jgiam.com/?p=194</guid>
		<description><![CDATA[After getting burnt by my previous webhost, SolidInternet (previously Myacen), I am more cautious when it comes to webhosts. I was with VirtuallyDedicated since November last year, and several things led me to switch to another webhost recently. These are how not to run a webhosting company. Promise first, don&#8217;t deliver. VirtuallyDedicated promised me a [...]]]></description>
			<content:encoded><![CDATA[<p>After getting burnt by my previous webhost, SolidInternet (previously Myacen), I am more cautious when it comes to webhosts. I was with <a href="http://virtuallydedicated.com/" target="_blank">VirtuallyDedicated</a> since November last year, and several things led me to switch to another webhost recently. These are how <em>not</em> to run a webhosting company.</p>
<ol>
<li><strong>Promise first, don&#8217;t deliver.</strong><br />
VirtuallyDedicated promised me a few times a control panel for my VPS. I didn&#8217;t <em>really</em> need a control panel. I just wanted it to be able to tell if my VPS was down by my own fault, or if the node was down, and to reboot my VPS if needed. Yet, I was promised again and again, and no control panel was delivered.</li>
<li><strong>Don&#8217;t communicate with your customers. Don&#8217;t inform them of downtimes or system failures.</strong><br />
Throughout the time I was with VirtuallyDedicated, my VPS experienced a few occasions of extended downtime. Extended being in the range of hours. The webhost didn&#8217;t bother to inform me nor offer any explanation. Unless I e-mailed them to ask about it. Over time, I just gave up and let the downtimes be, since they were rare.</li>
<li><strong>Let your servers go down for really long, and not only not inform customers, but don&#8217;t reply to their e-mails.</strong><br />
This last one took the cake. My VPS went down for over 24 hours. No word from the webhost. I submitted a support ticket, but did not receive a reply. I directly e-mailed the webhost, and over a day later, received a reply that the downtime was due to a hardware issue and that I didn&#8217;t receive a reply because &#8220;for some reason tickets were not reaching the support system&#8221;. No further explanation, not even why a hardware issue resulted in downtime of over a day.<br />
<a href="http://jgiam.com/wp-content/uploads/2010/08/pingdom-vps2-graph.png" rel="lightbox[194]"><img class="aligncenter size-medium wp-image-198" title="VPS2 Pingdom Graph" src="http://jgiam.com/wp-content/uploads/2010/08/pingdom-vps2-graph-480x374.png" alt="" width="480" height="374" /></a><a href="http://jgiam.com/wp-content/uploads/2010/08/pingdom-vps2-table.png" rel="lightbox[194]"><img class="aligncenter size-medium wp-image-199" title="VPS2 Pingdom Table" src="http://jgiam.com/wp-content/uploads/2010/08/pingdom-vps2-table-480x467.png" alt="" width="480" height="467" /></a></li>
</ol>
<p>After that, I simply had enough of VirtuallyDedicated. I decided that for my next webhost, I would go for an established company, one that actually had a real team of technical and support staff. Although there were some negative reviews, I am now on <a href="https://www.burst.net/" target="_blank">BurstNET</a>. So far, so good. There was an incident where my VPS was performing very slow due to (I suspect) high disk I/O by some other user on the node. But since then, everything is working well and I&#8217;m happy with BurstNET.</p>
<img src="http://feeds.feedburner.com/~r/jgiam/~4/F7x2gpBhD4Y" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://jgiam.com/2010/08/15/how-not-to-run-a-webhosting-company/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://jgiam.com/2010/08/15/how-not-to-run-a-webhosting-company</feedburner:origLink></item>
		<item>
		<title>HTC Sense (Windows Mobile) quirks</title>
		<link>http://feedproxy.google.com/~r/jgiam/~3/7VVkCi9U5CQ/htc-sense-windows-mobile-quirks</link>
		<comments>http://jgiam.com/2010/08/03/htc-sense-windows-mobile-quirks#comments</comments>
		<pubDate>Tue, 03 Aug 2010 08:51:15 +0000</pubDate>
		<dc:creator>Jon G</dc:creator>
				<category><![CDATA[Techie Corner]]></category>

		<guid isPermaLink="false">http://jgiam.com/?p=192</guid>
		<description><![CDATA[I&#8217;m on Singtel, and my HTC HD2 gets preconfigured with four data networks: SingTel Streaming, SingTel MMS, SingTel WAP and SingTel Internet. If you go to &#8220;Settings&#8221; &#62; &#8220;All Settings&#8221; &#62; &#8220;Connections&#8221; &#62; &#8220;Connections&#8221; &#62; &#8220;Advanced&#8221; &#62; &#8220;Select Networks&#8221;, you can see the list under the heading &#8220;Programs that automatically connect to the Internet should [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m on Singtel, and my HTC HD2 gets preconfigured with four data networks: SingTel Streaming, SingTel MMS, SingTel WAP and SingTel Internet. If you go to &#8220;Settings&#8221; &gt; &#8220;All Settings&#8221; &gt; &#8220;Connections&#8221; &gt; &#8220;Connections&#8221; &gt; &#8220;Advanced&#8221; &gt; &#8220;Select Networks&#8221;, you can see the list under the heading &#8220;Programs that automatically connect to the Internet should connect using:&#8221;.</p>
<p>One of the neat features of HTC Sense is the integration with Facebook, YouTube and Flickr. From the HTC Albums, you can easily upload photos to Facebook. If it works. Unfortunately for me, I couldn&#8217;t get that feature to work. Instead, I was prompted to login. After typing in my e-mail and password, I got the following &#8220;Login error&#8221;: &#8220;There has been a connection error while attempting to login&#8221;. I never figured this problem out until recently. Apparently this is an obscure problem. I came across a forum posting that mentioned trying to change the default data network, so I tried that. To my surprise, I hit the jackpot with &#8220;SingTel Streaming&#8221;. Once I selected that and tried to login, it worked! I changed the setting back to &#8220;SingTel Internet&#8221; (the default network), and was able to upload photos from HTC Albums!</p>
<p>I don&#8217;t really know the difference between the different Singtel data network settings, and it is quite strange that even though &#8220;SingTel Internet&#8221; (aka &#8220;IDEAS Internet&#8221;) is the default connection, HTC Sense is not able to login. This issue was also encountered on a HTC HD mini.</p>
<p>By the way, to manage your accounts in HTC Sense, go to &#8220;Settings&#8221; &gt; &#8220;All Settings&#8221; &gt; &#8220;Connections&#8221; &gt; &#8220;Account Manager&#8221;, and you will see the login status of Facebook, YouTube and Twitter. Not particularly intuitive.</p>
<p>A side effect of changing the data network was that all of a sudden, my Opera browser could not surf the Internet. Internet Explorer and other applications were fine. Just Opera. Loading any page would immediately display the network error page.</p>
<p>Thanks to a <a href="http://www.mobinauts.com/topic/109757-official-thread-for-htc-hd2-part-5/page__st__340" target="_blank">thread from Mobinauts</a>, I found that the solution is to change the following registry key from &#8217;0&#8242; to &#8217;1&#8242;:</p>
<pre>HKEY_LOCAL_MACHINE\Software\Opera\Prefs\Network
Conn Mgr Auto Detect Network = 1</pre>
<p>Apparently Opera is configured to connect only through &#8220;SingTel WAP&#8221;. Unfortunately, something I did caused the connection to fail. By changing the registry, Opera will use an available data network setting, in this case, &#8220;SingTel Internet&#8221;.</p>
<p>Perhaps these are more accurately telco (Singtel) quirks, rather than HTC Sense?</p>
<img src="http://feeds.feedburner.com/~r/jgiam/~4/7VVkCi9U5CQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://jgiam.com/2010/08/03/htc-sense-windows-mobile-quirks/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://jgiam.com/2010/08/03/htc-sense-windows-mobile-quirks</feedburner:origLink></item>
		<item>
		<title>Tethering Windows Mobile 6 with Ubuntu</title>
		<link>http://feedproxy.google.com/~r/jgiam/~3/c7u4H0-SdTM/tethering-windows-mobile-6-with-ubuntu</link>
		<comments>http://jgiam.com/2010/02/03/tethering-windows-mobile-6-with-ubuntu#comments</comments>
		<pubDate>Wed, 03 Feb 2010 04:19:23 +0000</pubDate>
		<dc:creator>Jon G</dc:creator>
				<category><![CDATA[Techie Corner]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[windows mobile]]></category>

		<guid isPermaLink="false">http://jgiam.com/?p=176</guid>
		<description><![CDATA[Recently, I was using a laptop with Ubuntu installed. Anticipating that I might not have Wi-fi and needed to tether my Windows Mobile phone for Internet, I installed SynCE. I was in a rush and didn&#8217;t have time to really test it other than loading Google (isn&#8217;t that the &#8220;standard&#8221; test for Internet connectivity now? [...]]]></description>
			<content:encoded><![CDATA[<p>Recently, I was using a laptop with Ubuntu installed. Anticipating that I might not have Wi-fi and needed to tether my Windows Mobile phone for Internet, I installed <a href="http://www.synce.org/" target="_blank">SynCE</a>. I was in a rush and didn&#8217;t have time to really test it other than loading Google (isn&#8217;t that the &#8220;standard&#8221; test for Internet connectivity now? <img src='http://jgiam.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> ) As it turned out, the place I went to did have Wi-fi access, but I hadn&#8217;t installed the Wi-fi drivers for the laptop. To install the Wi-fi drivers, I would need to tether my phone.</p>
<p>Unfortunately I was facing a very strange situation. When I tethered my phone, the laptop did have Internet. But I couldn&#8217;t load anything other than the Google home page. I could <strong>ping</strong>, and I could do <strong>nslookup</strong>. I could <strong>wget</strong> the Google homepage consistently. But I couldn&#8217;t search or load any other pages. <strong>apt-get</strong> refused to work as well. I tried to FTP, and discovered that the connection would choke if I tried to do a directory listing of a large directory.</p>
<p>After much trying and Googling, I wondered if it had anything to do with the <a href="http://en.wikipedia.org/wiki/Maximum_transmission_unit" target="_blank">MTU</a>. I Googled, and came across <a href="http://forum.xda-developers.com/showpost.php?p=4879610&amp;postcount=114" target="_blank">a forum post</a> that suggested changing the MTU to 1000. I tried it, and&#8230; it worked!</p>
<p>I&#8217;m now happily tethering my Windows Mobile 6.1 phone with Ubuntu 9.10, using just SynCE + MTU 1000. <img src='http://jgiam.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<img src="http://feeds.feedburner.com/~r/jgiam/~4/c7u4H0-SdTM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://jgiam.com/2010/02/03/tethering-windows-mobile-6-with-ubuntu/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://jgiam.com/2010/02/03/tethering-windows-mobile-6-with-ubuntu</feedburner:origLink></item>
		<item>
		<title>128MB wasn’t enough</title>
		<link>http://feedproxy.google.com/~r/jgiam/~3/H7o7nnqw3Zw/128mb-wasnt-enough</link>
		<comments>http://jgiam.com/2010/01/04/128mb-wasnt-enough#comments</comments>
		<pubDate>Mon, 04 Jan 2010 03:43:33 +0000</pubDate>
		<dc:creator>Jon G</dc:creator>
				<category><![CDATA[Techie Corner]]></category>
		<category><![CDATA[vps]]></category>

		<guid isPermaLink="false">http://jgiam.com/?p=174</guid>
		<description><![CDATA[128MB wasn&#8217;t enough for me. My VPS struggled to serve my sites, and too many simultaneous connections caused the server to swap wildly, bringing up CPU and disk usage. My VPS got suspended once for over usage of resources. Despite more tweaking, the server was still too slow for my liking. I wanted to upgrade [...]]]></description>
			<content:encoded><![CDATA[<p>128MB wasn&#8217;t enough for me. My VPS struggled to serve my sites, and too many simultaneous connections caused the server to swap wildly, bringing up CPU and disk usage. My VPS got suspended once for over usage of resources. Despite more tweaking, the server was still too slow for my liking.</p>
<p>I wanted to upgrade to a plan with more RAM, but the plans on RapidXen were beyond my budget. I looked around and found <a href="http://virtuallydedicated.com/xen.html" target="_blank">VirtuallyDedicated</a>. Their 640MB (with 1.25GB swap) was still reasonably affordable for me, and I decided to take that plan. I did not regret my decision. The extra RAM really does help, and my sites load faster, and handle more connections. Even compiling PHP for LiteSpeed took a fraction of the time. Network connectivity is much better, especially in terms of bandwidth. A tip if you&#8217;re buying hosting in another country: make sure you do latency and bandwidth tests. Not all datacentres are made equal. 10-20KB/s is really bad.</p>
<p>So far, so good with this VPS. My only issue right now is the lack of a control panel (for Xen VPSes), which means things like reboots have to be requested and done by staff. They keep telling me a control panel is launching soon, but I have not received any word.</p>
<img src="http://feeds.feedburner.com/~r/jgiam/~4/H7o7nnqw3Zw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://jgiam.com/2010/01/04/128mb-wasnt-enough/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://jgiam.com/2010/01/04/128mb-wasnt-enough</feedburner:origLink></item>
		<item>
		<title>Backing up my VPS: Settings, websites and MySQL</title>
		<link>http://feedproxy.google.com/~r/jgiam/~3/rnG9SuY1zPE/backing-up-my-vps-settings-websites-and-mysql</link>
		<comments>http://jgiam.com/2009/11/02/backing-up-my-vps-settings-websites-and-mysql#comments</comments>
		<pubDate>Mon, 02 Nov 2009 09:22:50 +0000</pubDate>
		<dc:creator>Jon G</dc:creator>
				<category><![CDATA[Techie Corner]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[vps]]></category>

		<guid isPermaLink="false">http://jgiam.com/?p=169</guid>
		<description><![CDATA[I&#8217;ve seen the painful lessons many times: lazy website owners thinking their webhost would last forever, and neglecting to save their own backups. But really, you learn a lesson the best when you actually feel the pain. And I sure did. To prevent this, I decided to automatically, and regularly backup my VPS and store them [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve seen the painful lessons many times: lazy website owners thinking their webhost would last forever, and neglecting to save their own backups. But really, you learn a lesson the best when you actually feel the pain. And I sure did.</p>
<p>To prevent this, I decided to automatically, and regularly backup my VPS and store them on my computer. I searched Google a bit, and found two typical approaches: a simple shell script, or a full-fledged backup solution. I decided that I didn&#8217;t need something like <a href="http://www.amanda.org/" target="_blank">Amanda</a> or <a href="http://www.bacula.org/en/" target="_blank">Bacula</a>. I didn&#8217;t feel too inclined to messing with scripts though. However, I found <a href="http://www.cyberciti.biz/tips/how-to-backup-mysql-databases-web-server-files-to-a-ftp-server-automatically.html" target="_blank">this nifty tutorial</a> to backup web server files <em>and</em> MySQL databases. The tutorial came complete with a script generator, which was really handy.</p>
<p>I made some changes to the generated script though:</p>
<ol>
<li>I prefer the yyyy-mm-dd date format for easier (and natural) file name sorting. I also changed the timestamp of the MySQL dumps to match the file dump timestamp format. </li>
<li>Because I&#8217;m not running large websites, I decided to change the script so that the full backup  is only run once a month instead of once a week, to save on resources.</li>
</ol>
<p>With this script running, I should not have to encounter another situation where I lose months of data. Well, unless the backups stop running without me realising. <img src='http://jgiam.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<img src="http://feeds.feedburner.com/~r/jgiam/~4/rnG9SuY1zPE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://jgiam.com/2009/11/02/backing-up-my-vps-settings-websites-and-mysql/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://jgiam.com/2009/11/02/backing-up-my-vps-settings-websites-and-mysql</feedburner:origLink></item>
		<item>
		<title>Optimising LiteSpeed Web Server: 30 seconds to less than 1 second</title>
		<link>http://feedproxy.google.com/~r/jgiam/~3/Cc2rxJFezIw/optimising-litespeed-web-server-30-seconds-to</link>
		<comments>http://jgiam.com/2009/10/29/optimising-litespeed-web-server-30-seconds-to#comments</comments>
		<pubDate>Thu, 29 Oct 2009 03:47:23 +0000</pubDate>
		<dc:creator>Jon G</dc:creator>
				<category><![CDATA[Techie Corner]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[vps]]></category>

		<guid isPermaLink="false">http://jgiam.com/?p=166</guid>
		<description><![CDATA[I chose to use the LiteSpeed Web Server over Apache HTTP Server because of the low memory footprint, as well as better performance for PHP. The GUI admin interface is also a big plus point, making it easy to administer the server. As I was adding sites and working to bring them online, I realised [...]]]></description>
			<content:encoded><![CDATA[<p>I chose to use the <a href="http://litespeedtech.com/overview.html" target="_blank">LiteSpeed Web Server</a> over <a href="http://httpd.apache.org/" target="_blank">Apache HTTP Server</a> because of the low memory footprint, as well as better performance for PHP. The GUI admin interface is also a big plus point, making it easy to administer the server.</p>
<p>As I was adding sites and working to bring them online, I realised that my sites were loading very slowly. I installed <a href="http://wordpress.org/extend/plugins/wptuner/" target="_blank">WP Tuner</a>, a WordPress plugin, to try and see if the bottleneck was on LiteSpeed or MySQL. From the statistics, the delay occurred at the very first &#8220;Start&#8221; marker, taking 30 seconds, or even as long as 60 seconds. This wasn&#8217;t a problem with MySQL then. Next, I used <a href="http://www.linuxforums.org/articles/using-top-more-efficiently_89.html" target="_blank">top</a> to monitor CPU and memory usage. It turns out that each PHP process took up 20MB of memory. With a VPS of only 128MB memory, and each site load using multiple processes, this was a huge problem. I was quickly running out of memory, and there was a lot of swapping. A quick search on Google, and I found <a href="http://litespeedtech.com/php-litespeed-sapi.html" target="_blank">this page of documentation</a>, which states:</p>
<blockquote><p>There are two ways to let PHP handle multiple requests concurrently, Server Managed Mode and Self Managed Mode. In Server Managed Mode, LiteSpeed web server dynamically spawn/stop PHP processes, in this mode &#8220;Instances&#8221; should match &#8220;Max Connections&#8221; configuration for PHP external application. <strong>To start PHP in Self Managed Mode, &#8220;Instances&#8221; should be set to &#8220;1&#8243;, while &#8220;LSAPI_CHILDREN&#8221; environment variable should be set to match the value of &#8220;Max Connections&#8221; and &gt;1.</strong> Web Server will start one PHP process, this process will start/stop children PHP processes dynamically based on on demand. If &#8220;LSAPI_CHILDREN&#8221; &lt;=1, PHP will be started in server managed mode.<br />
Self Managed Mode is preferred because all PHP processes can share one shared memory block for the opcode cache.</p>
</blockquote>
<div>I configured LiteSpeed to use Self Managed Mode as described, and restarted the server. I then loaded my sites in my browser, and just like that, my websites loaded in under a second. Just to make sure it wasn&#8217;t due to caching, I browsed several pages of the sites, and everything worked perfectly. It certainly pays to spend a bit of time analysing performance, reading documentation and tuning the server. <img src='http://jgiam.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </div>
<img src="http://feeds.feedburner.com/~r/jgiam/~4/Cc2rxJFezIw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://jgiam.com/2009/10/29/optimising-litespeed-web-server-30-seconds-to/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://jgiam.com/2009/10/29/optimising-litespeed-web-server-30-seconds-to</feedburner:origLink></item>
		<item>
		<title>Webhosts come and go</title>
		<link>http://feedproxy.google.com/~r/jgiam/~3/8uycMYnix1k/webhosts-come-and-go</link>
		<comments>http://jgiam.com/2009/10/27/webhosts-come-and-go#comments</comments>
		<pubDate>Tue, 27 Oct 2009 08:10:40 +0000</pubDate>
		<dc:creator>Jon G</dc:creator>
				<category><![CDATA[Techie Corner]]></category>

		<guid isPermaLink="false">http://jgiam.com/?p=163</guid>
		<description><![CDATA[This is a very important lesson: Webhosts come and go. One commonly-cited criteria for a good webhost is how long it has been in business. This, however, is hardly fool-proof. I had been with my previous host since 2003, I believe, which is six years or so of hosting. Two weeks ago, the server my [...]]]></description>
			<content:encoded><![CDATA[<p>This is a very important lesson: Webhosts come and go. One commonly-cited criteria for a good webhost is how long it has been in business. This, however, is hardly fool-proof. I had been with my previous host since 2003, I believe, which is six years or so of hosting. Two weeks ago, the server my website was on went down, and stayed down. No replies to tickets, no live chat, no answers to their phone (see <a href="http://www.webhostingtalk.com/showthread.php?t=897512">this thread</a> on WebHostingTalk). There were tell-tale signs of its impending doom: even before this incident, the server had gone down for one to two days at a time, and my tickets were not getting responded to. But I&#8217;d been lazy (and caught up with real life), and neglected to making a backup of my hosting account. My last full backup was from May, five months ago.</p>
<p>On the positive side, I am now a proud owner of a <a href="http://en.wikipedia.org/wiki/Virtual_private_server" target="_blank">VPS</a>. I decided to go with a VPS because I loved the flexibility and customisability of a VPS, and not be tied down to the quirks and limitations of shared hosting. A dedicated server is way over budget, so I decided to go with a small, cheap VPS instead. After much reading up, I decided to sign up with <a href="http://rapidxen.net/" target="_blank">RapidXen</a>, and purchased a 128MB VPS. Since I had a <a href="http://www.lowendbox.com/exclusive-deals/" target="_blank">coupon for 20% off</a>, I decided to get a slightly higher spec&#8217;ed VPS, 128MB RAM with 384MB swap and 10GB disk space.</p>
<p>Over the past few days, I have had fun setting up my VPS, and have just put this website back online (though restored from the May backup). Setting up a VPS requires Linux knowledge though, so this is definitely not for a Linux-newbie. There are a quite a few guides, and I found these particularly useful:</p>
<ul>
<li><a href="http://www.lowendbox.com/blog/yes-you-can-run-18-static-sites-on-a-64mb-link-1-vps/" target="_blank">Yes, You Can Run 18 Static Sites on a 64MB Link-1 VPS</a>, an article on <a href="http://www.lowendbox.com/" target="_blank">LowEndBox</a>, which shows some steps for optimising memory usage on a VPS.</li>
<li><a href="http://www.lowendbox.com/blog/reducing-mysql-memory-usage-for-low-end-boxes/" target="_blank">Reducing MySQL Memory Usage for Low End Boxes</a>, also from LowEndBox, on how to reduce MySQL memory usage.</li>
<li><a href="http://www.usefuljaja.com/debian-vps" target="_blank">Debian VPS configuration and setup</a>, from <a href="http://www.usefuljaja.com/" target="_blank">usefuljaja.com</a>, with a quick-start on setting up and securing a clean VPS.</li>
<li><a href="http://www.usefuljaja.com/litespeed" target="_blank">Litespeed tutorials</a>, also from usefuljaja.com, which has many detailed, step-by-step instructions on setting up Litespeed web server.</li>
</ul>
<p>The VPS seems to be running well at the moment, and I hope this will be a long-term host <img src='http://jgiam.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<img src="http://feeds.feedburner.com/~r/jgiam/~4/8uycMYnix1k" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://jgiam.com/2009/10/27/webhosts-come-and-go/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://jgiam.com/2009/10/27/webhosts-come-and-go</feedburner:origLink></item>
		<item>
		<title>Using Zebra for batch processing</title>
		<link>http://feedproxy.google.com/~r/jgiam/~3/qiB5vQRXjjc/using-zebra-for-batch-processing</link>
		<comments>http://jgiam.com/2009/01/13/using-zebra-for-batch-processing#comments</comments>
		<pubDate>Tue, 13 Jan 2009 08:10:08 +0000</pubDate>
		<dc:creator>Jon G</dc:creator>
				<category><![CDATA[Techie Corner]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://jgiam.com/?p=156</guid>
		<description><![CDATA[As mentioned in my previous post, Zebra, more specifically, zebraimg, the barcode recognition component, is fast and rather accurate. However, the program isn&#8217;t really made for batch processing of barcodes. Yes, you can execute zebraimg *.jpg, but the problem is that it is difficult to extract information on which barcodes were successfully recognised, which were [...]]]></description>
			<content:encoded><![CDATA[<p>As mentioned in <a href="http://jgiam.com/2009/01/09/cataloguing-my-home-library">my previous post</a>, <a href="http://zebra.sourceforge.net/" target="_blank">Zebra</a>, more specifically, <strong>zebraimg</strong>, the barcode recognition component, is fast and rather accurate. However, the program isn&#8217;t really made for batch processing of barcodes. Yes, you can execute <strong>zebraimg *.jpg</strong>, but the problem is that it is difficult to extract information on which barcodes were successfully recognised, which were ambiguous, and which failed. I initially ran this command to process my barcodes, but ended up having to cross-check the results, which wasted quite a bit of time. I wanted some formatting of results to make it easier to identify problematic barcodes.</p>
<p>A simple script would be able to format the recognition results. Because I am not familiar with shell scripting, I wrote one in PHP instead.</p>
<p>The gist of the script is that it scans the working directory for all JPEGs, runs <strong>zebraimg</strong> and writes the result to a file. The result is saved in a CSV format with the filename and zero or more recognised barcodes.</p>
<p><span id="more-156"></span></p>
<p>First, we define the location of the <strong>zebraimg</strong> executable, and the allowed file extensions. Note that zebraimg is not limited to only JPEGs. However, since my barcodes are all JPEGs, I&#8217;m restricting my scripts to JPEGs.</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp;<span style="color: #000088;">$zebraimg</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'/usr/local/bin/zebraimg'</span><span style="color: #339933;">;</span><br />
&nbsp;<span style="color: #000088;">$allowed_ext</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'jpg'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>Next, we get the file listing in the current directory, and open <strong>result.txt</strong> for writing.</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp;<span style="color: #000088;">$filelist</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/scandir"><span style="color: #990000;">scandir</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$cwd</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp;<br />
&nbsp;<span style="color: #000088;">$fp</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/fopen"><span style="color: #990000;">fopen</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'result.txt'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'w'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>We then do some basic validity checks:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp;<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$filelist</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><a href="http://www.php.net/is_file"><span style="color: #990000;">is_file</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp;<span style="color: #666666; font-style: italic;">//echo $file . &quot; is not a file\n&quot;;</span><br />
&nbsp; &nbsp;<span style="color: #b1b100;">continue</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp;<br />
&nbsp; <span style="color: #000088;">$fileinfo</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/pathinfo"><span style="color: #990000;">pathinfo</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <br />
&nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><a href="http://www.php.net/array_search"><span style="color: #990000;">array_search</span></a><span style="color: #009900;">&#40;</span><a href="http://www.php.net/strtolower"><span style="color: #990000;">strtolower</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fileinfo</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'extension'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$allowed_ext</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">===</span> <span style="color: #009900; font-weight: bold;">FALSE</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp;<span style="color: #b1b100;">continue</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span></div></div>
<p>We are now ready to execute <strong>zebraimg</strong> on the current file:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; <span style="color: #000088;">$cmd</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$zebraimg</span><span style="color: #339933;">.</span><span style="color: #0000ff;">' -q '</span><span style="color: #339933;">.</span><span style="color: #000088;">$file</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; <a href="http://www.php.net/unset"><span style="color: #990000;">unset</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$results</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <br />
&nbsp; <a href="http://www.php.net/exec"><span style="color: #990000;">exec</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$cmd</span><span style="color: #339933;">,</span> <span style="color: #000088;">$results</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <br />
&nbsp; <span style="color: #b1b100;">echo</span> <a href="http://www.php.net/count"><span style="color: #990000;">count</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$results</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot; barcodes found.<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span></div></div>
<p>I used the <strong>-q</strong> option so that <strong>zebraimg</strong> only returns the barcodes found, if any (and no other messages).</p>
<p>Next, we do some simple text processing to get the CSV format that we want, and write out the result.</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; <span style="color: #000088;">$towrite</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$file</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$results</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$result</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #000088;">$towrite</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">','</span><span style="color: #339933;">.</span><span style="color: #000088;">$result</span><span style="color: #339933;">;</span><br />
&nbsp; <br />
&nbsp; <span style="color: #000088;">$towrite</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; <br />
&nbsp; <a href="http://www.php.net/fwrite"><span style="color: #990000;">fwrite</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fp</span><span style="color: #339933;">,</span> <span style="color: #000088;">$towrite</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>And of course, close the <strong>foreach</strong> loop and the file pointer:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp;<span style="color: #009900;">&#125;</span><br />
&nbsp;<a href="http://www.php.net/fclose"><span style="color: #990000;">fclose</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fp</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>Sample output from running the script:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Processing IMAGE_352.JPG... 1 barcodes found.<br />
Processing IMAGE_353.JPG... 0 barcodes found.<br />
Processing IMAGE_354.JPG... 1 barcodes found.<br />
Processing IMAGE_355.JPG... 1 barcodes found.<br />
Processing IMAGE_356.JPG... 1 barcodes found.<br />
Processing IMAGE_357.JPG... 1 barcodes found.<br />
Processing IMAGE_358.JPG... 1 barcodes found.<br />
Processing IMAGE_359.JPG... 2 barcodes found.</div></div>
<p>And the corresponding entries in the result file:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">IMAGE_352.JPG,EAN-13:9780747269861<br />
IMAGE_353.JPG<br />
IMAGE_354.JPG,EAN-13:9789812046260<br />
IMAGE_355.JPG,EAN-13:0071152006998<br />
IMAGE_356.JPG,EAN-13:0070993007997<br />
IMAGE_357.JPG,EAN-13:9780349112923<br />
IMAGE_358.JPG,EAN-13:9780747236818<br />
IMAGE_359.JPG,EAN-13:9781876095024,EAN-13:0633365095024</div></div>
<p>There is, of course, a slight performance overhead incurred, but this is nothing compared to the effort of cross-checking the recognised barcodes manually.</p>
<p>What performance overhead are we talking about here? Running the <strong>zebraimg *.JPG</strong> took around 10 seconds for 74 images. Running the script took around 13 seconds. As you can see, in absolute terms, this overhead is minimal, thanks to the speed at which <strong>zebraimg</strong> processes the images.</p>
<img src="http://feeds.feedburner.com/~r/jgiam/~4/qiB5vQRXjjc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://jgiam.com/2009/01/13/using-zebra-for-batch-processing/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://jgiam.com/2009/01/13/using-zebra-for-batch-processing</feedburner:origLink></item>
		<item>
		<title>Visit to the Singapore Zoo</title>
		<link>http://feedproxy.google.com/~r/jgiam/~3/W0qFHJVCI2g/visit-to-the-singapore-zoo</link>
		<comments>http://jgiam.com/2009/01/10/visit-to-the-singapore-zoo#comments</comments>
		<pubDate>Sat, 10 Jan 2009 12:18:49 +0000</pubDate>
		<dc:creator>Jon G</dc:creator>
				<category><![CDATA[Photography]]></category>

		<guid isPermaLink="false">http://jgiam.com/?p=151</guid>
		<description><![CDATA[Before my next post on zebraimg, how about some actual zebras? This was from my visit to the Singapore Zoo in December. Do check out the rest of the album here, or my dA for selected photos.]]></description>
			<content:encoded><![CDATA[<p>Before my next post on <strong>zebraimg</strong>, how about some actual zebras? <img src='http://jgiam.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="text-align: center;"><a href="http://g2.jgiam.com/v/zoo2008/DSC_4922_resize.jpg.html" target="_blank"><img class="aligncenter" title="Zebras" src="http://g2.jgiam.com/d/6613-1/DSC_4922_resize.jpg" alt="" width="240" height="159" /></a></p>
<p>This was from my visit to the <a href="http://www.zoo.com.sg/" target="_blank">Singapore Zoo</a> in December. Do check out the rest of the album <a href="http://g2.jgiam.com/v/zoo2008/" target="_blank">here</a>, or my <a href="http://o-0.deviantart.com/" target="_blank">dA</a> for selected photos.</p>
<img src="http://feeds.feedburner.com/~r/jgiam/~4/W0qFHJVCI2g" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://jgiam.com/2009/01/10/visit-to-the-singapore-zoo/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://jgiam.com/2009/01/10/visit-to-the-singapore-zoo</feedburner:origLink></item>
		<item>
		<title>Cataloguing my home library</title>
		<link>http://feedproxy.google.com/~r/jgiam/~3/TzgU2e3pZzE/cataloguing-my-home-library</link>
		<comments>http://jgiam.com/2009/01/09/cataloguing-my-home-library#comments</comments>
		<pubDate>Fri, 09 Jan 2009 15:02:02 +0000</pubDate>
		<dc:creator>Jon G</dc:creator>
				<category><![CDATA[Techie Corner]]></category>

		<guid isPermaLink="false">http://jgiam.com/?p=142</guid>
		<description><![CDATA[I have many books at home, and I&#8217;ve always wanted to keep a catalogue of my books. But because I have so many books, manually typing in ISBNs was out of the question. I wanted a tech solution, preferably free. I explored the possibility of software to recognise barcodes from photos, since it would be [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;">I have many books at home, and I&#8217;ve always wanted to keep a catalogue of my books. But because I have so many books, manually typing in <a href="http://en.wikipedia.org/wiki/ISBN" target="_blank">ISBN</a>s was out of the question. I wanted a tech solution, preferably free. I explored the possibility of software to recognise barcodes from photos, since it would be easy to snap photos of barcodes of my books.</p>
<p>Being a Windows person, I searched for and tried Windows programs first. The only candidate I found was <a href="http://www.bctester.de/en/index.htm" target="_blank">bcTester</a>. It recognised the first photo, then choked on the second. I tried cropping that, and it recognised it, but then choked on the third. To make it easier, I adjusted my photos to increase the contrast (easily done in batch), but cropping each photo individually would defeat the whole purpose of my &#8220;exercise&#8221;, and bcTester did not support batch processing either, so I decided to pass.</p>
<p>The next program I tried was <a href="http://zebra.sourceforge.net/" target="_blank">Zebra</a>, a *nix open-source project. I spent some time getting the pre-requisites installed, including messing around with some symbolic links, before I managed to successfully compile and run <strong>zebraimg</strong>. Once I did, <strong>zebraimg</strong> was just amazing. It zipped through my barcode images and got most correct.</p>
<p style="TEXT-ALIGN: center"><img class="aligncenter size-medium wp-image-143" title="barcodes" src="http://jgiam.com/wp-content/uploads/2009/01/barcodes-479x360.jpg" alt="barcodes" width="479" height="360" /></p>
<p style="TEXT-ALIGN: left"><span id="more-142"></span></p>
<p style="TEXT-ALIGN: left">Out of 75 images, <strong>zebraimg</strong> failed to process four (three of which were too blur, and one was because the barcode was scraped out partially), got two wrong and was unsure of two (generated more than one barcode).</p>
<div class="mceTemp mceIEcenter" style="text-align: center;">
<dl id="attachment_144" class="wp-caption aligncenter" style="width: 490px; text-align: center;">
<dt class="wp-caption-dt"><img class="size-medium wp-image-144" title="barcode_fail" src="http://jgiam.com/wp-content/uploads/2009/01/barcode_fail-480x360.jpg" alt="Barcode that zebraimg failed to process" width="480" height="360" /></dt>
<dd class="wp-caption-dd">Barcode that zebraimg failed to process</dd>
</dl>
</div>
<div class="mceTemp mceIEcenter" style="text-align: center;">
<dl id="attachment_145" class="wp-caption aligncenter" style="width: 490px; text-align: center;">
<dt class="wp-caption-dt"><img class="size-medium wp-image-145" title="barcode_wrong" src="http://jgiam.com/wp-content/uploads/2009/01/barcode_wrong-480x360.jpg" alt="Barcode that zebraimg processed wrongly" width="480" height="360" /></dt>
<dd class="wp-caption-dd">Barcode that zebraimg processed wrongly</dd>
</dl>
</div>
<div class="mceTemp mceIEcenter" style="text-align: center;">
<dl id="attachment_146" class="wp-caption aligncenter" style="width: 490px; text-align: center;">
<dt class="wp-caption-dt"><img class="size-medium wp-image-146" title="barcode_unsure" src="http://jgiam.com/wp-content/uploads/2009/01/barcode_unsure-480x360.jpg" alt="Barcode that zebraimg was unsure" width="480" height="360" /></dt>
<dd class="wp-caption-dd">Barcode that zebraimg was unsure</dd>
</dl>
</div>
<p style="text-align: left;">Recognising the barcodes was only the first step. Books without 13-digit ISBNs have barcodes that are &#8220;useless&#8221;, because they do not identify the book uniquely. In fact, I had three books in this batch with the same barcode. Hence, I had to manually key in the 10-digit ISBN for those books that did not have barcodes beginning with &#8220;<a href="http://en.wikipedia.org/wiki/ISBN#EAN_format_used_in_barcodes.2C_and_upgrading" target="_blank">978</a>&#8220;. Once that was done, I finally had a list of (10- and 13-digit) ISBNs.</p>
<p style="text-align: left;">There are two routes for managing a home library: online or offline. For online, I settled on two: <a href="http://www.librarything.com/" target="_blank">LibraryThing</a> and <a href="http://www.gurulib.com/" target="_blank">Gurulib</a>. GuruLib is free, and allows mass importing of books by uploading a file. Unfortunately, the interface could use some tweaks. While importing my list, I noticed there were duplicates, and some books were not imported. However, the website does not show which books failed to be imported. Since I only recorded the ISBNs of my books, this irked me as I was not able to cross-check the titles. I decided to pass on GuruLib.</p>
<p style="text-align: left;">LibraryThing is free for the first 200 books, after that, it requires payment of USD10/year or a one-time payment of USD25. I tried to avoid LibraryThing at first, becuase I know I have more than 200 books. Since I didn&#8217;t have much of a choice left, I gave LibraryThing a spin, and was impressed. The interface is clean and plain, but it is functional and fast. Importing my books was so easily done, and the import screen showed that two books failed to be imported because they were not found in the default databases (Amazon US, UK and the Library of Congress). I tried Amazon CA and found my books. Amazing! I just might subscribe to LibraryThing.</p>
<p style="text-align: left;">For the offline option, I only tried <a href="http://www.collectorz.com/book/" target="_blank">Collectorz.com Book Collector</a>. It did the job, but at USD29.95, I wasn&#8217;t too keen. While importing my books, it failed on a few. I checked the ISBNs against my images, and found that those barcodes had been processed wrongly by zebraimg. I manually typed in the barcode, searched again, and found the correct books.</p>
<p style="text-align: left;">This has been an interesting experiment and exercise. And now that I&#8217;ve finally figured and tested things out, I&#8217;d definitely save time on the subsequent batches of books. <img src='http://jgiam.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="text-align: left;">In the next post, I will show a simple PHP script I wrote to easily batch process and manage the decoded barcodes.</p>
<img src="http://feeds.feedburner.com/~r/jgiam/~4/TzgU2e3pZzE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://jgiam.com/2009/01/09/cataloguing-my-home-library/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://jgiam.com/2009/01/09/cataloguing-my-home-library</feedburner:origLink></item>
	</channel>
</rss>
