<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Wildfalcon</title>
	
	<link>http://wildfalcon.com</link>
	<description>Cross Domain Development and Thinking</description>
	<pubDate>Mon, 22 Sep 2008 14:46:29 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.1</generator>
	<language>en</language>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/LauriesBlog" type="application/rss+xml" /><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site, subject to copyright and fair use.</feedburner:browserFriendly><item>
		<title>Capistrano Task Graph and 3 reasons why it sucks</title>
		<link>http://feeds.feedburner.com/~r/LauriesBlog/~3/399830384/</link>
		<comments>http://wildfalcon.com/archives/2008/09/22/capistrano-task-graph-and-3-reasons-why-it-sucks/#comments</comments>
		<pubDate>Mon, 22 Sep 2008 14:18:04 +0000</pubDate>
		<dc:creator>Laurie</dc:creator>
		
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://wildfalcon.com/?p=202</guid>
		<description><![CDATA[Capistrano comes with a set of tasks ready to deploy your application. Unfortunately it doesn&#8217;t come with an easy way to view  those tasks, and how they are related. Here is the graph you are probably looking for

This is a pretty crappy state of play! Given that Capistrano is the recommended way to deploy your [...]]]></description>
			<content:encoded><![CDATA[<p>Capistrano comes with a set of tasks ready to deploy your application. Unfortunately it doesn&#8217;t come with an easy way to view  those tasks, and how they are related. Here is the graph you are probably looking for</p>
<p style="text-align: center;"><a href="http://wildfalcon.com/wp-content/uploads/2008/09/cap-graph.jpg" onclick="javascript:pageTracker._trackPageview ('/downloads/jpg/cap-graph.jpg');"><img class="size-medium wp-image-201 aligncenter" title="cap-graph" src="http://wildfalcon.com/wp-content/uploads/2008/09/cap-graph.jpg" alt="" width="536" height="235" /></a></p>
<p>This is a pretty crappy state of play! Given that Capistrano is the recommended way to deploy your applications. Let me justify that</p>
<ol>
<li>The deploy target: Why would I ever want to deploy and not run the migrations? If there are migrations, not running them is going to give me an untested environment, (new code, old database) and if there are no migrations, then there is no cost to running them.</li>
<li>Inconsistent: Why is it that the deploy target wraps update_code and symlink in a transaction, but deploy:migrations does not?</li>
<li>Unclear Naming: Its not imediatly clear what the difference between deploy:migrate and deploy:migrations is.</li>
</ol>
<p>Capistrano is a really cool tool, but problems like this with the default tasks make it really confusing to use. I want to see it having default tasks that are named in a clear way, with a new convention if necessary, and consistent behaviour.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Bookmark to:</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://wildfalcon.com/archives/2008/09/22/capistrano-task-graph-and-3-reasons-why-it-sucks/&amp;title=Capistrano+Task+Graph+and+3+reasons+why+it+sucks" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://wildfalcon.com/archives/2008/09/22/capistrano-task-graph-and-3-reasons-why-it-sucks/&amp;title=Capistrano+Task+Graph+and+3+reasons+why+it+sucks" title="Add to&nbsp;digg"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http://wildfalcon.com/archives/2008/09/22/capistrano-task-graph-and-3-reasons-why-it-sucks/" title="Add to&nbsp;Facebook"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://wildfalcon.com/archives/2008/09/22/capistrano-task-graph-and-3-reasons-why-it-sucks/&amp;title=Capistrano+Task+Graph+and+3+reasons+why+it+sucks" title="Add to&nbsp;reddit"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://wildfalcon.com/archives/2008/09/22/capistrano-task-graph-and-3-reasons-why-it-sucks/&amp;title=Capistrano+Task+Graph+and+3+reasons+why+it+sucks" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://wildfalcon.com/archives/2008/09/22/capistrano-task-graph-and-3-reasons-why-it-sucks/" title="Add to&nbsp;Technorati"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
<img src="http://feeds.feedburner.com/~r/LauriesBlog/~4/399830384" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://wildfalcon.com/archives/2008/09/22/capistrano-task-graph-and-3-reasons-why-it-sucks/feed/</wfw:commentRss>
		<feedburner:origLink>http://wildfalcon.com/archives/2008/09/22/capistrano-task-graph-and-3-reasons-why-it-sucks/</feedburner:origLink></item>
		<item>
		<title>Shoot Shoreditch</title>
		<link>http://feeds.feedburner.com/~r/LauriesBlog/~3/385937152/</link>
		<comments>http://wildfalcon.com/archives/2008/09/07/shoot-shoreditch/#comments</comments>
		<pubDate>Sun, 07 Sep 2008 17:43:34 +0000</pubDate>
		<dc:creator>Laurie</dc:creator>
		
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://wildfalcon.com/?p=186</guid>
		<description><![CDATA[A year or so ago now a good friend of mine asked me if I had ever heard of Shoot Experience, and was I interested in acompanying her on one of their shoot days. Naturally I jumped at the chance, and with typical speed it took over a year to actually sign up and do [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.flickr.com/photos/wildfalcon/2835952101/" title="Shoot Shoreditch by Laurie Young, on Flickr" target="_blank" onclick="javascript:pageTracker._trackPageview ('/outbound/www.flickr.com');"><img class="alignleft" src="http://farm4.static.flickr.com/3094/2835952101_dfd3225322_m.jpg" alt="Shoot Shoreditch" width="240" height="160" /></a>A year or so ago now a good friend of mine asked me if I had ever heard of <a href="http://www.shootexperience.com/" title="Shoot Experience" target="_blank" onclick="javascript:pageTracker._trackPageview ('/outbound/www.shootexperience.com');">Shoot Experience</a>, and was I interested in acompanying her on one of their shoot days. Naturally I jumped at the chance, and with typical speed it took over a year to actually sign up and do to the day.</p>
<p>Shoot experience organise various day shoot trips, and the one we did was &#8220;Shoot Shoreditch&#8221;, perfect as we both live right round the corner from Shoreditch. Not so great for Olly and Nicky, who trecked over all the way from somewhere in West London for the day to complete our team.</p>
<p>I was a little bit worried when I looked at thier T&amp;C page. Seems they demand the right to sell any photos you enter for comercial purposes, and I have heard enough horror stories of photo competitions and events being run as ways to build up photo libraries&#8230;, but I decided to give it ago anyway. At the day they claimed this was because they are trying to help the people who attend the days earn money from their hobby, which would be a great thing for them to be doing - but untill someone tries to buy one of my photos - I can&#8217;t tell you how true that is. They did however give us the option to opt out of granting our model releases, and giving them exclusive rights to the photos. So I do get to show you what we shot!</p>
<p>We were given the theme of &#8220;light&#8221; and 10 clues, 7 pointing to locations, and 3 creative clues; a map, and five hours to go and be creative. This is what we got:</p>
<p><strong>Once generating &#8220;out of the dust light and power&#8221; -  Nowadays home to acrobatic flight and squirty flowers</strong></p>
<p>This strange phrase refers to the motto of the Vestry of St Leonard Shoreditch Electric Light Station, which is now a pretty cool <a href="http://www.thecircusspace.co.uk/" title="The Circus Space" target="_blank" onclick="javascript:pageTracker._trackPageview ('/outbound/www.thecircusspace.co.uk');">circus school</a>.</p>
<p style="text-align: center;"><a href="http://www.flickr.com/photos/wildfalcon/2836720362/" title="Once generating &quot;out of the dust light and power&quot; -  Nowadays home to acrobatic flight and squirty flowers by Laurie Young, on Flickr" target="_blank" onclick="javascript:pageTracker._trackPageview ('/outbound/www.flickr.com');"><img class="aligncenter" src="http://farm4.static.flickr.com/3259/2836720362_9197206fa6_m.jpg" alt="Once generating &quot;out of the dust light and power&quot; -  Nowadays home to acrobatic flight and squirty flowers" width="160" height="240" /></a></p>
<p><strong>A sun powered beacon for the lost and Foundry</strong></p>
<p>Just opposite the Foundry Bar is a new solar powerd art installation called the Beacon</p>
<p style="text-align: center;"><a href="http://www.flickr.com/photos/wildfalcon/2836721448/" title="A sun powered beacon for the lost and Foundry by Laurie Young, on Flickr" target="_blank" onclick="javascript:pageTracker._trackPageview ('/outbound/www.flickr.com');"><img class="aligncenter" src="http://farm4.static.flickr.com/3039/2836721448_7e1f1af5ae_m.jpg" alt="A sun powered beacon for the lost and Foundry" width="240" height="160" /></a></p>
<p><strong>Electrifying Shoreditch with Eddison&#8217;s invention since 1920</strong></p>
<p>Eddison of course invented the light bulbe, and there is a famous bar in Shoreditch called the Electric Showrooms, with the name in lightbulbs, however, this Bluu bar nearby provided a much nicer photo</p>
<p style="text-align: center;"><a href="http://www.flickr.com/photos/wildfalcon/2836721848/" title="Electrifying Shoreditch with Eddison's invention since 1920 by Laurie Young, on Flickr" target="_blank" onclick="javascript:pageTracker._trackPageview ('/outbound/www.flickr.com');"><img class="aligncenter" src="http://farm4.static.flickr.com/3007/2836721848_9e55a9887f_m.jpg" alt="Electrifying Shoreditch with Eddison's invention since 1920" width="240" height="160" /></a></p>
<p><strong>Olympic Torch</strong><br />
Ok, maybe we were not as creative on this one as we could have been.</p>
<p style="text-align: center;"><a href="http://www.flickr.com/photos/wildfalcon/2836722446/" title="Olympic Torch by Laurie Young, on Flickr" target="_blank" onclick="javascript:pageTracker._trackPageview ('/outbound/www.flickr.com');"><img class="aligncenter" src="http://farm4.static.flickr.com/3118/2836722446_8f88811a8a_m.jpg" alt="Olympic Torch" width="160" height="240" /></a></p>
<p><strong>Underground Overground near the Great Eastern Corner</strong><br />
We actually got this one wrong. Its meant to be a overground and underground train lifted up onto the top of a building nearby - but quite frankly that was dull, and this is really quite a cool architecture shot</p>
<p style="text-align: center;"><a href="http://www.flickr.com/photos/wildfalcon/2836723148/" title="Underground Overground near the Great Eastern Corner by Laurie Young, on Flickr" target="_blank" onclick="javascript:pageTracker._trackPageview ('/outbound/www.flickr.com');"><img class="aligncenter" src="http://farm4.static.flickr.com/3111/2836723148_c63dc680bb_m.jpg" alt="Underground Overground near the Great Eastern Corner" width="160" height="240" /></a></p>
<p><strong>Uncover an explosive plot on Hoxton Street</strong></p>
<p>On Friday, October 26th 1604  Lord Monteagle received the following letter at his house, on Hoxton Street:</p>
<blockquote><p><em>My lord out of the love i bear to some of youre frends i have a care of your preseruasion therefore i would advise you as you tender your life to devise some excuse to shift of your attendance at this parliament for god and man hath concurred to punish the wickedness of this time and think not slightly of this advertisement but retire youre self into youre control where you may expect the event in saftey for though there be no appearance of any stir yet i say they shall receive a terrible blow this parliament and yet they shall not see who hurts them this councel is not to be condemned because it may do you good and can do you no harm for the danger is passed as soon as you have burnt the letter and i hope god will give you the grace to make good use of it to whose holy protection i commend you.&#8221;</em></p></blockquote>
<p style="text-align: center;"><a href="http://www.flickr.com/photos/wildfalcon/2836723928/" title="Uncover an explosive plot on Hoxton Street by Laurie Young, on Flickr" target="_blank" onclick="javascript:pageTracker._trackPageview ('/outbound/www.flickr.com');"><img class="aligncenter" src="http://farm4.static.flickr.com/3284/2836723928_6d63619be5_m.jpg" alt="Uncover an explosive plot on Hoxton Street" width="240" height="160" /></a></p>
<p><strong>More Light More Power</strong></p>
<p>I really really liked this photo. I like the idea and the execution, but I don&#8217;t think anyone at who saw it on the slide show at the end of the day got it</p>
<p style="text-align: center;"><a href="http://www.flickr.com/photos/wildfalcon/2835889453/" title="More Light More Power by Laurie Young, on Flickr" target="_blank" onclick="javascript:pageTracker._trackPageview ('/outbound/www.flickr.com');"><img class="aligncenter" src="http://farm4.static.flickr.com/3169/2835889453_d6fc9b85c8_m.jpg" alt="More Light More Power" width="240" height="160" /></a></p>
<p><strong>Here comes a candle to light you to bed</strong></p>
<p>This refers to the lyrics of a populer nursery rhyme:</p>
<blockquote><dl>
<dd>&#8220;<em>Oranges and lemons&#8221;, say the bells of St. Clement&#8217;s</em></dd>
<dd>&#8220;<em>You owe me three farthings&#8221;, say the bells of St. Martin&#8217;s</em></dd>
<dd>&#8220;<em>When will you pay me?&#8221; say the bells of Old Bailey</em></dd>
<dd>&#8220;<em>When I grow rich&#8221;, say the bells of Shoreditch</em></dd>
<dd>&#8220;<em>When will that be?&#8221; say the bells of Stepney</em></dd>
<dd>&#8220;<em>I do not know&#8221;, says the great bell of Bow</em></dd>
<dd><em>Here comes a candle to light you to bed</em></dd>
<dd><em>And here comes a chopper to chop off your head!</em></dd>
<dd><em>Chip chop chip chop - The last man&#8217;s dead.</em></dd>
</dl>
</blockquote>
<p>The bells of Shoreditch are in the St Leonards Church, the photo was taken on the front steps.</p>
<p style="text-align: center;"><a href="http://www.flickr.com/photos/wildfalcon/2835890065/" title="Here comes a candle to light you to bed by Laurie Young, on Flickr" target="_blank" onclick="javascript:pageTracker._trackPageview ('/outbound/www.flickr.com');"><img class="aligncenter" src="http://farm4.static.flickr.com/3148/2835890065_8180859ac4_m.jpg" alt="Here comes a candle to light you to bed" width="240" height="160" /></a></p>
<p><strong>Beam me up</strong><br />
We got creative on this one</p>
<p style="text-align: center;"><a href="http://www.flickr.com/photos/wildfalcon/2835890861/" title="Beam me up by Laurie Young, on Flickr" target="_blank" onclick="javascript:pageTracker._trackPageview ('/outbound/www.flickr.com');"><img class="aligncenter" src="http://farm4.static.flickr.com/3131/2835890861_2934a8bc5c_m.jpg" alt="Beam me up" width="160" height="240" /></a></p>
<p><strong>Barbarella&#8217;s bubbling force sheds new light on Kingsland Road</strong></p>
<p>We one a prize for this one - the best answer to the clue</p>
<p>This was taken outside of Barbarellas Shoe, Belt and Bag shop. However apparently this clue was meant to point to the <a href="http://www.mathmos.com/" title="Mathmos" target="_blank" onclick="javascript:pageTracker._trackPageview ('/outbound/www.mathmos.com');">Mathmos light shop</a> (!?!)</p>
<p style="text-align: center;"><a href="http://www.flickr.com/photos/wildfalcon/2835891593/" title="Barbarella's bubbling force sheds new light on Kingsland Road by Laurie Young, on Flickr" target="_blank" onclick="javascript:pageTracker._trackPageview ('/outbound/www.flickr.com');"><img class="aligncenter" src="http://farm4.static.flickr.com/3108/2835891593_f1900fbc40_m.jpg" alt="Barbarella's bubbling force sheds new light on Kingsland Road" width="240" height="160" /></a></p>
<p style="text-align: left;">It was a really great day, and we took some awesome photos. As long as you don&#8217;t mind them making some money off of your photos (if they are good enough) then well worth a day, just try to bring your umbrealla!</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Bookmark to:</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://wildfalcon.com/archives/2008/09/07/shoot-shoreditch/&amp;title=Shoot+Shoreditch" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://wildfalcon.com/archives/2008/09/07/shoot-shoreditch/&amp;title=Shoot+Shoreditch" title="Add to&nbsp;digg"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http://wildfalcon.com/archives/2008/09/07/shoot-shoreditch/" title="Add to&nbsp;Facebook"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://wildfalcon.com/archives/2008/09/07/shoot-shoreditch/&amp;title=Shoot+Shoreditch" title="Add to&nbsp;reddit"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://wildfalcon.com/archives/2008/09/07/shoot-shoreditch/&amp;title=Shoot+Shoreditch" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://wildfalcon.com/archives/2008/09/07/shoot-shoreditch/" title="Add to&nbsp;Technorati"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
<img src="http://feeds.feedburner.com/~r/LauriesBlog/~4/385937152" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://wildfalcon.com/archives/2008/09/07/shoot-shoreditch/feed/</wfw:commentRss>
		<feedburner:origLink>http://wildfalcon.com/archives/2008/09/07/shoot-shoreditch/</feedburner:origLink></item>
		<item>
		<title>Silly Algorithms Over Lunch</title>
		<link>http://feeds.feedburner.com/~r/LauriesBlog/~3/384261521/</link>
		<comments>http://wildfalcon.com/archives/2008/09/05/silly-algorithms-over-lunch/#comments</comments>
		<pubDate>Fri, 05 Sep 2008 15:30:14 +0000</pubDate>
		<dc:creator>Laurie</dc:creator>
		
		<category><![CDATA[Computing]]></category>

		<guid isPermaLink="false">http://wildfalcon.com/archives/2008/09/05/silly-algorithms-over-lunch/</guid>
		<description><![CDATA[One of the things I absolutely knew I wanted when I was looking for a job, was to recapture the glory days of my student years, when we used to take a coffee break every morning, and come up with totally cool and utterly insane ideas. Such as proving that it was worth doing nothing [...]]]></description>
			<content:encoded><![CDATA[<p>One of the things I absolutely knew I wanted when I was looking for a job, was to recapture the glory days of my student years, when we used to take a coffee break every morning, and come up with totally cool and utterly insane ideas. Such as proving that it was worth doing nothing for the first 18 months of any 3 year research project (we were so busy doing nothing that we never wrote up this proof).</p>
<p>I once again got the chance yesterday to take 30 mins out of the otherwise stressful day to create a <a href="http://kamps.org/haje/glh-compression/" onclick="javascript:pageTracker._trackPageview ('/outbound/kamps.org');">new compression algorithm</a> which can reduce the content of Wikipedia (100Mb) down to 225 bytes, beating the previous record of 16Mb. The downside to this particular algorithm is that the decompression is a tad slow, taking longer than the current <a href="http://en.wikipedia.org/wiki/Age_of_the_universe" onclick="javascript:pageTracker._trackPageview ('/outbound/en.wikipedia.org');">age of the universe</a>.</p>
<p>Oh well - back to the day job</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Bookmark to:</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://wildfalcon.com/archives/2008/09/05/silly-algorithms-over-lunch/&amp;title=Silly+Algorithms+Over+Lunch" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://wildfalcon.com/archives/2008/09/05/silly-algorithms-over-lunch/&amp;title=Silly+Algorithms+Over+Lunch" title="Add to&nbsp;digg"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http://wildfalcon.com/archives/2008/09/05/silly-algorithms-over-lunch/" title="Add to&nbsp;Facebook"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://wildfalcon.com/archives/2008/09/05/silly-algorithms-over-lunch/&amp;title=Silly+Algorithms+Over+Lunch" title="Add to&nbsp;reddit"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://wildfalcon.com/archives/2008/09/05/silly-algorithms-over-lunch/&amp;title=Silly+Algorithms+Over+Lunch" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://wildfalcon.com/archives/2008/09/05/silly-algorithms-over-lunch/" title="Add to&nbsp;Technorati"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
<img src="http://feeds.feedburner.com/~r/LauriesBlog/~4/384261521" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://wildfalcon.com/archives/2008/09/05/silly-algorithms-over-lunch/feed/</wfw:commentRss>
		<feedburner:origLink>http://wildfalcon.com/archives/2008/09/05/silly-algorithms-over-lunch/</feedburner:origLink></item>
		<item>
		<title>Designing a Homeopathic Website Strategy</title>
		<link>http://feeds.feedburner.com/~r/LauriesBlog/~3/383550691/</link>
		<comments>http://wildfalcon.com/archives/2008/09/04/designing-a-homeopathic-website-strategy/#comments</comments>
		<pubDate>Thu, 04 Sep 2008 20:20:35 +0000</pubDate>
		<dc:creator>Laurie</dc:creator>
		
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://wildfalcon.com/?p=164</guid>
		<description><![CDATA[Announcing two new websites, CrystalFlower and Avilian
Its a few years now since I set my mother up with her first blog site. As a practicing homeopath I felt she needed to have an on-line web presence - more and more people rely on on-line search, so it seems an absolute necessity. Since then her use [...]]]></description>
			<content:encoded><![CDATA[<p>Announcing two new websites, <a href="http://crystalflower.co.uk" onclick="javascript:pageTracker._trackPageview ('/outbound/crystalflower.co.uk');">CrystalFlower</a> and <a href="http://avilian.co.uk" onclick="javascript:pageTracker._trackPageview ('/outbound/avilian.co.uk');">Avilian</a></p>
<p>Its a few years now since I set my mother up with her first blog site. As a practicing homeopath I felt she needed to have an on-line web presence - more and more people rely on on-line search, so it seems an absolute necessity. Since then her use of her site has increased and diversified way beyond the original intent of the site.</p>
<p>This caused a problem. There were several totally different types of content on her site - the first was a professional facing site; information about her practice as a homeopath and so on. Secondly there was a whole variety of content, posts and essays on a diverse range of topics; scientific research on homeopathy, case studies, history essays, and many more. Finally in the last year she started to write a LOT of biographies on people connected to homeopathy. In addition to this the site was hosted on a sub-domain of this site, which was causing Google to get confused as to what was going on.</p>
<p>This lead to a very confusing site, difficult to navigate, with the sheer volume of biographies making it even harder to find any of the other content. So a total redesign we necessary. We moved the professional practicing homeopath content to <a href="http://crystalflower.co.uk" onclick="javascript:pageTracker._trackPageview ('/outbound/crystalflower.co.uk');">CrystalFlower</a>. This site is intended for people looking for a homeopath to consult. Most of the rest of the content, which broadly speaking it categorised as anything she is interested in writing on, has moved to a new personal blog <a href="http://avilian.co.uk" onclick="javascript:pageTracker._trackPageview ('/outbound/avilian.co.uk');">Avilian</a>. The homeopathy biographies are remaining on <a href="http://homeopathy.wildfalcon.com">Homeopathy.Wildfalcon</a> for now, till we find something better to do with it.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Bookmark to:</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://wildfalcon.com/archives/2008/09/04/designing-a-homeopathic-website-strategy/&amp;title=Designing+a+Homeopathic+Website+Strategy" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://wildfalcon.com/archives/2008/09/04/designing-a-homeopathic-website-strategy/&amp;title=Designing+a+Homeopathic+Website+Strategy" title="Add to&nbsp;digg"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http://wildfalcon.com/archives/2008/09/04/designing-a-homeopathic-website-strategy/" title="Add to&nbsp;Facebook"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://wildfalcon.com/archives/2008/09/04/designing-a-homeopathic-website-strategy/&amp;title=Designing+a+Homeopathic+Website+Strategy" title="Add to&nbsp;reddit"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://wildfalcon.com/archives/2008/09/04/designing-a-homeopathic-website-strategy/&amp;title=Designing+a+Homeopathic+Website+Strategy" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://wildfalcon.com/archives/2008/09/04/designing-a-homeopathic-website-strategy/" title="Add to&nbsp;Technorati"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
<img src="http://feeds.feedburner.com/~r/LauriesBlog/~4/383550691" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://wildfalcon.com/archives/2008/09/04/designing-a-homeopathic-website-strategy/feed/</wfw:commentRss>
		<feedburner:origLink>http://wildfalcon.com/archives/2008/09/04/designing-a-homeopathic-website-strategy/</feedburner:origLink></item>
		<item>
		<title>5 Tips for completing your PhD</title>
		<link>http://feeds.feedburner.com/~r/LauriesBlog/~3/381789663/</link>
		<comments>http://wildfalcon.com/archives/2008/09/03/5-tips-for-completing-your-phd/#comments</comments>
		<pubDate>Tue, 02 Sep 2008 23:08:42 +0000</pubDate>
		<dc:creator>Laurie</dc:creator>
		
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://wildfalcon.com/archives/2008/09/03/finishing-off-a-phd/</guid>
		<description><![CDATA[I seem to know a whole host of people, and veritable league in fact, of people who are finishing their PhD as I type this. This causes me no end of joy, daily  tormenting them, asking how many words they wrote today (so far numbers like 200 look pretty good). However I remember when [...]]]></description>
			<content:encoded><![CDATA[<p>I seem to know a whole host of people, and veritable league in fact, of people who are finishing their PhD as I type this. This causes me no end of joy, daily  tormenting them, asking how many words they wrote today (so far numbers like 200 look pretty good). However I remember when I was in the same position, and what helped me. So here are my top tips for finishing your PhD.</p>
<p><strong>Spend some time each morning just writing</strong><br />
Unless you already have all the words you need, each morning, set aside 30 minutes to just write down text. Don&#8217;t worry if its good text, and certainty do NOT allow yourself to stop and thing &#8220;this is crap&#8221; just generate text. You can tidy it up later, but doing this will soon get your word count up to where it should be. Whatever you do, do not stop and ask yourself why your word count isn&#8217;t already where it should be - that way leads to madness.</p>
<p><strong>Don&#8217;t worry about corrections</strong><br />
Its very rare to get no corrections, if your thesis is one of the few that gets no corrections at all, if your spending your time going though making the whole thing really shine, then your well into the territory of diminishing returns. This is not an excuse to do a bad job, or a sloppy thesis. But don&#8217;t forget that often examiners will see things from a different perspective, and want a different view, or an edge case you missed to be considered in addition to what you have already done. I know your thinking you can never survive another few months making corrections, but you can, and in a year&#8217;s time when you look back, and realise how much better your thesis is because of it - you will be glad the examiner asked for the corrections</p>
<p><strong>Set yourself a deadline if one isn&#8217;t imposed on you</strong><br />
This will force you to make the hard decisions about what to write up, and what to leave out. You will (I hope) have done a lot of work by now, and you want to put it all in, but does it all add to the central message of your thesis? If something is adjunct to your main message, leave it out. I left out an entire journal paper from my thesis (after the examiners pointed out to be that it was irrelevant).</p>
<p><strong>Leave time for binding it</strong><br />
Even though you often get to submit at least one electronic copy now - for the time being you still have to submit a bound copy. Every college has its own, often strange, and always pedantic rules about how to bind it. What size the lettering can be, what colour the 7th page must be. Submitting your thesis is a stressful time, and faffing about with stupid binding regulations is something you are going to want to take a little bit of time over - just to convince yourself you got it right</p>
<p>And finally<br />
<strong>Submit the thesis when its ready - not when you are ready</strong><br />
Your thesis will be good enough to pass before you are psychologically convinced of this. This is pretty much guaranteed. You have spent such a long part of your life working on this, and you just have to get it right. If your normal (probably not if your doing a PhD) then you&#8217;re scared its going to fail, and you want to keep polishing it and making it better. Listen to your supervisor - its what they are there for (even if its all they are there for). They look bad if they tell you to submit before its ready - so once they say submit - submit it already!</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Bookmark to:</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://wildfalcon.com/archives/2008/09/03/5-tips-for-completing-your-phd/&amp;title=5+Tips+for+completing+your+PhD" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://wildfalcon.com/archives/2008/09/03/5-tips-for-completing-your-phd/&amp;title=5+Tips+for+completing+your+PhD" title="Add to&nbsp;digg"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http://wildfalcon.com/archives/2008/09/03/5-tips-for-completing-your-phd/" title="Add to&nbsp;Facebook"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://wildfalcon.com/archives/2008/09/03/5-tips-for-completing-your-phd/&amp;title=5+Tips+for+completing+your+PhD" title="Add to&nbsp;reddit"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://wildfalcon.com/archives/2008/09/03/5-tips-for-completing-your-phd/&amp;title=5+Tips+for+completing+your+PhD" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://wildfalcon.com/archives/2008/09/03/5-tips-for-completing-your-phd/" title="Add to&nbsp;Technorati"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
<img src="http://feeds.feedburner.com/~r/LauriesBlog/~4/381789663" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://wildfalcon.com/archives/2008/09/03/5-tips-for-completing-your-phd/feed/</wfw:commentRss>
		<feedburner:origLink>http://wildfalcon.com/archives/2008/09/03/5-tips-for-completing-your-phd/</feedburner:origLink></item>
		<item>
		<title>A Classic Web 2.0 Architecture Puzzle</title>
		<link>http://feeds.feedburner.com/~r/LauriesBlog/~3/378203448/</link>
		<comments>http://wildfalcon.com/archives/2008/08/29/a-classic-web-20-architecture-puzzle/#comments</comments>
		<pubDate>Fri, 29 Aug 2008 16:15:54 +0000</pubDate>
		<dc:creator>Laurie</dc:creator>
		
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://wildfalcon.com/archives/2008/08/29/a-classic-web-20-architecture-puzzle/</guid>
		<description><![CDATA[Time for an open puzzle, answers on a postcard, or preferably in the comments box below
Imagine you are implementing a typical web 2.0 application. It has cool things, like video clips, and maps. Lets keep it simple for now, and say it only has status messages and video clips. The two are unrelated, sharing almost [...]]]></description>
			<content:encoded><![CDATA[<p>Time for an open puzzle, answers on a postcard, or preferably in the comments box below</p>
<p>Imagine you are implementing a typical web 2.0 application. It has cool things, like video clips, and maps. Lets keep it simple for now, and say it only has status messages and video clips. The two are unrelated, sharing almost no common features (you can&#8217;t play a map, or add a way-point to a video). There is just one common feature that you have to have to concern yourself with, tags. </p>
<p>Both video clips and maps can be tagged, when you see a video clip tagged with &#8220;dog&#8221; you should be able to click on &#8220;dog&#8221; to see all the video clips tagged with &#8220;dog&#8221; as well as all the maps tagged with &#8220;dog&#8221;</p>
<p>The question is how would you store this in the database. Specifically I&#8217;m looking for a database schema, what tables would you use, and what columns?  The question is intentionally stripped to its bare minimum, the extension would be to allow lots of other things to be tagged, and to allow tag based queries (such as retrieving all tags related to a given tag) to be executed as fast as possible.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Bookmark to:</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://wildfalcon.com/archives/2008/08/29/a-classic-web-20-architecture-puzzle/&amp;title=A+Classic+Web+2.0+Architecture+Puzzle" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://wildfalcon.com/archives/2008/08/29/a-classic-web-20-architecture-puzzle/&amp;title=A+Classic+Web+2.0+Architecture+Puzzle" title="Add to&nbsp;digg"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http://wildfalcon.com/archives/2008/08/29/a-classic-web-20-architecture-puzzle/" title="Add to&nbsp;Facebook"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://wildfalcon.com/archives/2008/08/29/a-classic-web-20-architecture-puzzle/&amp;title=A+Classic+Web+2.0+Architecture+Puzzle" title="Add to&nbsp;reddit"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://wildfalcon.com/archives/2008/08/29/a-classic-web-20-architecture-puzzle/&amp;title=A+Classic+Web+2.0+Architecture+Puzzle" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://wildfalcon.com/archives/2008/08/29/a-classic-web-20-architecture-puzzle/" title="Add to&nbsp;Technorati"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
<img src="http://feeds.feedburner.com/~r/LauriesBlog/~4/378203448" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://wildfalcon.com/archives/2008/08/29/a-classic-web-20-architecture-puzzle/feed/</wfw:commentRss>
		<feedburner:origLink>http://wildfalcon.com/archives/2008/08/29/a-classic-web-20-architecture-puzzle/</feedburner:origLink></item>
		<item>
		<title>Design Patterns in Ruby - A Book Review</title>
		<link>http://feeds.feedburner.com/~r/LauriesBlog/~3/298948135/</link>
		<comments>http://wildfalcon.com/archives/2008/05/27/design-patterns-in-ruby-a-book-review/#comments</comments>
		<pubDate>Tue, 27 May 2008 08:30:34 +0000</pubDate>
		<dc:creator>Laurie</dc:creator>
		
		<category><![CDATA[General]]></category>

		<category><![CDATA[book review]]></category>

		<category><![CDATA[patterns]]></category>

		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://wildfalcon.com/?p=145</guid>
		<description><![CDATA[In short: This book is good, go buy it.
In &#8220;Design Patterns in Ruby&#8221; Russ Olsen sets out to cover two distinct goals. First he introduces the idea of design patterns, and secondly he explores how the dynamic nature of Ruby allows patterns to be used with less effort than languages such as Java and C#.
The [...]]]></description>
			<content:encoded><![CDATA[<p>In short: This book is good, go buy it.</p>
<p>In &#8220;Design Patterns in Ruby&#8221; Russ Olsen sets out to cover two distinct goals. First he introduces the idea of design patterns, and secondly he explores how the dynamic nature of Ruby allows patterns to be used with less effort than languages such as Java and C#.</p>
<p>The overview of design patterns is pretty comprehensive, though not a substitute for the GoF book, which is referenced regularly thoughout. Russ does a good job of covering the reasons why patterns are good, and the generaly coding philosophy that lead to them. It&#8217;s here that we get a first glimps of one of my favourite things about this book. Not only does Russ clearly present the original GoF ideas and concepts (with due credit given to them) but he add his own ideas, which I think are just as valid.</p>
<p>This is followed by a list of 16 patterns. 13 are from the GoF book, and 3 are new for Ruby. For each pattern he follows the same structure. First a bit of context to explain the general concept, then an reasonably in depth discussion of how to implement the pattern, with code examples. Its in this section that we really get to look at what Ruby adds. Next comes a look at how to use, and not to use the pattern, before finally looking at some examples of where the pattern is used in real world Ruby projects.</p>
<p>The descriptions of the patterns are accurate, and comprehensive, and certainly cover the information you would find in the GoF book, although not all patterns are covered, and the structure he follows is not quite strict enough for this to be a good quick reference book. It&#8217;s in the discussions of how Ruby (and dynamic programming in general) adapt the use of the patterns that this book really shines. Always the &#8220;tradational&#8221; use of the patterns is presented first, and then we get to see how we can adapt this. In some cases the language itself almost renders the pattern unnecessary, the command pattern springs to mind here, which can almost completly be replaced with Procs, lambdas or code blocks. I was very impressed at how Russ clearly explains the advantage of the tradational format too though.</p>
<p>The final 3 patterns (DSLs, Meta-Programming, and Convention over Configuration) were a very interesting addition. I don&#8217;t feel its really fair to call them patterns though. They more cover general techniques and are too general to accuratly be called patterns in my opinion. That&#8217;s not to say they are not useful, and an strong addition to anyone&#8217;s skill set.</p>
<p>The other aspect that shines though this book, is as an essay in teaching programmers used to static languages (Java etc) that Ruby is a fully fledged language, and capable of serious application work. Having been through this process I have finally decided I agree with this thesis, and in fact it was this book that finally helped me make up my mind. Pattern usage (and miss-usage) has long formed the basis of &#8220;enterprise&#8221; application development, and there is an underlying theme showing that Ruby not only supports patterns, but can make developing enterprise applications (with or without patterns) easier. However this is a double edged sword (isn&#8217;t everything) and I would have liked to have seen a bit more attention paid to how Ruby can make things harder, especially if it included some advice on how to mitigate the problems.</p>
<p>I also feel the need to point out that there are a too many errors in the book for my liking. Not big errors, but the occasional two line code example that contains the wrong code. If you have a general idea of what the section is about, it&#8217;s easy enough to see whats going on, but if your learning patterns and/or ruby for the first time from this book, it could cause a problem. Having said that I do have an early printing of the first version, and I am sure these issues will be picked up very fast.</p>
<p>Overall I was very impressed by this book, it covered a lot of things I already knew, fixed a few misconceptions I had, and taught me a few new things too.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Bookmark to:</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://wildfalcon.com/archives/2008/05/27/design-patterns-in-ruby-a-book-review/&amp;title=Design+Patterns+in+Ruby+-+A+Book+Review" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://wildfalcon.com/archives/2008/05/27/design-patterns-in-ruby-a-book-review/&amp;title=Design+Patterns+in+Ruby+-+A+Book+Review" title="Add to&nbsp;digg"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http://wildfalcon.com/archives/2008/05/27/design-patterns-in-ruby-a-book-review/" title="Add to&nbsp;Facebook"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://wildfalcon.com/archives/2008/05/27/design-patterns-in-ruby-a-book-review/&amp;title=Design+Patterns+in+Ruby+-+A+Book+Review" title="Add to&nbsp;reddit"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://wildfalcon.com/archives/2008/05/27/design-patterns-in-ruby-a-book-review/&amp;title=Design+Patterns+in+Ruby+-+A+Book+Review" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://wildfalcon.com/archives/2008/05/27/design-patterns-in-ruby-a-book-review/" title="Add to&nbsp;Technorati"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
<img src="http://feeds.feedburner.com/~r/LauriesBlog/~4/298948135" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://wildfalcon.com/archives/2008/05/27/design-patterns-in-ruby-a-book-review/feed/</wfw:commentRss>
		<feedburner:origLink>http://wildfalcon.com/archives/2008/05/27/design-patterns-in-ruby-a-book-review/</feedburner:origLink></item>
		<item>
		<title>Best Practice work-flow with git</title>
		<link>http://feeds.feedburner.com/~r/LauriesBlog/~3/283597152/</link>
		<comments>http://wildfalcon.com/archives/2008/05/05/best-practice-work-flow-with-git/#comments</comments>
		<pubDate>Mon, 05 May 2008 00:26:38 +0000</pubDate>
		<dc:creator>Laurie</dc:creator>
		
		<category><![CDATA[General]]></category>

		<category><![CDATA[git]]></category>

		<category><![CDATA[source control]]></category>

		<category><![CDATA[subversion]]></category>

		<category><![CDATA[team]]></category>

		<category><![CDATA[workflow]]></category>

		<guid isPermaLink="false">http://wildfalcon.com/archives/2008/05/05/best-practice-work-flow-with-git/</guid>
		<description><![CDATA[Introduction
A quick look about on the web will bring you up-to speed on pretty much all you need to know about git. There are some great introduction&#8217;s to what it is, detailed manuals, and best of all an explanation of how it works aimed at people who understand computer science (and if you can&#8217;t follow [...]]]></description>
			<content:encoded><![CDATA[<h1>Introduction</h1>
<p>A quick look about on the web will bring you up-to speed on pretty much all you need to know about git. There are some great introduction&#8217;s to what it is, detailed manuals, and best of all an explanation of how it works aimed at people who <a href="http://eagain.net/articles/git-for-computer-scientists/" title="git for computer scientists" onclick="javascript:pageTracker._trackPageview ('/outbound/eagain.net');">understand computer science</a> (and if you can&#8217;t follow that, you&#8217;re not going to earn much working as a programmer). However there is somethings missing from all these pages, and that&#8217;s some best practices on how you should actually use git. What work-flow should you use, and what best practices should you follow.</p>
<p>This is really important. The problems with subversion were not that some of its operation&#8217;s could be slow. Personally I never found myself staring at my screen, twiddling my thumbs, or going for a quick round of Mario Kart while waiting for subversion to finish something. The problem I always had with subversion was that my team and I were always treading on each others toes. We had a number of releases that were late because we were all committing code over each others&#8217; work, and introducing unnecessary complexity.</p>
<p>However, there is a solution, and we found it. To fully understand it though, you need a good understanding of the problems that need solving.</p>
<h1>The real problem with subversion</h1>
<p>When I first came across continuous integration, I thought it was an absolutely great idea. If, as it often suggested, integrating work from different developers is hard, with the difficulty increasing roughly quadratically with time since the last integration, it make a huge amount of sense to integrate as often as you can. But I learned the hard way that it&#8217;s not true. At least not at the small scale. When someone else in my team is working on code, they, like all developers often go though a phase of sketching out their solution in code. This is normally pretty bad code from a production point of view. Their next step is to tidy this up, and make it into production quality code. It&#8217;s at this point that integration is good. Any fool can see trying to integrating my production code with a colleagues sketch code is bad. This is what happens with subversion though. Everything gets committed, otherwise you risk loosing your work if there is an issue (you won&#8217;t believe how often developer leave their laptops in bars). Branches are of course for exactly this reason, and I will talk about them later. For now lets just say I don&#8217;t know anyone using them successfully in subversion.</p>
<p>The problem with subversion then is that there is a tension, between trying to integrate your code with the rest of your team, and trying to get far enough down the route of maturing your code that you don&#8217;t create a bottle-neck. I experienced at least one case personally where one developer was doing a major chunk of refactoring, and it acted as a bottle-neck, preventing any bug fixes from other developers being committed and deployed. Subversion makes avoiding this too expensive.</p>
<p>The solution is branches, merging, and testing at each stage</p>
<p>Hopefully you knew that already, but does your team actually do it? This was always the answer I would give if asked how manage a code base, but no team I worked in ever managed it.</p>
<p>Why? Well quite simply, merging is hard. Subversion merges don&#8217;t work well with code that moves. If I move a chunk of code from one directory to another, subversion no longer tracks it well between branches. This is something I do a lot when refactoring code, and it breaks subversion.</p>
<p>On the other hand, because git expects merges, and moves, to be regular events it handles them very well. This is probably because under the hood it tracks the contents of your files rather your files, but at this level of understanding, all I care about is it works. I can create a branch, work on it, and merge, and apart from some annoying glitches between how editors handle whitespace, most things just work.</p>
<h1>Git work-flow</h1>
<p>This is the work-flow we chose (and if your skimming this article, this is the best bit to read)</p>
<p>First of all, we had a centrally hosted repository. I&#8217;m of the opinion that trying to run git with no repository being authoritative can work, but adds various complications, and pretty much no benefits. It might be cool, but that&#8217;s what the kids who give you cigarettes at school always said.</p>
<p>Then we had an authoritative branch on that repository. We all set our authoritative repository to be called &#8220;origin&#8221; and the branch was called master. Thus origin/master represented the state of the art production code. However, no-one, absolutely no-one was allowed to work on master. Most of the time everyone in the team (except the gatekeeper) did not even have master set up as a local branch.</p>
<p>Secondly, we had another branch on origin, called stable. Stable was always an ancestor of origin/master, but lagged behind a bit. Stable had various tags placed on it, which represented the actual public releases we made. More on this later.</p>
<p>Next each developer had as many branches as they wanted. Foremost though, each developer had a branch named after themselves. So I mostly worked in the &#8216;laurie&#8217; branch, which was also on origin as origin/laurie. Along with this, each developer had a copy of the deployment platform on their workstation, and on on a staging server, in my case this was called laurie-stage. Each developer then works there. They write their tests, modify their code etc, making lots of commits along the way (the local nature of git commits makes regular small commits a very easy habit to get into, and it&#8217;s a very good one when you need to debug something that went wrong a while ago). When I am happy with my work, and its tested and working locally, I merge master into it:</p>
<pre>git fetch &amp;&amp; git merge origin/master &amp;&amp; rake spec</pre>
<p>This command gets the latest version of master, and applies any new changes to my code base. Master is not changed. I run all my tests again, and then deploy to stage-laurie. I then pass this over to my quality assurance guys (which could be me in another hat, but we were lucky enough to have a secondary team of people who were in a position to do the testing instantly). They test the product, checking that the feature has been added correctly, or the bug fixed, and that no new bugs have been introduced (though your unit tests will catch that - right?). This is continuous integration happening right here.</p>
<p><a href="http://wildfalcon.com/archives/2008/05/05/best-practice-work-flow-with-git/git-work-flow/" title="Git work-flow" rel="attachment wp-att-149"><img src="http://wildfalcon.com/wp-content/uploads/2008/05/git.jpg" alt="Git work-flow" /></a></p>
<p>After I have gotten my code to a point where this all passes, I push the state of my local branch to origin/laurie, and I go and talk to the gatekeeper.</p>
<p>In our team the gatekeeper was a person, though if your brave you could automate him. The gatekeeper has a local master branch. After I have told him that the changes in laurie are good to go, he asks round the rest of the team. Are any other branches good to go, generally there will be about 2-3 branches ready to go at any one time. He then gets a summary of what the changes are, and orders them in order of business value. Then, starting with the most critical change, he merges it into master, and runs all the tests. He then does this for the next most critical fix and so on. If at any point one of the merge results in code that fails the tests, he can simply un-merge (moving the post it note mentioned in the Git for Computer scientist article, - you did read it I hope).</p>
<p>Other developers can help with this process on their workstations. After my changes (which are of course the most important) are successfully merged into master, everyone else can pull master again, and merge it back into their branch, - preempting any conflicts and fixing them.</p>
<p>Once the gatekeeper has merged in all the changes, or at least all the ones that don&#8217;t conflict and break tests, he deploys this to a master staging server. Once again the quality team takes a look, this time concentrating on making sure that no existing functionality has been blatted by any of the changes. Assuming that passes the gatekeeper then merges origin/master into origin/stable. Tags it with the latest release revision number, and deploys onto our production environment.</p>
<p>We found this flow worked really well. Conflicts and merge related issues did occur, but always when merging the master branch into a developers local branch, so at most one team member was held up by this.</p>
<p>We took the policy of releasing as often as possible, so we would often release a new production code-base 2-3 times a day, each time with fully tested code. Sure, there were a few mistakes, but even when we were making big change, and developing the work flow, no bug serious enough to need us to roll-back the production code got through the safety nets.</p>
<p>If you need to guarantee that there are no mistakes, then like any project, you need to increase the depth of your test phase. Ours was relatively fast, as most of the users were alpha/beta testers :)</p>
<h1>Summary</h1>
<p>Releasing production code that often was a great asset too. The management team could see that work was progressing. Even if it wasn&#8217;t going the speed they wanted (is such a thing possible) they were greatly comforted to know that the users would see several improvements per day. As a team we had the freedom to allow one or two developers to pick up a slightly longer scale project, such as refactoring an important sub-system while the rest of the team got on with pushing out live improvements, and of course the users got the experience of a system constantly being updated. As we were sensible with listening to the users before choosing the next piece of work, they also got the feeling that the application was very responsive to any change request they made.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Bookmark to:</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://wildfalcon.com/archives/2008/05/05/best-practice-work-flow-with-git/&amp;title=Best+Practice+work-flow+with+git" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://wildfalcon.com/archives/2008/05/05/best-practice-work-flow-with-git/&amp;title=Best+Practice+work-flow+with+git" title="Add to&nbsp;digg"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http://wildfalcon.com/archives/2008/05/05/best-practice-work-flow-with-git/" title="Add to&nbsp;Facebook"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://wildfalcon.com/archives/2008/05/05/best-practice-work-flow-with-git/&amp;title=Best+Practice+work-flow+with+git" title="Add to&nbsp;reddit"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://wildfalcon.com/archives/2008/05/05/best-practice-work-flow-with-git/&amp;title=Best+Practice+work-flow+with+git" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://wildfalcon.com/archives/2008/05/05/best-practice-work-flow-with-git/" title="Add to&nbsp;Technorati"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
<img src="http://feeds.feedburner.com/~r/LauriesBlog/~4/283597152" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://wildfalcon.com/archives/2008/05/05/best-practice-work-flow-with-git/feed/</wfw:commentRss>
		<feedburner:origLink>http://wildfalcon.com/archives/2008/05/05/best-practice-work-flow-with-git/</feedburner:origLink></item>
		<item>
		<title>Polymorphic Associations and Interfaces In Ruby/Rails</title>
		<link>http://feeds.feedburner.com/~r/LauriesBlog/~3/283559109/</link>
		<comments>http://wildfalcon.com/archives/2008/04/30/polymorphic-associations-and-interfaces-in-rubyrails/#comments</comments>
		<pubDate>Tue, 29 Apr 2008 23:07:40 +0000</pubDate>
		<dc:creator>Laurie</dc:creator>
		
		<category><![CDATA[General]]></category>

		<category><![CDATA[assocations]]></category>

		<category><![CDATA[polymorphism]]></category>

		<category><![CDATA[rails]]></category>

		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://wildfalcon.com/archives/2008/04/29/polymorphic-associations-and-interfaces-in-rubyrails/</guid>
		<description><![CDATA[I have been using a lot of polymorphic associations in rails recently. If you don&#8217;t know what they are, bear with me and I will explain in a moment. To really use a polymorphic association properly it&#8217;s vital to understand interfaces, which should be part of your daily bread and butter toolkit, but in a [...]]]></description>
			<content:encoded><![CDATA[<p>I have been using a lot of polymorphic associations in rails recently. If you don&#8217;t know what they are, bear with me and I will explain in a moment. To really use a polymorphic association properly it&#8217;s vital to understand interfaces, which should be part of your daily bread and butter toolkit, but in a dynamic language like Ruby they are a conceptual construct, rather than a language enforceable construct, like in Java or C#.</p>
<p>So before I go on about interfaces, let me give you a quick overview of polymorphic associations.</p>
<p>A polymorphic association lets you associate your model to another object, model, entity etc (pick your word, they all mean the same thing really) without knowing its type. Think about a user holding a number of subscriptions, one might be an RSS feed, another a stream of Twitter message (via some fancy new API), and a third a binary feed representing your CPU usage for the last 20 minutes.</p>
<p>If you want to use polymorphic associations with this, you could do it like this:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
</pre></td><td class="code"><pre class="ruby ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> User <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>
  has_many <span style="color:#ff3333; font-weight:bold;">:subscriptions</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> Subscription <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>
  belongs_to <span style="color:#ff3333; font-weight:bold;">:producer</span>, <span style="color:#ff3333; font-weight:bold;">:polymorphic</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">true</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> RSSFeed <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>
  has_many <span style="color:#ff3333; font-weight:bold;">:subscribers</span>, <span style="color:#ff3333; font-weight:bold;">:as</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:producer</span>, <span style="color:#ff3333; font-weight:bold;">:class_name</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;subscription&quot;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> TwitterFeed <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>
  has_many <span style="color:#ff3333; font-weight:bold;">:subscribers</span>, <span style="color:#ff3333; font-weight:bold;">:as</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:producer</span>, <span style="color:#ff3333; font-weight:bold;">:class_name</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;subscription&quot;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> CPUMonitor <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>
  has_many <span style="color:#ff3333; font-weight:bold;">:subscribers</span>, <span style="color:#ff3333; font-weight:bold;">:as</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:producer</span>, <span style="color:#ff3333; font-weight:bold;">:class_name</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;subscription&quot;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>At the database level, the subscriptions table will have two columns for the association: producer_type and producer_id. A composite foreign key. A row in the subscriptions table will show something like producer_type = &#8220;CPUMoniter&#8221; and producer_id = 3. When you call the producer method in subscription it will load the row in the CPUMoniters table with ID 3.</p>
<p>So the polymorphic bit means that the type of thing you’re going to get back when you ask a subscription for its producer is unknown. It might be an RSSFeed, it might be a TwitterFeed, or it might be a CPUMoniter, or possibly anything else you can think of.</p>
<p>More formally, according to Wikipedia (which knows all) polymorphism &#8220;is the ability of objects belonging to different types to respond to method calls of the same name, each one according to an appropriate type-specific behaviour.&#8221;.</p>
<p>Put in dynamic, Ruby terms, this means I don&#8217;t care what I sort of model I get when I ask a subscription for its producer, as long as it goes quack I can treat it like it&#8217;s a duck.</p>
<p>This is where interfaces come in. Interfaces specify what I want the returned object to behave like, it could be a duck, or it could be a spaceship or maybe, just maybe, it could be a producer. In fact if you read though the ActiveRecord docs on polymorphic associations, you will find that &#8220;interface&#8221; is exactly what they call the parameter passed in the :as key of the params hash, and the first parameter to a polymorphic belongs_to association, and even the xxx_type and xxx_id columns in the database. This threw me quite a bit when I first looked at polymorphic associations, you have to declare that the association uses the producer interface, but you don&#8217;t have a producers model, or a producers table, or a producers anything for that matter. To my mind, &#8220;producers&#8221; is the name of the interface that RSSFeed, TwitterFeed and CPUMonitor all have to implement. It could specify that all of them must have a &#8220;next_message&#8221; method, which will give me (surprise surprise) the next message they produce. If I don&#8217;t have something like this, then my code is going to get messy:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code"><pre class="ruby ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> Subscription <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>
  belongs_to <span style="color:#ff3333; font-weight:bold;">:producer</span>, <span style="color:#ff3333; font-weight:bold;">:polymorphic</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">true</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> print_next_message
    <span style="color:#9966CC; font-weight:bold;">if</span> producer.<span style="color:#9900CC;">is_a</span>?<span style="color:#006600; font-weight:bold;">&#40;</span>RSSFeed<span style="color:#006600; font-weight:bold;">&#41;</span>
      <span style="color:#CC0066; font-weight:bold;">puts</span> producer.<span style="color:#9900CC;">rss_message</span>
    <span style="color:#9966CC; font-weight:bold;">elsif</span> producer.<span style="color:#9900CC;">is_a</span>?<span style="color:#006600; font-weight:bold;">&#40;</span>TwitterFeed<span style="color:#006600; font-weight:bold;">&#41;</span>
      <span style="color:#CC0066; font-weight:bold;">puts</span> producer.<span style="color:#9900CC;">twitter_messsage</span>
    <span style="color:#9966CC; font-weight:bold;">else</span>
      <span style="color:#CC0066; font-weight:bold;">puts</span> producer.<span style="color:#9900CC;">cpu_message</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>Which is just really butt ugly. Its slow to grok to figure out what’s going on, and I don&#8217;t even want to think about maintaining that code when I add a CriticalNuclearReactor class that people can subscribe to. If on the other hand, I say that every thing which implements the producer interface must define a next_message method I can push the ugliness into the classes that implement the interfaces.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
</pre></td><td class="code"><pre class="ruby ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> Subscription <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>
  belongs_to <span style="color:#ff3333; font-weight:bold;">:producer</span>, <span style="color:#ff3333; font-weight:bold;">:polymorphic</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">true</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> print_next_message
    <span style="color:#CC0066; font-weight:bold;">puts</span> producer.<span style="color:#9900CC;">next_message</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> RSSFeed <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>
  has_many <span style="color:#ff3333; font-weight:bold;">:subscribers</span>, <span style="color:#ff3333; font-weight:bold;">:as</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:producer</span>, <span style="color:#ff3333; font-weight:bold;">:class_name</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;subscription&quot;</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> next_message
    rss_message
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> TwitterFeed <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>
  has_many <span style="color:#ff3333; font-weight:bold;">:subscribers</span>, <span style="color:#ff3333; font-weight:bold;">:as</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:producer</span>, <span style="color:#ff3333; font-weight:bold;">:class_name</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;subscription&quot;</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> next_message
    twitter_message
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> CPUMonitor <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>
  has_many <span style="color:#ff3333; font-weight:bold;">:subscribers</span>, <span style="color:#ff3333; font-weight:bold;">:as</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:producer</span>, <span style="color:#ff3333; font-weight:bold;">:class_name</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;subscription&quot;</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> next_message
    cpu_message
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> CriticalNuclearReactor <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>
  has_many <span style="color:#ff3333; font-weight:bold;">:subscribers</span>, <span style="color:#ff3333; font-weight:bold;">:as</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:producer</span>, <span style="color:#ff3333; font-weight:bold;">:class_name</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;subscription&quot;</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> next_message
    get_the_bloody_hell_out_of_here_message
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>Just look at how much easier the print_next_message method in subscription is to read. This is good. Also notice how the only time I need to care what the technique for getting a message from a nuclear reactor is when I&#8217;m inside the nuclear reactor class, which means I&#8217;m already thinking about nuclear stuff. I no longer need to hold that in my stack when I’m working on how subscriptions work. Finally, my subscription model does not need to be changed when I add another producer type. This is important. Very important! As soon as anyone with even a mild case of featuritus gets near your code they are going to want to add stuff, and more often that not, that will mean adding new classes. If adding new classes means adding new branches to all your conditional logic, your stuffed. In that case write me a big cheque and I might come and fix your design for you.</p>
<p>So this is how interfaces work. In a static language (Java, C#) you can get the language to enforce this:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="java java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> Producer <span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">public</span> message next_message<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>and your subscription class can (is required to) state its the type it expects for producer</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="java java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Subscription<span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">public</span> Producer _producer;
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>and your compiler checks all this for you. If you get it wrong you get nice early TypeMismatchError.  Now I&#8217;ve finally decided I prefer dynamic languages to static, so I&#8217;m not going to claim Ruby is crap for not allowing this. But it is a big stinking black hole you can fall into if your not expecting it.</p>
<p>In fact it’s not really a problem at all. All you have to do is write down, somewhere obvious, somewhere  where anyone in your team is going to find it, what methods you expect producer to implement. If you can find a way to check what types could have been assigned to the producers association (analysing the code is too hard, but you could get a good idea by peeking into the database) you can even get your unit tests to check that all the classes that are going to be returned from producer respond to the next_method message. You could even write a module that you import into your producer classes that provides either a decent default implementation or raises &#8220;Interface Not Implemented Properly, shoot the coder&#8221; exceptions.</p>
<p>So that’s interfaces. Hopefully you know have a good idea of why they are very important when using polymorphic associations, even though you can&#8217;t code them (in Ruby), you should be thinking about them. Really.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Bookmark to:</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://wildfalcon.com/archives/2008/04/30/polymorphic-associations-and-interfaces-in-rubyrails/&amp;title=Polymorphic+Associations+and+Interfaces+In+Ruby%2FRails" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://wildfalcon.com/archives/2008/04/30/polymorphic-associations-and-interfaces-in-rubyrails/&amp;title=Polymorphic+Associations+and+Interfaces+In+Ruby%2FRails" title="Add to&nbsp;digg"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http://wildfalcon.com/archives/2008/04/30/polymorphic-associations-and-interfaces-in-rubyrails/" title="Add to&nbsp;Facebook"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://wildfalcon.com/archives/2008/04/30/polymorphic-associations-and-interfaces-in-rubyrails/&amp;title=Polymorphic+Associations+and+Interfaces+In+Ruby%2FRails" title="Add to&nbsp;reddit"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://wildfalcon.com/archives/2008/04/30/polymorphic-associations-and-interfaces-in-rubyrails/&amp;title=Polymorphic+Associations+and+Interfaces+In+Ruby%2FRails" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://wildfalcon.com/archives/2008/04/30/polymorphic-associations-and-interfaces-in-rubyrails/" title="Add to&nbsp;Technorati"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
<img src="http://feeds.feedburner.com/~r/LauriesBlog/~4/283559109" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://wildfalcon.com/archives/2008/04/30/polymorphic-associations-and-interfaces-in-rubyrails/feed/</wfw:commentRss>
		<feedburner:origLink>http://wildfalcon.com/archives/2008/04/30/polymorphic-associations-and-interfaces-in-rubyrails/</feedburner:origLink></item>
		<item>
		<title>Personal content, for just your friends.</title>
		<link>http://feeds.feedburner.com/~r/LauriesBlog/~3/202704901/</link>
		<comments>http://wildfalcon.com/archives/2007/12/12/personal-content-for-just-your-friends/#comments</comments>
		<pubDate>Wed, 12 Dec 2007 21:54:28 +0000</pubDate>
		<dc:creator>Laurie</dc:creator>
		
		<category><![CDATA[General]]></category>

		<category><![CDATA[Community]]></category>

		<category><![CDATA[Computing]]></category>

		<category><![CDATA[Hapiness]]></category>

		<category><![CDATA[movies]]></category>

		<category><![CDATA[privacy]]></category>

		<category><![CDATA[YouTube]]></category>

		<guid isPermaLink="false">http://wildfalcon.com/archives/2007/12/12/personal-content-for-just-your-friends/</guid>
		<description><![CDATA[Have you ever wanted to share something personal with just a few, or even just one close friend. Its really not easy. I&#8217;m not talking about an idea, something you can just ring up and tell them. I&#8217;m thinking of videos (though the idea extends to photos, or music, or any thing like that). Because [...]]]></description>
			<content:encoded><![CDATA[<p>Have you ever wanted to share something personal with just a few, or even just one close friend. Its really not easy. I&#8217;m not talking about an idea, something you can just ring up and tell them. I&#8217;m thinking of videos (though the idea extends to photos, or music, or any thing like that). Because its not easy, I think a lot of you end up not doing it, and thats a shame.</p>
<p>I spent today working on this problem. My dance partner and I had someone record us at a competition at the weekend. I want to share the videos with her, but not with the whole world. After all, what if someone in Australia sees it and doesn&#8217;t like our dancing! I didn&#8217;t want to burn a copy of the CD and give it to her. Mainly because I just had a foot operation, and so can&#8217;t get out of bed. That aside though, some sort of internet sharing is just so much more elegant, and being a computer geek, i want elegance when doing this sort of thing.</p>
<p>So video sharing, of course, means YouTube. Does YouTube allow me to share a video with just one person? It turns out it does, but falls very short on my elegance desires. I won&#8217;t bore you with all the details, but by the time I had set the video up to not be publicly viewable, and informed YouTube who, other than myself, should be able to view the video, I had formed a somewhat less than favorable view of the administration interface that YouTube provides.</p>
<p>I think this is really quite a big deal. The easier something is to do, the more I am willing to do it. Facebook makes tagging people in a photo really easy, so I tag photos in Facebook. My photo-library software though, just isn&#8217;t as good, its not bad, its just not *as* good, so I don&#8217;t tag photos in it. If I could easily send a video message to a group of people, and be sure only they get it, then I probably would.</p>
<p>The thing thats really important to me here is the idea of how confident I feel doing this. The more I trust the people I am sending my content to, and the more I trust the security of the system, the more open I will be, and the better the quality of the communication will be. I find I do trust YouTube (for now), but the lack of simplicity in their interface leads me to believe they either do not want, or do not care about user to user communication. I did use them today for my videos, but it did not leave me with the warm fuzzy feeling that they care about me. Nor did it leave me wanting to try sending videos to other friends.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Bookmark to:</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://wildfalcon.com/archives/2007/12/12/personal-content-for-just-your-friends/&amp;title=Personal+content%2C+for+just+your+friends." title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://wildfalcon.com/archives/2007/12/12/personal-content-for-just-your-friends/&amp;title=Personal+content%2C+for+just+your+friends." title="Add to&nbsp;digg"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http://wildfalcon.com/archives/2007/12/12/personal-content-for-just-your-friends/" title="Add to&nbsp;Facebook"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://wildfalcon.com/archives/2007/12/12/personal-content-for-just-your-friends/&amp;title=Personal+content%2C+for+just+your+friends." title="Add to&nbsp;reddit"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://wildfalcon.com/archives/2007/12/12/personal-content-for-just-your-friends/&amp;title=Personal+content%2C+for+just+your+friends." title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://wildfalcon.com/archives/2007/12/12/personal-content-for-just-your-friends/" title="Add to&nbsp;Technorati"><img class="social_img" src="http://wildfalcon.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
<img src="http://feeds.feedburner.com/~r/LauriesBlog/~4/202704901" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://wildfalcon.com/archives/2007/12/12/personal-content-for-just-your-friends/feed/</wfw:commentRss>
		<feedburner:origLink>http://wildfalcon.com/archives/2007/12/12/personal-content-for-just-your-friends/</feedburner:origLink></item>
	</channel>
</rss>
