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

<channel>
	<title>HiddenTao</title>
	<atom:link href="http://www.hiddentao.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.hiddentao.com</link>
	<description>software, websites, mobile, technology</description>
	<lastBuildDate>Sun, 07 Feb 2010 14:11:41 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=abc</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Dropbox on removable media</title>
		<link>http://www.hiddentao.com/archives/2010/02/07/dropbox-on-removable-media/</link>
		<comments>http://www.hiddentao.com/archives/2010/02/07/dropbox-on-removable-media/#comments</comments>
		<pubDate>Sun, 07 Feb 2010 14:11:09 +0000</pubDate>
		<dc:creator>ram</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Dropbox]]></category>

		<guid isPermaLink="false">http://www.hiddentao.com/?p=760</guid>
		<description><![CDATA[I&#8217;ve been using Dropbox for a while now. For those who are unfamiliar with it it&#8217;s an application which makes it easy to share files online with anyone. Essentially, Dropbox creates a &#8220;My Dropbox&#8221; folder on your computer. This folder is automatically kept in sync with your Dropbox account online &#8211; thus, anything you put [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been using <a href="http://www.dropbox.com/" class="link-external">Dropbox</a> for a while now. For those who are unfamiliar with it it&#8217;s an application which makes it easy to share files online with anyone. Essentially, Dropbox creates a &#8220;My Dropbox&#8221; folder on your computer. This folder is automatically kept in sync with your Dropbox account online &#8211; thus, anything you put into this folder gets automatically uploaded to your Dropbox online account. If you choose to share your Dropbox folder (or even just a specific file) with somebody else then the changes you make to the folder will show up in their local copy of it (they have to be signed up to Dropbox too) and vice versa. Dropbox simply sits in the background and synchronises the folder &#8211; the folder looks and works just like a normal filesystem folder.
<span id="more-760"></span></p>

<p>By default the Dropbox application starts automatically upon boot-up and and it expects the dropbox folder to be available to it all times while it&#8217;s running. The rationale behind this (I&#8217;m guessing) is that most users will want Dropbox to work seamlessly in the background without having to worry about having to manually start it or initiate the synchronisation. This is all great until you want to place your Dropbox local folder onto removable media such as your USB flash drive, so that you can have access to your stuff on-the-go. The Dropbox application won&#8217;t let you create your Dropbox folder on removable media. So what to do?</p>

<p>I did some investigation and came across <a href="http://wiki.dropbox.com/DropboxAddons/DropboxPortable" class="link-external">Dropbox Portable</a>, essentially an attempt at tricking the Dropbox installer in such a way that you can install the application as well as your Dropbox folder to a flash drive. This method didn&#8217;t work for me so I then looked for and came across an alternative. Here&#8217;s what you do:</p>

<ol>
<li>Install Dropbox as normal and then exit the application.</li>
<li>Move the Dropbox folder to your flash drive.</li>
<li>Create a <a href="http://en.wikipedia.org/wiki/Symbolic_link" rel="nofollow" class="liwikipedia">symbolic link</a> from the old location of the folder pointing to the new location of the folder on the flash drive.</li>
<li>Restart the application and it should be none the wiser.</li>
</ol>

<p>You can use symbolic linking on just about any operating system including the latest versions of Windows. For Windows XP you&#8217;ll need to use the <a href="http://technet.microsoft.com/en-us/sysinternals/bb896768.aspx" class="link-external">Junction</a> tool to create such a link. On Vista (and I&#8217;m guessing for Windows 7) you can use the built-in <code>mklink</code> command-line tool.</p>

<p><strong>Note:</strong> don&#8217;t symbolic link directly to the Dropbox folder itself. If you did this and then accidentally removed your flash drive whilst Dropbox was still running then it <em>might</em> assume that you&#8217;ve just emptied your Dropbox folder and would then proceed to delete your files stored online (remember, it tries to keep everything in sync). To avoid this problem create the symbolic link to the parent folder instead. So on my setup (Vista) my flash drive (G:) has the Dropbox folder at <code>G:\Dropbox\My Dropbox</code>. The symbolic link ist at <code>C:\Dropbox</code> and points to <code>G:\Dropbox</code>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hiddentao.com/archives/2010/02/07/dropbox-on-removable-media/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>3D demo</title>
		<link>http://www.hiddentao.com/archives/2010/01/20/3d-demo/</link>
		<comments>http://www.hiddentao.com/archives/2010/01/20/3d-demo/#comments</comments>
		<pubDate>Wed, 20 Jan 2010 12:23:24 +0000</pubDate>
		<dc:creator>ram</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[3D]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.hiddentao.com/?p=726</guid>
		<description><![CDATA[A while back I decided to write a simple 3D graphics engine in Java after being inspired by Daniel Tebbutt&#8217;s Bedlam solver. Essentially I wanted to show a cube like his but with the added ability to split it apart so that you could see how the pieces fit together. As I got going with [...]]]></description>
			<content:encoded><![CDATA[<p>A while back I decided to write a simple 3D graphics engine in Java after being inspired by <a href="http://danieltebbutt.com/bedlam.html" class="link-external">Daniel Tebbutt&#8217;s Bedlam solver</a>. Essentially I wanted to show a cube like his but with the added ability to split it apart so that you could see how the pieces fit together. As I got going with this I was enjoying it so much I put aside the puzzle algorithm and just started adding more 3D rendering features.</p>

<p>Fast forward many hours of coding and here is a simple demo (click the image to launch it):
<span id="more-726"></span></p>

<p><a href="#" class="imglink" title="Launch demo (requires Java 1.5+)" onclick="window.open('http://www.hiddentao.com/downloads/kai/applet.html','_blank','status=0,toolbar=0,location=0,menubar=0,scrollbars=0,directories=0,resizable=0,width=670,height=500')">
<img src="http://farm3.static.flickr.com/2770/4289736971_b0f35bc880.jpg" />
</a></p>

<p><em>The demo consists of 3 separate scenes. You can switch between by simply clicking in the window. Further mouse and keyboard controls are listed in the demo window itself. Debug output from the demo is viewable in the Java applet console</em></p>

<p><strong>Architecture</strong></p>

<p>I&#8217;ve tried to use good object-oriented programming as much as possible throughout. For example, each scene is represented as a hierarchical scenegraph and a <a href="http://en.wikipedia.org/wiki/Visitor_pattern" rel="nofollow" class="liwikipedia">Visitor</a> model to perform rendering. The renderer itself is obtained from a <a href="http://en.wikipedia.org/wiki/Factory_pattern" rel="nofollow" class="liwikipedia">Factory</a> which allows for different types of renderers (OpenGL, DirectX, Software, etc.). As is standard practice with scenegraphs, a matrix stack is used to allow for model-level transformations independent to world-level transformations.</p>

<p>At the moment the only available renderer is software-based. But the architecture allows for OpenGL or DirectX-based rendering to be added in future. I use the <code>Graphics2D.drawLine()</code> API call in Java to render the pixels. Everything else (e.g. z-buffer) is manually implemented. The engine supports wireframe-mode rendering and backface culling. There is a single source light in the scene whose direction can be modified (in the demo it&#8217;s always pointing forwards from the camera). The rasterizer currently uses flat shading &#8211; next would be to add <a href="http://en.wikipedia.org/wiki/Gouraud_shading" rel="nofollow" class="liwikipedia">Gouraud and Phong</a>, not to mention texturing.</p>

<p>3D rotation on world objects are performed using matrix multiplication. The camera is rotated using Quaternions since this made it simpler to use the <a href="http://www.devmaster.net/articles/viewing-systems/" class="link-external">UVN</a> camera model. The third scene in the demo above is animated; this is accomplished using a simple timer thread using which any number of events can be scheduled for execution at given time intervals.</p>

<p><strong>Performance</strong></p>

<p>When programming in Java it&#8217;s easy to not worry about memory usage and allocations since the garbage collector handles the freeing up of memory. But for graphics engines every allocation or garbage collection run will impact performance. So from the outset I&#8217;ve tried to pre-allocate memory where possible, by constructing temporary vectors and matrices for use during calculations later on. Thus, the vast majority of the matrix and vector multiplication which take place in the render loop don&#8217;t allocate any new memory when doing so.</p>

<p>However, when I finally started rendering things I found that the performance bottleneck was actually the rasterizer. The more polygons (triangles) that needed to be drawn and the larger they appeared on screen, the longer each frame took to render. Perhaps I can improve this by optimising the polygon order (e.g. render from farthest to nearest) and improving the raster algorithms. Eventually I want to switch to using OpenGL as the rendering system but since I&#8217;ve come so far with the software renderer it would be nice to see if I can improve it a bit more first.</p>

<p><strong>Download</strong></p>

<p>The engine code is licensed under the LGPL and is available <a href="http://www.hiddentao.com/code/3d-graphics/" class="liinternal">here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hiddentao.com/archives/2010/01/20/3d-demo/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Page Tagger 0.3.5 and Common-Utils</title>
		<link>http://www.hiddentao.com/archives/2010/01/16/page-tagger-0-3-5-and-common-utils/</link>
		<comments>http://www.hiddentao.com/archives/2010/01/16/page-tagger-0-3-5-and-common-utils/#comments</comments>
		<pubDate>Sat, 16 Jan 2010 14:46:27 +0000</pubDate>
		<dc:creator>ram</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Common-Utils]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Page Tagger]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://www.hiddentao.com/?p=702</guid>
		<description><![CDATA[A new version of Page Tagger is now available. Grab it now from here or the Wordpress plugin repository.

Also, I&#8217;ve put up a few Java classes I wrote a while back as a small library called Common-Utils. Included within are the following:


ArrayUtils &#8211; Utility methods to fill an array with a given value or check [...]]]></description>
			<content:encoded><![CDATA[<p>A new version of <a href="http://www.hiddentao.com/code/wordpress-page-tagger-plugin/" class="liinternal">Page Tagger</a> is now available. Grab it now from <a href="http://www.hiddentao.com/code/wordpress-page-tagger-plugin/" class="liinternal">here</a> or the <a href="http://wordpress.org/extend/plugins/page-tagger/" class="liwp">Wordpress plugin repository</a>.</p>

<p>Also, I&#8217;ve put up a few Java classes I wrote a while back as a small library called <a href="http://www.hiddentao.com/code/common-utils/" title="Common-Utils" class="liinternal">Common-Utils</a>. Included within are the following:</p>

<ul>
<li><code>ArrayUtils</code> &#8211; Utility methods to fill an array with a given value or check if it contains a given value.</li>
<li><code>DynamicArray</code> &#8211; A resizable &#8220;static&#8221; array for when you don&#8217;t quite need the full flexibility of <code>ArrayList</code>.</li>
<li><code>NonMutableIterator</code> &#8211; Wraps around a normal <code>Iterator</code> and disables use of the <code>remove</code> method.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.hiddentao.com/archives/2010/01/16/page-tagger-0-3-5-and-common-utils/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Page Tagger 0.3.4</title>
		<link>http://www.hiddentao.com/archives/2009/12/20/page-tagger-0-3-4/</link>
		<comments>http://www.hiddentao.com/archives/2009/12/20/page-tagger-0-3-4/#comments</comments>
		<pubDate>Sun, 20 Dec 2009 12:44:48 +0000</pubDate>
		<dc:creator>ram</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Page Tagger]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://www.hiddentao.com/?p=665</guid>
		<description><![CDATA[This is a new version of Page Tagger that has been tested to work with Wordpress 2.9.

Grab it now from here or the Wordpress plugin repository.
]]></description>
			<content:encoded><![CDATA[<p>This is a new version of <a href="http://www.hiddentao.com/code/wordpress-page-tagger-plugin/" class="liinternal">Page Tagger</a> that has been tested to work with Wordpress 2.9.</p>

<p>Grab it now from <a href="http://www.hiddentao.com/code/wordpress-page-tagger-plugin/" class="liinternal">here</a> or the <a href="http://wordpress.org/extend/plugins/page-tagger/" class="liwp">Wordpress plugin repository</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hiddentao.com/archives/2009/12/20/page-tagger-0-3-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Copenhagen target converter</title>
		<link>http://www.hiddentao.com/archives/2009/11/27/copenhagen-target-converter/</link>
		<comments>http://www.hiddentao.com/archives/2009/11/27/copenhagen-target-converter/#comments</comments>
		<pubDate>Fri, 27 Nov 2009 13:38:46 +0000</pubDate>
		<dc:creator>ram</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Climate change]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Sandbag]]></category>

		<guid isPermaLink="false">http://www.hiddentao.com/?p=646</guid>
		<description><![CDATA[As we near the 15th Annual UNFCCC conference in Copenhagen more and more countries are pledging emissions cuts. But the devil is always in the details, as a recent article in the Guardian pointed out.

For instance, Russia recently announced that it would cut its greenhouse gas emissions by 25% on 1990 levels. In other words [...]]]></description>
			<content:encoded><![CDATA[<p>As we near the <a href="http://en.cop15.dk/" title="COP15" class="link-external">15th Annual UNFCCC conference</a> in Copenhagen more and more countries are pledging emissions cuts. But the devil is always in the details, as a <a href="http://www.guardian.co.uk/environment/cif-green/2009/nov/26/us-china-targets-mean" class="link-external">recent article in the Guardian</a> pointed out.</p>

<p>For instance, <a href="http://www.bloomberg.com/apps/news?pid=20601130&amp;sid=a0vyS5jDWR0M" class="link-external">Russia recently announced</a> that it would cut its greenhouse gas emissions by 25% on 1990 levels. <span id="more-646"></span>In other words in by the year 2020 Russia&#8217;s yearly emissions (measured in tonnes of CO<subscript>2</subscript>) will be at 75% of what they were in 1990. This sounds good on paper since we generally assume that yearly emissions have increased since 1990 for all countries. But the collapse of the Soviet economy in 1991 led to massive fall in emissions, meaning that a 25% cut on Russia&#8217;s 1990 emissions levels actually equates to a 25.6% increase on Russia&#8217;s 2007 emissions levels. In other words, they&#8217;re allowing themselves to increase their pollution levels!</p>

<p>In order to help other people make sense of the emission targets being pledged by the various countries, over the last couple of days I&#8217;ve helped to develop a &#8220;target converter&#8221; for <a href="http://sandbag.org.uk/" class="link-external">Sandbag</a>, a non-profit climate change campaign.</p>

<p>It takes an emissions target and a baseline year for a given country and then calculates what the equivalent percentages are for all the other years for which emissions data is available for that country (data source is <a href="http://unfccc.int/" class="link-external">UNFCCC</a>). So for instance, for Russia&#8217;s target of a 25% reduction on 1990 levels we get:</p>

<p><a class="imglink" rel="lightbox" href="http://farm3.static.flickr.com/2550/4137704821_b20b41d425_o.png" title="Russia's target in context (note that the 2020 emission level is a prediction)">
<img src="http://farm3.static.flickr.com/2550/4137704821_5e1bac4dfd.jpg" alt="Russia's target in context" />
</a></p>

<p>You can find the target converter at <a href="http://sandbag.org.uk/targetconverter" title="Sandbag target converter" class="link-external">http://sandbag.org.uk/targetconverter</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hiddentao.com/archives/2009/11/27/copenhagen-target-converter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Page Tagger 0.3.2</title>
		<link>http://www.hiddentao.com/archives/2009/11/18/page-tagger-0-3-2/</link>
		<comments>http://www.hiddentao.com/archives/2009/11/18/page-tagger-0-3-2/#comments</comments>
		<pubDate>Wed, 18 Nov 2009 21:18:07 +0000</pubDate>
		<dc:creator>ram</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Page Tagger]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://www.hiddentao.com/?p=633</guid>
		<description><![CDATA[This is a new version of Page Tagger that has been tested to work with Wordpress 2.8.6.

Some users were reporting that the tag editing interface was unusable when used in conjunction with certain other plugins (e.g. the multi-level navigation plugin). Other users were having trouble getting the plugin to work in the latest version of [...]]]></description>
			<content:encoded><![CDATA[<p>This is a new version of <a href="http://www.hiddentao.com/code/wordpress-page-tagger-plugin/" class="liinternal">Page Tagger</a> that has been tested to work with Wordpress 2.8.6.</p>

<p>Some users were reporting that the tag editing interface was unusable when used in conjunction with certain other plugins (e.g. the multi-level navigation plugin). Other users were having trouble getting the plugin to work in the latest version of Wordpress (2.8.6). This release (hopefully) fixes these issues.</p>

<p>Grab it now from <a href="http://www.hiddentao.com/code/wordpress-page-tagger-plugin/" class="liinternal">here</a> or the <a href="http://wordpress.org/extend/plugins/page-tagger/" class="liwp">Wordpress plugin repository</a>.</p>

<p><strong>Update (Nov20):</strong> The plugin has been updated to 0.3.3 now. This fixes a callback bug which was preventing the plugin from initialising on certain installations.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hiddentao.com/archives/2009/11/18/page-tagger-0-3-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Launch48</title>
		<link>http://www.hiddentao.com/archives/2009/10/20/launch48/</link>
		<comments>http://www.hiddentao.com/archives/2009/10/20/launch48/#comments</comments>
		<pubDate>Tue, 20 Oct 2009 14:41:57 +0000</pubDate>
		<dc:creator>ram</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Launch48]]></category>

		<guid isPermaLink="false">http://www.hiddentao.com/?p=585</guid>
		<description><![CDATA[This weekend just gone I attended Launch48, an event where the objective was to build a viable commercial web application in just 48 hours with a diverse group of random people you meet at the event itself.

There is already information on the Launch48 site about how the weekend unfolded as well what came out of [...]]]></description>
			<content:encoded><![CDATA[<p>This weekend just gone I attended <a href="http://www.launch48.com/" title="Launch48 homepage" class="link-external">Launch48</a>, an event where the objective was to build a viable commercial web application in just 48 hours with a diverse group of random people you meet at the event itself.</p>

<p>There is already information on the Launch48 site about <a href="http://www.launch48.com/4pm-board-meetings-live-blog/" class="link-external">how the weekend unfolded</a> as well <a href="http://eu.techcrunch.com/2009/10/18/launch48-startups-present-their-ideas-after-a-frantic-48-hours/" class="link-external">what came out of it</a>, so I&#8217;m going to talk about my experiences at the event and reflect upon what I learned.
<span id="more-585"></span></p>

<p><strong>Friday</strong></p>

<p>Friday was the first day of the event. The bulk of the day was the <a href="http://www.launch48.com/launch48-conference-presentations/" class="link-external">Launch48 conference</a>. I think I was able to take away something new from each speaker who came on (<a href="http://www.hiddentao.com/wp-content/uploads/2009/10/Launch48-conference-notes-16Oct2009.pdf" class="lipdf">download my notes &#8211; PDF</a>). We were based in Paypal&#8217;s offices in Richmond, where the weekend event was also being held. After the conference came idea pitching time in the evening. Essentially, anyone who had a web business idea (mobile apps counted too) got 60 seconds to pitch their idea to all the attendees. There was some odd ones (in my opinion) &#8211; one guy wanted to build a website where people could search for good retirement homes to send their parents to &#8211; but nearly all the ideas had some sort of value in them. What I observed was that a &#8220;winning&#8221; pitch was 50% about the idea and 50% about the way it was pitched. The most important thing to keep in mind when pitching in 60 seconds is that the audience have to understand what your idea is, how you intend to make money from it, and who your competitors are. You needed to be able to speak clearly. Even if you don&#8217;t have a decent idea you should pitch it (as I did) as it&#8217;s good practice to pitch.
Not only that, as I learned over the course of the weekend it doesn&#8217;t really matter if your idea has already been done by someone else &#8211; you can always do better. It&#8217;s about execution, marketing, branding, and a lot of the other things.</p>

<p>After all the pitches had taken place (there were about 30 in total) all the attendees voted on each idea by a show of hands, helping whittle them down to the 12 most popular ones (mine didn&#8217;t make the cut!). These remaining ideas were then re-pitched, this time for 2 minutes each, which included a short Q&amp;A session with the audience. Afterwards another voting session resulted in the 6 most popular ideas being chosen for development over the coming weekend. All attendees then allocated themselves to whichever idea they wanted to work on. Because absolutely anyone could attend the event there was no control over the proportions of coders vs marketing vs business people vs other skillsets. I was a little surprised at the relatively few number of developers there were there. Some ideas had a lacking in certain skillsets &#8211; for instance, the idea I chose lacked enough developers, another team lacked in designers. After this we all grouped into our various chosen teams and got to know each other briefly before heading off home.</p>

<p><strong>Saturday</strong></p>

<p>On Saturday we started the earnest work of getting our idea &#8211; <a href="http://www.wraply.com/" class="link-external">Wraply</a> &#8211; implemented. The basic idea behind the site is that it lets you easily buy a gift for yourself or a friend by pooling money from a number of people. An improvement on the old-fashioned method of chasing up people for money and then pooling it all together manually.</p>

<p>One thing I quickly realised early on was that people differed widely in their competency and proficiency. For instance, we had 3 developers in our team yet we all came from different programming language backgrounds and had different levels of programming experience. Luckily another developer who had missed the conference the day before joined us in the morning, at which point we had two developers with the same skillset and programming experience. These two guys did the heavy lifting whilst the other guys chipped in where they could.</p>

<p>Another thing I learnt was the importance of knowing your target market. I would never have come up with the target markets that they came up with. I could really see the importance that good marketing, usability and business modelling played in making such a project a success. Even if we didn&#8217;t accomplish all our technical goals over the weekend, having a solid business and marketing plan would make it more likely that we&#8217;d be able to get funding if need be to take the project forward. Our revenue model hinged on affiliate revenue via <a href="http://www.skimlinks.com/" class="link-external">Skimlinks</a> &#8211; yes it&#8217;s variable, but reliable enough if we were able to build up real volume of gift pooling on our site.</p>

<p>We kicked off the marketing and PR drive early on, with entries on various social networking sites such as <a href="http://twitter.com/wraply" class="link-external">Twitter</a>. The usability and design teams then constructed some wireframes for the dev team to start coding to. Coding didn&#8217;t start till 5pm on Saturday, which in hindsight was way too late since we could have gotten so much more done had we started earlier. But of course, we had to spend time figuring out the database structures and what language/framework to use to build the site in (we opted for PHP and <a href="http://codeigniter.com/" class="link-external">CodeIgniter</a>).</p>

<p><strong>Sunday</strong></p>

<p>Another sleepless night later (I had so much adrenaline going through me!) and it was the final day of the event. Today was all about coding and implementation and I really had to stay focussed in the moment and stop myself worrying about whether we&#8217;d get everything finished in time. One of our coders was a Paypal guru and spent the whole day battling their APIs to try and get us payment integration working! Although we didn&#8217;t have the time in the end to get this properly integrated into the site we did manage to get a demo of gift pool creation of working. Probably the coolest feature on the site was the ability for the user to enter a URL to an Amazon product page onto our site and then see the title, image and price of the product magically appear on our webpage (AJAX fetch using Amazon&#8217;s web services API).</p>

<p>Usually when I&#8217;m building software and websites I take time to handle errors gracefully, log where I need to and write browser-based automated tests to ensure robustness in the face of future changes. On this weekend I threw all of those practices out of the window and just got it working in whatever way I could. I had to tell the guys presenting the demo not to enter the same email address twice when creating a gift pool as the database would throw back a &#8216;duplicate not allowed&#8217; error if they did so!</p>

<p>Come 4pm we were first up to present to all the event attendees. It went smoothly. Over the weekend, as we were developing the website and business model we kept finding more and more direct competitors to our idea already out there on the web (e.g. <a href="http://lottay.com/" class="link-external">Lottay</a>). Apart from being disappointing minds it meant we had some tough questions to answer in the Q&amp;A session of our presentation. I still feel we can differentiate ourselves from our competitors enough to have a chance for success in the marketplace. The other team presentations were really impressive. Some of the other teams even almost had complete products ready to be released to the public at large (in fact, <a href="http://given.org/" class="link-external">Given.org</a> is pretty much done). Congratulations to all of them on their successes.</p>

<p>After the presentation saga we all headed off for beer and pizza (classic startup nutrition) and just chilled out, chatted to people and networked. We were all pretty knackered by that point I&#8217;ve gotta say. It has taken me a couple of days to recover from it all!</p>

<p><strong>Conclusion</strong></p>

<p>I learnt an awful lot from this weekend. I learnt how quickly you can build a functional prototype if you really have to in a short space of time! Oh, and wireframing is a must before actually building webpages. Being a good software engineer with some creative design and usability skills isn&#8217;t enough to make a successful web business. I need to think about marketing, PR, revenue model, branding and lot of the other things. I got to meet and learn from a diverse group of people, all with an entrepreneurial mindset like myself. I would definitely do this again, and I recommend anyone with an interest in web business (or otherwise) to do it.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hiddentao.com/archives/2009/10/20/launch48/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Creating an archives page like mine</title>
		<link>http://www.hiddentao.com/archives/2009/09/22/creating-an-archives-page-like-mine/</link>
		<comments>http://www.hiddentao.com/archives/2009/09/22/creating-an-archives-page-like-mine/#comments</comments>
		<pubDate>Tue, 22 Sep 2009 12:58:49 +0000</pubDate>
		<dc:creator>ram</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://www.hiddentao.com/?p=556</guid>
		<description><![CDATA[A plugin user recently wrote in asking me how to create an archives page like mine. So I thought I&#8217;d give everyone the lowdown on how to do this in this post.


First of all, there is no search box on my site just now because 1) I didn&#8217;t think I had enough content to warrant [...]]]></description>
			<content:encoded><![CDATA[<p>A plugin user recently wrote in asking me how to create an <a href="http://www.hiddentao.com/archives/" class="liinternal">archives page like mine</a>. So I thought I&#8217;d give everyone the lowdown on how to do this in this post.
<span id="more-556"></span></p>

<p>First of all, there is no search box on my site just now because 1) I didn&#8217;t think I had enough content to warrant this, and 2) I tag all the content I create quite extensively. So my archives view doesn&#8217;t handle search results. Nor does it handle querying for specific dates, categories or authors. But I do handle querying for tags. Secondly, all the relevant template files from my theme for making this work can be found at the <a href="#files" class="liinternal">bottom</a>.</p>

<h2>Initial archives view</h2>

<p>From the <a href="http://codex.wordpress.org/Theme_Development#Theme_Template_Files" class="liwp">Wordpress theme developer documentation</a> we know that we should provide an <strong>archive.php</strong> template file in our theme folder to handle the viewing of blog archives. I&#8217;ve implemented this for my theme. It gets shown when you click the <em>Archives</em> navigational button at the top of the page. In order for Wordpress to know that it needs to show this page when you visit <em>/archives</em> I have the following placed in my template&#8217;s <strong>page.php</strong>:</p>

<pre><code>if ('archives' == SITE_SECTION)
{
    require_once('archive.php');
    exit;
}
</code></pre>

<p><em>(The <code>SITE_SECTION</code> constant tells me which top-level site-section the user is currently in. This is linked to how I generate the navigational links at the top &#8211; the code for this is in my theme&#8217;s functions.php</em>).</p>

<p>I then create a publicly-viewable static page called &#8216;Archives&#8217; and leave it empty, ensuring that its URL path is set to <em>/archives</em>. Now whenever someone visits this URL they get shown the contents of the <strong>archive.php</strong> template.</p>

<p>Inside <strong>archive.php</strong> I use the <code>wp_tag_cloud()</code> method to display a cloud of the most popular tags. I then have the following section of code to display all the posts, grouped by month:</p>

<pre><code>    // get all posts in descending date order
    query_posts('posts_per_page=10000&amp;orderby=date&amp;order=DESC&amp;post_type=post');

    $list_of_posts = array();

    // split entries into blog posts and static pages
    while (have_posts())
    {
        the_post();
        global $post;
        $list_of_posts[] = $post;
    }

    // show them
    require_once('archive_show_posts_by_month.inc.php');
</code></pre>

<p>The <strong>archive_show_posts_by_month.inc.php</strong> script does exactly what it says on the tin. It takes the <code>$list_of_posts</code> array and outputs the posts, grouped by month. Now you might wonder why I&#8217;m calling <code>query_posts</code> and performing a database fetch. It&#8217;s because by default Wordpress has only fetched the contents of the static page located at <em>/archives</em> since that&#8217;s what it thinks is being displayed to the user. So in this code I fetch all the blog posts from the database (if you have more than 10,000 blog posts then by all means use a larger number in the query).</p>

<p>So that&#8217;s the display of the <a href="http://www.hiddentao.com/archives/" class="liinternal">initial archives page</a> done. Now for the tag-specific archives (<a href="http://www.hiddentao.com/archives/tag/code/" class="liinternal">example</a>)&#8230;</p>

<h2>Archives for a given tag</h2>

<p>At the top of <strong>archive.php</strong> I have the following code:</p>

<pre><code>global $wp_query;
$qry_tag_name = $wp_query-&gt;query_vars['tag'];
if ('' != $qry_tag_name)
{
    require_once('archive_results.php');
    exit;
}
</code></pre>

<p>When you try to view the archives for a specific tag Wordpress will automatically invoke the <strong>archive.php</strong> template. This code then checks to see if you&#8217;re viewing a specific tag rather than viewing the initial archives page. If so, it invokes the <strong>archive_results.php</strong> template. Inside this template we have the following code:</p>

<pre><code>// get proper tag name
$tag_name = single_tag_title("", false);

&lt;?php if (have_posts()) : ?&gt;

&lt;?php
    $list_of_posts = array();
    $list_of_pages = array();

    // split entries into blog posts and static pages
    while (have_posts()) :

        the_post();
        global $post;
        if ('post' === $post-&gt;post_type)
        {
            $list_of_posts[] = $post;
        }
        else if ('page' === $post-&gt;post_type)
        {
            $list_of_pages[] = $post;
        }

    endwhile;   

    ?&gt;
        &lt;div class="results_pages"&gt;
            &lt;p class="description"&gt;
                All pages tagged &lt;strong&gt;'&lt;?php echo $tag_name; ?&gt;'&lt;/strong&gt;:
            &lt;/p&gt;

            &lt;div class="indented"&gt;
    &lt;?php
        require_once('archive_show_pages.inc.php');
    ?&gt;
            &lt;/div&gt;

        &lt;/div&gt;

        &lt;div class="results_posts"&gt;
            &lt;p class="description"&gt;
                All blog posts tagged &lt;strong&gt;'&lt;?php echo $tag_name; ?&gt;'&lt;/strong&gt;, from newest to oldest:
            &lt;/p&gt;

            &lt;div class="indented"&gt;

    &lt;?php
        require_once('archive_show_posts_by_month.inc.php');
    ?&gt;
            &lt;/div&gt;

        &lt;/div&gt;

&lt;?php else : ?&gt;

        &lt;p class="description"&gt;
            No posts tagged &lt;strong&gt;'&lt;?php echo $tag_name; ?&gt;'&lt;/strong&gt; were found.
        &lt;/p&gt;

&lt;?php endif; ?&gt;
</code></pre>

<p>This code splits the list of entries (already loaded by Wordpress since you&#8217;re viewing tag-specific archives) into static pages and blog posts. It then calls <strong>archive_show_pages.inc.php</strong> and <strong>archive_show_posts_by_month.inc.php</strong> to display each set of entries one after another.</p>

<h2 id="files">Files</h2>

<p>Template files from my theme: <a href="http://www.hiddentao.com/downloads/hiddentao_archives.zip" class="lizip">ZIP file</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hiddentao.com/archives/2009/09/22/creating-an-archives-page-like-mine/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Upgrading your HTC Hero/T-Mobile G2 Touch to the latest HTC firmware</title>
		<link>http://www.hiddentao.com/archives/2009/09/19/upgrading-your-htc-herot-mobile-g2-touch-to-the-latest-htc-firmware/</link>
		<comments>http://www.hiddentao.com/archives/2009/09/19/upgrading-your-htc-herot-mobile-g2-touch-to-the-latest-htc-firmware/#comments</comments>
		<pubDate>Sat, 19 Sep 2009 21:47:19 +0000</pubDate>
		<dc:creator>ram</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Firmware]]></category>
		<category><![CDATA[HTC]]></category>
		<category><![CDATA[T-Mobile]]></category>

		<guid isPermaLink="false">http://www.hiddentao.com/?p=547</guid>
		<description><![CDATA[I recently purchased a T-Mobile G2 Touch phone. I&#8217;d like to write about what I had to do to get my T-Mobile-branded (and sim-locked) phone upgraded to the latest HTC firmware. You see, HTC recently released an updated version of the firmware for the phone but T-Mobile have been holding out on releasing this update [...]]]></description>
			<content:encoded><![CDATA[<p>I <a href="http://www.hiddentao.com/archives/2009/09/19/you-are-now-friends-with-android/" class="liinternal">recently purchased</a> a T-Mobile G2 Touch phone. I&#8217;d like to write about what I had to do to get my T-Mobile-branded (and sim-locked) phone upgraded to the latest HTC firmware. You see, HTC recently released an updated version of the firmware for the phone but <a href="http://www.theregister.co.uk/2009/09/17/t_mobile_hero_update/" class="link-external">T-Mobile have been holding out</a> on releasing this update to their customers. You can&#8217;t manually download the firmware from HTC and install it on your own since it checks the serial number of the phone and will only work if your phone is an unlocked, generic HTC Hero model.
<span id="more-547"></span></p>

<p>After some searching around the web I found a brilliant site &#8211; <a href="http://android.modaco.com/" class="link-external">http://android.modaco.com/</a> &#8211; which provides a <a href="http://android.modaco.com/content/htc-hero-hero-modaco-com/292018/08-09-2-2-the-modaco-custom-rom-is-here-2-versions-based-on-the-new-update/" class="link-external">customised ROM</a> (includes the latest firmware update as well as other desirable goodies) as well as <a href="http://android.modaco.com/content/htc-hero-hero-modaco-com/291942/03-09-hero-roms-radios-in-update-zip-format/" class="link-external">official HTC ROMs</a>. But to install these onto your phone you first of all need to <em>root</em> it, which essentially means giving yourself <a href="http://www.linuxselfhelp.com/linuxterms/index/root.html" class="link-external">superuser access</a> to the phone. To do this I followed the instructions and video on this page:</p>

<p><a href="http://theunlockr.com/2009/08/27/how-to-root-your-htc-hero-in-one-click/" class="link-external">http://theunlockr.com/2009/08/27/how-to-root-your-htc-hero-in-one-click/</a></p>

<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/neE5zA687hE&#038;hl=en&#038;fs=1&#038;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/neE5zA687hE&#038;hl=en&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></p>

<p>What the previous step does is replace the flash memory updater on your phone with a custom version that ignores serial number restrictions. Once I&#8217;d performed this step I downloaded the custom ROM and followed the instructions on the following page:</p>

<p><a href="http://theunlockr.com/2009/08/27/how-to-load-a-custom-rom-on-your-htc-hero/" class="link-external">http://theunlockr.com/2009/08/27/how-to-load-a-custom-rom-on-your-htc-hero/</a></p>

<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/knWWB9Y9-28&#038;hl=en&#038;fs=1&#038;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/knWWB9Y9-28&#038;hl=en&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></p>

<p>By the way, don&#8217;t expect any sympathy from T-Mobile if you damage your phone from doing the above. But I followed the steps as outlined and now I have had the latest firmware running on my phone for a few days with no hiccups so far. If you do run into the difficulties there is a very active forum on the ROM site where you&#8217;ll be able to get help (although honestly, I don&#8217;t think you&#8217;ll have any problems). On the ROM site you&#8217;ll also find updated firmware for the phone&#8217;s radio transceiver.</p>

<p>With that done now I just need to figure out what apps I&#8217;m going to make my phone <img src='http://www.hiddentao.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.hiddentao.com/archives/2009/09/19/upgrading-your-htc-herot-mobile-g2-touch-to-the-latest-htc-firmware/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>&#8220;You are now friends with Android&#8221;</title>
		<link>http://www.hiddentao.com/archives/2009/09/19/you-are-now-friends-with-android/</link>
		<comments>http://www.hiddentao.com/archives/2009/09/19/you-are-now-friends-with-android/#comments</comments>
		<pubDate>Sat, 19 Sep 2009 21:35:43 +0000</pubDate>
		<dc:creator>ram</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Symbian]]></category>

		<guid isPermaLink="false">http://www.hiddentao.com/?p=529</guid>
		<description><![CDATA[Having worked at Symbian a few years ago and gotten to learn about mobile operating systems, I believe that Symbian have the best mobile OS kernel in terms of performance, responsiveness and robustness. Unfortunately almost the opposite can be said for the S60 UI layer (which Nokia makes) that sits on top of it. The [...]]]></description>
			<content:encoded><![CDATA[<p>Having worked at <a href="http://www.symbian.com" class="link-external">Symbian</a> a few years ago and gotten to learn about mobile operating systems, I believe that Symbian have the best mobile OS kernel in terms of performance, responsiveness and robustness. Unfortunately almost the opposite can be said for the S60 UI layer (which Nokia makes) that sits on top of it. The end result being that a lot of Symbian phones (a lot of which are Nokias) tend to feel slow and buggy more often than they should. Nevertheless, they do pack a lot of features and thus for the last 3 years I&#8217;ve happily moved around with a Nokia N73, running S60v3 on Symbian 9.1. 
<span id="more-529"></span>
Over the last year Symbian got bought outright by <a href="http://gizmodo.com/5019082/nokia-helps-buys-symbian-turns-it-open-source" class="link-external">Nokia</a> and they&#8217;ve now turned it into the <em>Symbian Foundation</em>, essentially mirroring what <a href="http://www.openhandsetalliance.com/" class="link-external">Google</a>, <a href="http://www.limofoundation.org/" class="link-external">LiMo</a> and others have done. Symbian (and consequentially Nokia) have a huge task ahead of them if they wish to remain competitive in the smartphone market.</p>

<p>After leaving Symbian I went to work a <a href="http://www.bluewhalesystems.com/" class="link-external">mobile software startup</a> whose primary concern was a mobile social networking app written in Java MIDP. Now, if you want to stay as true as you can to the &#8220;write once, run anywhere&#8221; principle for mobiles then Java is really the only choice since almost every phone out there has some sort of Java support, albeit each with its own various inconsistencies and quirks. Writing a mobile Java app was also a whole lot easier than writing one in Symbian C++. The availability of great development tools (Eclipse, JUnit, ProGuard, etc.) didn&#8217;t hurt either! Having worked on a mobile Java client I decided that if I was to build my own mobile app I&#8217;d have to do it in Java.</p>

<p>Then iPhone came along and 2 years later it&#8217;s now obvious that if you have a good idea for a mobile app and don&#8217;t mind learning to develop on the Mac then you might as well as write your app for the iPhone, thus giving yourself a real chance to earn a decent income from it. Many of my fellow engineers have had iPhones for a while and some of them are even starting to write apps for it, some lured by the prospect of <a href="http://www.wired.com/gadgetlab/2008/09/indie-developer/" class="link-external">making a killing</a>, others just wanting to do something cool for what is hailed as the &#8220;Jesus phone&#8221;.</p>

<p>My T-Mobile contract is about to expire and I started seriously thinking about whether to upgrade to an iPhone or an Android handset. After much deliberation, I bought myself a lovely little <a href="http://www.youtube.com/watch?v=QJN8cXyyEQM" class="link-external">T-Mobile G2 Touch</a> instead (also known as HTC Hero). It runs <a href="http://developer.android.com/sdk/android-1.5-highlights.html" class="link-external">Android 1.5</a>, the latest stable release of Google&#8217;s mobile OS. Android development is essentially done in Java (the bytecode format and VM varies) using APIs which are different to the MIDP ones. You can use Eclipse to code, test and debug your apps. It&#8217;s an open source OS, which means you&#8217;ll be able to find deployable versions of the OS on the web which even include features from the upcoming 2.0 release of Android (e.g. multi-touch) folded into the current stable release.</p>

<p>If you read around you&#8217;ll find that the Android Market and consequent ecosystem for paid apps is almost miniscule compared to the AppStore (see <a href="http://larvalabs.com/blog/iphone/android-market-sales/" class="link-external">article and comments</a> and <a href="http://larvalabs.com/blog/iphone/android-market-sales-follow-up/" class="link-external">follow-up</a>), but I&#8217;m hoping that this will improve in the near future. And anyway, if the Android app platform doesn&#8217;t really take off then atleast I&#8217;ll already have some mobile app development experience by the time I get my iPhone <img src='http://www.hiddentao.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>

<p><strong>Update (Sep19): I&#8217;ve shifted the instructions for updating the HTC Hero/T-Mobile G2 Touch firmware into a <a href="http://www.hiddentao.com/archives/2009/09/19/upgrading-your-htc-herot-mobile-g2-touch-to-the-latest-htc-firmware/" class="liinternal">new post</a></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.hiddentao.com/archives/2009/09/19/you-are-now-friends-with-android/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
