<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Deeper Design</title>
	<atom:link href="http://deeperdesign.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://deeperdesign.wordpress.com</link>
	<description>Almost but not quite, entirely unlike tea.</description>
	<lastBuildDate>Thu, 12 Jan 2012 04:42:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='deeperdesign.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://0.gravatar.com/blavatar/08d7e437e42e10829f6084b42966257d?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>Deeper Design</title>
		<link>http://deeperdesign.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://deeperdesign.wordpress.com/osd.xml" title="Deeper Design" />
	<atom:link rel='hub' href='http://deeperdesign.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Software that doesn&#8217;t work with Mac OS X Lion</title>
		<link>http://deeperdesign.wordpress.com/2011/07/23/software-that-doesnt-work-with-mac-os-x-lion/</link>
		<comments>http://deeperdesign.wordpress.com/2011/07/23/software-that-doesnt-work-with-mac-os-x-lion/#comments</comments>
		<pubDate>Sat, 23 Jul 2011 04:34:52 +0000</pubDate>
		<dc:creator>orj</dc:creator>
				<category><![CDATA[Computing]]></category>
		<category><![CDATA[lion]]></category>
		<category><![CDATA[macosx]]></category>

		<guid isPermaLink="false">http://deeperdesign.wordpress.com/?p=748</guid>
		<description><![CDATA[Since upgrading to Mac OS X Lion I&#8217;ve found the following software on my System that no longer works. Games &#38; apps that require Rosetta (PowerPC compatibility) Age of Empires 2 Gold Baldur&#8217;s Gate 2 Diablo 2 DooM Legacy Railroad &#8230; <a href="http://deeperdesign.wordpress.com/2011/07/23/software-that-doesnt-work-with-mac-os-x-lion/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=deeperdesign.wordpress.com&amp;blog=2974760&amp;post=748&amp;subd=deeperdesign&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Since upgrading to Mac OS X Lion I&#8217;ve found the following software on my System that no longer works.</p>
<p><strong>Games &amp; apps that require Rosetta (PowerPC compatibility)</strong></p>
<ul>
<li>Age of Empires 2 Gold</li>
<li>Baldur&#8217;s Gate 2</li>
<li>Diablo 2</li>
<li>DooM Legacy</li>
<li>Railroad Tycoon 3</li>
<li>Starcraft</li>
</ul>
<p><strong>Games and apps that crash on start</strong></p>
<ul>
<li>The Dig</li>
<li>Indiana Jones and the Last Crusade</li>
<li>Guitar Rig 4 64bit (patch expected soon)</li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/deeperdesign.wordpress.com/748/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/deeperdesign.wordpress.com/748/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/deeperdesign.wordpress.com/748/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/deeperdesign.wordpress.com/748/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/deeperdesign.wordpress.com/748/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/deeperdesign.wordpress.com/748/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/deeperdesign.wordpress.com/748/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/deeperdesign.wordpress.com/748/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/deeperdesign.wordpress.com/748/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/deeperdesign.wordpress.com/748/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/deeperdesign.wordpress.com/748/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/deeperdesign.wordpress.com/748/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/deeperdesign.wordpress.com/748/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/deeperdesign.wordpress.com/748/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=deeperdesign.wordpress.com&amp;blog=2974760&amp;post=748&amp;subd=deeperdesign&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://deeperdesign.wordpress.com/2011/07/23/software-that-doesnt-work-with-mac-os-x-lion/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b44b790518c1bae919fcc1cf3e59e3b5?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">orj</media:title>
		</media:content>
	</item>
		<item>
		<title>Even more Cocoaheads Presentations</title>
		<link>http://deeperdesign.wordpress.com/2011/07/12/even-more-cocoaheads-presentations/</link>
		<comments>http://deeperdesign.wordpress.com/2011/07/12/even-more-cocoaheads-presentations/#comments</comments>
		<pubDate>Tue, 12 Jul 2011 17:41:54 +0000</pubDate>
		<dc:creator>orj</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[presentation]]></category>

		<guid isPermaLink="false">http://deeperdesign.wordpress.com/?p=739</guid>
		<description><![CDATA[I&#8217;ve continued my journey with Final Cut Pro X and created more videos from talks done at the June Melbourne Cocoaheads meetup. These videos are now up on the Melbourne Cocoaheads Vimeo group (and embedded below). David Kennedy &#38; Scott &#8230; <a href="http://deeperdesign.wordpress.com/2011/07/12/even-more-cocoaheads-presentations/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=deeperdesign.wordpress.com&amp;blog=2974760&amp;post=739&amp;subd=deeperdesign&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve continued my journey with Final Cut Pro X and created more videos from talks done at the June <a href="http://melbournecocoaheads.com">Melbourne Cocoaheads</a> meetup. These videos are now up on the <a href="http://www.vimeo.com/groups/melbournecocoaheads">Melbourne Cocoaheads Vimeo group</a> (and embedded below).</p>
<p><strong>David Kennedy &amp; Scott Manley of <a href="dangerouspixels.com.au">Dangerous Pixels</a> speak about building their iOS app development consultancy and their application Task Caddy.<br />
</strong><br />
<div class='embed-vimeo' style='text-align:center;'><iframe src='http://player.vimeo.com/video/26285004' width='640' height='360' frameborder='0'></iframe></div></p>
<p>You can find a wrap-up from the Dangerous Pixel guys, with links, slides and other resources over <a href="http://blog.dangerouspixels.com.au/post/6610032579/melbourne-cocoaheads-wrap-up">on their blog.</a></p>
<p><strong>Luke Cunningham &amp; Jesse Collis on &#8220;Epic Refactorings and Patterns to Make Your Code Awesome&#8221;.<br />
</strong><br />
<div class='embed-vimeo' style='text-align:center;'><iframe src='http://player.vimeo.com/video/26116975' width='640' height='360' frameborder='0'></iframe></div></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/deeperdesign.wordpress.com/739/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/deeperdesign.wordpress.com/739/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/deeperdesign.wordpress.com/739/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/deeperdesign.wordpress.com/739/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/deeperdesign.wordpress.com/739/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/deeperdesign.wordpress.com/739/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/deeperdesign.wordpress.com/739/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/deeperdesign.wordpress.com/739/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/deeperdesign.wordpress.com/739/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/deeperdesign.wordpress.com/739/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/deeperdesign.wordpress.com/739/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/deeperdesign.wordpress.com/739/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/deeperdesign.wordpress.com/739/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/deeperdesign.wordpress.com/739/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=deeperdesign.wordpress.com&amp;blog=2974760&amp;post=739&amp;subd=deeperdesign&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://deeperdesign.wordpress.com/2011/07/12/even-more-cocoaheads-presentations/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b44b790518c1bae919fcc1cf3e59e3b5?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">orj</media:title>
		</media:content>
	</item>
		<item>
		<title>More Melbourne Cocoaheads Presentation Videos</title>
		<link>http://deeperdesign.wordpress.com/2011/07/02/more-melbourne-cocoaheads-presentation-videos/</link>
		<comments>http://deeperdesign.wordpress.com/2011/07/02/more-melbourne-cocoaheads-presentation-videos/#comments</comments>
		<pubDate>Sat, 02 Jul 2011 07:24:23 +0000</pubDate>
		<dc:creator>orj</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://deeperdesign.wordpress.com/?p=722</guid>
		<description><![CDATA[I&#8217;ve been getting busy with Final Cut Pro X and created more videos from talks done at our local Cocoaheads meetups. These videos are now up on the Melbourne Cocoaheads Vimeo group (and embedded below).<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=deeperdesign.wordpress.com&amp;blog=2974760&amp;post=722&amp;subd=deeperdesign&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been getting busy with Final Cut Pro X and created more videos from talks done at our local Cocoaheads meetups.  These videos are now up on the <a href="http://vimeo.com/groups/melbournecocoaheads">Melbourne Cocoaheads Vimeo group</a> (and embedded below).</p>
<p><div class='embed-vimeo' style='text-align:center;'><iframe src='http://player.vimeo.com/video/25513227' width='640' height='360' frameborder='0'></iframe></div><br />
<div class='embed-vimeo' style='text-align:center;'><iframe src='http://player.vimeo.com/video/25589960' width='640' height='360' frameborder='0'></iframe></div></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/deeperdesign.wordpress.com/722/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/deeperdesign.wordpress.com/722/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/deeperdesign.wordpress.com/722/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/deeperdesign.wordpress.com/722/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/deeperdesign.wordpress.com/722/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/deeperdesign.wordpress.com/722/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/deeperdesign.wordpress.com/722/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/deeperdesign.wordpress.com/722/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/deeperdesign.wordpress.com/722/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/deeperdesign.wordpress.com/722/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/deeperdesign.wordpress.com/722/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/deeperdesign.wordpress.com/722/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/deeperdesign.wordpress.com/722/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/deeperdesign.wordpress.com/722/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=deeperdesign.wordpress.com&amp;blog=2974760&amp;post=722&amp;subd=deeperdesign&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://deeperdesign.wordpress.com/2011/07/02/more-melbourne-cocoaheads-presentation-videos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b44b790518c1bae919fcc1cf3e59e3b5?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">orj</media:title>
		</media:content>
	</item>
		<item>
		<title>What&#8217;s wrong with this macro?</title>
		<link>http://deeperdesign.wordpress.com/2011/06/28/whats-wrong-with-this-macro/</link>
		<comments>http://deeperdesign.wordpress.com/2011/06/28/whats-wrong-with-this-macro/#comments</comments>
		<pubDate>Tue, 28 Jun 2011 07:26:56 +0000</pubDate>
		<dc:creator>orj</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://deeperdesign.wordpress.com/?p=716</guid>
		<description><![CDATA[What is wrong with this Objective-C (and C/C++) macro? #define RETAIN_PROPERTY(propertyName, newValue) \ do { \ if (propertyName##_ != newValue) \ { \ [newValue retain]; \ [propertyName##_ release]; \ propertyName##_ = newValue; \ } \ } while(0) Looks pretty benign &#8230; <a href="http://deeperdesign.wordpress.com/2011/06/28/whats-wrong-with-this-macro/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=deeperdesign.wordpress.com&amp;blog=2974760&amp;post=716&amp;subd=deeperdesign&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>What is wrong with this Objective-C (and C/C++) macro?</p>
<pre><code>
#define RETAIN_PROPERTY(propertyName, newValue) \
    do { \
        if (propertyName##_ != newValue) \
        { \
            [newValue retain]; \
            [propertyName##_ release]; \
            propertyName##_ = newValue; \
        } \
    } while(0)
</code></pre>
<p>Looks pretty benign right?  Well it is when you call it like this:</p>
<pre><code>
id n = [NSNumber numberWithInt:10];
RETAIN_PROPERTY(propName, n);
</code></pre>
<p>But what happens when you do this:</p>
<pre><code>
RETAIN_PROPERTY(propName, [NSNumber numberWIthInt:10]);
</code></pre>
<p>Well macros are just that, macros. They generate code. They substitute the <b>text</b> of the macro parameters and emit the body into your source.  Unlike methods or functions, they do <b>not</b> evaluate their parameters before passing the result to the macro.  So the macro above when called the second way will produce the following code:</p>
<pre><code>
    do {
        if (propName_ != [NSNumber numberWIthInt:10])
        {
            [[NSNumber numberWIthInt:10] retain];
            [propName_ release];
            propName_ = [NSNumber numberWIthInt:10];
        }
    } while(0);
</code></pre>
<p>Not quite what we wanted right.  We&#8217;re leaking an NSNumber instance and creating two which are auto-released and we&#8217;ll probably have a zombie object stored in propName_ after the auto-release pool is drained.  A nice confusing bug for us to stumble upon.</p>
<p>So how do we fix this?</p>
<p>Like so:</p>
<pre><code>
#define RETAIN_PROPERTY(propertyName, newValue) \
    do { \
        __typeof__(newValue) __A = (newValue); \
        if (propertyName##_ != __A) \
        { \
            [__A retain]; \
            [propertyName##_ release]; \
            propertyName##_ = __A; \
        } \
    } while(0)
</code></pre>
<p>The line <code>__typeof__(newValue) __A = (newValue);</code> forces the passed parameter to be evaluated and a result stored in the temporary <code>__A</code>.  We can then use the temporary variable multiple times within the macro body without fear.</p>
<p>Bug fixed and we can get back to being productive coders.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/deeperdesign.wordpress.com/716/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/deeperdesign.wordpress.com/716/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/deeperdesign.wordpress.com/716/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/deeperdesign.wordpress.com/716/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/deeperdesign.wordpress.com/716/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/deeperdesign.wordpress.com/716/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/deeperdesign.wordpress.com/716/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/deeperdesign.wordpress.com/716/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/deeperdesign.wordpress.com/716/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/deeperdesign.wordpress.com/716/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/deeperdesign.wordpress.com/716/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/deeperdesign.wordpress.com/716/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/deeperdesign.wordpress.com/716/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/deeperdesign.wordpress.com/716/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=deeperdesign.wordpress.com&amp;blog=2974760&amp;post=716&amp;subd=deeperdesign&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://deeperdesign.wordpress.com/2011/06/28/whats-wrong-with-this-macro/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b44b790518c1bae919fcc1cf3e59e3b5?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">orj</media:title>
		</media:content>
	</item>
		<item>
		<title>Cancellable asynchronous searching with UISearchDisplayController</title>
		<link>http://deeperdesign.wordpress.com/2011/05/30/cancellable-asynchronous-searching-with-uisearchdisplaycontroller/</link>
		<comments>http://deeperdesign.wordpress.com/2011/05/30/cancellable-asynchronous-searching-with-uisearchdisplaycontroller/#comments</comments>
		<pubDate>Mon, 30 May 2011 08:15:52 +0000</pubDate>
		<dc:creator>orj</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://deeperdesign.wordpress.com/?p=699</guid>
		<description><![CDATA[Apple&#8217;s UISearchDisplayController is a handy wrapper around searching for UITableViewControllers. UISearchDisplayController will send its delegate the following message whenever a user types something into the search bar: - (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString It is in this method that the delegate &#8230; <a href="http://deeperdesign.wordpress.com/2011/05/30/cancellable-asynchronous-searching-with-uisearchdisplaycontroller/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=deeperdesign.wordpress.com&amp;blog=2974760&amp;post=699&amp;subd=deeperdesign&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Apple&#8217;s UISearchDisplayController is a handy wrapper around searching for UITableViewControllers.  UISearchDisplayController will send its delegate the following message whenever a user types something into the search bar:<br />
<code>
<pre>
 - (BOOL)searchDisplayController:(UISearchDisplayController *)controller
shouldReloadTableForSearchString:(NSString *)searchString
</pre>
<p></code></p>
<p>It is in this method that the delegate should perform a search of its data and based on whether the search results have or would change return the value YES or NO.</p>
<p>This all works fine and dandy when the objects to search are in memory and the delegate method executs promptly.  If this is not the case then the UI will block while the search logic is performed.  This can create significant lag in the user interface as the user is typing into the search field.</p>
<p>In the iOS API documentation for searchDisplayController:shouldReloadTableForSearchString: Apple provides a hint about performing search work in the background but doesn&#8217;t really go into any detail.  The docs say:</p>
<blockquote><p>
You might implement this method if you want to perform an asynchronous search. You would initiate the search in this method, then return NO. You would reload the table when you have results.
</p></blockquote>
<p>An approach to doing an asynchronous search might be something like this:</p>
<p><code></p>
<pre>
@interface MyUISearchDisplayDelegate ()
@property (nonatomic, retain) NSOperationQueue *searchQueue;
@property (nonatomic, retain) NSArray *searchResults;
@end

@implementation MyUISearchDisplayDelegate
@synthesize searchQueue, searchResults;

- (id)init
{
    if ((self = [super init]))
    {
        self.searchResults = [NSMutableArray array];
        self.searchQueue = [[NSOperationQueue new] autorelease];
        [self.searchQueue setMaxConcurrentOperationCount:1];
    }

    return self;
}

- (void)dealloc
{
    self.searchResults = nil;
    self.searchQueue = nil;

    [super dealloc];
}

// ...

 - (BOOL)searchDisplayController:(UISearchDisplayController *)controller
shouldReloadTableForSearchString:(NSString *)searchString
{
   if  ([searchString isEqualToString:@""] == NO)
    {
        [self.searchQueue addOperationWithBlock:^{

            NSArray *results = // fetch the results from
                // somewhere (that can take a while to do)

            // Ensure you're assigning to a local variable here.
            // Do not assign to a member variable.  You will get
            // occasional thread race condition related crashes
            // if you do.            

            [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                // Modify your instance variables here on the main
                // UI thread.
                [self.searchResults removeAllObjects];
                [self.searchResults addObjectsFromArray:results];

                // Reload your search results table data.
                [controller.searchResultsTableView reloadData];
            }];
        }];

        return NO;
    }
    else
    {
        [self.searchResults removeAllObjects];
        return YES;
    }
}
</pre>
<p></code></p>
<p>This implementation gets you some of the way there. The problem with it however is that as the user interacts with the UISearchBar the searchString changes and with each character typed another invocation of searchDisplayController:shouldReloadTableForSearchString: is performed.  This causes lots of work to be enqueued into the NSOperationQueue.  Work that must get executed in sequence.  </p>
<p>This is not ideal.  The user is only interested in the most recent search string that they have entered.  If they enter the string &#8220;fubar&#8221; into the UISearchBar they don&#8217;t care about the searches for f, fu, fub, and fuba.</p>
<p>OK.  So how do you properly implement this?  Well, it is surprisingly easy.  Just cancel all the existing operations in the NSOperationQueue before adding your latest search operation to the queue.<br />
<code>
<pre>
     [self.searchQueue cancelAllOperations];
</pre>
<p></code></p>
<p>Any yet to execute operations will be cancelled and never execute.  Any presently executing operation will run to completion.  In a more complex situation, perhaps with a multistep NSOperation, (where you were using a custom subclass of NSOperation or something) you could check for isCanceled on NSOperaton instance and bail out of your operation early.  I&#8217;ll leave that up to you to figure out.</p>
<p>So, with this change the code becomes:</p>
<p><code>
<pre>
 - (BOOL)searchDisplayController:(UISearchDisplayController *)controller
shouldReloadTableForSearchString:(NSString *)searchString
{
   if  ([searchString isEqualToString:@""] == NO)
    {
        [self.searchQueue cancelAllOperations];
        [self.searchQueue addOperationWithBlock:^{

            NSArray *results = // fetch the results from
              // somewhere (that can take a while to do)

            // Ensure you're assigning to a local variable here.
            // Do not assign to a member variable.  You will get
            // occasional thread race condition related crashes
            // if you do.            

            [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                // Modify your instance variables here on the main
                // UI thread.
                [self.searchResults removeAllObjects];
                [self.searchResults addObjectsFromArray:results];

                // Reload your search results table data.
                [controller.searchResultsTableView reloadData];
            }];
        }];

        return NO;
    }
    else
    {
        [self.searchResults removeAllObjects];
        return YES;
    }
}
</pre>
<p></code></p>
<p>One final little thing, it is probably a good idea to cancel any pending operations when the user dismisses the search UI.</p>
<p><code>
<pre>
- (void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller
{
    [self.searchQueue cancelAllOperations];
}
</pre>
<p></code></p>
<p>You may wish to cancel any pending operations in other delegate methods too.  Such as tableView:didSelectRowAtIndexPath: for example.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/deeperdesign.wordpress.com/699/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/deeperdesign.wordpress.com/699/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/deeperdesign.wordpress.com/699/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/deeperdesign.wordpress.com/699/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/deeperdesign.wordpress.com/699/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/deeperdesign.wordpress.com/699/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/deeperdesign.wordpress.com/699/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/deeperdesign.wordpress.com/699/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/deeperdesign.wordpress.com/699/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/deeperdesign.wordpress.com/699/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/deeperdesign.wordpress.com/699/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/deeperdesign.wordpress.com/699/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/deeperdesign.wordpress.com/699/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/deeperdesign.wordpress.com/699/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=deeperdesign.wordpress.com&amp;blog=2974760&amp;post=699&amp;subd=deeperdesign&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://deeperdesign.wordpress.com/2011/05/30/cancellable-asynchronous-searching-with-uisearchdisplaycontroller/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b44b790518c1bae919fcc1cf3e59e3b5?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">orj</media:title>
		</media:content>
	</item>
		<item>
		<title>Using p4merge as a custom Git merge tool on Mac OS X.</title>
		<link>http://deeperdesign.wordpress.com/2011/05/27/using-p4merge-as-a-custom-git-merge-tool-on-mac-os-x/</link>
		<comments>http://deeperdesign.wordpress.com/2011/05/27/using-p4merge-as-a-custom-git-merge-tool-on-mac-os-x/#comments</comments>
		<pubDate>Fri, 27 May 2011 02:39:52 +0000</pubDate>
		<dc:creator>orj</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[macosx]]></category>
		<category><![CDATA[p4merge]]></category>
		<category><![CDATA[xcode]]></category>

		<guid isPermaLink="false">http://deeperdesign.wordpress.com/?p=687</guid>
		<description><![CDATA[On Mac OS X Git uses the opendiff(1) command line utility as its merge tool by default. opendiff(1) will launch the FileMerge app that comes with XCode when performing merges. Unfortunately FileMerge is not a very good merge tool. To &#8230; <a href="http://deeperdesign.wordpress.com/2011/05/27/using-p4merge-as-a-custom-git-merge-tool-on-mac-os-x/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=deeperdesign.wordpress.com&amp;blog=2974760&amp;post=687&amp;subd=deeperdesign&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>On Mac OS X Git uses the <a href="http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man1/opendiff.1.html">opendiff(1)</a> command line utility as its merge tool by default.  </p>
<p><a href="http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man1/opendiff.1.html">opendiff(1)</a> will launch the FileMerge app that comes with XCode when performing merges.  Unfortunately FileMerge is not a very good merge tool.</p>
<p>To improve this, there are a number of options.  There are some good commercial, Open Source and freeware diff tools out there for Mac OS X such as <a href="http://www.sourcegear.com/diffmerge/">DiffMerge</a>, <a href="http://www.guiffy.com/">SureMerge</a>, <a href="http://www.araxis.com/merge_mac/">Araxis Merge</a>, <a href="http://kdiff3.sourceforge.net/">K3Diff</a>, and <a href="http://www.perforce.com/perforce/downloads/index.html">p4merge</a>, etc.  Too many to list them all here.</p>
<p>For my system I chose <tt>p4merge</tt>.  <tt>p4merge</tt> is part of the <a href="http://www.perforce.com/">Perforce</a> source control management system.  I&#8217;ve used Perforce quite a lot in the past at previous jobs and it has great tools.  Perforce is commercial software, and I&#8217;m not about to use Perforce as my source control system instead of Git, but fortunately you can download and use the Perforce GUI tools for free. The Perforce merge tool is not tied in any way to the Perforce SCM system so you can use it as a stand alone tool.</p>
<p>To set up <tt>p4merge</tt> as my mergetool with Git I did the following:</p>
<ol>
<li>Downloaded the Perforce Visual Client disk image from Perforce.com</li>
<li>Installed <tt>p4merge</tt> into <tt>/Applications</tt>.</li>
<li>Added the <a target="_blank" href="//gist.github.com/994547">these settings</a> to my <tt>~/.gitconfig</tt> file.</li>
</ol>
<p>Now <tt>git mergetool</tt> will launch p4merge as my preferred merge tool.</p>
<p><img src="http://deeperdesign.files.wordpress.com/2011/05/screen-shot-2011-05-27-at-12-59-14-pm.png?w=584&#038;h=501" alt="p4merge Screenshot" title="p4merge Screenshot" width="584" height="501" class="aligncenter size-full wp-image-696" /></p>
<p>Now you may be wondering why I didn&#8217;t just set my Git <tt>merge.tool</tt> config setting to p4merge, as it is supported &#8220;by default&#8221; by Git.  Well, Git expects the command p4merge to be in the <tt>$PATH</tt> and I&#8217;d rather not have to install shell scripts across the different Mac systems I use so that it works &#8220;out of the box&#8221;. I also found p4merge wasn&#8217;t dealing well with the relative paths that Git was trying to pass to it, hence the custom <tt>mergetool.custom.cmd</tt> setting that uses <tt>$PWD</tt>.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/deeperdesign.wordpress.com/687/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/deeperdesign.wordpress.com/687/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/deeperdesign.wordpress.com/687/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/deeperdesign.wordpress.com/687/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/deeperdesign.wordpress.com/687/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/deeperdesign.wordpress.com/687/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/deeperdesign.wordpress.com/687/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/deeperdesign.wordpress.com/687/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/deeperdesign.wordpress.com/687/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/deeperdesign.wordpress.com/687/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/deeperdesign.wordpress.com/687/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/deeperdesign.wordpress.com/687/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/deeperdesign.wordpress.com/687/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/deeperdesign.wordpress.com/687/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=deeperdesign.wordpress.com&amp;blog=2974760&amp;post=687&amp;subd=deeperdesign&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://deeperdesign.wordpress.com/2011/05/27/using-p4merge-as-a-custom-git-merge-tool-on-mac-os-x/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b44b790518c1bae919fcc1cf3e59e3b5?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">orj</media:title>
		</media:content>

		<media:content url="http://deeperdesign.files.wordpress.com/2011/05/screen-shot-2011-05-27-at-12-59-14-pm.png" medium="image">
			<media:title type="html">p4merge Screenshot</media:title>
		</media:content>
	</item>
		<item>
		<title>Use the right cable.</title>
		<link>http://deeperdesign.wordpress.com/2011/05/10/use-the-right-cable/</link>
		<comments>http://deeperdesign.wordpress.com/2011/05/10/use-the-right-cable/#comments</comments>
		<pubDate>Tue, 10 May 2011 13:40:08 +0000</pubDate>
		<dc:creator>orj</dc:creator>
				<category><![CDATA[Computing]]></category>

		<guid isPermaLink="false">http://deeperdesign.wordpress.com/?p=683</guid>
		<description><![CDATA[Lately I had become somewhat dissatisfied with the speed of my QNAP 509 Pro NAS. In particular with the speed of transfers to and from it. I was thinking about getting another one, or replacing the drives in and effort &#8230; <a href="http://deeperdesign.wordpress.com/2011/05/10/use-the-right-cable/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=deeperdesign.wordpress.com&amp;blog=2974760&amp;post=683&amp;subd=deeperdesign&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Lately I had become somewhat dissatisfied with the speed of my <a href="http://www.qnap.com/pro_detail_feature.asp?p_id=104" title="QNAP 509 Pro Turbo NAS">QNAP 509 Pro NAS</a>.  In particular with the speed of transfers to and from it. I was thinking about getting another one, or replacing the drives in and effort to speed it up.</p>
<p>But then I gave it some thought and figured I should probably first do some more testing and research.  </p>
<p>QNAP advertise the NAS I have as being able to get a sustained 60 megabytes per second in file transfers over a single gigabit ethernet link.  This is pretty respectable.  However, I was only getting at most 12MB/s.  At first I thought that my iMac not supporting &#8220;<a href="http://en.wikipedia.org/wiki/Jumbo_frame" title="Jumbo Ethernet Frames">jumbo frames</a>&#8221; could be the problem.  But with a little more digging I discovered the QNAP doesn&#8217;t support jumbo frames either so that wasn&#8217;t going to help me anyway.</p>
<p>In an effort to rule out the iMac as the problem I hooked up my MacBook Pro, which is normally only connected via Wi-Fi, to the Apple Time Capsule that is serving as my gigabit ethernet switch and did some more testing.  The MacBook Pro was having similarly bad performance transferring to and from the QNAP.  In an effort to discover if data transfer performance was just generally bad or if it was just the QNAP that was suffering bad performance I tried transferring files between my MacBook Pro and my iMac.  This is where things started to get interesting.  My MacBook was happily transferring data to and from my iMac at around 60MB/s.</p>
<p>It was at this point that a silly thought popped into my mind.  Perhaps the cable connecting the Time Capsule to the QNAP just wasn&#8217;t up to snuff when it came to gigabit ethernet.  So I changed it, and things got better. Fast.</p>
<p>Afterwards I realised that the cable I had been using all this time, to connect my QNAP to the rest of the world, the cable that I had just randomly selected from the large collection I have, was a cable I made myself a long time ago when CAT5 and 100MBps networks were the norm.  The cable I replaced it with was a professionally made, modern, CAT5E cable.  One designed to work with gigabit ethernet.  </p>
<p>What a difference using the right cable can make.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/deeperdesign.wordpress.com/683/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/deeperdesign.wordpress.com/683/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/deeperdesign.wordpress.com/683/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/deeperdesign.wordpress.com/683/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/deeperdesign.wordpress.com/683/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/deeperdesign.wordpress.com/683/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/deeperdesign.wordpress.com/683/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/deeperdesign.wordpress.com/683/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/deeperdesign.wordpress.com/683/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/deeperdesign.wordpress.com/683/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/deeperdesign.wordpress.com/683/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/deeperdesign.wordpress.com/683/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/deeperdesign.wordpress.com/683/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/deeperdesign.wordpress.com/683/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=deeperdesign.wordpress.com&amp;blog=2974760&amp;post=683&amp;subd=deeperdesign&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://deeperdesign.wordpress.com/2011/05/10/use-the-right-cable/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b44b790518c1bae919fcc1cf3e59e3b5?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">orj</media:title>
		</media:content>
	</item>
		<item>
		<title>Foggy CarrierWave Nokogiri woes on Mac OS X Snow Leopard</title>
		<link>http://deeperdesign.wordpress.com/2011/05/08/foggy-carrierwave-nokogiri-woes-on-mac-os-x-snow-leopard/</link>
		<comments>http://deeperdesign.wordpress.com/2011/05/08/foggy-carrierwave-nokogiri-woes-on-mac-os-x-snow-leopard/#comments</comments>
		<pubDate>Sun, 08 May 2011 12:47:40 +0000</pubDate>
		<dc:creator>orj</dc:creator>
				<category><![CDATA[Computing]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://deeperdesign.wordpress.com/?p=674</guid>
		<description><![CDATA[I&#8217;m developing a Ruby on Rails app on my Mac running Snow Leopard. Tonight I wanted to use the fog gem with CarrierWave to upload files to Amazon S3. Fog is a Ruby wrapper around different cloud services and CarrierWave &#8230; <a href="http://deeperdesign.wordpress.com/2011/05/08/foggy-carrierwave-nokogiri-woes-on-mac-os-x-snow-leopard/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=deeperdesign.wordpress.com&amp;blog=2974760&amp;post=674&amp;subd=deeperdesign&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m developing a Ruby on Rails app on my Mac running Snow Leopard.  Tonight I wanted to use the <a href="http://rubygems.org/gems/fog" title="Fog Gem">fog</a> gem with <a href="https://github.com/jnicklas/carrierwave" title="CarrierWave">CarrierWave</a> to upload files to Amazon S3.</p>
<p>Fog is a Ruby wrapper around different cloud services and CarrierWave provides a very nice API for handling file uploads in Rails apps.</p>
<p>Fog has a dependency on the <a href="http://nokogiri.org/tutorials/installing_nokogiri.html" title="Installing Nokogiri">Nokogiri</a> HTML/XML parsing library, which has a dependency on <tt>libxml2</tt>, <tt>libxslt</tt>, and <tt>libiconv</tt>.  </p>
<p>Welcome to pain and suffering&#8230;</p>
<p>The versions of <tt>libxml2</tt> and <tt>libxslt</tt> on MacOS X are a little out of date.  And when trying to install the nokogiri gem with:</p>
<blockquote><p><code>sudo gem install nokogiri</code></p></blockquote>
<p>You will get an error like this:</p>
<blockquote><p><code><br />
ERROR:  Error installing nokogiri:<br />
	ERROR: Failed to build gem native extension.<br />
...<br />
checking for libxml/parser.h... yes<br />
checking for libxslt/xslt.h... yes<br />
checking for libexslt/exslt.h... yes<br />
checking for iconv_open() in iconv.h... no<br />
checking for iconv_open() in -liconv... no<br />
-----<br />
libiconv is missing.<br />
please visit http://nokogiri.org/tutorials/installing_nokogiri.html<br />
for help with installing dependencies.<br />
-----<br />
</code></p></blockquote>
<p>Now, libiconv isn&#8217;t missing.  It is installed with MacOS X.  But nokogiri&#8217;s build script can&#8217;t find it for some reason.  </p>
<p>The <a href="http://nokogiri.org/tutorials/installing_nokogiri.html" title="Installing Nokogiri">Nokogiri</a> install instructions suggest installing newer versions of <tt>libxml2</tt> and <tt>libxslt</tt> to solve this problem.  They even kindly provide instructions for a number of operating systems including MacOS X.</p>
<p>Unfortunately none of them worked for me.  </p>
<p>I&#8217;m using <a href="https://github.com/mxcl/homebrew" title="Homebrew">homebrew</a> to manage my additional source packages on my Mac.  Installing libxml2 via homebrew is easy:</p>
<blockquote><p><code>brew install libxml2</code></p></blockquote>
<p>Installing <tt>libxslt</tt>, not so much. </p>
<p>There is no brew formula for libxslt in the default homebrew git repo.  I have no idea why.  Perhaps something to do with homebrew&#8217;s policy not to dupe stuff bundled with MacOS X.  Not sure why they provide a <tt>libxml2</tt> forumla then as it comes with MacOS X too.</p>
<p>So to install <tt>libxslt</tt> I did the following:</p>
<blockquote><p><code><br />
curl ftp://xmlsoft.org/libxml2/libxslt-1.1.26.tar.gz -o libxslt-1.1.26.tar.gz<br />
tar zxfv libxslt-1.1.26.tar.gz<br />
cd libxslt-1.1.26<br />
./configure \<br />
  --prefix=/usr/local/Cellar/libxslt/1.1.26 \<br />
  --with-libxml-prefix=/usr/local/Cellar/libxml2/2.7.7<br />
make<br />
make install<br />
cd .. &amp;&amp; rm -rf libxslt-1.1.26 &amp;&amp; rm -f libxslt-1.1.26.tar.gz<br />
</code></p></blockquote>
<p>To install <tt>nokogiri</tt> I then used the following command line.</p>
<blockquote><p><code><br />
sudo gem install nokogiri -- \<br />
    --with-xslt-dir=/usr/local/Cellar/libxslt/1.1.26 \<br />
    --with-xml2-include=/usr/local/Cellar/libxml2/2.7.7/include/libxml2 \<br />
    --with-xml2-lib=/usr/local/Cellar/libxml2/2.7.7/lib \<br />
    --with-iconv-dir=/usr<br />
</code></p></blockquote>
<p>Now everything seems to be working ok.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/deeperdesign.wordpress.com/674/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/deeperdesign.wordpress.com/674/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/deeperdesign.wordpress.com/674/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/deeperdesign.wordpress.com/674/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/deeperdesign.wordpress.com/674/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/deeperdesign.wordpress.com/674/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/deeperdesign.wordpress.com/674/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/deeperdesign.wordpress.com/674/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/deeperdesign.wordpress.com/674/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/deeperdesign.wordpress.com/674/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/deeperdesign.wordpress.com/674/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/deeperdesign.wordpress.com/674/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/deeperdesign.wordpress.com/674/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/deeperdesign.wordpress.com/674/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=deeperdesign.wordpress.com&amp;blog=2974760&amp;post=674&amp;subd=deeperdesign&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://deeperdesign.wordpress.com/2011/05/08/foggy-carrierwave-nokogiri-woes-on-mac-os-x-snow-leopard/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b44b790518c1bae919fcc1cf3e59e3b5?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">orj</media:title>
		</media:content>
	</item>
		<item>
		<title>Test Flight &#8211; Easy Beta Distribution for iOS Apps</title>
		<link>http://deeperdesign.wordpress.com/2011/04/23/test-flight-easy-beta-distribution-for-ios-apps/</link>
		<comments>http://deeperdesign.wordpress.com/2011/04/23/test-flight-easy-beta-distribution-for-ios-apps/#comments</comments>
		<pubDate>Sat, 23 Apr 2011 15:48:23 +0000</pubDate>
		<dc:creator>orj</dc:creator>
				<category><![CDATA[Computing]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://deeperdesign.wordpress.com/?p=660</guid>
		<description><![CDATA[At the April 2011 Melbourne Cocoaheads meetup I presented a talk on using Test Flight. Test Flight is an online service for iOS app developers that makes distributing betas easy and fairly painless. You can watch the talk below or &#8230; <a href="http://deeperdesign.wordpress.com/2011/04/23/test-flight-easy-beta-distribution-for-ios-apps/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=deeperdesign.wordpress.com&amp;blog=2974760&amp;post=660&amp;subd=deeperdesign&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>At the <a href="http://www.melbournecocoaheads.com/april-14th-meeting-wrap-up/">April 2011 Melbourne Cocoaheads meetup</a> I presented a talk on using <a href="http://testflightapp.com">Test Flight</a>.  <a href="http://testflightapp.com">Test Flight</a> is an online service for iOS app developers that makes distributing betas easy and fairly painless.  </p>
<p>You can watch the talk below or in HD on <a href="http://vimeo.com/22772258">Vimeo</a>.<br />
<div class='embed-vimeo' style='text-align:center;'><iframe src='http://player.vimeo.com/video/22772258' width='640' height='360' frameborder='0'></iframe></div></p>
<p>Here are the slides for this talk.<br />
<iframe src='http://www.slideshare.net/slideshow/embed_code/7715518' width='584' height='479'></iframe></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/deeperdesign.wordpress.com/660/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/deeperdesign.wordpress.com/660/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/deeperdesign.wordpress.com/660/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/deeperdesign.wordpress.com/660/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/deeperdesign.wordpress.com/660/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/deeperdesign.wordpress.com/660/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/deeperdesign.wordpress.com/660/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/deeperdesign.wordpress.com/660/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/deeperdesign.wordpress.com/660/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/deeperdesign.wordpress.com/660/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/deeperdesign.wordpress.com/660/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/deeperdesign.wordpress.com/660/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/deeperdesign.wordpress.com/660/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/deeperdesign.wordpress.com/660/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=deeperdesign.wordpress.com&amp;blog=2974760&amp;post=660&amp;subd=deeperdesign&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://deeperdesign.wordpress.com/2011/04/23/test-flight-easy-beta-distribution-for-ios-apps/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b44b790518c1bae919fcc1cf3e59e3b5?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">orj</media:title>
		</media:content>
	</item>
		<item>
		<title>Arrogant geeks with zero interpersonal skills.</title>
		<link>http://deeperdesign.wordpress.com/2011/04/15/arrogant-geeks-with-zero-interpersonal-skills/</link>
		<comments>http://deeperdesign.wordpress.com/2011/04/15/arrogant-geeks-with-zero-interpersonal-skills/#comments</comments>
		<pubDate>Fri, 15 Apr 2011 05:27:00 +0000</pubDate>
		<dc:creator>orj</dc:creator>
				<category><![CDATA[Computing]]></category>

		<guid isPermaLink="false">http://deeperdesign.wordpress.com/?p=651</guid>
		<description><![CDATA[What is it about certain arrogant geeks and their crappy attitude? Exhibit A: A melbourne Cocoaheads regular who works for an Apple Reseller, posts an nice offer of big discounts on older (refurbished and run-out model) Mac gear to the &#8230; <a href="http://deeperdesign.wordpress.com/2011/04/15/arrogant-geeks-with-zero-interpersonal-skills/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=deeperdesign.wordpress.com&amp;blog=2974760&amp;post=651&amp;subd=deeperdesign&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>What is it about certain arrogant geeks and their crappy attitude?</p>
<p>Exhibit A:</p>
<p>A melbourne Cocoaheads regular who works for an Apple Reseller, <a href="http://groups.google.com/group/cocoaheadsau/browse_thread/thread/bfd3848f8c215a04#">posts an nice offer of big discounts</a> on older (refurbished and run-out model) Mac gear to the <a href="http://groups.google.com/group/cocoaheadsau">Cocoaheads Australia</a> mailing list.</p>
<p>He gets this response from <a href="http://www.ank.com.ar/">Andres Kievsky</a>:</p>
<blockquote><p>50% off? Too good to be true, hence they are most likely scams, or old discontinued models.</p>
<p>Are you sending spam, Mr. Snowden?</p></blockquote>
<p>I send Mr Kievsky this response (off list).</p>
<blockquote><p>Dude. Get off your high horse.</p>
<p>Matt is a Melbourne Cocoaheads regular that works for an Apple Reseller and is willing to do some good deals on clearance (older model) Macs for Cocoaheads devs. It is not random spam.</p>
<p>Also, if you have an issue with something someone posts to the list, take it up with them directly off-list rather than adding more noise to the list.</p>
<p>Regards</p></blockquote>
<p>And this is Mr Kievsky&#8217;s oh so mature response to that:</p>
<blockquote><p>Suck my balls, Oliver.</p>
<p>Don&#8217;t you send me any more shit ok? Thanks kid.
</p></blockquote>
<p>Not content with abusing me once, he followed up with:</p>
<blockquote><p>
And by that I mean I don&#8217;t want to get any more emails from you, kiddo, whoever the fuck you might be.</p>
<p>Thanks again! and have a wonderful day in fantasy land.
</p></blockquote>
<p>What a <em>wonderful</em> guy he must be in person.</p>
<p><b>Update:</b> Oh, and on his <a href="http://www.facebook.com/profile.php?id=100001620007214">Facebook profile</a>, for shits and giggles he lists his schools as Virginia Tech, and Columbine High School for the years in which crazed gunmen murdered many an innocent bystander.  How hilarious! <b>Not.</b></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/deeperdesign.wordpress.com/651/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/deeperdesign.wordpress.com/651/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/deeperdesign.wordpress.com/651/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/deeperdesign.wordpress.com/651/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/deeperdesign.wordpress.com/651/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/deeperdesign.wordpress.com/651/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/deeperdesign.wordpress.com/651/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/deeperdesign.wordpress.com/651/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/deeperdesign.wordpress.com/651/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/deeperdesign.wordpress.com/651/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/deeperdesign.wordpress.com/651/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/deeperdesign.wordpress.com/651/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/deeperdesign.wordpress.com/651/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/deeperdesign.wordpress.com/651/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=deeperdesign.wordpress.com&amp;blog=2974760&amp;post=651&amp;subd=deeperdesign&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://deeperdesign.wordpress.com/2011/04/15/arrogant-geeks-with-zero-interpersonal-skills/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b44b790518c1bae919fcc1cf3e59e3b5?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">orj</media:title>
		</media:content>
	</item>
	</channel>
</rss>
