<?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:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>chrisblunt.com</title>
	
	<link>http://chrisblunt.com/blog</link>
	<description>Agile Software Development &amp; Design</description>
	<pubDate>Tue, 06 Jan 2009 19:19:37 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://www.chrisblunt.com/rss/atom.xml" 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.</feedburner:browserFriendly><item>
		<title>Welcoming 2009 with some Goals</title>
		<link>http://feeds.feedburner.com/~r/chrisblunt/~3/504554901/</link>
		<comments>http://chrisblunt.com/blog/2009/01/06/welcoming-2009-with-some-goals/#comments</comments>
		<pubDate>Tue, 06 Jan 2009 19:17:34 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
		
		<category><![CDATA[Personal]]></category>

		<category><![CDATA[2009]]></category>

		<category><![CDATA[goals]]></category>

		<category><![CDATA[lifehacking]]></category>

		<category><![CDATA[rails]]></category>

		<category><![CDATA[ruby]]></category>

		<category><![CDATA[unclutter]]></category>

		<guid isPermaLink="false">http://chrisblunt.com/blog/?p=471</guid>
		<description><![CDATA[A belated happy new year! I've been reading a lot of 'lifehacker' blogs recently - the original LifeHacker, ZenHabits and unclutterer.com being the main three - and am hoping that 2009 will be a good year to declutter (both digitally and in the real world!). I thought it best, then, to outline some goals at the start of the year and see where I get with them over the remaining 359 days.]]></description>
			<content:encoded><![CDATA[<p>A belated happy new year! I&#8217;ve been reading a lot of &#8216;lifehacker&#8217; blogs recently - the original <a href="http://lifehacker.com/">LifeHacker</a>, <a href="http://zenhabits.net/">ZenHabits</a> and <a href="http://unclutterer.com/">unclutterer.com</a> being the main three - and am hoping that 2009 will be a good year to declutter (both digitally and in the real world!). I thought it best, then, to outline some goals at the start of the year and see where I get with them over the remaining 359 days.<br />
<span id="more-471"></span></p>
<p style="padding-left: 30px;"><strong>Get Married</strong><br />
I&#8217;ve been engaged for well over a year, so it&#8217;s really time we started planning the wedding.</p>
<p style="padding-left: 30px;"><strong>Run a half-marathon (and raise some money for charity)</strong><br />
<a href="http://www.plymouthhalfmarathon.co.uk/">Plymouth hosts a half-marathon</a> run around the city in May each year, and this year I hope to be running rather than watching it. The last time I ran this distance was before I went to University, so I have a few months of training; 137 days according to the website, which doesn&#8217;t sound very long. I took the first tentative steps this week with a 3 mile jog, and will be keeping a training log on <a href="http://twitter.com/cblunt">Twitter</a>.</p>
<p style="padding-left: 30px;"><strong>Unclutter</strong><br />
After Christmas, I made a start at &#8216;<a href="http://unclutterer.com/">uncluttering</a>&#8216; by donating clothes and clearing out things that &#8216;might come in useful&#8217;. Reading <a href="http://unclutterer.com/">unclutterer.com</a>, as well as books like the <a href="http://www.fourhourworkweek.com/">4-hour work week</a>, is inspirational for aiming for less (in a good way!). I&#8217;ll also probably check out <a href="http://zenhabits.net/">Leo Babauta&#8217;s</a> <a href="http://thepowerofless.com/">The Power of Less</a> soon, although I have a wealth of books to get through at the moment.</p>
<p style="padding-left: 30px;"><strong>Learn Ruby/Ruby on Rails (well!)</strong><br />
I&#8217;ve played with <a href="http://rubyonrails.org/">Rails</a> and am currently developing a personal project to learn the more intricate parts of this powerful framework. Coming from PHP, <a href="http://ruby-lang.org/">Ruby</a> seems incredibly clean and well-structured and my experience so far is that Rails is a nice framework to use.</p>
<p style="padding-left: 30px;">At <a href="http://www.webbased.co.uk/">work</a>, I&#8217;ve built a custom framework based on my experience with symfony to power the <a href="http://promo.webbased.co.uk/activesite">application</a> I&#8217;m working on. I&#8217;ve recently found out, though, that a new project I&#8217;ll be working on is likely to be in Rails, so hopefully this will provide some motivation and time to get to know ROR properly.</p>
<p style="padding-left: 30px;">I&#8217;m also using Ruby for some GTK apps (using the <a href="http://ruby-gnome2.sourceforge.jp/">ruby-gtk</a> bindings), as I&#8217;ve now moved exclusively to running Ubuntu on my machines. I have few open-source project ideas I&#8217;d like to get off the ground, and being able to use the same language for web and desktop apps makes sense.</p>
<p style="padding-left: 30px;"><strong>Microblog More</strong><br />
Microblogging is a lot easier than writing long posts, and more suited to me, hence signing up to <a href="http://twitter.com/cblunt">Twitter</a>. So rather than promise to blog more, I&#8217;ll make sure I tweet more, and use this site as a repository of code, discoveries and pondering.</p>
<p style="padding-left: 30px;"><strong>Release some software&#8230;</strong><br />
I&#8217;ve been working on a personal web project in Rails (see above) that I hope to release at least at a beta state within the next few months. I&#8217;ll hopefully be posting more about the development in the near future.</p>
<p style="padding-left: 30px;"><strong>&#8230;and contribute to open source</strong><br />
As well as my main project, I&#8217;ve got a few small-scale open source apps I&#8217;d like to build, both for functional use and to hone Ruby-GTK It&#8217;s time I gave something back to the open-source community, especially now as I&#8217;m now <a href="http://getfirefox.com/">exclusively</a> <a href="http://www.vim.org/">using</a> <a href="http://openoffice.org">open-source</a> <a href="http://www.ubuntu.com/">desktop software</a>.</p>
<p>This list is by no means exhaustive (and is a little tech-heavy), but hopefully will act as a guide for the next year. There will doubtless be lots of other goals cropping up, and things that I&#8217;ve forgotten about for now. My final goal, then, is to make sure I keep this list up-to-date.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/chrisblunt?a=WxR4AL.P"><img src="http://feeds.feedburner.com/~f/chrisblunt?i=WxR4AL.P" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/chrisblunt?a=RLFoFG.P"><img src="http://feeds.feedburner.com/~f/chrisblunt?i=RLFoFG.P" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/chrisblunt?a=RAXfEn.P"><img src="http://feeds.feedburner.com/~f/chrisblunt?i=RAXfEn.P" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/chrisblunt?a=hsE1e1.p"><img src="http://feeds.feedburner.com/~f/chrisblunt?i=hsE1e1.p" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://chrisblunt.com/blog/2009/01/06/welcoming-2009-with-some-goals/feed/</wfw:commentRss>
		<feedburner:origLink>http://chrisblunt.com/blog/2009/01/06/welcoming-2009-with-some-goals/</feedburner:origLink></item>
		<item>
		<title>Signed up to Twitter</title>
		<link>http://feeds.feedburner.com/~r/chrisblunt/~3/481619215/</link>
		<comments>http://chrisblunt.com/blog/2008/12/11/signed-up-to-twitter/#comments</comments>
		<pubDate>Thu, 11 Dec 2008 12:38:30 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
		
		<category><![CDATA[Personal]]></category>

		<category><![CDATA[social]]></category>

		<category><![CDATA[twitter]]></category>

		<category><![CDATA[web2.0]]></category>

		<guid isPermaLink="false">http://chrisblunt.com/blog/?p=464</guid>
		<description><![CDATA[Having resisted for so long, I finally signed up to Twitter.
]]></description>
			<content:encoded><![CDATA[<p>Having resisted for so long, I finally signed up to <a href="http://twitter.com/cblunt">Twitter</a>.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/chrisblunt?a=9n5AO"><img src="http://feeds.feedburner.com/~f/chrisblunt?i=9n5AO" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/chrisblunt?a=hVQsO"><img src="http://feeds.feedburner.com/~f/chrisblunt?i=hVQsO" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/chrisblunt?a=BwRDO"><img src="http://feeds.feedburner.com/~f/chrisblunt?i=BwRDO" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/chrisblunt?a=Me04o"><img src="http://feeds.feedburner.com/~f/chrisblunt?i=Me04o" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://chrisblunt.com/blog/2008/12/11/signed-up-to-twitter/feed/</wfw:commentRss>
		<feedburner:origLink>http://chrisblunt.com/blog/2008/12/11/signed-up-to-twitter/</feedburner:origLink></item>
		<item>
		<title>How to stop rsync overloading your wireless/LAN</title>
		<link>http://feeds.feedburner.com/~r/chrisblunt/~3/471634514/</link>
		<comments>http://chrisblunt.com/blog/2008/12/01/how-to-stop-rsync-overloading-your-wirelesslan/#comments</comments>
		<pubDate>Mon, 01 Dec 2008 19:52:10 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
		
		<category><![CDATA[Business]]></category>

		<category><![CDATA[Dissertation]]></category>

		<category><![CDATA[Personal]]></category>

		<category><![CDATA[Programming]]></category>

		<category><![CDATA[bash]]></category>

		<category><![CDATA[rsync]]></category>

		<category><![CDATA[scripting]]></category>

		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://chrisblunt.com/blog/?p=454</guid>
		<description><![CDATA[I am currently using rsync as a backup solution between two computers and an external backup drive, all operating across my wireless LAN. However, every so often - and always when syncing a lot of files - rsync has knocked out my wireless internet. Today, I decided to find out what was going on, and [...]]]></description>
			<content:encoded><![CDATA[<p>I am currently using <a href="http://samba.anu.edu.au/rsync/">rsync</a> as a backup solution between two computers and an external backup drive, all operating across my wireless LAN. However, every so often - and always when syncing a lot of files - rsync has knocked out my wireless internet. Today, I decided to find out what was going on, and found the solution:</p>
<p>
<pre class="codeblock" title="Bash">
<input type="hidden" value="">
<pre class="code">rsync <span style="color: #660033;">--bwlimit</span>=<span style="color: #000000;">500</span> ...</pre>
</pre>
<p>It turns out that rsync was overloading my router with data, causing it to reset the connection. Setting a bandwidth limit (in kBPS) to one nearer that of the router prevents overloading, and allows the scripts to complete.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/chrisblunt?a=gnfmO"><img src="http://feeds.feedburner.com/~f/chrisblunt?i=gnfmO" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/chrisblunt?a=VLOgO"><img src="http://feeds.feedburner.com/~f/chrisblunt?i=VLOgO" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/chrisblunt?a=kg6lO"><img src="http://feeds.feedburner.com/~f/chrisblunt?i=kg6lO" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/chrisblunt?a=ur1Uo"><img src="http://feeds.feedburner.com/~f/chrisblunt?i=ur1Uo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://chrisblunt.com/blog/2008/12/01/how-to-stop-rsync-overloading-your-wirelesslan/feed/</wfw:commentRss>
		<feedburner:origLink>http://chrisblunt.com/blog/2008/12/01/how-to-stop-rsync-overloading-your-wirelesslan/</feedburner:origLink></item>
		<item>
		<title>Cast a String to Timestamp in PostgreSQL</title>
		<link>http://feeds.feedburner.com/~r/chrisblunt/~3/402740122/</link>
		<comments>http://chrisblunt.com/blog/2008/08/20/cast-a-string-to-timestamp-in-postgresql/#comments</comments>
		<pubDate>Wed, 20 Aug 2008 11:48:13 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
		
		<category><![CDATA[Personal]]></category>

		<category><![CDATA[Programming]]></category>

		<category><![CDATA[database]]></category>

		<category><![CDATA[postgres]]></category>

		<category><![CDATA[snippet]]></category>

		<guid isPermaLink="false">http://chrisblunt.com/blog/?p=421</guid>
		<description><![CDATA[If storing a date/timestamp in a varchar or text field in postgres, the to_timestamp() function will let you access the value as a &#8216;real&#8217; date. The second parameter tells the function the format of your string:

SELECT to_timestamp('2008-08-01', 'YYYY-MM-DD') AS date;
]]></description>
			<content:encoded><![CDATA[<p>If storing a date/timestamp in a varchar or text field in postgres, the <em>to_timestamp()</em> function will let you access the value as a &#8216;real&#8217; date. The second parameter tells the function the format of your string:</p>
<p>
<pre>SELECT to_timestamp('2008-08-01', 'YYYY-MM-DD') AS date;</pre></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/chrisblunt?a=ip6eL"><img src="http://feeds.feedburner.com/~f/chrisblunt?i=ip6eL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/chrisblunt?a=dXqnL"><img src="http://feeds.feedburner.com/~f/chrisblunt?i=dXqnL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/chrisblunt?a=k0cjL"><img src="http://feeds.feedburner.com/~f/chrisblunt?i=k0cjL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/chrisblunt?a=uWb4l"><img src="http://feeds.feedburner.com/~f/chrisblunt?i=uWb4l" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://chrisblunt.com/blog/2008/08/20/cast-a-string-to-timestamp-in-postgresql/feed/</wfw:commentRss>
		<feedburner:origLink>http://chrisblunt.com/blog/2008/08/20/cast-a-string-to-timestamp-in-postgresql/</feedburner:origLink></item>
		<item>
		<title>Cocoa Bindings and NSPopUpButton</title>
		<link>http://feeds.feedburner.com/~r/chrisblunt/~3/402740123/</link>
		<comments>http://chrisblunt.com/blog/2008/07/29/cocoa-bindings-and-nspopupbutton/#comments</comments>
		<pubDate>Tue, 29 Jul 2008 22:37:33 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<category><![CDATA[bindings]]></category>

		<category><![CDATA[cocoa]]></category>

		<category><![CDATA[core data]]></category>

		<guid isPermaLink="false">http://chrisblunt.com/blog/?p=401</guid>
		<description><![CDATA[
A frustrating problem I came across today when I tried binding an NSPopUpButton&#8217;s selection key to an NSArrayController&#8217;s selection was that the NSPopUpButton would always display a &#8216;ghost&#8217; object -one of the opaque classes internal to Cocoa/Core-Data Bindings(&#60;_NSControllerObjectProxy&#8230; or similar).
It turns out that NSPopUpButton does not record the user&#8217;s selection, so even if I had [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-415" title="NSPopup Window" src="http://chrisblunt.com/blog/wp-content/uploads/2008/07/nspopup1.jpg" alt="" width="320" height="240" /></p>
<p>A frustrating problem I came across today when I tried binding an <em>NSPopUpButton</em>&#8217;s selection key to an <em>NSArrayController</em>&#8217;s selection was that the <em>NSPopUpButton</em> would always display a &#8216;ghost&#8217; object -one of the opaque classes internal to Cocoa/Core-Data Bindings(&lt;_NSControllerObjectProxy&#8230; or similar).</p>
<p>It <a href="http://www.meandmark.com/bindingspart4.html">turns out</a> that <em>NSPopUpButton</em> does not record the user&#8217;s selection, so even if I had been able to get rid of the ghost object, I wouldn&#8217;t have been able to access the selected object.</p>
<p>The solution is to manually maintain a currently selected object in the window controller - <em>File&#8217;s Owner</em> in Interface Builder; in this case, <em>selectedPackage</em>:</p>
<p>In MyWindowController.m:</p>
<pre class="codeblock" title="Objective-C">
<input type="hidden" value="">
<pre class="code">
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>setSelectedPackage<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSManagedObject</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>package
<span style="color: #002200;">&#123;</span>
<span style="color: #11740a; font-style: italic;">// ... checks ...</span>
selectedPackage <span style="color: #002200;">=</span> package;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSManagedObject</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>selectedPackage
<span style="color: #002200;">&#123;</span>
<span style="color: #a61390;">return</span> selectedPackage;
<span style="color: #002200;">&#125;</span>
</pre>
</pre>
<p>In Interface Builder, the NSPopUpButton should be bound to the NSArrayController (Packages) and the File&#8217;s Owner as:</p>
<p><strong>Content:</strong> Packages.arrangedObjects<br />
<strong>Content Values: </strong>Packages.arrangedObjects;modelPath=packageName<br />
<strong>Selection:</strong> File&#8217;s Owner.selectedPackage</p>
<p>A default selection can then be provided by calling the <em>setSelectedPackage:</em> method.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/chrisblunt?a=zE6QL"><img src="http://feeds.feedburner.com/~f/chrisblunt?i=zE6QL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/chrisblunt?a=0caXL"><img src="http://feeds.feedburner.com/~f/chrisblunt?i=0caXL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/chrisblunt?a=8d1ZL"><img src="http://feeds.feedburner.com/~f/chrisblunt?i=8d1ZL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/chrisblunt?a=uwhwl"><img src="http://feeds.feedburner.com/~f/chrisblunt?i=uwhwl" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://chrisblunt.com/blog/2008/07/29/cocoa-bindings-and-nspopupbutton/feed/</wfw:commentRss>
		<feedburner:origLink>http://chrisblunt.com/blog/2008/07/29/cocoa-bindings-and-nspopupbutton/</feedburner:origLink></item>
		<item>
		<title>Running Aptana Jaxer on Ubuntu 8.04</title>
		<link>http://feeds.feedburner.com/~r/chrisblunt/~3/402740124/</link>
		<comments>http://chrisblunt.com/blog/2008/06/05/running-aptana-jaxer-on-ubuntu-804/#comments</comments>
		<pubDate>Thu, 05 Jun 2008 18:00:53 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
		
		<category><![CDATA[Personal]]></category>

		<category><![CDATA[Programming]]></category>

		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[hints]]></category>

		<category><![CDATA[Javascript]]></category>

		<category><![CDATA[jaxer]]></category>

		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://chrisblunt.com/blog/?p=394</guid>
		<description><![CDATA[
I&#8217;ve not had any time to try out Jaxer yet, but the idea of a single platform for both client and server-side processing sounds good.
On trying to get started, though, one problem I encountered was that the installation instructions on Aptana&#8217;s site didn&#8217;t quite get Jaxer running on my default Ubuntu 8.04 install. The reason [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-395" title="Jaxer Status Panel" src="http://chrisblunt.com/blog/wp-content/uploads/2008/06/jaxer_status.jpg" alt="" width="320" height="240" /></p>
<p>I&#8217;ve not had any time to try out <a href="http://www.aptana.com/">Jaxer</a> yet, but the idea of a single platform for both client and server-side processing sounds good.</p>
<p>On trying to get started, though, one problem I encountered was that the <a href="http://aptana.com/jaxer/linux">installation instructions</a> on <a href="http://www.aptana.com/">Aptana</a>&#8217;s site didn&#8217;t quite get Jaxer running on my default <a href="http://www.ubuntu.com">Ubuntu</a> 8.04 install. The reason seems to be the built-in Apache trying to load an external library from
<pre>/usr/lib</pre>
<p> which doesn&#8217;t exist.</p>
<p>The library in question is libexpat.so.0; however, there is a libexpat.so.1.5.2 installed! You can check this by running:</p>
<pre>$ ls -l /usr/bin | grep libexpat</pre>
<p>Creating a link to this file in /usr/lib with:</p>
<pre>$ ln -s libexpat.so.1.5.2 /usr/bin/libexpat.so.0</pre>
<p>seems to have got Jaxer running and the server status looks good. If you&#8217;re having trouble getting a Jaxer server running on the latest Ubuntu, this might be worth giving a go.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/chrisblunt?a=Lp9kL"><img src="http://feeds.feedburner.com/~f/chrisblunt?i=Lp9kL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/chrisblunt?a=VkyAL"><img src="http://feeds.feedburner.com/~f/chrisblunt?i=VkyAL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/chrisblunt?a=zbtzL"><img src="http://feeds.feedburner.com/~f/chrisblunt?i=zbtzL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/chrisblunt?a=3Yy4l"><img src="http://feeds.feedburner.com/~f/chrisblunt?i=3Yy4l" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://chrisblunt.com/blog/2008/06/05/running-aptana-jaxer-on-ubuntu-804/feed/</wfw:commentRss>
		<feedburner:origLink>http://chrisblunt.com/blog/2008/06/05/running-aptana-jaxer-on-ubuntu-804/</feedburner:origLink></item>
		<item>
		<title>Singleton Pattern in Javascript</title>
		<link>http://feeds.feedburner.com/~r/chrisblunt/~3/402740125/</link>
		<comments>http://chrisblunt.com/blog/2008/05/10/singleton-pattern-in-javascript/#comments</comments>
		<pubDate>Sat, 10 May 2008 08:04:51 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
		
		<category><![CDATA[Personal]]></category>

		<category><![CDATA[Programming]]></category>

		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[Design Patterns]]></category>

		<category><![CDATA[Javascript]]></category>

		<category><![CDATA[Singleton]]></category>

		<guid isPermaLink="false">http://chrisblunt.com/blog/?p=392</guid>
		<description><![CDATA[At work, I have been developing a custom framework loosely based on my experience with the symfony and Propel. One of the requirements for the application under development is to store the application&#8217;s state both on the server and the client, so that information can be passed by means of AJAX requests.
To aid this process, [...]]]></description>
			<content:encoded><![CDATA[<p>At work, I have been developing a custom framework loosely based on my experience with the <a href="http://www.symfony-project.org/">symfony</a> and <a href="http://propel.phpdb.org/">Propel</a>. One of the requirements for the application under development is to store the application&#8217;s state both on the server and the client, so that information can be passed by means of AJAX requests.</p>
<p>To aid this process, each page controller PHP class has a corresponding Javascript class. In order to maintain state through the application, each class as a Singleton. With the help of <a href="http://prototypejs.org">Prototype</a>, singleton classes are quick and easy to implement in Javascript:</p>
<p>First, declare the class itself using Prototype&#8217;s Class.create() method:</p>
<pre class="codeblock" title="Javascript">
<input type="hidden" value="">
<pre class="code">
PageController <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">Class</span>.<span style="color: #660066;">create</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #006600; font-style: italic;">/**
	 * @type {integer}
	 */</span>
	userId<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">,</span>
&nbsp;
	<span style="color: #006600; font-style: italic;">// ... more properties ...</span>
&nbsp;
	<span style="color: #006600; font-style: italic;">/**
	 * Constructor
	 */</span>
	initialize<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
	<span style="color: #006600; font-style: italic;">// ...</span>
	<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
&nbsp;
	<span style="color: #006600; font-style: italic;">/**
	 * A method to do something...
	 */</span>
	doSomething<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'doSomething()'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
&nbsp;
	<span style="color: #006600; font-style: italic;">// ... more methods ...</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
</pre>
</pre>
<p>Once the class is created, we can declare a static instance of the class and a static method, getInstance(), that will be used to return the single instance of the class:</p>
<pre class="codeblock" title="Javascript">
<input type="hidden" value="">
<pre class="code">
<span style="color: #006600; font-style: italic;">/**
 * @type {PageController} Static instance of the page controller
 */</span>
PageController.<span style="color: #660066;">instance</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #006600; font-style: italic;">/**
 * Return the static (singleton) instance of
 * the page controller object
 */</span>
PageController.<span style="color: #660066;">getInstance</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>PageController.<span style="color: #660066;">instance</span><span style="color: #009900;">&#41;</span>
		PageController.<span style="color: #660066;">instance</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> PageController<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
&nbsp;
	<span style="color: #000066; font-weight: bold;">return</span> PageController.<span style="color: #660066;">instance</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
</pre>
</pre>
<p>With the class now declared, the singleton instance can be accessed in your application using the static getInstance() method:</p>
<pre class="codeblock" title="Javascript">
<input type="hidden" value="">
<pre class="code">PageController.<span style="color: #660066;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">doSomething</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></pre>
</pre>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/chrisblunt?a=OeZyL"><img src="http://feeds.feedburner.com/~f/chrisblunt?i=OeZyL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/chrisblunt?a=d5zgL"><img src="http://feeds.feedburner.com/~f/chrisblunt?i=d5zgL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/chrisblunt?a=2tfTL"><img src="http://feeds.feedburner.com/~f/chrisblunt?i=2tfTL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/chrisblunt?a=8sCAl"><img src="http://feeds.feedburner.com/~f/chrisblunt?i=8sCAl" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://chrisblunt.com/blog/2008/05/10/singleton-pattern-in-javascript/feed/</wfw:commentRss>
		<feedburner:origLink>http://chrisblunt.com/blog/2008/05/10/singleton-pattern-in-javascript/</feedburner:origLink></item>
		<item>
		<title>Gmail Contacts API</title>
		<link>http://feeds.feedburner.com/~r/chrisblunt/~3/247510876/</link>
		<comments>http://chrisblunt.com/blog/2008/03/07/gmail-contacts-api/#comments</comments>
		<pubDate>Fri, 07 Mar 2008 17:49:15 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
		
		<category><![CDATA[Personal]]></category>

		<category><![CDATA[api]]></category>

		<category><![CDATA[contacts]]></category>

		<category><![CDATA[google]]></category>

		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://chrisblunt.com/blog/?p=386</guid>
		<description><![CDATA[I noticed today that Google has finally launched an API for its contacts application. I&#8217;m sure I&#8217;m not alone in wanting to easily and properly synchronise contact data amongst Gmail, Address Book, mobile, etc. and use Gmail contacts as a single repository.
The API uses Google&#8217;s GData format, which is something I&#8217;m yet to look into. [...]]]></description>
			<content:encoded><![CDATA[<p>I noticed today that Google has finally launched an <a href="http://googledataapis.blogspot.com/2008/03/3-2-1-contact-api-has-landed.html">API for its contacts application</a>. I&#8217;m sure I&#8217;m not alone in wanting to easily and properly synchronise contact data amongst Gmail, Address Book, mobile, etc. and use Gmail contacts as a single repository.</p>
<p>The API uses <a href="http://code.google.com/apis/gdata/basics.html">Google&#8217;s GData</a> format, which is something I&#8217;m yet to look into. It would seem to be a‚ good time to put into practice some <a href="http://python.org/">Python</a>‚ - or maybe dust off the Objective-C - and‚ <a href="http://developer.apple.com/">Cocoa</a>.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/chrisblunt?a=eHsXO"><img src="http://feeds.feedburner.com/~f/chrisblunt?i=eHsXO" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/chrisblunt?a=f4ODO"><img src="http://feeds.feedburner.com/~f/chrisblunt?i=f4ODO" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/chrisblunt?a=EGZhO"><img src="http://feeds.feedburner.com/~f/chrisblunt?i=EGZhO" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/chrisblunt?a=03Wio"><img src="http://feeds.feedburner.com/~f/chrisblunt?i=03Wio" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://chrisblunt.com/blog/2008/03/07/gmail-contacts-api/feed/</wfw:commentRss>
		<feedburner:origLink>http://chrisblunt.com/blog/2008/03/07/gmail-contacts-api/</feedburner:origLink></item>
		<item>
		<title>An Example of Near-Perfect Design</title>
		<link>http://feeds.feedburner.com/~r/chrisblunt/~3/247316460/</link>
		<comments>http://chrisblunt.com/blog/2007/12/10/one-example-of-near-perfect-design/#comments</comments>
		<pubDate>Mon, 10 Dec 2007 20:16:59 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
		
		<category><![CDATA[Personal]]></category>

		<category><![CDATA[calendar]]></category>

		<category><![CDATA[design]]></category>

		<category><![CDATA[google]]></category>

		<category><![CDATA[interaction]]></category>

		<category><![CDATA[interface]]></category>

		<category><![CDATA[user]]></category>

		<guid isPermaLink="false">http://chrisblunt.com/blog/2007/12/10/one-example-of-near-perfect-design.htm</guid>
		<description><![CDATA[I&#8217;ve been a long-time fan of Google Calendar, mainly because I can see where I need to be from any web connection. But probably its most useful feature is the thought that has obviously gone into the interaction design.
The Problem
When using calendar software, it is painful to have to click between each field, setting hours [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been a long-time fan of Google Calendar, mainly because I can see where I need to be from any web connection. But probably its most useful feature is the thought that has obviously gone into the interaction design.</p>
<p><strong>The Problem</strong><br />
When using calendar software, it is painful to have to click between each field, setting hours and minutes, locations etc. then confirming with an OK. I have been known (more often than not) to forego any form of calendar, instead relying on scrawl left on scraps of paper around the office. Whilst less organised than a calendar, this said scrawl is a lot easier to jot down. Needless to say, though, it is also a lot easier to lose.</p>
<p><strong>A Solution</strong><br />
In <a href="http://calendar.google.com/">Google Calendar,</a> the designers have captured my need to quickly jot down when, where and who. No longer do I need to tab between fields, carefully tapping out 24-hour clocks (or 12-hours, depending the software&#8217;s mood). Instead, events can be entered as simply as:</p>
<blockquote><p>meet joe at company friday 11am</p></blockquote>
<p>Google Calendar will then automatically pick out the important information and add the appropriate event. No fussing around with mini-calendars or remembering to use mm/dd instead of dd/mm - the app just works. This is, for me at least, near-perfection user design - and I hope more software begins to take note (Apple&#8217;s new iCal 3.0 does not).</p>
<p>Google Calendar&#8217;s &#8216;Quick Add&#8217; is an example of removing layers of abstraction (or barriers) between the user and the system, and quite correctly why should the user conform to the system? It should surely be the other way round. Mobile phone OS designers should note, why should it take 4 menu items to get to a message inbox? Perhaps <a href="http://code.google.com/android/">Google&#8217;s new Android</a> will help to iron that one out&#8230;</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/chrisblunt?a=kxkZ9yF"><img src="http://feeds.feedburner.com/~f/chrisblunt?i=kxkZ9yF" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/chrisblunt?a=NthhbKF"><img src="http://feeds.feedburner.com/~f/chrisblunt?i=NthhbKF" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/chrisblunt?a=JDqunBF"><img src="http://feeds.feedburner.com/~f/chrisblunt?i=JDqunBF" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/chrisblunt?a=HJ72KJf"><img src="http://feeds.feedburner.com/~f/chrisblunt?i=HJ72KJf" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://chrisblunt.com/blog/2007/12/10/one-example-of-near-perfect-design/feed/</wfw:commentRss>
		<feedburner:origLink>http://chrisblunt.com/blog/2007/12/10/one-example-of-near-perfect-design/</feedburner:origLink></item>
		<item>
		<title>Core Data: Cached Transient Properites</title>
		<link>http://feeds.feedburner.com/~r/chrisblunt/~3/247316461/</link>
		<comments>http://chrisblunt.com/blog/2007/11/01/core-data-cached-transient-properites/#comments</comments>
		<pubDate>Thu, 01 Nov 2007 17:28:49 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
		
		<category><![CDATA[HostManager]]></category>

		<category><![CDATA[Programming]]></category>

		<category><![CDATA[bindings]]></category>

		<category><![CDATA[cocoa]]></category>

		<category><![CDATA[code]]></category>

		<category><![CDATA[coredata]]></category>

		<category><![CDATA[development]]></category>

		<guid isPermaLink="false">http://chrisblunt.com/blog/2007/11/01/core-data-cached-transient-properites.htm</guid>
		<description><![CDATA[In writing <a href="http://chrisblunt.com/software/">HostManager</a> 2.0, I've come up against a lot of problems caused by the dark magic that is <a href="http://developer.apple.com/documentation/Cocoa/Conceptual/CocoaBindings/CocoaBindings.html">Cocoa bindings</a> and key-value observing. One of the most troublesome of these has been with transient (calculated) properties.]]></description>
			<content:encoded><![CDATA[<p>In writing <a href="http://chrisblunt.com/software/">HostManager</a> 2.0, I&#8217;ve come up against a lot of problems caused by the dark magic that is <a href="http://developer.apple.com/documentation/Cocoa/Conceptual/CocoaBindings/CocoaBindings.html">Cocoa bindings</a> and key-value observing. One of the most troublesome of these has been with transient (calculated) properties.</p>
<p>For example, a Client managed object can get a count of owned domains that are expiring soon. This is a transient propety, accessed through a key of expiringDomains. It simply returns an NSSet which is built from a fetchRequest. </p>
<p>Previously, I was running this fetchRequest each time the key was accessed. This was admittedly inefficient, but seemed functional - at least until you saved the document.</p>
<p>Something crazy happens when a Core Data document is saved - all the objects in a context are released (faulted). There is a good reason for this, as it frees up any memory that was being used to temporarily store the managed objects. However, it caused very strange results to appear in my transient  properties; namely, they would all vanish.</p>
<p>Even forcing the fetch request to refresh didn&#8217;t pick up any objects from the context (I&#8217;m not sure why as I would have expected the faulted objects to be &#8216;refired&#8217;). So I took the plunge and refactored the Client object to cache its expiringDomains value. After some extensive testing and finger-crossing, I&#8217;m fairly sure this is the correct way to handle transient relationship properties:</p>
<p><strong>CustomManagedObject.h</strong></p>
<pre class="codeblock" title="Objective-C">
<input type="hidden" value="">
<pre class="code"><span style="color: #a61390;">@interface</span> CustomManagedObject <span style="color: #002200;">:</span> <span style="color: #400080;">NSManagedObject</span> <span style="color: #002200;">&#123;</span>
ame <span style="color: #400080;">NSSet</span> <span style="color: #002200;">*</span>transientRelationship;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSSet</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>transientRelationship;</pre>
</pre>
<p><strong>CustomManagedObject.m</strong></p>
<pre class="codeblock" title="Objective-C">
<input type="hidden" value="">
<pre class="code"><span style="color: #6e371a;">#import &quot;CustomManagedObject.h&quot;</span>
&nbsp;
<span style="color: #a61390;">@implementation</span> CustomManagedObject
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>awakeFromFetch
<span style="color: #002200;">&#123;</span>
ame <span style="color: #002200;">&#91;</span>super awakeFromFetch<span style="color: #002200;">&#93;</span>;
&nbsp;
ame <span style="color: #11740a; font-style: italic;">// set managed object to observe changes to the context, this is necessary</span>
ame <span style="color: #11740a; font-style: italic;">// to monitor changes to the context that occur elsewhere in the app</span>
ame <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSNotificationCenter</span> defaultCenter<span style="color: #002200;">&#93;</span> addObserver<span style="color: #002200;">:</span>self selector<span style="color: #002200;">:</span><span style="color: #a61390;">@selector</span><span style="color: #002200;">&#40;</span>refresh<span style="color: #002200;">:</span><span style="color: #002200;">&#41;</span> name<span style="color: #002200;">:</span>NSManagedObjectContextObjectsDidChangeNotification object<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>self managedObjectContext<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
&nbsp;
ame <span style="color: #11740a; font-style: italic;">// clear the cache after managed object is fetched into the context</span>
ame <span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span> transientRelationship <span style="color: #002200;">!=</span> <span style="color: #a61390;">nil</span> <span style="color: #002200;">&#41;</span>
ame <span style="color: #002200;">&#91;</span>transientRelationship release<span style="color: #002200;">&#93;</span>, transientRelationship <span style="color: #002200;">=</span> <span style="color: #a61390;">nil</span>;<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>refresh<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSNotification</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>notification
<span style="color: #002200;">&#123;</span>
ame <span style="color: #11740a; font-style: italic;">// ... perform check to see if update is neccessary, assume it is...</span>
&nbsp;
ame <span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span> refreshNeeded <span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
ame <span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span> expiringDomains <span style="color: #002200;">!=</span> <span style="color: #a61390;">nil</span> <span style="color: #002200;">&#41;</span>
ame gDomains release<span style="color: #002200;">&#93;</span>, expiringDomains <span style="color: #002200;">=</span> <span style="color: #a61390;">nil</span>;
ame <span style="color: #002200;">&#125;</span>
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSSet</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>transientRelationship
<span style="color: #002200;">&#123;</span>
ame <span style="color: #002200;">&#91;</span>self willAccessValueForKey<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;transientRelationship&quot;</span><span style="color: #002200;">&#93;</span>
ame
ame <span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span> transientRelationship <span style="color: #002200;">==</span> <span style="color: #a61390;">nil</span> <span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>SFetchRequest <span style="color: #002200;">*</span>aFetchRequest <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSFetchRequest</span> alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span> autorelease<span style="color: #002200;">&#93;</span>;
&nbsp;
ame <span style="color: #002200;">&#91;</span>aFetchRequest setEntity<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSEntityDescription</span> entityForName<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;DestinationEntity&quot;</span> inManagedObjectContext<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>self managedObjectContext<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
&nbsp;
ame <span style="color: #11740a; font-style: italic;">// optionally, set a predicate, e.g. owner == self</span>
ame <span style="color: #002200;">&#91;</span>aFetchRequest setPredicate<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSPredicate</span> predicateWithFormat<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;predicateString&quot;</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
&nbsp;
ame <span style="color: #400080;">NSArray</span> <span style="color: #002200;">*</span>results <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>self managedObjectContext<span style="color: #002200;">&#93;</span> executeFetchRequest<span style="color: #002200;">:</span>aFetchRequest error<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;
&nbsp;
ame transientRelationship <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSSet</span> setWithArray<span style="color: #002200;">:</span>results<span style="color: #002200;">&#93;</span> retain<span style="color: #002200;">&#93;</span>;
ame <span style="color: #002200;">&#125;</span>
ame
ame <span style="color: #002200;">&#91;</span>self didAccessValueForKey<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;transientRelationship&quot;</span><span style="color: #002200;">&#93;</span>
&nbsp;
ame <span style="color: #a61390;">return</span> transientRelationship;
<span style="color: #002200;">&#125;</span></pre>
</pre>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/chrisblunt?a=zPPAV4F"><img src="http://feeds.feedburner.com/~f/chrisblunt?i=zPPAV4F" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/chrisblunt?a=MUkXSvF"><img src="http://feeds.feedburner.com/~f/chrisblunt?i=MUkXSvF" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/chrisblunt?a=gtWcxWF"><img src="http://feeds.feedburner.com/~f/chrisblunt?i=gtWcxWF" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/chrisblunt?a=RfhZRtf"><img src="http://feeds.feedburner.com/~f/chrisblunt?i=RfhZRtf" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://chrisblunt.com/blog/2007/11/01/core-data-cached-transient-properites/feed/</wfw:commentRss>
		<feedburner:origLink>http://chrisblunt.com/blog/2007/11/01/core-data-cached-transient-properites/</feedburner:origLink></item>
	</channel>
</rss>
