<?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>Warren Seen &#187; ruby</title>
	<atom:link href="http://warrenseen.com/blog/category/ruby/feed/" rel="self" type="application/rss+xml" />
	<link>http://warrenseen.com/blog</link>
	<description>freelance software developer</description>
	<lastBuildDate>Wed, 03 Jun 2009 23:54:34 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Bye bye hashjobs.com, it was fun.</title>
		<link>http://warrenseen.com/blog/2009/06/04/bye-bye-hashjobscom-it-was-fun/</link>
		<comments>http://warrenseen.com/blog/2009/06/04/bye-bye-hashjobscom-it-was-fun/#comments</comments>
		<pubDate>Wed, 03 Jun 2009 23:54:34 +0000</pubDate>
		<dc:creator>warren</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[twitter]]></category>
		<category><![CDATA[web2.0]]></category>

		<guid isPermaLink="false">http://warrenseen.com/blog/?p=84</guid>
		<description><![CDATA[It&#8217;s funny how things work out. When I made the initial version of hashjobs live back in January, I mentioned that I wasn&#8217;t really sure how or if I could make anything from it. As luck would have it, it turns out that I managed to catch the &#8220;post jobs on Twitter&#8221; trend in its [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s funny how things work out. When I made the initial version of <a href="http://hashjobs.com/">hashjobs</a> live back in January, <a href="http://warrenseen.com/blog/2009/01/22/just-launched-hashjobscom/">I mentioned</a> that I wasn&#8217;t really sure how or if I could make anything from it. As luck would have it, it turns out that I managed to catch the &#8220;post jobs on Twitter&#8221; trend in its infancy. </p>
<p>Almost immediately I started getting offers to buy the domain name. Each inquiry I got, I would knock back as I have always had plans as to what I wanted to work on for future versions of the site. Most of these seemed like tire-kickers who I never heard from again. </p>
<p>But there was one guy who kept coming back asking about the site. Early last month, he forwarded a very specific offer via a 3rd party to me that made me realise he was VERY serious about acquiring HashJobs. After a bit of back and forth negotiating, and consideration of what I could make from the site in the next 12-18 months if I had a serious go at it, I happily accepted his offer.</p>
<p>So I&#8217;m pleased to announce that as of this morning, the final installment of our transaction has cleared, and Jason Davis of <a href="http://recruitingblogs.com/">recruitingblogs.com</a> is the new owner of HashJobs. I&#8217;ve had a sneak peek at Jason&#8217;s plans for the site and I think he is going to do it far more justice than I could have, given his position in the online recruiting community. I wish him all the best.</p>
<p>(As a side note, I am amazed how quickly incoming wire transfers clear, compared to transfers between local banks!)</p>
<p>As for my plans, well at least I&#8217;ve filled a GFC-induced hole in my previous 6 months cashflow. People who I&#8217;ve told about this always ask me, &#8220;Can yo do the same again in a different field?&#8221; The answer is, &#8220;Probably not, it was more luck than good management.&#8221; </p>
<p>I think I&#8217;ll just start another side project (I have a few ideas) and see where the wind takes me&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://warrenseen.com/blog/2009/06/04/bye-bye-hashjobscom-it-was-fun/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Just launched &#8211; Hashjobs.com</title>
		<link>http://warrenseen.com/blog/2009/01/22/just-launched-hashjobscom/</link>
		<comments>http://warrenseen.com/blog/2009/01/22/just-launched-hashjobscom/#comments</comments>
		<pubDate>Thu, 22 Jan 2009 06:34:17 +0000</pubDate>
		<dc:creator>warren</dc:creator>
				<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://warrenseen.com/blog/?p=82</guid>
		<description><![CDATA[I&#8217;ve just pushed the initial version of Hash#Jobs live. The site is a quick and dirty twitter filter to pull out all the job-related tweets from the twitter stream.
from the about page: 
Hash#Jobs aggregates tweets that contain the following tags from twitter:
#job, #jobpost, #NAJ, #HAJ, #employment, #recruiting, #hiring
If you want your tweet to appear here, [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve just pushed the initial version of <a href="http://hashjobs.com">Hash#Jobs</a> live. The site is a quick and dirty twitter filter to pull out all the job-related tweets from the twitter stream.</p>
<p>from the <a href="http://hashjobs.com/about">about </a>page: </p>
<blockquote><p>Hash#Jobs aggregates tweets that contain the following tags from twitter:<br />
#job, #jobpost, #NAJ, #HAJ, #employment, #recruiting, #hiring<br />
If you want your tweet to appear here, simply add one of those tags.</p>
<p>Some day, in the future, Hash#Jobs might be smarter, through the wonders of bayesian classifiers and other cool things like text clustering. No promises.</p></blockquote>
<p>I built Hash#Jobs initially for myself, since I&#8217;m looking for new gigs, but figured, what the hell, for $12 bucks worth of domain registration, I might as well share it with the world. If one person gets a job out of it then it will have been worthwhile. It was also a fun excuse to play with <a href="http://sinatra.rubyforge.org/">Sinatra</a>, I think someone said it&#8217;s like <a href="http://camping.rubyforge.org/">camping</a>, but without the magic mushrooms. I&#8217;d have to agree&#8230;</p>
<p>I haven&#8217;t considered whether I could or should make money off something like this&#8230; I doubt I&#8217;d turn over more than the cost of the DNS or hosting, so not sure if it&#8217;s worth the effort.</p>
<p>I&#8217;d like to improve the system over the coming days to include clustering, as re-tweets show up and can very quickly fill a single page with repetitive information. I&#8217;m also toying with the idea of a Bayesian classifier to try and weed out what is and isn&#8217;t a genuine job post. It remains to be seen if 140 chars will be enough to get a meaningful result out of a Bayesian tool.</p>
<p>So anyway, there you have it, if you find it useful, feel free to drop me a comment and let me know. Also, please pass it on to someone who&#8217;s looking for a job if you think they can use it.</p>
]]></content:encoded>
			<wfw:commentRss>http://warrenseen.com/blog/2009/01/22/just-launched-hashjobscom/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Rails auto complete with form_for and fields_for support</title>
		<link>http://warrenseen.com/blog/2009/01/16/rails-auto-complete-with-form_for-and-fields_for-support/</link>
		<comments>http://warrenseen.com/blog/2009/01/16/rails-auto-complete-with-form_for-and-fields_for-support/#comments</comments>
		<pubDate>Fri, 16 Jan 2009 02:44:21 +0000</pubDate>
		<dc:creator>warren</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[Add new tag]]></category>

		<guid isPermaLink="false">http://warrenseen.com/blog/?p=81</guid>
		<description><![CDATA[I&#8217;ve forked the Rails auto_complete plugin to add support for the following usage:

 Ruby [Show Styled Code]:


  




 Ruby [Show Plain Code]:



&#60;% form_for&#40;@foo&#41; do &#124;f&#124; %&#62;


&#160; &#60;%= f.text_field_with_auto_complete :bar %&#62;


&#60;% end %&#62; 




This fork also supports nested fields_for calls:

 Ruby [Show Styled Code]:


  
    
  




 Ruby [Show Plain [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve forked the <a href="http://github.com/rails/auto_complete/tree/master">Rails auto_complete plugin</a> to add support for the following usage:</p>
<div class="synthi_code" style="display:none;" id ="plain_synthi_4c856de1ae48f">
<div class="synthi_header" style="font-weight:bold;"> Ruby <span  class="synthi_button"style="font-weight:lighter;font-size:smaller;">[<a href="#" onClick="javascript:document.getElementById('styled_synthi_4c856de1ae48f').style.display='block';document.getElementById('plain_synthi_4c856de1ae48f').style.display='none';return false">Show Styled Code</a>]:</span></div>
<pre style="width:100%;overflow:auto;">
<% form_for(@foo) do |f| %>
  <%= f.text_field_with_auto_complete :bar %>
<% end %>
</pre>
</div>
<div class="synthi_code" style="display:block;" id ="styled_synthi_4c856de1ae48f">
<div class="synthi_header" style="font-weight:bold;"> Ruby <span  class="synthi_button"style="font-weight:lighter;font-size:smaller;">[<a href="#" onClick="javascript:document.getElementById('plain_synthi_4c856de1ae48f').style.display='block';document.getElementById('styled_synthi_4c856de1ae48f').style.display='none';return false">Show Plain Code</a>]:</span></div>
<div class="ruby" style="font-family: monospace;">
<ol>
<li style="font-weight: bold;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&lt;% form_for<span style="color:#006600; font-weight:bold;">&#40;</span>@foo<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span> |f| %&gt;</div>
</li>
<li style="font-weight: bold;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &lt;%= f.<span style="color:#9900CC;">text_field_with_auto_complete</span> :bar %&gt;</div>
</li>
<li style="font-weight: bold;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&lt;% <span style="color:#9966CC; font-weight:bold;">end</span> %&gt; </div>
</li>
</ol>
</div>
</div>
<p>This fork also supports nested fields_for calls:</p>
<div class="synthi_code" style="display:none;" id ="plain_synthi_4c856de1b0b5f">
<div class="synthi_header" style="font-weight:bold;"> Ruby <span  class="synthi_button"style="font-weight:lighter;font-size:smaller;">[<a href="#" onClick="javascript:document.getElementById('styled_synthi_4c856de1b0b5f').style.display='block';document.getElementById('plain_synthi_4c856de1b0b5f').style.display='none';return false">Show Styled Code</a>]:</span></div>
<pre style="width:100%;overflow:auto;">
<% form_for(@foo) do |f| %>
  <% f.fields_for(@foo.baz) do |baz_f| %>
    <%= baz_f.text_field_with_auto_complete :quux %>
  <% end %>
<% end %>
</pre>
</div>
<div class="synthi_code" style="display:block;" id ="styled_synthi_4c856de1b0b5f">
<div class="synthi_header" style="font-weight:bold;"> Ruby <span  class="synthi_button"style="font-weight:lighter;font-size:smaller;">[<a href="#" onClick="javascript:document.getElementById('plain_synthi_4c856de1b0b5f').style.display='block';document.getElementById('styled_synthi_4c856de1b0b5f').style.display='none';return false">Show Plain Code</a>]:</span></div>
<div class="ruby" style="font-family: monospace;">
<ol>
<li style="font-weight: bold;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&lt;% form_for<span style="color:#006600; font-weight:bold;">&#40;</span>@foo<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span> |f| %&gt;</div>
</li>
<li style="font-weight: bold;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &lt;% f.<span style="color:#9900CC;">fields_for</span><span style="color:#006600; font-weight:bold;">&#40;</span>@foo.<span style="color:#9900CC;">baz</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span> |baz_f| %&gt;</div>
</li>
<li style="font-weight: bold;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &lt;%= baz_f.<span style="color:#9900CC;">text_field_with_auto_complete</span> :quux %&gt;</div>
</li>
<li style="font-weight: bold;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &lt;% <span style="color:#9966CC; font-weight:bold;">end</span> %&gt;&nbsp; &nbsp; </div>
</li>
<li style="font-weight: bold;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&lt;% <span style="color:#9966CC; font-weight:bold;">end</span> %&gt; </div>
</li>
</ol>
</div>
</div>
<p>You can find my fork on Github, <a href="http://github.com/warrenseen/auto_complete/tree/master">here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://warrenseen.com/blog/2009/01/16/rails-auto-complete-with-form_for-and-fields_for-support/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>You know Rails is getting traction&#8230;</title>
		<link>http://warrenseen.com/blog/2007/05/04/you-know-rails-is-getting-traction/</link>
		<comments>http://warrenseen.com/blog/2007/05/04/you-know-rails-is-getting-traction/#comments</comments>
		<pubDate>Thu, 03 May 2007 23:07:51 +0000</pubDate>
		<dc:creator>warren</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>

		<guid isPermaLink="false">http://warrenseen.com/blog/2007/05/04/you-know-rails-is-getting-traction/</guid>
		<description><![CDATA[&#8230; when job ads start appearing asking for unrealistic and bordering on impossible levels of experience.
I thought we&#8217;d gotten past this back in 2000 when .Net came out&#8230; but 3 Years of Ruby on Rails experience you say?
Mathematically impossible for the average (read: non-core) rails developer, considering Ruby on Rails was only released publicly in [...]]]></description>
			<content:encoded><![CDATA[<p>&#8230; when job ads start appearing asking for unrealistic and bordering on impossible levels of experience.</p>
<p>I thought we&#8217;d gotten past this back in 2000 when .Net came out&#8230; but <a href="http://www.indeed.com/rc/clk?jk=78bd0227827dfd4a&#038;cd=_hq65fXc-evh9Mp4FGmrR88YCUiEYte2wloTl8RMme7aDjepm7mHQa_VS5QdCwlafoIAhPp4NLUkoLHnACib3X4jvGPR4gk9A00hJPB4XdRYFnQc_g_UztBw7KdRi2E8&#038;qd=RnZhMybXSk4M3QtTVGXWoY-ygtZLXr_zwggEpygkL3t9H96ZIR7xaaAsUt8TqwFwIXNAyT1kiwH_s3jSJ2StEg&#038;rd=">3 Years of Ruby on Rails experience you say?</a></p>
<p>Mathematically impossible for the average (read: non-core) rails developer, considering Ruby on Rails was only released publicly in <a href="http://www.rubyonrails.org/core">July of 2004</a>.</p>
<p>They&#8217;re obviously very picky and so are willing to pay up to a whopping US$35-US$55/hr for all those <a href="http://workingwithrails.com/browse/people/authority">Rails rockstars</a> who were using it before it was released to the public! I&#8217;m sure they&#8217;ll drop everything and come running to apply!</p>
<p> <img src='http://warrenseen.com/blog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />
</p>
<p><!--96f14fcdea813b4332902dbf9301f39e-->
</p>
<p><!--5d6d68a0fa1d74c5997294541c1e8047-->
</p>
<p><!--2c0b9d963c2156a62b73722ac0c3a4a6-->
</p>
<p><!--397fbe8a24319ed0cd6e61aaa95b33cd-->
</p>
<p><!--fc49bba0bfbec6f929030e3f5e22a4b5--></p>
]]></content:encoded>
			<wfw:commentRss>http://warrenseen.com/blog/2007/05/04/you-know-rails-is-getting-traction/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Is platform selection premature optimisation?</title>
		<link>http://warrenseen.com/blog/2007/04/16/is-platform-selection-premature-optimisation/</link>
		<comments>http://warrenseen.com/blog/2007/04/16/is-platform-selection-premature-optimisation/#comments</comments>
		<pubDate>Mon, 16 Apr 2007 13:43:06 +0000</pubDate>
		<dc:creator>warren</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[scaling]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://warrenseen.com/blog/2007/04/16/is-platform-selection-premature-optimisation/</guid>
		<description><![CDATA[&#8220;We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil.&#8221;
Donald Knuth

Earlier today, I suggested that we should hold language and platform selection to the same standard we do with our code when avoiding premature optimisation. 
The thrust of my argument was that, in relation to [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p><em>&#8220;We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil.&#8221;</em><br />
<strong>Donald Knuth</strong></p>
</blockquote>
<p>Earlier today, <a href="http://warrenseen.com/blog/2007/04/16/rails-twitter-and-the-800lb-gorilla-in-the-room/">I suggested</a> that we should hold language and platform selection to the same standard we do with our code when avoiding premature optimisation. </p>
<p>The thrust of my argument was that, in relation to scalability, 99% of sites will never become so popular as to require scalability beyond that which is possible with Rails, so worrying about scalability feels like the start of <a href="http://en.wikipedia.org/wiki/Big_Design_Up_Front">big design up front</a>.</p>
<p>We should aim to not be dogmatic about our selection of language or platform, instead choosing the tools to get the job done, so we can <em>get something out there</em>. </p>
<p>After all, I think it was <strong>Fred Brooks</strong> who told us to <em>build a first version and throw it away</em>; the inherent wisdom in this approach is that you learn far more by building something and failing fast, than doggedly sticking to a flawed design that dies a slow, painful death.</p>
<p>If I can return to the example of Twitter, I don&#8217;t have any references, but I think their development time was quoted at something like 4 months? That&#8217;s not a lot of time really, and therefore, it&#8217;s not a lot of time to write off in the case that Twitter doesn&#8217;t get adopted and turned out to be an idea that was DOA. </p>
<p>Happily for the guys at Obvious, this wasn&#8217;t the case, and now they have a scaling issue, but I bet you they know a hell of a lot more about their users and usage patterns than what they ever could have predicted if they had set out to design it up front.</p>
<p>Could they have not followed the same path with J2EE or ASP.Net? Sure, if you ignore the fact that they&#8217;re Rails developers and therefore are more productive with&#8230; Rails. They chose the platform that was right for them, that got out of their way and let them implement the service to see if it would even work.</p>
<p>Another example, Reddit. The first version was written in Lisp before being <a href="http://www.aaronsw.com/weblog/rewritingreddit">rewritten in Python</a> &#8211; rewriting a proof-of-concept application (the cool kids call it <em>beta software</em> these days) into something that is &#8220;commercially ready&#8221; is not a bad thing.</p>
<p>I&#8217;m sure there are plenty of counter-examples where such an approach has failed, but I&#8217;m not getting into <em>reductio ad absurdum</em> arguments like &#8220;if your premise is true, then I could write #{compute_intensive_app} in #{slow_high_level_language}!&#8221;
</p>
<p><!--e6e8716e718d451b48de8222fe05a7ab-->
</p>
<p><!--f92266a2296131e7d8ccdf1ce51c7b51-->
</p>
<p><!--5b4e417bce981b848687706d16f3ff9b--></p>
]]></content:encoded>
			<wfw:commentRss>http://warrenseen.com/blog/2007/04/16/is-platform-selection-premature-optimisation/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Rails, Twitter and the 800lb Gorilla in the Room&#8230;</title>
		<link>http://warrenseen.com/blog/2007/04/16/rails-twitter-and-the-800lb-gorilla-in-the-room/</link>
		<comments>http://warrenseen.com/blog/2007/04/16/rails-twitter-and-the-800lb-gorilla-in-the-room/#comments</comments>
		<pubDate>Mon, 16 Apr 2007 01:24:39 +0000</pubDate>
		<dc:creator>warren</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[scaling]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://warrenseen.com/blog/2007/04/16/rails-twitter-and-the-800lb-gorilla-in-the-room/</guid>
		<description><![CDATA[When you first start using Rails, you quickly find there&#8217;s an 800lb gorilla in the room that no-one really wants to acknowledge. Yes, the &#8217;s&#8217; word: Scaling. Oh, they&#8217;re quick to tell you that it&#8217;s an uninteresting problem (at least for a programmer), if you do Rails right, and you&#8217;ve shared-nothing, then you just throw [...]]]></description>
			<content:encoded><![CDATA[<p>When you first start using Rails, you quickly find there&#8217;s an <a href="http://www.loudthinking.com/arc/000596.html">800lb gorilla</a> in the room that no-one really wants to acknowledge. Yes, the &#8217;s&#8217; word: <a href="http://www.radicalbehavior.com/5-question-interview-with-twitter-developer-alex-payne/">Scaling</a>. Oh, they&#8217;re quick to tell you that it&#8217;s an uninteresting problem (at least for a programmer), if you <a href="http://www.loudthinking.com/arc/000399.html">do Rails right</a>, and you&#8217;ve <a href="http://en.wikipedia.org/wiki/Shared-nothing">shared-nothing</a>, then you just throw more hardware at the problem. That if you have a real bottleneck in your code, just <a href="http://www.loudthinking.com/arc/000598.html">rewrite the performance critical parts of it in C</a>. Oh, and <a href="http://www.atdot.net/yarv/">YARV</a> will be here soon (for certain values of soon), so Ruby will be faster!</p>
<p>And suddenly, that gorilla shrinks; or at least it seems to.</p>
<p>Until <a href="http://obvious.com/">someone</a> goes and <a href="http://twitter.com/">pushes the boundary</a> way beyond <a href="http://penny-arcade.com/">those</a> <a href="http://43things.com/">who&#8217;ve</a> <a href="http://alistapart.com/">come</a> <a href="http://37signals.com">before</a>. Suddenly, the gorilla has grabbed your <a href="http://thebull.macsimumweb.com/2007/04/14/twitter-starting-to-get-de-railed/">girl</a>, climbed to the top of the Empire State and is angrily swatting light aircraft left, right and centre.</p>
<p>Scaling suddenly gets interesting again.</p>
<p><strong>Nay-sayers and trolls cloud the issue</strong><br />
Those who for whatever reason <a href="http://www.loudthinking.com/arc/000610.html#comments">want to see Rails fail</a>, have grabbed ahold of the issue and are casting it as a reason to abandon Rails: &#8220;<a href="http://www.codinghorror.com/blog/archives/000838.html">Behold, the savage beast that cannot be tamed!</a>&#8221; Often, they&#8217;ve got their <a href="http://www.loudthinking.com/arc/000399.html">own agenda</a>, whether it&#8217;s a desire to see their pet platform succeed, or to see DHH kicked to the dirt, these folks don&#8217;t really care about the scaling issue at all. They latch onto these issues not to help improve the platform, in the worst case they want to destroy it.</p>
<p>So forget them. </p>
<p>We&#8217;re here because we want to solve this without changing platforms.</p>
<p><strong>It doesn&#8217;t matter to most of us anyway</strong><br />
The truth is, 99% of Rails projects will *never* hit a performance wall that cannot be solved using existing wisdom. So the issue is a non-issue and certainly not a reason to ditch Rails. </p>
<p>If perchance, you&#8217;re part of the other 1%, you should be <a href="http://laughingmeme.org/2007/04/12/twitter-ruby-and-scaling/">thrilled to have this problem</a>, it means your software has been successful! Fact is, you don&#8217;t <em>accidentally</em> create a site/service which generates 11,000+ requests/sec. You <em>explicitly set out to do so</em>. And presumably, you chose Rails for a reason. Why shouldn&#8217;t we extend the concept of &#8220;no premature optimisation&#8221; to language and platform selection? If Twitter had <a href="http://bobondevelopment.com/2007/04/13/ruby-on-rails-hits-a-wall-twitter-stutters/">chosen an &#8220;enterprise&#8221; class platform</a> and <a href="http://www.codinghorror.com/blog/archives/000838.html">tried to architect</a> for 11k reqs/sec, chances are they would still be building&#8230; </p>
<p><a href="http://obvious.com/">Obvious</a> had a reason to choose Rails; they aren&#8217;t naive, they&#8217;ve been <a href="http://odeo.com/">around the block with Rails</a> before. </p>
<p>Generally, it&#8217;s much better to <a href="http://www.tbray.org/ongoing/When/200x/2007/04/13/Twitter-and-Rails">throw something out there NOW</a>, and let the real problems come out in the wash, rather than sit in a dark room, worrying about what might happen and giving yourself a case of analysis paralysis.</p>
<p><strong>Escalation Sucks</strong><br />
This issue has been blown up by a combination of <a href="http://gettingreal.37signals.com/ch04_Make_Opinionated_Software.php">strong opinions</a>, incomplete information and folks from other camps pouring fuel on the fire. It&#8217;s time this &#8220;conflict&#8221; was de-escalated and the combative nature of the discussion toned down.</p>
<p>The situation itself can be summed up pretty easily</p>
<ul>
<li>We&#8217;re in uncharted waters in terms of this sort of throughput, although others have <a href="http://tomayko.com/weblog/2007/04/13/rails-multiple-connections">suggestions</a> and maybe even <a href="http://drnicwilliams.com/2007/04/12/magic-multi-connections-a-facility-in-rails-to-talk-to-more-than-one-database-at-a-time/">solutions</a>.</li>
<li>The problem didn&#8217;t just suddenly spring up on the Twitter guys, <a href="http://romeda.org/blog/2007/04/scaling-twitter-talk.html">clearly they&#8217;ve been working on it for a while</a> &#8211; implying they&#8217;re now crying to core because Rails is broken for them is disingenuous. (In fact, the whole &#8220;<a href="http://www.loudthinking.com/arc/000608.html">they&#8217;ve forsaken that opportunity for an arms-crossed alternative.</a>&#8221; thing smells like something of a <a href="http://en.wikipedia.org/wiki/Strawman_argument">strawman argument</a> &#8211; I didn&#8217;t get that from the interview, so unless that&#8217;s come out of some backchannel, it seems a peculiar accusation to make.)</li>
<li>Solutions that work for Twitter may not work for other Rails apps. Once you exhaust all of the conventional scaling wisdom, you start to move into application-specific optimisations. Are we there yet? I guess we&#8217;ll wait and see. </li>
</ul>
<p><strong>When the storm is over</strong><br />
This is a learning opportunity for everyone, but those who stand to learn the most are the core team and the Twitter guys. I hope each can continue to be open to the other&#8217;s position. We need to remember at the end of the day, Twitter are under no obligation to release patches, and the core team are under no obligation to accept them &#8211; I hope that doesn&#8217;t happen though, as the community would be the worse for it.</p>
<p><!--1c738554a3f914e9bede627286dc5c4e--></p>
]]></content:encoded>
			<wfw:commentRss>http://warrenseen.com/blog/2007/04/16/rails-twitter-and-the-800lb-gorilla-in-the-room/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Local company taking on Google over GWT?</title>
		<link>http://warrenseen.com/blog/2007/04/03/local-company-taking-on-google-over-gwt/</link>
		<comments>http://warrenseen.com/blog/2007/04/03/local-company-taking-on-google-over-gwt/#comments</comments>
		<pubDate>Mon, 02 Apr 2007 23:40:26 +0000</pubDate>
		<dc:creator>warren</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[patents]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>

		<guid isPermaLink="false">http://warrenseen.com/blog/2007/04/03/local-company-taking-on-google-over-gwt/</guid>
		<description><![CDATA[


Tasmania is a small place, which is why I&#8217;m surprised that very few people in the IT industry here have heard of Morfik, a Hobart based development company. Reading this morning&#8217;s Read/Write Web however, things may be about change there. As reported by Richard, slashdot are running a post about the Morfik patent which appears [...]]]></description>
			<content:encoded><![CDATA[<div style="float:right;padding:5px">
<a href="http://www.flickr.com/photos/warren_seen/444206142/"><img src="http://farm1.static.flickr.com/207/444206142_306575a4ce_m.jpg" alt="Morfik" /></a>
</div>
<p>Tasmania is a small place, which is why I&#8217;m surprised that very few people in the IT industry here have heard of <a href="http://www.morfik.com/">Morfik</a>, a Hobart based development company. Reading this morning&#8217;s <a href="http://www.readwriteweb.com/archives/morfik_patents_ajax_compiler.php">Read/Write Web</a> however, things may be about change there. As reported by Richard, <a href="http://yro.slashdot.org/article.pl?sid=07/04/02/1059211">slashdot</a> are running a post about the <a href="http://appft1.uspto.gov/netacgi/nph-Parser?Sect1=PTO2&#038;Sect2=HITOFF&#038;p=1&#038;u=%2Fnetahtml%2FPTO%2Fsearch-bool.html&#038;r=1&#038;f=G&#038;l=50&#038;co1=AND&#038;d=PG01&#038;s1=morfik&#038;OS=morfik&#038;RS=morfik">Morfik patent</a> which appears to be aimed squarely at Google&#8217;s <a href="http://code.google.com/webtoolkit/">GWT</a>.</p>
<p>I&#8217;m in two minds about this, as I always am about software patents. On the one hand, Morfik was clearly first to the party in terms of public release of a JavaScript compiler, according to the patent they had a provisional granted prior to the release of the GWT. On the other, I have to wonder how this is any different to the multitude of language translation techniques already out there, or at least whether it&#8217;s significantly inventive enough to pass the &#8220;not obvious to a practitioner in the field&#8221; test.</p>
<p>But hey, this wouldn&#8217;t be the first patent to be granted despite the obviousness of it to someone with half a brain. I mean, thank goodness the patent doesn&#8217;t mention Ruby, I guess that means <a href="http://www.rubyinside.com/16-rjs-resources-and-tutorials-for-rails-programmers-5.html">RJS</a> is safe!
</p>
<p><!--c803f5fd0a94c87801a54b068fb22c3e-->
</p>
<p><!--d6255acec078e3ea5472f22cbce239a8-->
</p>
<p><!--7ef154d3b0ecc4f6ac914533288de280-->
</p>
<p><!--0d4e8a0bf70f98b503dd59ca2f735a62--></p>
]]></content:encoded>
			<wfw:commentRss>http://warrenseen.com/blog/2007/04/03/local-company-taking-on-google-over-gwt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ScratchyPad Tag Clouds</title>
		<link>http://warrenseen.com/blog/2007/04/02/scratchypad-tag-clouds/</link>
		<comments>http://warrenseen.com/blog/2007/04/02/scratchypad-tag-clouds/#comments</comments>
		<pubDate>Mon, 02 Apr 2007 07:26:05 +0000</pubDate>
		<dc:creator>warren</dc:creator>
				<category><![CDATA[camping]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://warrenseen.com/blog/2007/04/02/scratchypad-tag-clouds/</guid>
		<description><![CDATA[The version I posted yesterday had a dodgy tag cloud implementation that I was experimenting with. I&#8217;ve reworked it this morning between other tasks and am much happier now. I imported some delicious bookmarks to populate the db a bit more and the result is this:

Much better!

Initially, the tag cloud was overpowered by one tag [...]]]></description>
			<content:encoded><![CDATA[<p>The version I posted yesterday had a dodgy tag cloud implementation that I was experimenting with. I&#8217;ve reworked it this morning between other tasks and am much happier now. I imported some delicious bookmarks to populate the db a bit more and the result is this:</p>
<p><a href="http://www.flickr.com/photos/warren_seen/443222792/" title="photo sharing"><img src="http://farm1.static.flickr.com/188/443222792_36fbae0e5f_m.jpg" alt="" style="border: solid 2px #000000;" /></a></p>
<p>Much better!</p>
<p><span id="more-48"></span><br />
Initially, the tag cloud was overpowered by one tag because I was using a linear weighting, but once I switched to using a logarithmic weighting, things looked a lot better. </p>
<p>This is how the tag cloud is rendered, using Markaby:</p>
<div class="synthi_code" style="display:none;" id ="plain_synthi_4c856de1dca7a">
<div class="synthi_header" style="font-weight:bold;"> Ruby <span  class="synthi_button"style="font-weight:lighter;font-size:smaller;">[<a href="#" onClick="javascript:document.getElementById('styled_synthi_4c856de1dca7a').style.display='block';document.getElementById('plain_synthi_4c856de1dca7a').style.display='none';return false">Show Styled Code</a>]:</span></div>
<pre style="width:100%;overflow:auto;">
# Render the tag cloud view
def tag_cloud(tags = nil)
  @tags ||= tags
  max = 0
  @tags.each do |t|
    max = t.taggings.length if t.taggings.length > max
  end

  div.cloud do
    @tags.each do |t|
      weight = Math.log10(t.taggings.length) / Math.log10(max.to_f)
      _cloud_tag(t, weight)
    end
  end
end

# Generate tag HTML
def _tag(name, style = nil)
  a.tag(name, :href => R(Tags, name), :title => &#034;All entries tagged '#{name}'&#034;, :style => style)
end

# Generate the HTML for the tag in the cloud
def _cloud_tag(tag,weight)
  _tag(tag.name,style_for_weight(weight))
  self << &#034; &#034;
end

# Generate a CSS style string
def style_for_weight(weight)
  n = 0xff/2 + (0xff/2*weight).to_i
  &#034;font-size:#{0.5 + weight}em;color:rgb(#{n},#{n},#{n})&#034;
end</pre>
</div>
<div class="synthi_code" style="display:block;" id ="styled_synthi_4c856de1dca7a">
<div class="synthi_header" style="font-weight:bold;"> Ruby <span  class="synthi_button"style="font-weight:lighter;font-size:smaller;">[<a href="#" onClick="javascript:document.getElementById('plain_synthi_4c856de1dca7a').style.display='block';document.getElementById('styled_synthi_4c856de1dca7a').style.display='none';return false">Show Plain Code</a>]:</span></div>
<div class="ruby" style="font-family: monospace;">
<ol>
<li style="font-weight: bold;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000; font-style:italic;"># Render the tag cloud view</span></div>
</li>
<li style="font-weight: bold;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#9966CC; font-weight:bold;">def</span> tag_cloud<span style="color:#006600; font-weight:bold;">&#40;</span>tags = <span style="color:#0000FF; font-weight:bold;">nil</span><span style="color:#006600; font-weight:bold;">&#41;</span></div>
</li>
<li style="font-weight: bold;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; @tags ||= tags</div>
</li>
<li style="font-weight: bold;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; max = <span style="color:#006666;">0</span></div>
</li>
<li style="font-weight: bold;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; @tags.<span style="color:#9900CC;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> |t|</div>
</li>
<li style="font-weight: bold;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; max = t.<span style="color:#9900CC;">taggings</span>.<span style="color:#9900CC;">length</span> <span style="color:#9966CC; font-weight:bold;">if</span> t.<span style="color:#9900CC;">taggings</span>.<span style="color:#9900CC;">length</span> &gt; max</div>
</li>
<li style="font-weight: bold;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color:#9966CC; font-weight:bold;">end</span></div>
</li>
<li style="font-weight: bold;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; div.<span style="color:#9900CC;">cloud</span> <span style="color:#9966CC; font-weight:bold;">do</span></div>
</li>
<li style="font-weight: bold;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; @tags.<span style="color:#9900CC;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> |t|</div>
</li>
<li style="font-weight: bold;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; weight = Math.<span style="color:#9900CC;">log10</span><span style="color:#006600; font-weight:bold;">&#40;</span>t.<span style="color:#9900CC;">taggings</span>.<span style="color:#9900CC;">length</span><span style="color:#006600; font-weight:bold;">&#41;</span> / Math.<span style="color:#9900CC;">log10</span><span style="color:#006600; font-weight:bold;">&#40;</span>max.<span style="color:#9900CC;">to_f</span><span style="color:#006600; font-weight:bold;">&#41;</span></div>
</li>
<li style="font-weight: bold;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; _cloud_tag<span style="color:#006600; font-weight:bold;">&#40;</span>t, weight<span style="color:#006600; font-weight:bold;">&#41;</span></div>
</li>
<li style="font-weight: bold;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">end</span></div>
</li>
<li style="font-weight: bold;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color:#9966CC; font-weight:bold;">end</span></div>
</li>
<li style="font-weight: bold;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#9966CC; font-weight:bold;">end</span></div>
</li>
<li style="font-weight: bold;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000; font-style:italic;"># Generate tag HTML</span></div>
</li>
<li style="font-weight: bold;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#9966CC; font-weight:bold;">def</span> _tag<span style="color:#006600; font-weight:bold;">&#40;</span>name, style = <span style="color:#0000FF; font-weight:bold;">nil</span><span style="color:#006600; font-weight:bold;">&#41;</span></div>
</li>
<li style="font-weight: bold;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; a.<span style="color:#9900CC;">tag</span><span style="color:#006600; font-weight:bold;">&#40;</span>name, :href =&gt; R<span style="color:#006600; font-weight:bold;">&#40;</span>Tags, name<span style="color:#006600; font-weight:bold;">&#41;</span>, :title =&gt; <span style="color:#996600;">&quot;All entries tagged '#{name}'&quot;</span>, :style =&gt; style<span style="color:#006600; font-weight:bold;">&#41;</span></div>
</li>
<li style="font-weight: bold;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#9966CC; font-weight:bold;">end</span></div>
</li>
<li style="font-weight: bold;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000; font-style:italic;"># Generate the HTML for the tag in the cloud</span></div>
</li>
<li style="font-weight: bold;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#9966CC; font-weight:bold;">def</span> _cloud_tag<span style="color:#006600; font-weight:bold;">&#40;</span>tag,weight<span style="color:#006600; font-weight:bold;">&#41;</span></div>
</li>
<li style="font-weight: bold;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; _tag<span style="color:#006600; font-weight:bold;">&#40;</span>tag.<span style="color:#9900CC;">name</span>,style_for_weight<span style="color:#006600; font-weight:bold;">&#40;</span>weight<span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span></div>
</li>
<li style="font-weight: bold;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color:#0000FF; font-weight:bold;">self</span> &lt;&lt; <span style="color:#996600;">&quot; &quot;</span></div>
</li>
<li style="font-weight: bold;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#9966CC; font-weight:bold;">end</span></div>
</li>
<li style="font-weight: bold;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000; font-style:italic;"># Generate a CSS style string</span></div>
</li>
<li style="font-weight: bold;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#9966CC; font-weight:bold;">def</span> style_for_weight<span style="color:#006600; font-weight:bold;">&#40;</span>weight<span style="color:#006600; font-weight:bold;">&#41;</span></div>
</li>
<li style="font-weight: bold;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; n = 0xff/<span style="color:#006666;">2</span> + <span style="color:#006600; font-weight:bold;">&#40;</span>0xff/<span style="color:#006666;">2</span>*weight<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">to_i</span></div>
</li>
<li style="font-weight: bold;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color:#996600;">&quot;font-size:#{0.5 + weight}em;color:rgb(#{n},#{n},#{n})&quot;</span></div>
</li>
<li style="font-weight: bold;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#9966CC; font-weight:bold;">end</span> </div>
</li>
</ol>
</div>
</div>
<p><!--78288e6580c56b16172e9a54374058f8-->
</p>
<p><!--668a71d57104aed068e2205ba8eab6d9-->
</p>
<p><!--668a71d57104aed068e2205ba8eab6d9--></p>
]]></content:encoded>
			<wfw:commentRss>http://warrenseen.com/blog/2007/04/02/scratchypad-tag-clouds/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ScratchyPad Edit Screenshot</title>
		<link>http://warrenseen.com/blog/2007/04/01/scratchypad-edit-screenshot/</link>
		<comments>http://warrenseen.com/blog/2007/04/01/scratchypad-edit-screenshot/#comments</comments>
		<pubDate>Sun, 01 Apr 2007 07:50:11 +0000</pubDate>
		<dc:creator>warren</dc:creator>
				<category><![CDATA[camping]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://warrenseen.com/blog/2007/04/01/scratchypad-edit-screenshot/</guid>
		<description><![CDATA[ 

ScratchyPad Edit
Originally uploaded by Warren_Seen.

Editing an entry in the scratchpad.



]]></description>
			<content:encoded><![CDATA[<p> <a href="http://www.flickr.com/photos/warren_seen/441683655/" title="photo sharing"><img src="http://farm1.static.flickr.com/207/441683655_b4fd9a98e4_m.jpg" alt="" style="border: solid 2px #000000;" /></a></p>
<p><span style="font-size: 0.9em; margin-top: 0px;"><br />
<a href="http://www.flickr.com/photos/warren_seen/441683655/">ScratchyPad Edit</a></p>
<p>Originally uploaded by <a href="http://www.flickr.com/people/warren_seen/">Warren_Seen</a>.<br />
</span></p>
<p>Editing an entry in the scratchpad.<br />
<br clear="all" />
</p>
<p><!--505757e082bd33109763b506ba17888c--></p>
]]></content:encoded>
			<wfw:commentRss>http://warrenseen.com/blog/2007/04/01/scratchypad-edit-screenshot/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ScratchyPad Tags Screenshot</title>
		<link>http://warrenseen.com/blog/2007/04/01/scratchypad-tags-screenshot/</link>
		<comments>http://warrenseen.com/blog/2007/04/01/scratchypad-tags-screenshot/#comments</comments>
		<pubDate>Sun, 01 Apr 2007 07:48:29 +0000</pubDate>
		<dc:creator>warren</dc:creator>
				<category><![CDATA[camping]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://warrenseen.com/blog/2007/04/01/scratchypad-tags-screenshot/</guid>
		<description><![CDATA[ 

ScratchyPad Tags
Originally uploaded by Warren_Seen.

Displaying all entries tagged &#8217;scratchypad&#8217;





]]></description>
			<content:encoded><![CDATA[<p> <a href="http://www.flickr.com/photos/warren_seen/441683555/" title="photo sharing"><img src="http://farm1.static.flickr.com/192/441683555_e36a60b1e5_m.jpg" alt="" style="border: solid 2px #000000;" /></a></p>
<p><span style="font-size: 0.9em; margin-top: 0px;"><br />
<a href="http://www.flickr.com/photos/warren_seen/441683555/">ScratchyPad Tags</a></p>
<p>Originally uploaded by <a href="http://www.flickr.com/people/warren_seen/">Warren_Seen</a>.<br />
</span></p>
<p>Displaying all entries tagged &#8217;scratchypad&#8217;<br />
<br clear="all" />
</p>
<p><!--f7de58c01d01f963bdbac56c39833c2e-->
</p>
<p><!--0856f531afc71d046cf44c8dd43824f4--></p>
]]></content:encoded>
			<wfw:commentRss>http://warrenseen.com/blog/2007/04/01/scratchypad-tags-screenshot/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
