<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
	<channel>
		
		<title>Damien DeVille</title>
		<description>Damien DeVille - Software Engineer</description>
		<language>en-us</language>
		<category>Technology/Cocoa/Apple/Mac/iOS</category>
		<link>http://ddeville.me</link>
		<image>
			<url>http://ddeville.me/static/images/apple-touch-icon.png</url>
			<title>Damien DeVille</title>
			<link>http://ddeville.me</link>
		</image>
		<pubDate>Wed, 27 Mar 2013 06:30:10 PDT</pubDate>
		<lastBuildDate>Wed, 27 Mar 2013 06:30:10 PDT</lastBuildDate>
		
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/DamienDeVille" /><feedburner:info uri="damiendeville" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
				
				<title>→ Shared preferences between sandboxed applications</title>
				<link>http://feedproxy.google.com/~r/DamienDeVille/~3/cGRxQEj8uLc/shared-preferences-between-sandboxed-applications</link>
				
				<description>&lt;p&gt;I’ve written an article on Realmac’s &lt;a href="http://realmacsoftware.com/blog/shared-preferences-between-sandboxed-applications"&gt;blog&lt;/a&gt; about shared preferences between sandboxed applications.&lt;/p&gt;

&lt;p&gt;Some fun stuff, go give it a read!&lt;br/&gt;
The framework and a sample application both are available on &lt;a href="https://github.com/realmacsoftware/RMSharedPreferences"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/DamienDeVille/~4/cGRxQEj8uLc" height="1" width="1"/&gt;</description>
				
				<dc:creator>Damien DeVille</dc:creator>
				
				<guid isPermaLink="false">http://ddeville.me/2012/12/shared-preferences-between-sandboxed-applications</guid>
				<pubDate>Wed, 05 Dec 2012 07:30:03 PST</pubDate>
			<feedburner:origLink>http://ddeville.me/2012/12/shared-preferences-between-sandboxed-applications</feedburner:origLink></item>
		
			<item>
				
				<title>Hosting on GitHub Pages</title>
				<link>http://feedproxy.google.com/~r/DamienDeVille/~3/GbT5GHvKmKU/hosting-on-github-pages</link>
				
				<description>&lt;p&gt;When I redesigned this website last year I had one main goal in mind: it had to be flexible. I didn’t want to depend on a platform such as WordPress or have my content tight to a database. Very naturally I decided to use Jekyll.&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;Jekyll gives you just enough power to generate a static blog from a bunch of markdown files while leaving you completely in control of the structure and layout.
Back then, I was a happy customer of Linode so I was able to host the site myself. I was simply building it locally and pushed the content to my server via FTP with Transmit.
While this worked quite well, it required me to have my MacBook (with Jekyll and related gems installed) just to be able to publish a post. So I then moved to have the server check out the git repository and set up a post update hook that simply built and published the site. This worked nicely but required more setup on the server that I would need to replicate when changing provider, too much hassle for a simple blog. Also, over the last months I found it harder to justify the $240 per year for a Linode VPS given that I was only hosting my blog on (and a couple of git repositories that could easily be moved to GitHub at any time).&lt;/p&gt;

&lt;p&gt;So I made the move, from now on I will be hosting this blog on GitHub. This will make things much easier, the website only being a git repository built when pushing to the master branch. Drafts can be kept in a side branch, building locally for previewing, and merging to master to deploy.
This approach has one caveat though, one cannot use a non-vanilla version of Jekyll. In other words, this means no plugins. GitHub runs a basic version of Jekyll and (slightly outdated) Liquid and plugins in the repository will be ignored. I didn’t make an extensive use of plugins but still depended on a couple of them, to classify the posts by date for example. Anyway, nothing insurmountable so I removed the yearly and monthly classification of posts in the archive page and now display them sequentially with their appropriate posting date.
I have also slightly simplified the post types. Every post written on this site will be classified under Posts, that’s it! In other words, no more Bits and Starred Posts.&lt;/p&gt;

&lt;p&gt;The last little thing was the Contact page. I was using a simple PHP script for the contact form that I obviously won’t be able to run anymore. No big deal, no one likes contact forms and there are plenty of other ways to contact me!&lt;/p&gt;

&lt;p&gt;So, let’s just hope that this easier setup works smoothly and stimulates me writing more!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/DamienDeVille/~4/GbT5GHvKmKU" height="1" width="1"/&gt;</description>
				
				<dc:creator>Damien DeVille</dc:creator>
				
				<guid isPermaLink="false">http://ddeville.me/2012/11/hosting-on-github-pages</guid>
				<pubDate>Mon, 19 Nov 2012 14:06:50 PST</pubDate>
			<feedburner:origLink>http://ddeville.me/2012/11/hosting-on-github-pages</feedburner:origLink></item>
		
			<item>
				
				<title>John Siracusa‘s Mac OS X reviews</title>
				<link>http://feedproxy.google.com/~r/DamienDeVille/~3/9vddQvWsuwo/john-siracusa-s-mac-os-x-reviews</link>
				
				<description>&lt;p&gt;With Mountain Lion soon to be released next month, I am looking forward to read &lt;a href="http://twitter.com/siracusa"&gt;John Siracusa&lt;/a&gt; well renowned OS X review on Ars Technica.
John puts a tremendous effort in reviewing our favorite operation system and his articles are always an amazing journey through every little updates and improvements in the OS release.&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;I have been a full-time OS X user since Tiger (I have used Mac OS 8 for a while in elementary school but my personal switch to the Mac, like many Europeans, was only around 2005). For this reason, the only reviews I actually had a chance to read were the ones for Leopard, Snow Leopard and Lion.
Feeling like I had been missing something, I decided to read the whole saga from the very first one: Developer Preview 2!
It's been an amazing reading so far (I have just finished the 10.0 review) and I cannot recommend it enough to anyone even only slightly interested in OS X.&lt;/p&gt;

