<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Scott Means &#187; coding</title>
	<atom:link href="http://smeans.com/category/coding/feed/" rel="self" type="application/rss+xml" />
	<link>http://smeans.com</link>
	<description>Ripping the envelope of software development, one technology at a time.</description>
	<lastBuildDate>Tue, 15 Nov 2011 20:44:03 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Dealing with Google App Engine development datastore.</title>
		<link>http://smeans.com/2011/10/30/dealing-with-google-app-engine-development-datastore/</link>
		<comments>http://smeans.com/2011/10/30/dealing-with-google-app-engine-development-datastore/#comments</comments>
		<pubDate>Sun, 30 Oct 2011 20:19:20 +0000</pubDate>
		<dc:creator>smeans</dc:creator>
				<category><![CDATA[Google App Engine]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[database]]></category>

		<guid isPermaLink="false">http://smeans.com/?p=358</guid>
		<description><![CDATA[Make managing your development datastore in Google App Engine much easier.]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been using GAE for a couple of years now, and I&#8217;ve become pretty much accustomed to its foibles, except for one: it occasionally wipes out my development datastore for no apparent reason. It always happens when I have to restart the dev. server application, and it usually happens when I switch between two of my applications. But whatever the cause, it can be <em>really</em> annoying. So I&#8217;ve found a workaround of sorts.</p>
<p>Digging thorough the development server documentation, I found two options that are making my life <u>much</u> easier:</p>
<dl>
<dt>&#8211;use_sqlite</dt>
<dd>Use <a href="http://www.sqlite.org/">sqlite</a> for the local datastore.</dd>
<dt>&#8211;datastore_path=[path to datastore file]</dt>
<dd>Keep the datastore in the file specified.</dd>
</dl>
<p>By doing these two things, you can now see where GAE is keeping your datastore and you can make intermediate backups and restore them at will. You can also view your datastore using the command line sqlite client. Just add these two parameters to the Extra Flags box in your app&#8217;s info in the App Engine Launcher (or to the command line) and you&#8217;re good to go. Enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>http://smeans.com/2011/10/30/dealing-with-google-app-engine-development-datastore/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPhone Core Data/undo gotcha of the day.</title>
		<link>http://smeans.com/2011/02/02/iphone-core-dataundo-gotcha-of-the-day/</link>
		<comments>http://smeans.com/2011/02/02/iphone-core-dataundo-gotcha-of-the-day/#comments</comments>
		<pubDate>Wed, 02 Feb 2011 18:26:00 +0000</pubDate>
		<dc:creator>smeans</dc:creator>
				<category><![CDATA[coding]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://smeans.com/?p=283</guid>
		<description><![CDATA[In general, I like the NSUndoManager functionality in iOS, but sometimes the secret handshakes you need to know can really get me down. For example, I needed to disable undo/redo when setting a particular property of a model entity. Reading the documentation, this seemed pretty straightforward: [[theApp.managedObjectContext undoManager] disableUndoRegistration]; detailItem.fieldImageFile = relativePath; [[theApp.managedObjectContext undoManager] enableUndoRegistration]; [...]]]></description>
			<content:encoded><![CDATA[<p>In general, I like the <span class="code">NSUndoManager</span> functionality in iOS, but sometimes the secret handshakes you need to know can really get me down. For example, I needed to disable undo/redo when setting a particular property of a model entity. Reading the documentation, this seemed pretty straightforward:</p>
<pre class="prettyprint">
	[[theApp.managedObjectContext undoManager] disableUndoRegistration];
	detailItem.fieldImageFile = relativePath;
	[[theApp.managedObjectContext undoManager] enableUndoRegistration];
</pre>
<p>Seemed very clear, but it didn&#8217;t work! So, after much poking around on the Internet, I found a posting that alluded to the fact that changes to undo don&#8217;t occur until the run loop executes. So, to get the desired effect, I ended up with the following code:</p>
<pre class="prettyprint">
	<strong>[[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate:[NSDate date]];</strong>
	[[theApp.managedObjectContext undoManager] disableUndoRegistration];
	detailItem.fieldImageFile = relativePath;
	<strong>[[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate:[NSDate date]];</strong>
	[[theApp.managedObjectContext undoManager] enableUndoRegistration];
</pre>
<p>Yet another head-scratching API decision from Apple.</p>
]]></content:encoded>
			<wfw:commentRss>http://smeans.com/2011/02/02/iphone-core-dataundo-gotcha-of-the-day/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Key-value Observer (KVO) on the iPhone.</title>
		<link>http://smeans.com/2011/01/13/key-value-observer-kvo-on-the-iphone/</link>
		<comments>http://smeans.com/2011/01/13/key-value-observer-kvo-on-the-iphone/#comments</comments>
		<pubDate>Fri, 14 Jan 2011 03:49:19 +0000</pubDate>
		<dc:creator>smeans</dc:creator>
				<category><![CDATA[coding]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://smeans.com/?p=250</guid>
		<description><![CDATA[Here&#8217;s one for the you-learn-something-new-every-day file. Objective C supports a key-value-observer model that lets you monitor changes on an object&#8217;s property values. Unfortunately, I found this out the hard way while working on a MKMapKit project. What I wanted to do seemed simple: have a map view with a bunch of moving objects on it. [...]]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s one for the you-learn-something-new-every-day file. Objective C supports a key-value-observer model that lets you monitor changes on an object&#8217;s property values. Unfortunately, I found this out the hard way while working on a <span class="code">MKMapKit</span> project.</p>
<p>What I wanted to do seemed simple: have a map view with a bunch of moving objects on it. Each object pulls its current position from an XML document on the web. I already had my XML-wrapper object written when I wanted to display it on the map, so I simply implemented the <span class="code">MKAnnotation</span> protocol. All of my objects appeared, and all seemed to be right with the world.</p>
<p>Then, I started updating my objects and found that the annotations didn&#8217;t move. At all. I found a bunch of people on the web trying to solve the same problem, but I wasn&#8217;t very happy with the solutions I found. Most of them involved removing the annotations and adding them back into the map view. But, thankfully, I found one article that mentioned KVO on the iPhone. I was pretty familiar with KVO from my Flex projects, but didn&#8217;t even realize it was supported in Objective C.</p>
<p>To make a long story short, if you don&#8217;t use the <span class="code">willChangeValueForKey</span> and <span class="code">didChangeValueForKey</span> before and after updating your <span class="code">coordinate</span> property on your annotation object, the <span class="code">MKMapView</span> will not be aware that it has moved. After bracketing my XML update code with those two calls, all of a sudden my annotations started moving around.</p>
<pre class="prettyprint">
-(void)xmlProperty:(NSString *)newXml
{
	[self willChangeValueForKey:@"coordinate"];
	[xml release];
	xml = [newXml retain];
	[self didChangeValueForKey:@"coordinate"];
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://smeans.com/2011/01/13/key-value-observer-kvo-on-the-iphone/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Exporting from Core Data on iOS.</title>
		<link>http://smeans.com/2011/01/07/exporting-from-core-data-on-ios/</link>
		<comments>http://smeans.com/2011/01/07/exporting-from-core-data-on-ios/#comments</comments>
		<pubDate>Sat, 08 Jan 2011 03:59:40 +0000</pubDate>
		<dc:creator>smeans</dc:creator>
				<category><![CDATA[coding]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[objective-c]]></category>

		<guid isPermaLink="false">http://smeans.com/?p=238</guid>
		<description><![CDATA[So, I&#8217;m working on the latest release of our scrapbooking app (Coolibah) and I needed to export some objects that are stored in SQLLite through Core Data to my server. After googling around for a while (and finding not much, it seems like search results have started to really suck lately) I had to strike [...]]]></description>
			<content:encoded><![CDATA[<p>So, I&#8217;m working on the latest release of our scrapbooking app (<a href="http://blog.coolibah.me/">Coolibah</a>) and I needed to export some objects that are stored in SQLLite through Core Data to my server. After googling around for a while (and finding not much, it seems like search results have started to really suck lately) I had to strike out on my own and work something up. I got to use a very cool Objective C feature that I&#8217;ve only recently discovered: <a href="http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocCategories.html#//apple_ref/doc/uid/TP30001163-CH20-TPXREF139">categories</a>.</p>
<p>I was able to extend the <span class="code">NSManagedObject</span> class and add a new <span class="code">xmlString</span> property. By using the <span class="code">entity</span> property to do some simple introspection, I was able to write a serialization function in about 50 lines of code. Enjoy!</p>
<h2>NSManagedObject+XMLSync.h</h2>
<pre class="prettyprint">//
//  Created by Scott Means on 1/5/11.
//  Released into the public domain without warranty.
#import &lt;CoreData/CoreData.h&gt;
#import &lt;Foundation/Foundation.h&gt;

@interface NSManagedObject (XMLSync)

@property (nonatomic, readonly) NSString *xmlString;

@end
</pre>
<h2>NSManagedObject+XMLSync.m</h2>
<pre class="prettyprint">//
//  Created by Scott Means on 1/5/11.
//  Released into the public domain without warranty.

#import "NSManagedObject+XMLSync.h"

@implementation NSManagedObject (XMLSync)

- (NSString *)xmlString
{
	NSEntityDescription *ed = self.entity;
	NSURL *uri = self.objectID.URIRepresentation;
	NSMutableString *x = [NSMutableString stringWithFormat:@"<%@ id=\"/%@%@\"",
                ed.name, uri.host, uri.path];

	for (NSString *a in ed.attributesByName.allKeys) {
		id value = [self valueForKey:a];

		if (value) {
			if ([value isKindOfClass:[NSString class]]) {
				[x appendFormat:@" %@=\"%@\"", a, value];
			} else {
				if (![value respondsToSelector:@selector(stringValue)]) {
					NSLog(@"no stringValue");
				}
				[x appendFormat:@" %@=\"%@\"", a, [value stringValue]];
			}
		}
	}

	bool hasChildren = NO;

	for (NSString *r in ed.relationshipsByName) {
		if (!hasChildren) {
			[x appendString:@"/>"];
			hasChildren = YES;
		}

		NSRelationshipDescription *rd = [ed.relationshipsByName objectForKey:r];

		if (rd.isToMany) {
			hasChildren = YES;
			[x appendFormat:@"<%@>", r];

			for (NSManagedObject *c in [self valueForKey:r]) {
				[x appendString:c.xmlString];
			}

			[x appendFormat:@"</%@>", r];
		}
	}

	if (hasChildren) {
		[x appendFormat:@"</%@>", ed.name];
	}

	return x;
}

@end
</pre>
<p>Next project: figure out how to do better code formatting in WordPress!</p>
]]></content:encoded>
			<wfw:commentRss>http://smeans.com/2011/01/07/exporting-from-core-data-on-ios/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Preserving good code for posterity.</title>
		<link>http://smeans.com/2010/10/15/preserving-good-code-for-posterity/</link>
		<comments>http://smeans.com/2010/10/15/preserving-good-code-for-posterity/#comments</comments>
		<pubDate>Fri, 15 Oct 2010 15:09:18 +0000</pubDate>
		<dc:creator>smeans</dc:creator>
				<category><![CDATA[coding]]></category>

		<guid isPermaLink="false">http://smeans.com/?p=212</guid>
		<description><![CDATA[I&#8217;ve recently had to learn a couple of new programming languages in a hurry. I&#8217;m a pretty fair programmer in half-a-dozen other languages, but starting from scratch is always difficult. Even though flow control and syntax might be similar to something you already know (&#8220;is it for each or foreach?&#8221;) there is definitely a &#8220;natural&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve recently had to learn a couple of new programming languages in a hurry. I&#8217;m a pretty fair programmer in half-a-dozen other languages, but starting from scratch is always difficult. Even though flow control and syntax might be similar to something you already know (&#8220;is it for each or foreach?&#8221;) there is definitely a &#8220;natural&#8221; way to do things in every language. Some of the worst coding train-wrecks I&#8217;ve seen (and I&#8217;ve seen some doozies) happen when a programmer attempts to do something complex in a language they barely understand. They might know a way to do it in another language and try to map that knowledge into the target language, but that rarely leads to a clean solution.</p>
<p>So, wanting to do my bit, I created a new website called <a href="http://www.nativecode.org">Native Code</a> to try to make this easier. My goal is to create a database of common low-level coding idioms (micro-patterns, if you like) and then have them expressed in as many programming languages as possible. And not just expressed, but expressed <b>well</b>. So, please feel free to add your own contributions, create your own idioms, and otherwise capture your coding know-how for the ages. Enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>http://smeans.com/2010/10/15/preserving-good-code-for-posterity/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Core data model migration on the iPhone.</title>
		<link>http://smeans.com/2009/08/02/core-data-model-migration-on-the-iphone/</link>
		<comments>http://smeans.com/2009/08/02/core-data-model-migration-on-the-iphone/#comments</comments>
		<pubDate>Sun, 02 Aug 2009 21:39:21 +0000</pubDate>
		<dc:creator>smeans</dc:creator>
				<category><![CDATA[coding]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://smeans.com/?p=196</guid>
		<description><![CDATA[Doing something as simple as adding a new attribute to an entity in your Core Data model will break your application when it comes to opening older persistent data stores. Core Data has some support for automatic migration, documented in the &#8220;Introduction to Core Data Model Versioning and Data Migration Programming Guide&#8221; (whew!) in the [...]]]></description>
			<content:encoded><![CDATA[<p>Doing something as simple as adding a new attribute to an entity in your Core Data model will break your application when it comes to opening older persistent data stores. Core Data has some support for automatic migration, documented in the &#8220;Introduction to Core Data Model Versioning and Data Migration Programming Guide&#8221; (whew!) in the Lightweight Migration section. Unfortunately, there are crucial steps that are not mentioned in this section. Kudos to Grouchal on Stack Overflow for giving us the <a href="http://stackoverflow.com/questions/1018155/what-do-i-have-to-do-to-get-core-data-to-automatically-migrate-models/1219911#1219911">rest of the story</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://smeans.com/2009/08/02/core-data-model-migration-on-the-iphone/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>My MySQL tool is on softpedia.com.</title>
		<link>http://smeans.com/2009/06/18/my-mysql-tool-is-on-softpediacom/</link>
		<comments>http://smeans.com/2009/06/18/my-mysql-tool-is-on-softpediacom/#comments</comments>
		<pubDate>Thu, 18 Jun 2009 20:06:21 +0000</pubDate>
		<dc:creator>smeans</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://smeans.com/?p=184</guid>
		<description><![CDATA[I just got the notice today. I wrote this bulk row insert tool for MySQL that is designed to run over the Internet. It&#8217;s for really large data sets being loaded into &#8230; ahem &#8230; inexpensive hosted MySQL databases. Check out the mysqlxfer softpedia page.]]></description>
			<content:encoded><![CDATA[<p>I just got the notice today. I wrote this bulk row insert tool for MySQL that is designed to run over the Internet. It&#8217;s for really large data sets being loaded into &#8230; ahem &#8230; <em>inexpensive</em> hosted MySQL databases. Check out the <a href="http://www.softpedia.com/get/Internet/Servers/Database-Utils/mysqlxfer.shtml">mysqlxfer softpedia page</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://smeans.com/2009/06/18/my-mysql-tool-is-on-softpediacom/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Roll-your-own iPhone framework.</title>
		<link>http://smeans.com/2009/06/06/roll-your-own-iphone-framework/</link>
		<comments>http://smeans.com/2009/06/06/roll-your-own-iphone-framework/#comments</comments>
		<pubDate>Sat, 06 Jun 2009 16:05:34 +0000</pubDate>
		<dc:creator>smeans</dc:creator>
				<category><![CDATA[coding]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://smeans.com/?p=179</guid>
		<description><![CDATA[After starting work on my latest iPhone app (#6 or so), I finally decided it was time to get more efficient with my existing library of code. I&#8217;ve been building various helper classes for manipulating bitmaps, etc, and I wanted to be able to share them between my apps in a more organized way. As [...]]]></description>
			<content:encoded><![CDATA[<p>After starting work on my latest iPhone app (#6 or so), I finally decided it was time to get more efficient with my existing library of code. I&#8217;ve been building various helper classes for manipulating bitmaps, etc, and I wanted to be able to share them between my apps in a more organized way.</p>
<p>As usual, there isn&#8217;t much on the web about this, but I eventually tracked down a couple of useful articles to get me started:</p>
<ul>
<li><a href="http://github.com/keremk/iphone-static-library-project-template/tree/master">keremk&#8217;s iphone-static-library-project-template</a></li>
<li><a href="http://blog.stormyprods.com/2008/11/using-static-libraries-with-iphone-sdk.html">Building static libraries with the iPhone SDK</a></li>
</ul>
<p>The first article shows you how to add your own custom project type template to XCode so you can easily create shared iPhone libraries. The second one shows you how to reference your new library from your application. With a little trial-and-error I now have a nice shared lib of iPhone classes. Pretty soon, who knows, maybe Apple will allow dynamic linking and we can move iPhone development into the 80s!</p>
]]></content:encoded>
			<wfw:commentRss>http://smeans.com/2009/06/06/roll-your-own-iphone-framework/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPhone programming: fun with grayscale images.</title>
		<link>http://smeans.com/2009/06/03/iphone-programming-fun-with-grayscale-images/</link>
		<comments>http://smeans.com/2009/06/03/iphone-programming-fun-with-grayscale-images/#comments</comments>
		<pubDate>Wed, 03 Jun 2009 17:55:21 +0000</pubDate>
		<dc:creator>smeans</dc:creator>
				<category><![CDATA[coding]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://smeans.com/?p=177</guid>
		<description><![CDATA[So I was trying to do something that I thought was simple. I needed to convert an image from full color to grayscale in my iPhone application, and I easily found the CGColorSpaceCreateDeviceGray method which seemed to put me on the right track. But the complication came when I tried to use this color space [...]]]></description>
			<content:encoded><![CDATA[<p>So I was trying to do something that I <em>thought</em> was simple. I needed to convert an image from full color to grayscale in my iPhone application, and I easily found the <span style="font-family: monospace">CGColorSpaceCreateDeviceGray</span> method which seemed to put me on the right track. But the complication came when I tried to use this color space with <span style="font-family: monospace">CGBitmapContextCreate</span>. I got this error in the console:</p>
<pre>&lt;Error&gt;: CGBitmapContextCreate: unsupported parameter combination:
8 integer bits/component; 16 bits/pixel; 1-component colorspace;
kCGImageAlphaPremultipliedLast; 1472 bytes/row.</pre>
<p>So the combination of parameters was incorrect. But which one was at fault? Thankfully, I found a helpful <a href="http://lists.apple.com/archives/Carbon-dev/2007/Jun/msg00014.html">post</a> on the web that led me to this article:</p>
<p><a href="http://developer.apple.com/qa/qa2001/qa1037.html">CGBitmapContextCreate Supported Color Spaces</a></p>
<p>Very handy. Wish that this table were actually included in the documentation for the <span style="font-family: monospace">CGBitmapContextCreate</span> method. Imagine how useful that would be! So, for your convenience, here is a function to create a grayscale copy of a <span style="font-family: monospace">UIImage</span>:</p>
<pre>UIImage *createGrayCopy(UIImage *source)
{
	int width = source.size.width;
	int height = source.size.height;

	CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();

	CGContextRef context = CGBitmapContextCreate (nil,
						 width,
						 height,
						 8,      // bits per component
						 0,
						 colorSpace,
						 kCGImageAlphaNone);

	CGColorSpaceRelease(colorSpace);

	if (context == NULL) {
		return nil;
	}

	CGContextDrawImage(context,
		CGRectMake(0, 0, width, height), source.CGImage);

	UIImage *grayImage = [UIImage imageWithCGImage:CGBitmapContextCreateImage(context)];
	CGContextRelease(context);

	return grayImage;
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://smeans.com/2009/06/03/iphone-programming-fun-with-grayscale-images/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A day with the Jester.</title>
		<link>http://smeans.com/2009/05/30/a-day-with-the-jester/</link>
		<comments>http://smeans.com/2009/05/30/a-day-with-the-jester/#comments</comments>
		<pubDate>Sat, 30 May 2009 21:47:52 +0000</pubDate>
		<dc:creator>smeans</dc:creator>
				<category><![CDATA[coding]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[life]]></category>

		<guid isPermaLink="false">http://smeans.com/?p=159</guid>
		<description><![CDATA[I just finished one of the most interesting software development projects ever this week. After responding to a note posted to the Atlanta iPhone Developer Meetup group I ended up trading emails with JD Howard, author of the Naughty Jester blog. JD wanted an iPhone app to help connect with his readers, but he didn&#8217;t [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://naughtyjester.com"><img src="http://smeans.com/wp-content/uploads/2009/05/jesterimage1-143x150.jpg" alt="The Naughty Jester" title="The Naughty Jester" width="143" height="150" class="alignright size-thumbnail wp-image-161" /></a>I just finished one of the most interesting software development projects ever this week. After responding to a note posted to the <a href="http://www.meetup.com/atliphonedev/">Atlanta iPhone Developer Meetup group</a> I ended up trading emails with JD Howard, author of the <a href="http://naughtyjester.com">Naughty Jester</a> blog. JD wanted an iPhone app to help connect with his readers, but he didn&#8217;t have a big budget and he didn&#8217;t have a lot of time. He wanted to &#8220;drive down and knock an app out&#8221; in a day or so.</p>
<p>Never one to pass up a challenge, I told him to come on down. I was careful to set his expectations as low as possible, because one day really isn&#8217;t enough time to do a meaningful application. All I could promise was that at the end we would have something to submit to the iTunes App Store, and he was OK with that.</p>
<p>So at approximately 3:00 PM on Monday (Memorial Day), JD pulled up to my house in Columbia, SC. The trip took him 5 hours, instead of the 3 that he had originally thought. After a brief meet &#038; greet (plus various social networking connections, which I guess are the modern equivalent of <a href="http://en.wikipedia.org/wiki/Visiting_card">calling cards</a>), we sat down to do a quick mockup of his site.</p>
<p>We used a new tool that I really, really like: <a href="http://www.balsamiq.com/products/mockups">Balsamique Markups</a>. It&#8217;s a very nice WYSIWYG tool for laying out web pages, applications, and iPhone apps. For OCD perfectionists (which many developers are), I find the cartoony graphics strangely freeing. It really lets me lay out the gist of something without getting sucked into the minutiae of a full design.</p>
<p>We agreed on a basic application that would:
<ul>
<li>display his blog in a browser control</li>
<li>let the user forward a link to a friend</li>
<li>take the user to a newsletter signup</li>
<li>take the user to feedburner</li>
</ul>
<p>The one rule of iPhone development is that the things you think will be simple will be hard, and the things you think will be hard will be easy. We had a browser window up and running with his blog in it within 30 minutes. But producing a decent-looking home button image took almost an hour.</p>
<p>Possibly the most interesting part of the project was having someone I&#8217;d never met come and crash at my house while developing an application. My mother (who lives with me) was a little leery of the idea at first. &#8220;What if he&#8217;s an axe murderer?&#8221;</p>
<p>After JD and I had been working for a while and I mentioned this to him, he assured her that he was not an axe murderer, which I&#8217;m not sure had the desired effect. I put it to her like this &#8220;It&#8217;s like we&#8217;re running a bed &#038; breakfast, with iPhone development on the side.&#8221; Hmmmm&#8230;.</p>
<p>In any case, working with JD was a real pleasure, and we had some interesting conversations over cigars at the end of the day. Now, let&#8217;s all keep our fingers crossed that Apple will be kind and merciful and approve the app!</p>
]]></content:encoded>
			<wfw:commentRss>http://smeans.com/2009/05/30/a-day-with-the-jester/feed/</wfw:commentRss>
		<slash:comments>64</slash:comments>
		</item>
	</channel>
</rss>

