<?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>SickBiscuit &#187; Web</title>
	<atom:link href="http://sickbiscuit.com/blog/category/web/feed/" rel="self" type="application/rss+xml" />
	<link>http://sickbiscuit.com/blog</link>
	<description>The personal blog of Steven Wilkin</description>
	<lastBuildDate>Sun, 20 May 2012 01:11:01 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Keeping an eye on UK inflation with Google App Engine</title>
		<link>http://sickbiscuit.com/blog/2011/05/12/keeping-an-eye-on-uk-inflation-with-google-app-engine/</link>
		<comments>http://sickbiscuit.com/blog/2011/05/12/keeping-an-eye-on-uk-inflation-with-google-app-engine/#comments</comments>
		<pubDate>Thu, 12 May 2011 10:43:56 +0000</pubDate>
		<dc:creator>steve</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[code]]></category>

		<guid isPermaLink="false">http://sickbiscuit.com/blog/?p=553</guid>
		<description><![CDATA[Background
For a long time now whenever I&#8217;m on the search for something interesting to work on that could potentially be of value to myself and others my attention is brought to topics like machine learning, data mining and natural language processing.
These are all areas within computer science which are not particularly easy and have a [...]]]></description>
			<content:encoded><![CDATA[<h3>Background</h3>
<p>For a long time now whenever I&#8217;m on the search for something interesting to work on that could potentially be of value to myself and others my attention is brought to topics like <a href="http://en.wikipedia.org/wiki/Machine_learning">machine learning</a>, <a href="http://en.wikipedia.org/wiki/Data_mining">data mining</a> and <a href="http://en.wikipedia.org/wiki/Natural_language_processing">natural language processing</a>.</p>
<p>These are all areas within computer science which are not particularly easy and have a higher barrier of entry compared to building a typical web application for instance. Yet, if implemented correctly they can provide great insight and fame and fortune are bound to be near.</p>
<p>Joking aside. I studied artificial intelligence at <a href="http://www.qub.ac.uk/schools/eeecs/">university</a> and my undergraduate dissertation was focussed on <a href="http://en.wikipedia.org/wiki/Expert_system">expert systems</a> so I&#8217;ve a bit of exposure to these topics but nothing decidedly practical nor within the past decade.</p>
<h3>Interesting Books</h3>
<p>Some searching on Amazon turned up <a href="http://www.amazon.co.uk/dp/1449388345/tag=sickbiscuitco-21">a couple</a> <a href="http://www.amazon.co.uk/gp/product/0596529325/tag=sickbiscuitco-21">of books</a> which looked to be talking about the type of tasks I was interested in performing.</p>
<p>One thing these books have in common is that they use code examples in <a href="http://python.org/">Python</a>.</p>
<p>For nearly half a decade now a lot of my interest has been with <a href="/blog/2006/10/18/ruby-on-rails/">Ruby and related technologies</a> and so I&#8217;ve largely avoided Python considering the similarity of the space the two languages sit in. A look through the most popular AI books reveiled none using examples written in Ruby however.</p>
<p>The other day I came across a copy of <a href="https://www.packtpub.com/python-text-processing-nltk-20-cookbook/book">another book using Python</a> so I thought I may as well get a bit of hands on experience with the language and take it from there.</p>
<h3>Something Practical</h3>
<p>In the past I&#8217;ve tried to teach myself many languages from books but it has never been until I&#8217;ve needed to use the language for something practical that the know-how stuck.</p>
<p>Thankfully I didn&#8217;t have to wait long until inspiration struck. As a private investor in the current economic climate, a topic that has been in my mind has been the rate of inflation. Everytime I want to check how quickly my assets are being eroded by inflation I have to unleash Google and hope I land on the correct page and from there find the current rate amongst all the other information. This seemed like the perfect fit for <a href="/blog/2010/03/24/home-time-revisited-redeveloping-a-cakephp-application-with-sinatra/">yet another</a> <a href="/blog/2010/08/01/is-it-raining-in-belfast-redux/">single serving web app</a>.</p>
<p>My starting point was to write a Python script to scrape the <a href="http://www.statistics.gov.uk/cci/nugget.asp?id=19">Office for National Statistics</a> for the current value for the <a href="http://en.wikipedia.org/wiki/Retail_Price_Index">Retail Price Index</a>.</p>
<p>Next up was creating a basic web-app with <a href="http://code.google.com/appengine/">App Engine</a>. I&#8217;d tinkering with App Engine a bit previously so it was relatively straight-forward to follow the tutorials and piece together a single page app. Slightly more complicated was reading up on the Datastore and Memcache APIs but there were plenty of examples to follow.</p>
<h3>Conclusion</h3>
<p>The end result is <a href="http://ukinflation.appspot.com/">ukinflation.appspot.com</a>. It&#8217;s basic but deals with the job at hand. It&#8217;s also been a good introduction to various components of the App Engine environment: Datastore, Memcache, Cron, templates and the built-in webapp framework.</p>
<p>I&#8217;ve used in all of these types of technologies in other forms over the years and it&#8217;s amazing that you get so much functionality out of the box and as long as you embrace the constraints, scaling out comes for free.</p>
<p>I&#8217;ve still to make my mind up about Python though, maybe I&#8217;m just too accustomed to Ruby. Still, I&#8217;m glad to have another tool in  the toolbox and to not be restricted to any one set of tech.</p>
<h3>Share the Love</h3>
<p>As always the <a href="https://github.com/stevenwilkin/ukinflation">code is available on GitHub</a>, fork away!</p>
]]></content:encoded>
			<wfw:commentRss>http://sickbiscuit.com/blog/2011/05/12/keeping-an-eye-on-uk-inflation-with-google-app-engine/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A minimal Rack app to lookup your external IP address</title>
		<link>http://sickbiscuit.com/blog/2011/02/20/a-minimal-rack-app-to-lookup-your-external-ip-address/</link>
		<comments>http://sickbiscuit.com/blog/2011/02/20/a-minimal-rack-app-to-lookup-your-external-ip-address/#comments</comments>
		<pubDate>Sun, 20 Feb 2011 01:14:41 +0000</pubDate>
		<dc:creator>steve</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[code]]></category>

		<guid isPermaLink="false">http://sickbiscuit.com/blog/?p=544</guid>
		<description><![CDATA[I think I first heard the term &#8220;Rack-app&#8221; when I started using Heroku to host a couple of projects. I didn&#8217;t know an awful lot about Rack but I did know that it helped a great deal when it came to getting my Rails and Sinatra apps off my workstation and onto the web.
Tonight I [...]]]></description>
			<content:encoded><![CDATA[<p>I think I first heard the term &#8220;Rack-app&#8221; when I started using <a href="http://heroku.com/">Heroku</a> to host a couple of projects. I didn&#8217;t know an awful lot about <a href="https://github.com/rack/rack">Rack</a> but I did know that it helped a great deal when it came to getting my Rails and Sinatra apps off my workstation and onto the web.</p>
<p>Tonight I thought I&#8217;d have another quick look at how it works, what it takes to build a Rack-app and what information about the request is available to the handler.</p>
<p>The result was the following, an object which responds to <em>call</em> and returns a HTTP response code, headers and a body:</p>
<pre class="ruby">ip = <span style="color:#CC0066; font-weight:bold;">lambda</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>env<span style="color:#006600; font-weight:bold;">|</span>
  <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">200</span>, <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#996600;">&quot;Content-Type&quot;</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;text/plain&quot;</span><span style="color:#006600; font-weight:bold;">&#125;</span>, <span style="color:#006600; font-weight:bold;">&#91;</span>env<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;REMOTE_ADDR&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
run ip</pre>
<p>I have this running on <a href="http://ip.stevenwilkin.com">ip.stevenwilkin.com</a> and it provides the same useful function as <a href="http://whatismyip.com">whatismyip.com</a> but without the ads <img src='http://sickbiscuit.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>The code is available on <a href="https://github.com/stevenwilkin/ip.stevenwilkin.com">GitHub</a> as always.</p>
]]></content:encoded>
			<wfw:commentRss>http://sickbiscuit.com/blog/2011/02/20/a-minimal-rack-app-to-lookup-your-external-ip-address/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Minder &#8211; a simple web-app monitoring tool written in Ruby</title>
		<link>http://sickbiscuit.com/blog/2010/12/13/minder-a-simple-web-app-monitoring-tool-written-in-ruby/</link>
		<comments>http://sickbiscuit.com/blog/2010/12/13/minder-a-simple-web-app-monitoring-tool-written-in-ruby/#comments</comments>
		<pubDate>Mon, 13 Dec 2010 23:00:38 +0000</pubDate>
		<dc:creator>steve</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[code]]></category>

		<guid isPermaLink="false">http://sickbiscuit.com/blog/?p=502</guid>
		<description><![CDATA[Background
A few months ago I was tasked with migrating and maintaining a bunch of legacy Rails apps and a couple of them were misbehaving. Requests were hanging which was tying-up the front-end Apache child processes and resulting in all the web-apps on the server becoming unresponsive
At the time I didn&#8217;t know what was causing the [...]]]></description>
			<content:encoded><![CDATA[<h2>Background</h2>
<p>A few months ago I was tasked with migrating and maintaining a bunch of legacy Rails apps and a couple of them were misbehaving. Requests were hanging which was tying-up the front-end Apache child processes and resulting in all the web-apps on the server becoming unresponsive</p>
<p>At the time I didn&#8217;t know what was causing the hanging requests, it wasn&#8217;t happening in a predictable manner and on the surface I had all the apps dependencies in place.</p>
<p>Seeing as this was a job I was doing on the side I had very limited time to investigate the underlying issue and decided I would have to make do with just knowing when the apps went down so I could ssh in and manually kill off the offending processes.</p>
<p>My initial thought was to use Nagios for monitoring but it seemed excessively heavy-weight for the task at hand so I seized the opportunity to quickly develop a tool perfectly tailored to my needs.</p>
<p>The resulting script, minder, checks a list of domains and if the root of each can&#8217;t be read within 10 seconds a notication is sent via XMPP. Nothing more, nothing less. Simple.</p>
<p>Minder proved effective and I was bombarded with instant messages whenever any of the apps went under. Thankfully I found to bit more time to investigate more thoroughly and tracked the issue down to a missing TrueType font used by ImageMagick.</p>
<p>The first iteration of minder was very simple but I thought I&#8217;d put a bit of extra effort in to make it easier to customise and share it with the internet-at-large, hopefully someone will get some use out of it.</p>
<h2>Prerequisties</h2>
<ul>
<li>
<p>Two XMPP accounts:</p>
<ul>
<li>one to send notifications from, and</li>
<li>a second to receive notifications</li>
</ul>
<p>Google Talk or any regular Jabber/XMPP accounts will suffice
</li>
<li>
<p><a href="http://twitter.com/Blaine">Blaine</a>&#8217;s <a href="http://github.com/blaine/xmpp4r-simple">xmpp4r-simple</a> gem must be installed:</p>
<pre><code>sudo gem install xmpp4r-simple
</code></pre>
</li>
</ul>
<h2>Usage</h2>
<ul>
<li>copy minder.yaml.sample to minder.yaml</li>
<li>edit minder.yaml to specify the username and password of the sending XMPP account</li>
<li>specify your own personal XMPP account (xmpp_to)</li>
<li>modify the list of domains to monitor</li>
<li>run the script
<pre><code>$ ./minder.rb
</code></pre>
</li>
<li>
<p>Optionally run the script from a Cron job, the following will run every hour:</p>
<pre><code>0 * * * * /path/to/minder.rb &gt; /dev/null 2&gt;&amp;1
</code></pre>
</li>
</ul>
<h2>Get the code</h2>
<p>Clone the repo from <a href="https://github.com/stevenwilkin/minder">GitHub</a>. Fire any queries to <a href="http://twitter.com/stevebiscuit">@stevebiscuit</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://sickbiscuit.com/blog/2010/12/13/minder-a-simple-web-app-monitoring-tool-written-in-ruby/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>An experimental lifestream app</title>
		<link>http://sickbiscuit.com/blog/2010/06/27/an-experimental-lifestream-app/</link>
		<comments>http://sickbiscuit.com/blog/2010/06/27/an-experimental-lifestream-app/#comments</comments>
		<pubDate>Sun, 27 Jun 2010 21:48:49 +0000</pubDate>
		<dc:creator>steve</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Sinatra]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[code]]></category>

		<guid isPermaLink="false">http://sickbiscuit.com/blog/?p=480</guid>
		<description><![CDATA[Some time ago DW and myself had an enthusiastic conversation about logging various aspects of our electronic lives: emails sent and received, RSS feeds read, incoming and outgoing phone calls, the list goes on.
At that time I&#8217;d already started tinkering with apps to track my efforts in the gym and changes in my bodyweight, I&#8217;ve [...]]]></description>
			<content:encoded><![CDATA[<p>Some time ago <a href="http://twitter.com/davidbelfast">DW</a> and myself had an enthusiastic conversation about logging various aspects of our electronic lives: emails sent and received, RSS feeds read, incoming and outgoing phone calls, the list goes on.</p>
<p>At that time I&#8217;d already started tinkering with apps to track my efforts in the gym and changes in my bodyweight, I&#8217;ve used notebooks for this for years and thought it&#8217;d be interesting to have this information in electronic form.</p>
<h3>Sharpening skills</h3>
<p>While I was on the bench waiting for my current contract to start I was sharpening my skills through developing some small projects with the technologies I&#8217;d be using. One of those technologies was <a href="http://www.sqlite.org/">SQLite</a> which I knew of but didn&#8217;t have much hands on experience with.</p>
<p>I started by playing with the <a href="http://github.com/luislavena/sqlite3-ruby">Ruby interface to SQLite</a>, using it to insert and retrieve data from a simple database. I&#8217;ve since grown to love the simplicity and flexibility of SQLite and will no doubt use it again in the future.</p>
<p>I needed a practical application and thought back to my intentions to track my online activities. Now was as good a time as any to to tick this off the list of potential projects.</p>
<p>When I&#8217;d glued together some Ruby to parse the RSS feed of this blog I knew the basics were in place so I started on a simple Sinatra app to act as a web interface.</p>
<h3>Stumbling block</h3>
<p>I scoured the web for design inspiration and got a good start to the visual aspect of this project but couldn&#8217;t make my mind up over a few subtle items. Next thing my agent called: the purchase order finally came through and my contract was to start the next day.</p>
<p>The demands of adjusting to a new work environment meant I felt little motivation to work on anything on my own time and I became more interested in funneling my excess income into the stockmarket. The project joined those other half-finished unfortunates.</p>
<h3>A fresh jolt of motivation</h3>
<p>After a couple of months on the contract I started feeling a renewed motivation to get something of my own out there. I couldn&#8217;t  bare the thought of starting another project to not finish it so I set out to to whip this latest app into shape and release it as soon as possible and no later.</p>
<p>I dug through the uncommited changes in my working copy and made some arbitrary decisions which resulted in a design I felt was &#8220;good enough.&#8221; I modified my RSS parsing script to feed into SQLite and extended it to process my <a href="http://delicious.com/stevebiscuit">Delicious bookmarks</a> and <a href="http://www.last.fm/user/ahSyd">loved tracks on Last.fm</a>. I created pagination links, wrote a README and sorted out the hosting and cron jobs. Bingo.</p>
<h3>Check it out</h3>
<p>My original intention was to track much more of my online life and there&#8217;s some details I&#8217;d like to change but I love releasing code and I&#8217;m pleased with this first iteration.</p>
<p>The app is hosted at <a href="http://life.stevenwilkin.com">life.stevenwilkin.com</a> and the code is available on <a href="http://github.com/stevenwilkin/life.stevenwilkin.com">GitHub</a>, I hope you like it.</p>
]]></content:encoded>
			<wfw:commentRss>http://sickbiscuit.com/blog/2010/06/27/an-experimental-lifestream-app/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Home time revisited &#8211; redeveloping a CakePHP application with Sinatra</title>
		<link>http://sickbiscuit.com/blog/2010/03/24/home-time-revisited-redeveloping-a-cakephp-application-with-sinatra/</link>
		<comments>http://sickbiscuit.com/blog/2010/03/24/home-time-revisited-redeveloping-a-cakephp-application-with-sinatra/#comments</comments>
		<pubDate>Wed, 24 Mar 2010 18:26:50 +0000</pubDate>
		<dc:creator>steve</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Sinatra]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://sickbiscuit.com/blog/?p=466</guid>
		<description><![CDATA[I&#8217;ve just released the latest iteration of hometi.me, a little nano-app I&#8217;ve mentioned before.
Deliberate Practice
It&#8217;s only a trivial app but I&#8217;ve a bit of free time before the start of a contract so I thought it would be good practice to redevelop it, a task I&#8217;d been ignoring for a long time.
Goodbye CakePHP, Hello Sinatra
The [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve just released the latest iteration of <a href="http://hometi.me">hometi.me</a>, a little <a href="http://sickbiscuit.com/blog/2009/01/26/nano-apps/">nano-app</a> I&#8217;ve <a href="http://sickbiscuit.com/blog/2008/08/12/is-it-home-time-yet/">mentioned</a> <a href="http://sickbiscuit.com/blog/2008/09/09/home-time-is-a-little-closer/">before</a>.</p>
<h3>Deliberate Practice</h3>
<p>It&#8217;s only a trivial app but I&#8217;ve a bit of free time before the start of a contract so I thought it would be good practice to redevelop it, a task I&#8217;d been ignoring for a long time.</p>
<h3>Goodbye CakePHP, Hello Sinatra</h3>
<p>The original app was put together quickly with <a href="http://cakephp.org/">CakePHP</a>, a PHP-based framework I&#8217;ve used since my first paid programming gig. Since then though my interest and proficiency with Ruby and it&#8217;s frameworks has come more to the forefront. By choosing <a href="http://sinatrarb.com">Sinatra</a>, the app was given access to the rich Ruby ecosystem, including the joyful <a href="http://haml-lang.com/">HAML</a> and <a href="http://sass-lang.com/">SASS</a>.</p>
<p>The interesting aspect of this release is that all the logic is now implemented on the client-side using <a href="http://jquery.com/">Javascript</a>. Originally the countdown was calculated on the server-side and passed to the client with an AJAX call, but the server is more-or-less just hosting the markup, stylesheets and Javascript files required to get the app up and running in the browser.</p>
<h3>Heroku</h3>
<p>As this app doesn&#8217;t make use of a database or Cron jobs etc I thought I&#8217;d take the opportunity to move it from my own infrastructure and onto the awesomeness of <a href="http://heroku.com/">Heroku</a> whose free offering is a lot more performant than my little <a href="http://vpslink.com/?ref=CM6S0S">VPS</a>. Heroku is a service I&#8217;ve been playing with for a while now and it makes deploying a Ruby web app into production a breeze, assuming your project can work within it&#8217;s limitations.</p>
<p>All that&#8217;s left now is for the DNS changes to propagate. I&#8217;d like to show a bit more love to this app in the future, the controls to specify your own home time could be more intuitive for instance, but for now I&#8217;m content with the improvements I&#8217;ve made to it and it&#8217;s new home.</p>
<p>Is it passed your home time yet?</p>
]]></content:encoded>
			<wfw:commentRss>http://sickbiscuit.com/blog/2010/03/24/home-time-revisited-redeveloping-a-cakephp-application-with-sinatra/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>node-shoutbox &#8211; a simple node.js demo</title>
		<link>http://sickbiscuit.com/blog/2010/03/19/node-shoutbox-a-simple-node-js-demo/</link>
		<comments>http://sickbiscuit.com/blog/2010/03/19/node-shoutbox-a-simple-node-js-demo/#comments</comments>
		<pubDate>Fri, 19 Mar 2010 16:36:34 +0000</pubDate>
		<dc:creator>steve</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://sickbiscuit.com/blog/?p=454</guid>
		<description><![CDATA[Last month, at the inaugural Super Happy Dev Castle, my buddy Dave Rice told me about a project he was working on involving node.js, an event-based I/O system for Javascript.
Javascript outside of the browser?
This concept seemed almost ridiculous to me at that time but I thought it was worth a look and cobbled together a [...]]]></description>
			<content:encoded><![CDATA[<p>Last month, at the inaugural <a href="http://www.superhappydevcastle.org/">Super Happy Dev Castle</a>, my buddy <a href="http://twitter.com/davidjrice">Dave Rice</a> told me about a project he was working on involving <a href="http://github.com/ry/node">node.js</a>, an event-based I/O system for Javascript.</p>
<h3>Javascript outside of the browser?</h3>
<p>This concept seemed almost ridiculous to me at that time but I thought it was worth a look and cobbled together a quick &#8220;Hello World.&#8221; I was greatly amused by creating a command-line app with Javascript but did nothing more about it until last week. I&#8217;m currently starting out as an independant contractor &#038; have a bit of spare bandwidth so I thought I&#8217;d put together something a bit meatier in order to learn more about this system &#038; to also sharpen up my Javascript skills.</p>
<p>Dave had shown me <a href="http://github.com/felixge/node-comment">node-comment</a> and I also studied <a href="http://github.com/ry/node_chat">node_chat</a>. From there I had just enough reference material to understand the mechanics of <a href="http://en.wikipedia.org/wiki/Push_technology#Long_polling">long-polling</a> and to start piecing together a simple real-time commenting system.</p>
<h3>What is node?</h3>
<p>In and of itself, node is not a web development stack. It provides an I/O platform of which HTTP handling is a part. People are building blogging and wiki engines, FTP servers and command-line tools with this thing, anything I/O based is possible and thankfully micro-frameworks like <a href="http://github.com/jed/fab/">(fab)</a> can ease the pain of creating web apps.</p>
<p>Node is still very young software, which I have felt the pain of. To serve up static content I wanted to use <a href="http://github.com/felixge/node-paperboy">paperboy</a> as it can be used as middleware within (fab), however mere days after the last update to the project the API it was relying upon in node changed fundamentally. Despite being new to node development I was able to <a href="http://github.com/stevenwilkin/node-paperboy">patch paperboy to work with node v0.1.31</a> and get on with my actual project. Another sticking point was the inability of (fab) to handle POSTed form variables, this functionality is planned for it&#8217;s next release though.</p>
<h3>Fun</h3>
<p>Ultimately, my app is of little practical use: it doesn&#8217;t make use of persistance or moderation and node&#8217;s suitability for the production environment may itself be questionable at this time, but it was quite a fun experience. From something I more-or-less despised a decade ago I&#8217;ve come to develop a real affection for coding Javascript over the past few years.</p>
<p>When I had the basics of the app laid-down I eagerly awaiting the moment when I could have it open in two browser windows and enter a comment into one and see it appear in the second. That moment came and it brought a smile to my face. I suggest you give it a go <img src='http://sickbiscuit.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3>Get the code</h3>
<p>As a wise man once said, code speaks louder than words, so please be my guest and <a href="http://github.com/stevenwilkin/node-shoutbox">clone my demo on GitHub<a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://sickbiscuit.com/blog/2010/03/19/node-shoutbox-a-simple-node-js-demo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