&lt;p&gt;All the articles can be found on Ars Technica. Since there doesn't seem to be a global table of contents for the various reviews, I've linked to them below. Every article is split between multiple pages (some up to 25!); you can view the article on a single page if you become a subscriber though. For $5 a month, it's really a no-brainer, and the articles will save nicely in Instapaper.&lt;/p&gt;

&lt;p&gt;Enjoy!&lt;/p&gt;

&lt;h5&gt;Mac OS X DPs and Public Beta&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://arstechnica.com/apple/1999/12/macos-x-dp2"&gt;Mac OS X DP2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arstechnica.com/apple/2000/01/macos-x-gui"&gt;Mac OS X Update: Quartz &amp;amp; Aqua&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arstechnica.com/apple/2000/02/mac-os-x-dp3"&gt;Mac OS X DP3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arstechnica.com/apple/2000/05/mac-os-x-dp4"&gt;Mac OS X DP4&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arstechnica.com/apple/2000/06/macos-x-qa-1"&gt;Mac OS X Q&amp;amp;A&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arstechnica.com/apple/2010/09/macos-x-beta"&gt;Mac OS X Public Beta&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h5&gt;Releases&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://arstechnica.com/apple/2001/04/macos-x"&gt;Mac OS X 10.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arstechnica.com/apple/2001/10/macosx-10-1"&gt;Mac OS X 10.1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arstechnica.com/apple/2002/09/macosx-10-2"&gt;Mac OS X 10.2 Jaguar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arstechnica.com/apple/2003/11/macosx-10-3"&gt;Mac OS X 10.3 Panther&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arstechnica.com/apple/2005/04/macosx-10-4"&gt;Mac OS X 10.4 Tiger&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arstechnica.com/apple/2007/10/mac-os-x-10-5"&gt;Mac OS X 10.5 Leopard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arstechnica.com/apple/2009/08/mac-os-x-10-6"&gt;Mac OS X 10.6 Snow Leopard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arstechnica.com/apple/2011/07/mac-os-x-10-7"&gt;Mac OS X 10.7 Lion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h5&gt;Specials&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://arstechnica.com/apple/2001/01/macworld-expo-sf-2001"&gt;Macworld Expo San Francisco 2001&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arstechnica.com/apple/2011/05/mac-os-x-revisited"&gt;Here's to the crazy ones: a decade of Mac OS X reviews&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/DamienDeVille/~4/9vddQvWsuwo" height="1" width="1"/&gt;</description>
				
				<dc:creator>Damien DeVille</dc:creator>
				
				<guid isPermaLink="false">http://ddeville.me/2012/06/john-siracusa-s-mac-os-x-reviews</guid>
				<pubDate>Thu, 28 Jun 2012 22:34:40 PDT</pubDate>
			<feedburner:origLink>http://ddeville.me/2012/06/john-siracusa-s-mac-os-x-reviews</feedburner:origLink></item>
		
			<item>
				
				<title>→ Chocolat 1.0 released today</title>
				<link>http://feedproxy.google.com/~r/DamienDeVille/~3/5biBZ8ybPvA/chocolat-made-1-0-released-today</link>
				
				<description>&lt;p&gt;Given the dead-not-dead status of TextMate, I've been looking for a nice text editor to replace it with. Unfortunately, TextMate is awesome and I found it quite hard to find an app that I was comfortable with. Many people seem to like BBEdit or Sublime Text but I don't seem to become accustomed to the UI of any of them.&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;I have been alpha testing Chocolat for the past few months, and it looks like a very promising alternative to TextMate. A couple of minutes spent with Chocolat are actually enough to realize that it has clearly been built as a direct replacement to TextMate.&lt;/p&gt;

&lt;p&gt;The 1.0 version has been released today, it's $49 on Fileability's store.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/DamienDeVille/~4/5biBZ8ybPvA" height="1" width="1"/&gt;</description>
				
				<dc:creator>Damien DeVille</dc:creator>
				
				<guid isPermaLink="false">http://ddeville.me/2012/06/chocolat-made-1-0-released-today</guid>
				<pubDate>Thu, 28 Jun 2012 22:04:40 PDT</pubDate>
			<feedburner:origLink>http://ddeville.me/2012/06/chocolat-made-1-0-released-today</feedburner:origLink></item>
		
			<item>
				
				<title>→ Stephen Wolfram on the .data domain for the Data Web</title>
				<link>http://feedproxy.google.com/~r/DamienDeVille/~3/sHyyzFcOZqE/towards-the-data-web</link>
				
				<description>&lt;p&gt;Fascinating concept.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/DamienDeVille/~4/sHyyzFcOZqE" height="1" width="1"/&gt;</description>
				
				<dc:creator>Damien DeVille</dc:creator>
				
				<guid isPermaLink="false">http://ddeville.me/2012/01/towards-the-data-web</guid>
				<pubDate>Tue, 10 Jan 2012 00:00:00 PST</pubDate>
			<feedburner:origLink>http://ddeville.me/2012/01/towards-the-data-web</feedburner:origLink></item>
		
			<item>
				
				<title>NSURLConnection setDelegateQueue is broken on iOS</title>
				<link>http://feedproxy.google.com/~r/DamienDeVille/~3/GKQN0XzPuW8/broken-NSURLConnection-on-ios</link>
				
				<description>&lt;p&gt;On Mac OS 10.7 and iOS 5.0, a very handy method has been added to NSURLConnection: &lt;em&gt;setDelegateQueue:&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Using a URL connection in an NSOperation subclass has always been quite tedious because of the fact that one has to run a runloop for as long as the delegate callbacks have to happen.&lt;!--more--&gt;
As suggested by &lt;a href="http://twitter.com/mzarra"&gt;Marcus Zarra&lt;/a&gt; in this StackOverflow &lt;a href="http://stackoverflow.com/a/7492587"&gt;answer&lt;/a&gt;, this has usually been achieved by calling CFRunLoopRun() when calling the start: method on NSURLConnection and CFRunLoopStop(CFRunLoopGetCurrent()) when the connection finishes loading or fails.&lt;/p&gt;

&lt;p&gt;However, as my colleague &lt;a href="http://twitter.com/keith_duncan"&gt;Keith Duncan&lt;/a&gt; pointed out on &lt;a href="http://www.cocoabuilder.com/archive/cocoa/281178-running-nsurlconnection-from-within-an-nsoperation.html"&gt;CocoaBuilder&lt;/a&gt;, this is not optimal and should be avoided.&lt;/p&gt;

&lt;p&gt;So, by creating an NSOperationQueue in your NSOperation subclass and scheduling the delegate callbacks into this queue, we do not need to run the current runloop for the length of the operation and consume a thread. In a nutshell, this is very handy and a much cleaner way to achieve this!&lt;/p&gt;

&lt;p&gt;Here comes the problem: even though everything works perfectly fine on Lion, when performing the very same thing on iOS, the delegate callbacks are never called. It looks like the connection has to be started (and the delegate queue set) on the main queue for the delegate callbacks to happen. This obviously defeats the point of using it within an NSOperation subclass given that since Snow Leopard (and iOS 4.0) the &lt;em&gt;start&lt;/em&gt; method of NSOperation will likely not be called on the main thread.&lt;/p&gt;

&lt;p&gt;For this reason, in my opinion, the &lt;em&gt;setDelegateQueue:&lt;/em&gt; method is unusable as per iOS 5.0 and should be avoided until Apple fixes this problem.&lt;/p&gt;

&lt;p&gt;I have filed a bug at &lt;a href="http://openradar.appspot.com/10529053"&gt;rdar://10529053&lt;/a&gt; and you should dupe it if you observe the same behavior as I do.&lt;/p&gt;

&lt;p&gt;I have created a small sample project to demonstrate the bug that I have attached to the radar. Feel free to run it on your side and see for yourself. You can download it from &lt;a href="/static/media/files/posts/2011/12/BrokenConnection.zip"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/DamienDeVille/~4/GKQN0XzPuW8" height="1" width="1"/&gt;</description>
				
				<dc:creator>Damien DeVille</dc:creator>
				
				<guid isPermaLink="false">http://ddeville.me/2011/12/broken-NSURLConnection-on-ios</guid>
				<pubDate>Thu, 29 Dec 2011 00:00:00 PST</pubDate>
			<feedburner:origLink>http://ddeville.me/2011/12/broken-NSURLConnection-on-ios</feedburner:origLink></item>
		
			<item>
				
				<title>MIME type to UTI and back again in Cocoa</title>
				<link>http://feedproxy.google.com/~r/DamienDeVille/~3/d-A9au9zkpY/mime-to-UTI-cocoa</link>
				
				<description>&lt;p&gt;Often when working with web services in Cocoa, I need to convert between MIME type and Uniform Type Identifier (UTI).&lt;/p&gt;

&lt;p&gt;I have seen many hacky way to do this but, in my opinion, following is the correct way to achieve it.&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;First let's import the appropriate framework based on the platform (you might also need to add the framework to your project if not previously done).&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="objc"&gt;&lt;span class="cp"&gt;#if TARGET_OS_IPHONE&lt;/span&gt;
&lt;span class="cp"&gt;#import &amp;lt;MobileCoreServices/MobileCoreServices.h&amp;gt;&lt;/span&gt;
&lt;span class="cp"&gt;#else&lt;/span&gt;
&lt;span class="cp"&gt;#import &amp;lt;CoreServices/CoreServices.h&amp;gt;&lt;/span&gt;
&lt;span class="cp"&gt;#endif&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;To get the UTI from a MIME type.&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="objc"&gt;&lt;span class="n"&gt;NSURLResponse&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="c1"&gt;// assume a URL response from somewhere else.&lt;/span&gt;
&lt;span class="n"&gt;NSString&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;responseMIMEType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="n"&gt;MIMEType&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="n"&gt;CFStringRef&lt;/span&gt; &lt;span class="n"&gt;MIMEType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__bridge&lt;/span&gt; &lt;span class="n"&gt;CFStringRef&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="n"&gt;MIMEType&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="n"&gt;CFStringRef&lt;/span&gt; &lt;span class="n"&gt;UTI&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;UTTypeCreatePreferredIdentifierForTag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kUTTagClassMIMEType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;MIMEType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;NSString&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;UTIString&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__bridge_transfer&lt;/span&gt; &lt;span class="n"&gt;NSString&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;UTI&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;And to get the MIME type from the UTI.&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="objc"&gt;&lt;span class="n"&gt;NSString&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;filePath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="c1"&gt;// assume the path to a file from somewhere else.&lt;/span&gt;
&lt;span class="n"&gt;CFStringRef&lt;/span&gt; &lt;span class="n"&gt;fileExtension&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__bridge&lt;/span&gt; &lt;span class="n"&gt;CFStringRef&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="n"&gt;filePath&lt;/span&gt; &lt;span class="n"&gt;pathExtension&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="n"&gt;CFStringRef&lt;/span&gt; &lt;span class="n"&gt;UTI&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;UTTypeCreatePreferredIdentifierForTag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kUTTagClassFilenameExtension&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fileExtension&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;CFStringRef&lt;/span&gt; &lt;span class="n"&gt;MIMEType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;UTTypeCopyPreferredTagWithClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;UTI&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kUTTagClassMIMEType&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;CFRelease&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;UTI&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;NSString&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;MIMETypeString&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__bridge_transfer&lt;/span&gt; &lt;span class="n"&gt;NSString&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;MIMEType&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DamienDeVille/~4/d-A9au9zkpY" height="1" width="1"/&gt;</description>
				
				<dc:creator>Damien DeVille</dc:creator>
				
				<guid isPermaLink="false">http://ddeville.me/2011/12/mime-to-UTI-cocoa</guid>
				<pubDate>Wed, 28 Dec 2011 00:00:00 PST</pubDate>
			<feedburner:origLink>http://ddeville.me/2011/12/mime-to-UTI-cocoa</feedburner:origLink></item>
		
			<item>
				
				<title>→ Sophiestication Apps on Sales</title>
				<link>http://feedproxy.google.com/~r/DamienDeVille/~3/UUGihOZJNek/sophiestication-sales</link>
				
				<description>&lt;p&gt;All Sophiestication Software apps are $0.99 for the Christmas period.&lt;/p&gt;

&lt;p&gt;I own all of them and am a big fan of Groceries and Articles for both iPhone and iPad in particular. Go check them out!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/DamienDeVille/~4/UUGihOZJNek" height="1" width="1"/&gt;</description>
				
				<dc:creator>Damien DeVille</dc:creator>
				
				<guid isPermaLink="false">http://ddeville.me/2011/12/sophiestication-sales</guid>
				<pubDate>Thu, 22 Dec 2011 00:00:00 PST</pubDate>
			<feedburner:origLink>http://ddeville.me/2011/12/sophiestication-sales</feedburner:origLink></item>
		
			<item>
				
				<title>→ Updated Realmac Company Page</title>
				<link>http://feedproxy.google.com/~r/DamienDeVille/~3/aeYRspZ_AEE/new-realmac-company-page</link>
				
				<description>&lt;p&gt;Check out the updated company page at &lt;a href="http://www.realmacsoftware.com/company" title="Realmac Software Company Page!"&gt;Realmac Software&lt;/a&gt; and our new avatars!&lt;/p&gt;

&lt;p&gt;&lt;a href="/static/media/images/posts/2011/12/realmac_damien_analog.jpg"&gt;&lt;img src="/static/media/images/posts/2011/12/realmac_damien_analog_thumb.jpg" title="My page on the new Realmac company page, processed with Analog ;)" alt="My page on the new Realmac company page, processed with Analog ;)" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/DamienDeVille/~4/aeYRspZ_AEE" height="1" width="1"/&gt;</description>
				
				<dc:creator>Damien DeVille</dc:creator>
				
				<guid isPermaLink="false">http://ddeville.me/2011/12/new-realmac-company-page</guid>
				<pubDate>Tue, 20 Dec 2011 00:00:00 PST</pubDate>
			<feedburner:origLink>http://ddeville.me/2011/12/new-realmac-company-page</feedburner:origLink></item>
		
			<item>
				
				<title>→ UCL Computer Science Short Courses</title>
				<link>http://feedproxy.google.com/~r/DamienDeVille/~3/FyR_CGu41LE/ucl-cs-short-courses</link>
				
				<description>&lt;p&gt;The UCL Computer Science department has released a list of short courses for the summer of 2012.&lt;/p&gt;

&lt;p&gt;The Time-Series Modelling one looks quite nice (and would remind me of the time when I used to be a student there actually!).
I also like Popular Writing. Many of us can indeed very well write when targeting a technical audience but writing for the general public is definitely another story.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/DamienDeVille/~4/FyR_CGu41LE" height="1" width="1"/&gt;</description>
				
				<dc:creator>Damien DeVille</dc:creator>
				
				<guid isPermaLink="false">http://ddeville.me/2011/12/ucl-cs-short-courses</guid>
				<pubDate>Tue, 06 Dec 2011 00:00:00 PST</pubDate>
			<feedburner:origLink>http://ddeville.me/2011/12/ucl-cs-short-courses</feedburner:origLink></item>
		
			<item>
				
				<title>New Google+ for iOS icon</title>
				<link>http://feedproxy.google.com/~r/DamienDeVille/~3/DwK6JIlkJ00/new_google_plus_for_ios_icon</link>
				
				<description>&lt;p&gt;&lt;a href="/static/media/images/posts/2011/12/google_plus.png"&gt;&lt;img src="/static/media/images/posts/2011/12/google_plus_thumb.png" title="New Goole+ for iOS icon" alt="New Google+ for iOS icon" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Google+ for iOS. Keeping up with good design and inconsistencies.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/DamienDeVille/~4/DwK6JIlkJ00" height="1" width="1"/&gt;</description>
				
				<dc:creator>Damien DeVille</dc:creator>
				
				<guid isPermaLink="false">http://ddeville.me/2011/12/new_google_plus_for_ios_icon</guid>
				<pubDate>Tue, 06 Dec 2011 00:00:00 PST</pubDate>
			<feedburner:origLink>http://ddeville.me/2011/12/new_google_plus_for_ios_icon</feedburner:origLink></item>
		
			<item>
				
				<title>→ Alfred app goes 1.0 on the Mac App Store</title>
				<link>http://feedproxy.google.com/~r/DamienDeVille/~3/weY4rTYaEQs/alfred-app-goes-1</link>
				
				<description>&lt;p&gt;Today, Alfred app version 1.0 has been released on the Mac App Store (it's actually been available to download from their website for a couple of days).&lt;/p&gt;

&lt;p&gt;I love Alfred. I've never been a fan of Quicksilver or LaunchBar, always preferring the simpler Spotlight but Alfred seriously got me!&lt;/p&gt;

&lt;p&gt;Also, if you feel like you want to give some money to the developers, make sure you check &lt;a href="http://www.alfredapp.com/powerpack"&gt;Alfred Powerpack&lt;/a&gt;. Plenty of awesome additions.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/DamienDeVille/~4/weY4rTYaEQs" height="1" width="1"/&gt;</description>
				
				<dc:creator>Damien DeVille</dc:creator>
				
				<guid isPermaLink="false">http://ddeville.me/2011/12/alfred-app-goes-1</guid>
				<pubDate>Tue, 06 Dec 2011 00:00:00 PST</pubDate>
			<feedburner:origLink>http://ddeville.me/2011/12/alfred-app-goes-1</feedburner:origLink></item>
		
			<item>
				
				<title>→ LLVM 3.0 Release Notes</title>
				<link>http://feedproxy.google.com/~r/DamienDeVille/~3/oMv5M1ky5UI/llvm-3-release-notes</link>
				
				<description>&lt;p&gt;Check out the new goodies.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/DamienDeVille/~4/oMv5M1ky5UI" height="1" width="1"/&gt;</description>
				
				<dc:creator>Damien DeVille</dc:creator>
				
				<guid isPermaLink="false">http://ddeville.me/2011/12/llvm-3-release-notes</guid>
				<pubDate>Fri, 02 Dec 2011 00:00:00 PST</pubDate>
			<feedburner:origLink>http://ddeville.me/2011/12/llvm-3-release-notes</feedburner:origLink></item>
		
			<item>
				
				<title>Birds vs Chickens</title>
				<link>http://feedproxy.google.com/~r/DamienDeVille/~3/q3lHfZy2JW4/birds-vs-chickens</link>
				
				<description>&lt;p&gt;&lt;a href="/static/media/images/posts/2011/12/birds_vs_chickens.png"&gt;&lt;img src="/static/media/images/posts/2011/12/birds_vs_chickens_thumb.png" title="Birds vs Chickens" alt="Birds vs Chickens on the App Store" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is getting seriously ridiculous.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/DamienDeVille/~4/q3lHfZy2JW4" height="1" width="1"/&gt;</description>
				
				<dc:creator>Damien DeVille</dc:creator>
				
				<guid isPermaLink="false">http://ddeville.me/2011/12/birds-vs-chickens</guid>
				<pubDate>Thu, 01 Dec 2011 00:00:00 PST</pubDate>
			<feedburner:origLink>http://ddeville.me/2011/12/birds-vs-chickens</feedburner:origLink></item>
		
			<item>
				
				<title>Welcome to the New Way to Navigate Google</title>
				<link>http://feedproxy.google.com/~r/DamienDeVille/~3/KStiDeL6GOM/new-way-to-navigate-google</link>
				
				<description>&lt;p&gt;&lt;a href="/static/media/images/posts/2011/12/google_home_page.png"&gt;&lt;img src="/static/media/images/posts/2011/12/google_home_page_thumb.png" title="Google Home" alt="Google Home" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Not sure I like it.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/DamienDeVille/~4/KStiDeL6GOM" height="1" width="1"/&gt;</description>
				
				<dc:creator>Damien DeVille</dc:creator>
				
				<guid isPermaLink="false">http://ddeville.me/2011/11/new-way-to-navigate-google</guid>
				<pubDate>Wed, 30 Nov 2011 00:00:00 PST</pubDate>
			<feedburner:origLink>http://ddeville.me/2011/11/new-way-to-navigate-google</feedburner:origLink></item>
		
			<item>
				
				<title>→ Analog Update on the Mac App Store</title>
				<link>http://feedproxy.google.com/~r/DamienDeVille/~3/S4w6nsZ8nLI/analog-update-on-the-mas</link>
				
				<description>&lt;p&gt;The 1.01 version of Analog has just been approved this morning and is available on the Mac App Store. Update through the Mac App Store or if you didn't purchase it yet, &lt;a href="http://itunes.apple.com/gb/app/analog/id418343177?mt=12"&gt;go get it&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;&lt;a href="/static/media/images/posts/2011/11/analog_update_app_store.png"&gt;&lt;img src="/static/media/images/posts/2011/11/analog_update_app_store_thumb.png" title="Analog Update" alt="Analog Update" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/DamienDeVille/~4/S4w6nsZ8nLI" height="1" width="1"/&gt;</description>
				
				<dc:creator>Damien DeVille</dc:creator>
				
				<guid isPermaLink="false">http://ddeville.me/2011/11/analog-update-on-the-mas</guid>
				<pubDate>Tue, 01 Nov 2011 00:00:00 PDT</pubDate>
			<feedburner:origLink>http://ddeville.me/2011/11/analog-update-on-the-mas</feedburner:origLink></item>
		
			<item>
				
				<title>→ A Sister's Eulogy for Steve Jobs</title>
				<link>http://feedproxy.google.com/~r/DamienDeVille/~3/fiDCFuiawPM/a-sisters-eulogy-for-steve-jobs</link>
				
				<description>&lt;p&gt;A very poignant article from Mona Simpson, Steve Jobs' sister. Such a touching story, extremely well narrated.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/DamienDeVille/~4/fiDCFuiawPM" height="1" width="1"/&gt;</description>
				
				<dc:creator>Damien DeVille</dc:creator>
				
				<guid isPermaLink="false">http://ddeville.me/2011/10/a-sisters-eulogy-for-steve-jobs</guid>
				<pubDate>Sun, 30 Oct 2011 00:00:00 PDT</pubDate>
			<feedburner:origLink>http://ddeville.me/2011/10/a-sisters-eulogy-for-steve-jobs</feedburner:origLink></item>
		
			<item>
				
				<title>Recursive Blocks in Objective-C</title>
				<link>http://feedproxy.google.com/~r/DamienDeVille/~3/lLJMJUa4mLI/recursive-blocks-objc</link>
				
				<description>&lt;p&gt;Blocks are an awesome feature added to Objective-C with Mac OS X 10.6 and iOS 4.0.&lt;/p&gt;

&lt;p&gt;Most of the Cocoa API now includes block-based alternatives and some new APIs (like the AssetsLibrary framework for example) are only based on blocks. So you do not have a choice anymore, you &lt;em&gt;have to&lt;/em&gt; use blocks.&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;One cool feature that you might run into is recursive blocks. Even if there is in fact no reason why a block could not be recursive, there are a couple of rules to follow. An example of a recursive block would be something like the following:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="objc"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="n"&gt;blocky&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;blocky&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="p"&gt;(){&lt;/span&gt;
    &lt;span class="n"&gt;blocky&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="n"&gt;blocky&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Note that this piece of code has a couple of problems, apart from the fact that it loops forever, but explaining them being the point of this post we will discuss them later (no spoilers!).&lt;/p&gt;

&lt;p&gt;So why would we ever want to use a block recursively? Well, think about a common pattern in Cocoa, particularly in CocoaTouch. You have a UINavigationController on which you push instances of subclasses of UITableViewController in order to display some sort of tree structure of data. This structure will most likely be fetched from Core Data and resides in a single place in your application, probably in the root view controller of your navigation controller.&lt;/p&gt;

&lt;p&gt;Now suppose that each of these instances of (subclasses of) UITableViewController has to perform a specific action when one of its cells is clicked. It could be modifying the cell, pushing a new UITableViewController on the navigation stack or even do nothing. Since, as we have seen, the whole data structures would be owned by a single object (the root view controller), you do not really want controller down the stack to have to decide what to do with this data. You would rather have the root view controller, that actually manages the data, react to events down the chain.&lt;/p&gt;

&lt;p&gt;You could have a simple protocol in your UITableViewController subclass that the root view controller would conform to but you would end up with your logic for cell selection handling residing in two spots: in the table view cell selection callback in your root view controller and in the table view controller subclass delegate methods in this very same root view controller.&lt;/p&gt;

&lt;p&gt;So why not having a block that handles the cell selection in the root view controller and passing this block down the stack. Once a cell down the navigation controller is clicked, the controller subclass simply invokes that block and the root view controller will perform anything it has to do at that stage.&lt;/p&gt;

&lt;p&gt;So let's write some (pseudo)code. First, assume that we will use the same subclass of UITableViewController for any level of navigation down the stack. At the end, it probably will display the same kind of data so why create a custom subclass for each level of navigation. We will also have a simple class representing a data object to be displayed. Think about it as the data backing up the content of your cells. These objects are probably organized in an NSArray that itself resides in the root view controller. Each data object has a children array containing other data objects further down in the data hierarchy.&lt;/p&gt;

&lt;p&gt;First the very elementary MyDataObject class:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="objc"&gt;&lt;span class="k"&gt;@interface&lt;/span&gt; &lt;span class="nc"&gt;MyDataObject&lt;/span&gt; : &lt;span class="nc"&gt;NSObject&lt;/span&gt;

&lt;span class="k"&gt;@property&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strong&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;NSArray&lt;/span&gt; &lt;span class="n"&gt;children&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;@end&lt;/span&gt;

&lt;span class="k"&gt;@implementation&lt;/span&gt; &lt;span class="nc"&gt;MyDataObject&lt;/span&gt;

&lt;span class="k"&gt;@synthesize&lt;/span&gt; &lt;span class="n"&gt;children&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_children&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;@end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Next, the UITableViewController subclass used to manage the table view used to display content down the navigation stack:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="objc"&gt;&lt;span class="k"&gt;typedef&lt;/span&gt; &lt;span class="nf"&gt;void&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="n"&gt;CellSelectionHandlerBlock&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="n"&gt;MyDataObject&lt;/span&gt; &lt;span class="n"&gt;clickedItem&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;@interface&lt;/span&gt; &lt;span class="nc"&gt;MyTableViewControllerSubclass&lt;/span&gt; : &lt;span class="nc"&gt;UITableViewController&lt;/span&gt;

&lt;span class="k"&gt;@property&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strong&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;MyDataObject&lt;/span&gt; &lt;span class="n"&gt;dataObject&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@property&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;CellSelectionHandlerBlock&lt;/span&gt; &lt;span class="n"&gt;selectionHandlerBlock&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;@end&lt;/span&gt;

&lt;span class="k"&gt;@implementation&lt;/span&gt; &lt;span class="nc"&gt;MyTableViewControllerSubclass&lt;/span&gt;

&lt;span class="k"&gt;@synthesize&lt;/span&gt; &lt;span class="n"&gt;dataObject&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_dataObject&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@synthesize&lt;/span&gt; &lt;span class="n"&gt;selectionHandlerBlock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_selectionHandlerBlock&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;tableView:&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;UITableView&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;tableView&lt;/span&gt; &lt;span class="nf"&gt;didSelectRowAtIndexPath:&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NSIndexPath&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;indexPath&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_selectionHandlerBlock&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;MyDataObject&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;clickedDataObject&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[[[&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt; &lt;span class="n"&gt;dataObject&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;children&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="nl"&gt;objectAtIndex:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;indexPath&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;]];&lt;/span&gt;
        &lt;span class="n"&gt;_selectionHandlerBlock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;clickedDataObject&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// some other methods, in particular UITableView dataSource and delegate&lt;/span&gt;

&lt;span class="k"&gt;@end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;And finally the root view controller, itself a subclass of UITableViewController, that manages the table view used at the first level of hierarchy. It also manages the data objects and handle the cell selection in both its own table view and down the stack:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="objc"&gt;&lt;span class="k"&gt;@interface&lt;/span&gt; &lt;span class="nc"&gt;MyRootTableViewController&lt;/span&gt; : &lt;span class="nc"&gt;UITableViewController&lt;/span&gt;

&lt;span class="k"&gt;@property&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strong&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;NSArray&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;dataObjects&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;@end&lt;/span&gt;

&lt;span class="k"&gt;@implementation&lt;/span&gt; &lt;span class="nc"&gt;MyRootTableViewController&lt;/span&gt;

&lt;span class="k"&gt;@synthesize&lt;/span&gt; &lt;span class="n"&gt;dataObjects&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_dataObjects&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;tableView:&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;UITableView&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;tableView&lt;/span&gt; &lt;span class="nf"&gt;didSelectRowAtIndexPath:&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NSIndexPath&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;indexPath&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;CellSelectionHandlerBlock&lt;/span&gt; &lt;span class="n"&gt;selectionHandlerBlock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;selectionHandlerBlock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MyDataObject&lt;/span&gt; &lt;span class="n"&gt;clickedItem&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;([[&lt;/span&gt;&lt;span class="n"&gt;clickedItem&lt;/span&gt; &lt;span class="n"&gt;children&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;MyTableViewControllerSubclass&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;viewController&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;MyTableViewControllerSubclass&lt;/span&gt; &lt;span class="n"&gt;alloc&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;init&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
            &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;viewController&lt;/span&gt; &lt;span class="nl"&gt;setDataObject:&lt;/span&gt; &lt;span class="n"&gt;clickedItem&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
            &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;viewController&lt;/span&gt; &lt;span class="nl"&gt;setSelectionHandlerBlock:&lt;/span&gt; &lt;span class="n"&gt;selectionHandlerBlock&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt; &lt;span class="n"&gt;navigationController&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="nl"&gt;pushViewController:&lt;/span&gt; &lt;span class="n"&gt;viewController&lt;/span&gt; &lt;span class="nl"&gt;animated:&lt;/span&gt; &lt;span class="n"&gt;YES&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;NSLog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;@&amp;quot;Do some funky stuff with the cell!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="c1"&gt;// like presenting a modal view controller with some content.&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    
    &lt;span class="n"&gt;MyDataObject&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;dataObject&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt; &lt;span class="n"&gt;dataObjects&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="nl"&gt;objectAtIndex:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;indexPath&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;]];&lt;/span&gt;
    &lt;span class="n"&gt;selectionHandlerBlock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataObject&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// some other methods, in particular UITableView dataSource and delegate&lt;/span&gt;

&lt;span class="k"&gt;@end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;So as you can see, we only need to write the selection handling code once. In function of the data object underlying the clicked cell, the root view controller create a new MyTableViewControllerSubclass with the appropriate data object and pass the selection handler block to it. Whenever a cell is clicked in a view controller down the stack, we first retrieve the data object corresponding to the clicked cell and invoke the block.&lt;/p&gt;

&lt;p&gt;Also, every time a table view cell is clicked in the root view controller itself, the very same block is invoked.&lt;/p&gt;

&lt;p&gt;However, this piece of code creating the block is wrong for two reasons that I am going to explain. As you can see, the block is recursively called inside the block itself. In order to explain the problems with the current approach, let's get back to our simpler &lt;em&gt;blocky&lt;/em&gt; example.&lt;br/&gt;
In this example, a block is created and then called inside the content of the block creating infinite recursion. Leaving aside the infinite part here, this piece of code would crash on the first recursive call. To understand why, let's first discuss how a block treats its enclosing scope variables. Consider the following example:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="objc"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;NSLog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;@&amp;quot;i = %i&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This piece of code would correctly print &lt;em&gt;i = 1&lt;/em&gt; but would crash on the second line &lt;em&gt;i++&lt;/em&gt;. The reason is that the block captures local variables in its scope and treat them as constant.&lt;br/&gt;
In the case of Objective-C objects, captured objects are retained (and automatically released when the block goes away).&lt;br/&gt;
Blocks are actually Objective-C objects themselves. When first created, a block lives on the stack. If you intend to use the block beyond the current scope, you need to copy it to the heap. Once the block has been copied to the heap, it can be retained and released as a regular object (it does not make sense to retain a stack-based block though).&lt;br/&gt;
In order for a block to change its enclosing scope, we can use the __block storage type. Consider the following example:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="objc"&gt;&lt;span class="n"&gt;__block&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;NSLog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;@&amp;quot;i = %i&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;NSLog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;@&amp;quot;i = %i&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;In this case, the program will run correctly and print &lt;em&gt;i = 1&lt;/em&gt; and &lt;em&gt;i = 2&lt;/em&gt;. The block was able to modify the variable in its enclosing scope. Also note that __block captured objects are not retained.&lt;/p&gt;

&lt;p&gt;So coming back to our &lt;em&gt;blocky&lt;/em&gt; example, we now understands better why the crash is occurring. Since the block itself is invoked inside the block, it is const copied even before the assignment occurs. We can fix this by rewriting the program as:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="objc"&gt;&lt;span class="n"&gt;__block&lt;/span&gt; &lt;span class="nf"&gt;void&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="n"&gt;blocky&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;blocky&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="p"&gt;(){&lt;/span&gt;
    &lt;span class="n"&gt;blocky&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="n"&gt;blocky&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Similarly, in our navigation controller example, we would have to rewrite:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="objc"&gt;&lt;span class="n"&gt;__block&lt;/span&gt; &lt;span class="n"&gt;CellSelectionHandlerBlock&lt;/span&gt; &lt;span class="n"&gt;selectionHandlerBlock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;selectionHandlerBlock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MyDataObject&lt;/span&gt; &lt;span class="n"&gt;clickedItem&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;So far so good, and to be honest, during my testing, I did not have to do anything else for this to run perfectly in Debug mode. However, the first time I ran it in Release mode, my program crashed on the block invocation. It took me a while to understand what was going on until I realized that there was a small problem here.&lt;br/&gt;
I was reusing my block outside the current scope and even copied it later on (when passed to another objects).&lt;br/&gt;
If you think about it, the first block that is assigned to the __block type variable is a stack-based block. The block that is called inside the block is this very same stack-based block.&lt;br/&gt;
When the block is moved to the heap, captured variable are moved to the heap too. So our block variable is moved to the heap once the block is copied so we need to make sure that the reference variable points to the copy of the block and not the original stack-based one.&lt;/p&gt;

&lt;p&gt;The solution to this problem is to copy the block while creating it and assign this copied version to our __block variable:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="objc"&gt;&lt;span class="n"&gt;__block&lt;/span&gt; &lt;span class="nf"&gt;void&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="n"&gt;blocky&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;blocky&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="p"&gt;(){&lt;/span&gt;
    &lt;span class="n"&gt;blocky&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="n"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="n"&gt;blocky&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;I have no idea why this was not crashing in Debug.&lt;/p&gt;

&lt;p&gt;Blocks are very handy but are a tricky concept to grasp at first. However, there are a very powerful tool and I can only tell you that once you go block you never go bock (sorry, that was lame).&lt;/p&gt;

&lt;p&gt;I definitely recommend the following articles and books to learn more:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://twitter.com/nevyn"&gt;Joachim Bengtsson&lt;/a&gt; - &lt;a href="http://thirdcog.eu/pwcblocks/"&gt;Programming with C Blocks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/bbum"&gt;Bill Bumgarner&lt;/a&gt; - &lt;a href="http://www.friday.com/bbum/2009/08/29/blocks-tips-tricks/"&gt;^ Blocks Tips &amp;amp; Tricks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/borkware"&gt;Mark Dalrymple&lt;/a&gt; - &lt;a href="http://www.amazon.co.uk/Advanced-Mac-OSX-Programming-Guides/dp/0321706250/ref=sr_1_1?ie=UTF8&amp;amp;qid=1319917894&amp;amp;sr=8-1"&gt;Advanced Mac OS X Programming&lt;/a&gt; chapter 3 "Blocks"&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/DamienDeVille/~4/lLJMJUa4mLI" height="1" width="1"/&gt;</description>
				
				<dc:creator>Damien DeVille</dc:creator>
				
				<guid isPermaLink="false">http://ddeville.me/2011/10/recursive-blocks-objc</guid>
				<pubDate>Sat, 29 Oct 2011 00:00:00 PDT</pubDate>
			<feedburner:origLink>http://ddeville.me/2011/10/recursive-blocks-objc</feedburner:origLink></item>
		
			<item>
				
				<title>Moving to Jekyll</title>
				<link>http://feedproxy.google.com/~r/DamienDeVille/~3/NIp348sTrhQ/moving-to-jekyll</link>
				
				<description>&lt;p&gt;I haven't had much time to blog about it since I made the switch but you might have noticed the new feel and look of my site!&lt;/p&gt;

&lt;p&gt;I have moved away from WordPress for various reasons but mainly because I really did not like the idea of having my content living in a database. Also, I wanted to code the CSS myself and did not particularly want to go through the whole WP theme stuff.&lt;/p&gt;

&lt;p&gt;So, the story in a nutshell, I am now generating a static version of this site with &lt;a href="https://github.com/mojombo/jekyll"&gt;Jekyll&lt;/a&gt;. I write all the posts and bits in Markdown that I store as plain text files. I have written all the CSS using &lt;a href="http://sass-lang.com/"&gt;Sass&lt;/a&gt; (highly recommended by the way). I store my media files on Amazon S3 that I access with Amazon Cloud Front. I use &lt;a href="https://typekit.com"&gt;TypeKit&lt;/a&gt; for serving and managing the fonts and the &lt;a href="http://www.mathjax.org/"&gt;MathJax&lt;/a&gt; JavaScript display engine for rendering the mathematics formulae written with LaTeX. I am also using &lt;a href="http://disqus.com"&gt;DISQUS&lt;/a&gt; for the comments on the posts.&lt;/p&gt;

&lt;p&gt;I use quite a few new goodies of HTML 5 and CSS 3 so the site will render best on WebKit and fairly alright in Firefox. I checked that the site looked ok on the latest version of IE but I have no idea how it does on former versions. But frankly, I don't even give a rat's ass!&lt;/p&gt;

&lt;p&gt;I am very happy with the look of the site on a desktop browser and Safari on the iPad (and I guess this applies to all tablet even though I haven't tested it). However, I still will have to write a mobile stylesheet for the iPhone (and other smartphones).&lt;/p&gt;

&lt;p&gt;The very cool stuff is that I can now version control my entire website.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/DamienDeVille/~4/NIp348sTrhQ" height="1" width="1"/&gt;</description>
				
				<dc:creator>Damien DeVille</dc:creator>
				
				<guid isPermaLink="false">http://ddeville.me/2011/10/moving-to-jekyll</guid>
				<pubDate>Fri, 28 Oct 2011 00:00:00 PDT</pubDate>
			<feedburner:origLink>http://ddeville.me/2011/10/moving-to-jekyll</feedburner:origLink></item>
		
			<item>
				
				<title>Norman's Dream Device</title>
				<link>http://feedproxy.google.com/~r/DamienDeVille/~3/4uzxuGfin9k/normans-dream-device</link>
				
				<description>&lt;p&gt;Donald A. Norman in &lt;em&gt;The Design of Everyday Things&lt;/em&gt;, 1988:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Would you like a pocket-size device that reminded you of each appointment and daily event? I would. I am waiting for the day when portable computers become small enough that I can keep one with me at all times. I will definitely put all my reminding burdens upon it. It has to be small. It has to be convenient to use. And it has to be relatively powerful, at least at today's standards. It has to have a full, standard typewriter keyboard and a reasonably large display. It needs good graphics, because that makes a tremendous difference in usability, and a lot of memory - a huge amount actually. And it should be easy to hook up to the telephone; I need to connect it to my home and laboratory computers. Of course, it should be relatively inexpensive.&lt;/p&gt;

&lt;p&gt;What I ask for is not unreasonable. The technology I need is available today. It's just that the full package has never been put together, partly because the cost in today's world would be prohibitive. But it will exist in imperfect form in five years, possibly in perfect form in ten.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;In my opinion, even if PDAs have existed for quite a long time, almost 30 years later, the first device that actually meets every criteria mentioned by Norman (apart from the cost maybe) is the iPhone.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/DamienDeVille/~4/4uzxuGfin9k" height="1" width="1"/&gt;</description>
				
				<dc:creator>Damien DeVille</dc:creator>
				
				<guid isPermaLink="false">http://ddeville.me/2011/10/normans-dream-device</guid>
				<pubDate>Thu, 27 Oct 2011 00:00:00 PDT</pubDate>
			<feedburner:origLink>http://ddeville.me/2011/10/normans-dream-device</feedburner:origLink></item>
		
	</channel>
</rss>
