<?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>furbo.org &#187; Observation</title>
	<atom:link href="http://furbo.org/category/observation/feed/" rel="self" type="application/rss+xml" />
	<link>http://furbo.org</link>
	<description>by Craig Hockenberry</description>
	<lastBuildDate>Thu, 01 Jul 2010 16:12:33 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Communal computing</title>
		<link>http://furbo.org/2010/04/29/communal-computing/</link>
		<comments>http://furbo.org/2010/04/29/communal-computing/#comments</comments>
		<pubDate>Thu, 29 Apr 2010 16:07:07 +0000</pubDate>
		<dc:creator>Craig Hockenberry</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[Observation]]></category>
		<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://furbo.org/?p=187</guid>
		<description><![CDATA[Dear Steve,
First, let me congratulate you and everyone at Apple on the release of the iPad. From my dealings with your company, I know it wasn&#8217;t easy. Thanks to everyone for busting their asses: a lot of very complex puzzle pieces came together during those last 60 days!
I recently had an encounter with Bill Atkinson. [...]]]></description>
			<content:encoded><![CDATA[<p>Dear Steve,</p>
<p>First, let me congratulate you and everyone at Apple on the release of the iPad. From my dealings with your company, I know it wasn&#8217;t easy. Thanks to everyone for busting their asses: a lot of very complex puzzle pieces came together during those last 60 days!</p>
<p>I recently had an encounter with <a href="http://en.wikipedia.org/wiki/Bill_Atkinson">Bill Atkinson</a>. I told him that &#8220;I haven&#8217;t had this much fun with a computer since 1984.&#8221; He laughed, said &#8220;Thanks!&#8221;, and went back to working on <a href="http://www.billatkinson.com/aboutPhotoCard.html">his iPad app</a>. We, and many other developers like us, are completely smitten with this new device.</p>
<p>After owning an iPad for a little over three weeks, it feels like we&#8217;re dealing with something much bigger than that Mac we all got excited about<a href="http://en.wikipedia.org/wiki/Apple_Macintosh#1984:_Introduction"> over 25 years ago</a>. I&#8217;ve been struggling to define exactly what that is: beyond the technical specifications like the beautiful screen with its large multi-touch surface. Those specifications define what the device can do, but not what it means in our lives. I want to understand the magic.</p>
<p>Last week, much of that meaning came into clearer focus at a birthday party for my brother, niece and nephew (April is birthday month in our family!) My wife had loaded our iPad with photos from a recent trip to see the desert wildflowers in <a href="http://www.parks.ca.gov/?page_id=638">Anza Borrego</a> and my 50th birthday party from the week prior.</p>
<p>Predictably, people&#8217;s initial reaction was &#8220;Wow, that&#8217;s the new iPad!&#8221; But that quickly faded as I opened the Photos app and passed the device around. My family was more interested in sharing the photos than talking about the new technology.</p>
<p>I was particularly interested in how my mother, the quintessential technophobe, would react to the device. She picked up on things quickly and was flipping through photos in no time. It astonished me how the interface disappeared for her: at one point she subconsciously licked her finger before &#8220;flipping&#8221; to the next photo.</p>
<p>As interesting as it was to see someone non-technical use the device, the real eye opener was how several people could interact with the iPad at once. Much of my mother&#8217;s fear of computers was overcome because she was looking at the pictures alongside my sister-in-law who helped her out when she got stuck. Learning was organic.</p>
<p>My niece also discovered some of the games I had on the device. One, Abca, was a hit because many people could play it at once. I&#8217;ve always played the game by myself and was surprised at how much fun it was to have other people guessing words simultaneously. A group of people transformed the software into something no developer had ever expected.</p>
<p>All of this led to the revelation that we&#8217;ve begun a new age of &#8220;communal computing.&#8221; The desktop revolution centered around empowering individuals: this new revolution will extend that empowerment to groups of people.</p>
<p>The iPad was naturally passed around amongst the partygoers. Many people interacted with it during the evening, and I lost track of who had it at any given time. And therein lies a fundamental problem.</p>
<p>My iPad has a lot of personal information on it: <a href="http://www.apple.com/ipad/features/mail.html">email</a>, <a href="http://www.apple.com/ipad/features/pages.html">business documents</a>, and <a href="http://www.apple.com/ipad/features/numbers.html">financial data</a>. When you pass it around, you&#8217;re giving everyone who touches it the opportunity to mess with your private life, whether intentionally or not. That makes me uneasy.</p>
<p>It&#8217;s hard to fault Apple for this shortcoming. The secrecy of the project undoubtedly limited the amount of group interaction your designers and engineers would experience with their new creation. The social aspects of this device is probably just as much as revelation to them as it is to me.</p>
<p>I can envision several ways to solve this problem: either with a traditional login screen or with something new like folders that require a passcode to open. I have no doubt that your designers can find something elegant that gives me peace of mind as I share my iPad with friends and family.</p>
<p>Thanks for your time and consideration,</p>
<p>Craig Hockenberry</p>
<p><strong>Updated April 30th, 2010:</strong> I filed Radar <a href="http://openradar.appspot.com/7922808">#7922808</a> for this issue and it was marked as a duplicate of Radar <a href="rdar://problem/7584426">#7584426</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://furbo.org/2010/04/29/communal-computing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>UDID not</title>
		<link>http://furbo.org/2010/03/22/udid-not/</link>
		<comments>http://furbo.org/2010/03/22/udid-not/#comments</comments>
		<pubDate>Mon, 22 Mar 2010 19:52:18 +0000</pubDate>
		<dc:creator>Craig Hockenberry</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Observation]]></category>

		<guid isPermaLink="false">http://furbo.org/?p=145</guid>
		<description><![CDATA[Here we are on the brink of a new iPhone OS product introduction and developers are facing yet another crunch with device IDs for Ad Hoc testing.
Apple currently lets each iPhone developer, whether a company or an individual account, assign 100 devices for testing purposes. A large chunk of those available devices get used by [...]]]></description>
			<content:encoded><![CDATA[<p>Here we are on the brink of a new iPhone OS product introduction and developers are facing yet another crunch with device IDs for Ad Hoc testing.</p>
<p>Apple currently lets each iPhone developer, whether a company or an individual account, assign 100 devices for testing purposes. A large chunk of those available devices get used by employees with multiple devices. We also have a valuable group of external testers that we use for Ad Hoc beta testing. Many of these individuals buy the latest and greatest hardware, so each time there is a new product introduced, we use up more devices from our list.</p>
<p><a href="http://www.panic.com/~neven/ipadcountdown/">On April 3rd</a>, almost everyone on our beta test list will be buying an iPad and want to run <a href="http://twitterrific.com">Twitterrific</a> on it. Unfortunately, some of these testers are going to be out of luck because we don&#8217;t have enough devices left to allocate. I have no idea what we&#8217;re going to do if the next version of the iPhone OS is introduced before our iPhone Developer account gets renewed.</p>
<p>As a developer, I never like turning a valuable tester away from my product. But that&#8217;s what we&#8217;re doing now.</p>
<p>To be clear, I think Apple&#8217;s policy is justified. Developers were abusing the system, so something had to be done. The problem, in my mind, is that the throttling valve is being put on the wrong piece of pipe.</p>
<p>As developers, we want to maintain a pool of testers, not devices that they test on. Devices are ephemeral: they change as new hardware is introduced and replaced. The thing that remains constant are the people who test our products.</p>
<p><a href="http://twitter.com/robotspacer/status/10885311288">A tweet from Mike Piontek</a> crystalized this thought: the limitation for Ad Hoc provisioning should be based around individuals, not the devices that they own. It makes more sense to regulate Apple IDs rather than UDIDs. I want John Gruber to be able to run my apps on whatever devices he currently owns. I want to put my own name on the provisioning list and enable the five iPhone OS devices sitting on my desk. All that Apple cares about is that are only 98 other people besides Gruber and me.</p>
<p>(I suspect that Enterprise IT has similar problems and would welcome a solution based on employees rather than the hardware they own. I can only imagine the headaches of managing thousands of devices.)</p>
<p>Of course, there&#8217;s a huge amount of infrastructure around verification based on UDIDs: the Program Portal, device firmware, and our own internal processes would require changes. But I think it&#8217;s a good goal to work toward, because the current system isn&#8217;t scaling well and will only get worse as Apple introduces new products.</p>
]]></content:encoded>
			<wfw:commentRss>http://furbo.org/2010/03/22/udid-not/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Brain farts</title>
		<link>http://furbo.org/2009/06/15/brain-farts/</link>
		<comments>http://furbo.org/2009/06/15/brain-farts/#comments</comments>
		<pubDate>Mon, 15 Jun 2009 21:17:01 +0000</pubDate>
		<dc:creator>Craig Hockenberry</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Observation]]></category>
		<category><![CDATA[Opinion]]></category>

		<guid isPermaLink="false">http://furbo.org/?p=111</guid>
		<description><![CDATA[What happened?
In spite of plenty of advance warning from Twitter, we got caught by the Twitpocalypse bug.
For the 2.0.1 release, we had tested our software extensively. I actually wrote an emulation layer on top of the code that reads data from Twitter that added a large number to every ID read from Twitter. This testing [...]]]></description>
			<content:encoded><![CDATA[<h3>What happened?</h3>
<p>In spite of plenty of <a href="http://groups.google.com/group/twitter-development-talk/browse_thread/thread/24c87f61ea602904">advance warning</a> from Twitter, we got caught by the <a href="http://twitter.com/rentzsch/status/1786073038">Twitpocalypse bug</a>.</p>
<p>For the 2.0.1 release, we had tested our software extensively. I actually wrote an emulation layer on top of the code that reads data from Twitter that added a large number to every ID read from Twitter. This testing uncovered several bugs which were fixed and incorporated into the <a href="http://svn.cocoasourcecode.com/MGTwitterEngine/">MGTwitterEngine</a> open source code.</p>
<p>Unfortunately, this testing didn&#8217;t take into account that the library we use to parse the data (<a href="http://lloyd.github.com/yajl/">YAJL</a>) includes a range check that ensures signed values, which are allowed by the JSON specification, will fit into 32-bit storage. The &#8220;YAJL Error 3&#8243; is that library telling us that the range check failed.</p>
<p>In hindsight, I should have fed the parser some large unsigned integers. In the wonderful world of software development, we call this a <strong>brain fart</strong>.</p>
<h3>How did we respond?</h3>
<p>Unfortunately, the Twitpocalypse occurred on Friday evening, just as my wife and I were heading out for a high school graduation. I quickly shot off an email to Twitter asking a few questions (I had mistakenly thought that there were problems with data being returned by an authenticated connection.)</p>
<p>After a couple of hours of iPhone email and SMS, it was clear that we were going to need do a new release. We had a critical bug that affected thousands of users. And our fear was this submission would take longer than normal: many developers are submitting 3.0 updates.</p>
<p>Life officially sucked at this point, and the graduation ceremony was memorable for all the wrong reasons.</p>
<p>After getting a few hours of fitful rest, I opened up Xcode on Saturday morning and started looking for the problem. It took just a few minutes to find the bug and another few minutes to fix it. Our concern at this point was getting the update to users.</p>
<h3>Apple saves the day</h3>
<p>In spite of it being the middle of weekend after a busy week at WWDC, we were able to get in touch with Apple Developer Relations. Our contact was able to expedite the approval of the application.</p>
<p>To say that this was a relief would be the understatement of the century. The <a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=284540316&#038;mt=8">update for the free version</a> started showing up in iTunes on Sunday evening. The <a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=284542696&#038;mt=8">paid version was updated</a> on Tuesday morning.</p>
<h3>What can we learn from this?</h3>
<p>Developers are human. We make mistakes. It&#8217;s interesting to note that <a href="http://twitter.com/atebits/status/2153788845">Loren Brichter</a> and <a href="http://twitter.com/birdfeedapp/status/2148534512">Buzz Anderson</a>, fellow developers whose skills I hold in high regard, were also affected by the Twitpocalypse. It really does happen to the best of us.</p>
<p>It&#8217;s also interesting to see that Loren and Buzz reacted in the same way I did: by fixing the problem ASAP. In Loren&#8217;s case, that meant <a href="http://twitter.com/atebits/status/2161396468">finding a hotel with WiFi</a> in order to distribute his update. Buzz released a new beta <a href="http://twitter.com/birdfeedapp/status/2159774601">in a matter of hours</a>.</p>
<p>In my experience, these brain farts are problems with easy fixes. It&#8217;s something like checking for invalid bounds, getting a Boolean state wrong, or something else of that nature. It&#8217;s not a complex problem: it&#8217;s an oversight.</p>
<p>The problem, therefore, is not how fast we can react to fixing critical bugs, but how fast the App Store reviewers can react with an approval.</p>
<p>As a device that&#8217;s constantly connected to the Internet, the iPhone taps into a stream of data that is unpredictable. Data in &#8220;the cloud&#8221; can change at any time, and web applications naturally adapt to these changes with a quick deployment strategies. Those of us who are building client applications on top of this network infrastructure need the ability to adapt quickly, too.</p>
<p>Security issues are another area where a quick response is a requirement, not a luxury. If I discover something that puts a user&#8217;s private data at risk, it&#8217;s my responsibility to fix the problem as quickly as possible. Time spent in a review queue is time spent being exposed to a flaw.</p>
<p>At the same time, we shouldn&#8217;t blame Apple for these delays in reviewing applications. In the year that they have been selling our products, the App Store has been more successful than anyone imagined. It&#8217;s clear to me that reviewers and others involved in the approval process are overwhelmed by this success.</p>
<h3>How can we fix it?</h3>
<p>Fortunately, I think there&#8217;s a simple way to solve this problem for all developers selling products on the App Store. The inspiration for this solution will be obvious to anyone who&#8217;s used Apple&#8217;s Developer Technical Support (DTS.)</p>
<p>When you purchase an ADC membership, you are given a number of &#8220;incidents&#8221;. These DTS incidents can be used when you have a problem that can&#8217;t be solved through documentation, support forums or hours and hours of debugging. It&#8217;s for the hard stuff, and usually involves getting an engineer at Apple involved to understand and fix the issue.</p>
<p>As a developer, I&#8217;m very careful to use these incidents wisely: they are a last resort. There are some years where I don&#8217;t use them at all, those are the good years.</p>
<p>A similar system could be put in place for critical bug fixes on the App Store. If every developer was given one or two &#8220;prioritized reviews,&#8221; it would act as insurance for the brain farts. You&#8217;d have a way to raise a flag and say &#8220;I need special attention for a critical bug.&#8221;</p>
<p>If another developer has a critical bug, I have no problem with my review process for a feature release taking a little longer. And since prioritized reviews would be a scarce resource, they won&#8217;t be open for abuse because developers will think twice before using them.</p>
<p>Because it&#8217;s not a matter of <strong>if</strong> you have a brain fart that leads to a critical bug, it&#8217;s a matter of <strong>when</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://furbo.org/2009/06/15/brain-farts/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A phone by any other name would smell as sweet&#8230;</title>
		<link>http://furbo.org/2009/06/04/a-phone-by-any-other-name-would-smell-as-sweet/</link>
		<comments>http://furbo.org/2009/06/04/a-phone-by-any-other-name-would-smell-as-sweet/#comments</comments>
		<pubDate>Thu, 04 Jun 2009 16:52:21 +0000</pubDate>
		<dc:creator>Craig Hockenberry</dc:creator>
				<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[Observation]]></category>

		<guid isPermaLink="false">http://furbo.org/?p=110</guid>
		<description><![CDATA[The general consensus is that there will be a new iPhone announced next week. I, like others, think it&#8217;s going to have new features and capabilities. But how is Apple going to label this new device?
iPhone 3G?
It&#8217;s entirely possible that Apple will keep the same name as the previous version. There&#8217;s precedence in the Mac [...]]]></description>
			<content:encoded><![CDATA[<p>The general consensus is that there will be a <a href="http://arstechnica.com/apple/news/2009/06/iphone-mania-heats-upspy-shots-location-aware-safari-more.ars">new iPhone</a> announced next week. I, <a href="http://daringfireball.net/2009/05/the_next_iphone">like others</a>, think it&#8217;s going to have new features and capabilities. But how is Apple going to label this new device?</p>
<h3>iPhone 3G?</h3>
<p>It&#8217;s entirely possible that Apple will keep the same name as the previous version. There&#8217;s precedence in the Mac product line: we&#8217;ve had MacBook Pros for several years now with various ways of distinguishing different product iterations (&#8221;Late 2008&#8243;, &#8220;Unibody&#8221;, etc.)</p>
<p>Given Apple&#8217;s reluctance to publish any of the device&#8217;s <a href="http://furbo.org/2007/08/21/what-the-iphone-specs-dont-tell-you/">hardware capabilities</a>, this would seem to make sense.</p>
<p>Except for one small problem. It&#8217;s likely that the new iPhone will have a faster processor and more memory. Some applications will be written to take specific advantage of these improvements. And that, of course, means that you need a way to let iTunes customers know if those applications are compatible with their device.</p>
<p>I don&#8217;t see Apple putting &#8220;iPhone 3G (2008)&#8221; and &#8220;iPhone 3G (2009)&#8221; anywhere in the iTunes UI. It&#8217;s just too confusing.</p>
<h3>iPhone 4G?</h3>
<p>What about having artificial product designations like they did with PowerPC desktop Macs: &#8220;G3&#8243;, &#8220;G4&#8243; and &#8220;G5.&#8221;</p>
<p>The problem here is that 3G refers to a network service, not a product generation. If this naming convention is used, customers are bound to wonder if a &#8220;4G&#8221; product works on their 3G network.</p>
<h3>iPhone 3G Plus?</h3>
<p>So maybe they do something like we&#8217;ve seen with the iPod product line. Using terms like &#8220;Classic&#8221;, &#8220;mini&#8221;, &#8220;nano&#8221; and &#8220;shuffle&#8221; to differentiate the products.</p>
<p>The problem here, of course, is that there&#8217;s only one product on sale. Unless Apple plans to keep the current product on sale (at a reduced price,) this just doesn&#8217;t make sense.</p>
<p>I&#8217;m not going to make any predictions on the device&#8217;s name, but I will be paying close attention. The ultimate choice is likely to offer some subtle clues regarding Apple&#8217;s plans to evolve this product in future revisions.</p>
]]></content:encoded>
			<wfw:commentRss>http://furbo.org/2009/06/04/a-phone-by-any-other-name-would-smell-as-sweet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Of toolbars and actions</title>
		<link>http://furbo.org/2009/05/01/of-toolbars-and-actions/</link>
		<comments>http://furbo.org/2009/05/01/of-toolbars-and-actions/#comments</comments>
		<pubDate>Sat, 02 May 2009 00:40:20 +0000</pubDate>
		<dc:creator>Craig Hockenberry</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Observation]]></category>

		<guid isPermaLink="false">http://furbo.org/?p=109</guid>
		<description><![CDATA[Another area where I find iPhone development to be a bit convoluted was with toolbars and action sheets. The sheets are conceptually tied to the toolbar, yet there is no glue to combine UIActionSheet with UIToolbar. It&#8217;s also fairly difficult to represent your application state in the toolbar—an example is the refresh button in Twitterrific [...]]]></description>
			<content:encoded><![CDATA[<p>Another area where I find iPhone development to be a bit convoluted was with toolbars and action sheets. The sheets are conceptually tied to the toolbar, yet there is no glue to combine <code>UIActionSheet</code> with <code>UIToolbar</code>. It&#8217;s also fairly difficult to represent your application state in the toolbar—an example is the refresh button in <a href="http://twitterrific.com">Twitterrific</a> that turns into a cancel button while the refresh is taking place.</p>
<p>And then one day it dawned on me: an iPhone toolbar with an action sheet is like a menubar with menus on the Mac desktop (turn your phone upside down and there is even some visual similarity.)</p>
<p>After investigating some of the design patterns for <a href="http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/nsmenu_Class/Reference/Reference.html"><code>NSMenu</code></a> and <a href="http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSMenuItem_Class/Reference/Reference.html"><code>NSMenuItem</code></a>, it was clear that this would work well on a mobile interface as well. My implementation is a subclass of <code>UIToolbar</code> named <code>IFActionToolbar</code>.</p>
<p>In it&#8217;s simplest form, you attach a list of items to one of the toolbar&#8217;s bar button items:</p>
<pre>@interface MyViewController : UIViewController
{
  IBOutlet IFActionToolbar *toolbar;
  IBOutlet UIBarButtonItem *barButtonItem;
}

...</pre>
<pre>@implementation MyViewController  

...

- (void)viewDidLoad
{
  [super viewDidLoad];

  IFActionToolbarActionItem *actionItem = nil;

  NSMutableArray *actionItems = [NSMutableArray arrayWithCapacity:3];
  actionItem = [[[IFActionToolbarActionItem alloc] initWithTitle:@"One" target:self action:@selector(firstAction:)] autorelease];
  [actionItems addObject:actionItem];
  actionItem = [[[IFActionToolbarActionItem alloc] initWithTitle:@"Two" target:self action:@selector(secondAction:)] autorelease];
  [actionItems addObject:actionItem];
  actionItem = [[[IFActionToolbarActionItem alloc] initWithTitle:@"Cancel" target:nil action:NULL] autorelease];
  [actionItems addObject:actionItem];
  [toolbar attachActionItems:actionItems toItem:barButtonItem];

  [toolbar update];
}</pre>
<p>The <code>IFActionToolbarActionItem</code> is just a simple wrapper object that associates a title with a target and action. These action items are used to automatically construct the action sheet when the user taps on <code>barButtonItem</code>. If you&#8217;ve ever constructed an <code>NSMenu</code> using <code>NSMenuItems</code>, this will feel quite familiar.</p>
<p>Additionally, the toolbar supports an <code>-update</code> method. This method calls the assigned delegate to enable or disable toolbar buttons, set the image for the toolbar item, change the title of the action sheet, hide or show items in the action sheet, and define the cancel or destructive buttons in the sheet. Again, similar in pattern to how <code>NSMenuItems</code> are maintained.</p>
<p>Any time you call this update method, the <code>UIToolbar</code> is configured automatically. It makes it much easier to reflect the state of your controller in the view.</p>
<p>I&#8217;m not going to spend too much time discussing the inner workings of this class: the picture of a <a href="http://furbo.org/stuff/ActionToolbar_1.0.zip">sample project</a> is worth a thousand words.</p>
<p>One thing I would like to caution you about: don&#8217;t get too carried away with enabling and disabling items in the action menu. In our UI testing, we found that changing the list too much was confusing for users. It&#8217;s like the <a href="http://humanized.com/weblog/2007/03/05/are_adaptive_interfaces_the_answer/">&#8220;adaptive menus&#8221;</a> used in Microsoft Office: it&#8217;s very difficult for a user to adapt to your interface if it&#8217;s constantly changing. Just because you can doesn&#8217;t mean you should.</p>
<p>Again, I hope this code is useful in your own iPhone projects. Enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>http://furbo.org/2009/05/01/of-toolbars-and-actions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Matt Gallagher deserves a medal&#8230;</title>
		<link>http://furbo.org/2009/04/30/matt-gallagher-deserves-a-medal/</link>
		<comments>http://furbo.org/2009/04/30/matt-gallagher-deserves-a-medal/#comments</comments>
		<pubDate>Thu, 30 Apr 2009 23:58:04 +0000</pubDate>
		<dc:creator>Craig Hockenberry</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Observation]]></category>

		<guid isPermaLink="false">http://furbo.org/?p=108</guid>
		<description><![CDATA[Every once in awhile you read a blog post that completely changes the way you think about a problem. Matt Gallagher&#8217;s Cocoa With Love is one of those blogs where it happens often. If you&#8217;re not subscribing to his RSS feed, do it now.
In particular, this post addressed a problem that every iPhone developer has [...]]]></description>
			<content:encoded><![CDATA[<p>Every once in awhile you read a blog post that completely changes the way you think about a problem. Matt Gallagher&#8217;s <a href="http://cocoawithlove.com/">Cocoa With Love</a> is one of those blogs where it happens often. If you&#8217;re not subscribing to his RSS feed, <a href="feed://cocoawithlove.com/feeds/posts/default?alt=rss">do it now</a>.</p>
<p>In particular, <a href="http://cocoawithlove.com/2008/12/heterogeneous-cells-in.html">this post</a> addressed a problem that every iPhone developer has encountered: any kind of settings or form UI is a pain in the butt if you follow Apple&#8217;s sample code. And, of course, this is exacerbated because these essential interfaces aren&#8217;t very fun to code. For both <a href="http://twitterrific.com">Twitterrific</a> and <a href="http://frenzic.com">Frenzic</a>, it&#8217;s been a frustrating experience: I wanted to fix how this standard UI was created and maintained.</p>
<h3>The motivation</h3>
<p>Before I start talking about what I did using Matt&#8217;s concepts and code, I&#8217;d like to discuss the need for settings in an application.</p>
<p>There are some people who think that <a href="http://blog.atebits.com/2008/12/settings-are-in-the-settings-app/">settings should only be in the Settings app</a>. There are others that think they should <a href="http://mantia.me/blog/your-apps-settings-should-not-be-in-the-settings-app/">only be within the application</a>. I can honestly see how both groups are right, but what both sides fail to realize is that it&#8217;s often a matter of context.</p>
<p>If you&#8217;re working on a simple application with simple needs, relying on the infrastructure provided by the SDK is fine. You may have some additional support load for <a href="http://www.settingsareinthesettingsapp.com/">users who have problems finding your settings</a>, but that&#8217;s a reasonable tradeoff for saving development time. Sophia Teutschler&#8217;s <a href="http://www.sophiestication.com/groceries/">Groceries</a> app is a fine example of where the built-in settings shine: I turned off the Marker Felt font several months ago, and I haven&#8217;t touched it since.</p>
<p>In the case of Twitterrific, there were three main reasons why we built the settings into the application:</p>
<ol>
<li>We could not split the settings between two locations. From a user&#8217;s point-of-view, it&#8217;s incredibly confusing to have an application&#8217;s configuration in two places. This would have happened if we had put the account settings in the application and everything else in the Settings app.</li>
<li>Some of the settings are things that people will change on a fairly frequent basis. For example, the dark theme works best at night, while a light theme is better during the day. Leaving the app to make these types of adjustments is inconvenient.</li>
<li>The Settings app can&#8217;t handle preferences that are &#8220;dynamic.&#8221; An example is a vibration setting for the notification: there&#8217;s no way to make this appear on an iPhone but not on an iPod touch.</li>
</ol>
<div>As we start to see more complex applications appearing on the App Store, I think there will be a lot of other developers coming to grips with settings in their applications. That&#8217;s where my code comes in…</div>
<h3>The solution</h3>
<p>I&#8217;ve taken the basic concepts that Matt presented in his article and extended them to create a pixel perfect replica of what you see in the Settings application. Instead of <a href="http://developer.apple.com/iphone/library/documentation/PreferenceSettings/Conceptual/SettingsApplicationSchemaReference/Articles/RootContent.html#//apple_ref/doc/uid/TP40007018">configuring applications using a property list</a>, you do it with some very simple code in a view controller. (Domain-specific languages, such as those found in Ruby, were an inspiration for the methods used in this code.)</p>
<p>And if you&#8217;re not doing settings, the classes are still very handy for making user input forms. They were used in all of the search forms used in the <a href="http://twitterrific.com">new version of Twitterrific</a>.</p>
<p>To give you a quick taste of how it&#8217;s used, here&#8217;s a complete implementation of a table view controller that presents a single group with a text field and a switch control. In just six lines of code:</p>
<pre>- (void)constructTableGroups
{
  NSMutableArray *cells = [NSMutableArray array];
  IFTextCellController *textCell = [[[IFTextCellController alloc] initWithLabel:@"Text" andPlaceholder:@"Placeholder" atKey:@"sampleText" inModel:model] autorelease];
  [cells addObject:textCell];
  IFSwitchCellController *switchCell = [[[IFSwitchCellController alloc] initWithLabel:@"Switch" atKey:<span>@"sampleSwitch" inModel:model] autorelease];
  [cells addObject:switchCell];
  tableGroups = [[NSArray arrayWithObject:cells] retain];
}</span></pre>
<p>The real beauty of this code is that it&#8217;s incredibly easy to change. Settings and forms tend to evolve over the lifetime of a project, so using these simple declarations for the table view layouts makes it much simpler to adapt to new requirements. If I need to change the switch control shown above into a choice list, I can do it in a couple of lines of code.</p>
<p>So without further ado, here&#8217;s the <a href="http://furbo.org/stuff/GenericTableViews_1.0.zip">source code</a> in a sample project. The code is well documented, so you shouldn&#8217;t have any problems figuring out how it all works. Start by looking at the <strong>RootViewController</strong>, then take a look at the <strong>SampleViewController</strong>, followed by the <strong>SampleAdvancedViewController</strong>. If you&#8217;d like to incorporate this code into your own project, just grab all the classes with the Iconfactory prefix (&#8221;IF&#8221;.)</p>
<h3>The license</h3>
<p>Previously, I&#8217;ve released source code on this site without any licensing at all. This time, I&#8217;m going to try something new. You can do anything you want with this code with one requirement: you need to give the Iconfactory some <a href="http://iconfactory.com/iphone">link love</a> in your product.</p>
<p>For more details on the licensing terms, check out the Licensing.rtf file that&#8217;s included in the sample project. If you can&#8217;t abide by this restriction, please <a href="http://furbo.org/resume/">get in contact</a> and we can try to work something out.</p>
<p>I hope this code saves you as much time as it has saved me. Enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>http://furbo.org/2009/04/30/matt-gallagher-deserves-a-medal/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A thought experiment</title>
		<link>http://furbo.org/2009/03/29/a-thought-experiment/</link>
		<comments>http://furbo.org/2009/03/29/a-thought-experiment/#comments</comments>
		<pubDate>Sun, 29 Mar 2009 23:31:38 +0000</pubDate>
		<dc:creator>Craig Hockenberry</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Observation]]></category>

		<guid isPermaLink="false">http://furbo.org/?p=107</guid>
		<description><![CDATA[Assume the following:

You have an application that you&#8217;re selling on the App Store. This application, MyApp 1.0, works on both iPhones and iPod touches with the 2.2.1 firmware.
The compelling new APIs in iPhone SDK 3.0 allow you to implement a bunch of great new features in your product. Let&#8217;s say you add a Map View [...]]]></description>
			<content:encoded><![CDATA[<p>Assume the following:</p>
<ul>
<li>You have an application that you&#8217;re selling on the App Store. This application, MyApp 1.0, works on both iPhones and iPod touches with the 2.2.1 firmware.</li>
<li>The <a href="http://developer.apple.com/iPhone/program/sdk.html">compelling new APIs in iPhone SDK 3.0</a> allow you to implement a bunch of great new features in your product. Let&#8217;s say you add a Map View and release MyApp 2.0 (after SDK 3.0 is released.)</li>
</ul>
<p>Now, what happens if you find a bug in MyApp? Let&#8217;s say it&#8217;s a simple thing like dereferencing a nil pointer that causes a crash: something that can be fixed with a single line of code. You easily fix this bug, but you can&#8217;t give this fix to <strong>all</strong> of your customers. Why?</p>
<p>The problem lies with iTunes Connect. It only allows you to upload a single binary. And that single binary is specified to work with a single version of the iPhone firmware. Even if you have branching tools in your version control system, you can&#8217;t use them to produce an update for both versions of the SDK.</p>
<p>This presents a problem for customers who are still running the 2.2.1 firmware: they can&#8217;t get your fix until they upgrade to the 3.0 firmware.</p>
<p>Despite the fact that there will be a lot of uptake on this new release and all its great new features, it still feels wrong that an iPod touch owner will need buy the update in order to get my fix. I don&#8217;t like it when customers have to pay for my stupidity.</p>
<p>If you agree, please dupe Radar ID <a href="http://openradar.appspot.com/radar?id=19404">6735814</a>. Thanks!</p>
]]></content:encoded>
			<wfw:commentRss>http://furbo.org/2009/03/29/a-thought-experiment/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Front Row To Go</title>
		<link>http://furbo.org/2009/03/16/front-row-to-go/</link>
		<comments>http://furbo.org/2009/03/16/front-row-to-go/#comments</comments>
		<pubDate>Mon, 16 Mar 2009 19:41:46 +0000</pubDate>
		<dc:creator>Craig Hockenberry</dc:creator>
				<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[Observation]]></category>
		<category><![CDATA[Opinion]]></category>

		<guid isPermaLink="false">http://furbo.org/?p=104</guid>
		<description><![CDATA[Everyone and his brother has a prediction about Apple and the mythical &#8220;netbook.&#8221; This is mine.
Before I get into the actual prediction, let me say that I&#8217;ve come to this conclusion by looking at Apple as a business, not as a supplier of shiny gadgets for our technolust. As much as we love the things [...]]]></description>
			<content:encoded><![CDATA[<p>Everyone and his brother has a prediction about Apple and the mythical &#8220;netbook.&#8221; This is mine.</p>
<p>Before I get into the actual prediction, let me say that I&#8217;ve come to this conclusion by looking at Apple as a business, not as a supplier of shiny gadgets for our technolust. As much as we love the things they make, their goal as a corporation is to make the stockholder&#8217;s happy. They do that by selling lots of products. We&#8217;re just a means to that end.</p>
<p>A lot of the speculation regarding the netbook says that it provides functionality in the price gap between a $200 iPhone and a $1000 MacBook. While that&#8217;s true, it misses the point.</p>
<p>Apple would rather sell you another device <strong>in addition</strong> to the ones they already sell. They&#8217;re not interested in cutting into (presumably healthy) MacBook sales with a netbook. Likewise, selling a bigger touch device could cut into iPhone sales: keep your crappy cell phone and buy the netbook to throw in your purse or backpack.</p>
<p>One of the things that saved Apple was a simplified product line based around professional and consumer uses. Does it really make sense to have more than one consumer-level device for laptop computing? The MacBook already kicks ass in that department: having another device in that category just muddies the water.</p>
<p>But what if there was a device that could work in conjunction with your other Apple products? Something that extended their capabilities. Something that made each product better for a few hundred dollars.</p>
<p>Apple and their shareholders would love this: you&#8217;d buy the iPhone and the &#8220;netbook&#8221;. And eventually the MacBook. And maybe an Apple TV. And probably an iPod, too.</p>
<p>So what are some of the problems with the current hardware lineup?</p>
<ul>
<li>iPhone / iPod touch &#8211; Small screen, small keyboard.</li>
<li>Mac &#8211; No touch screen, running Front Row prevents using your Mac for other things.</li>
<li>Apple TV &#8211; crappy remote, no keyboard.</li>
<li>iPod &#8211; Very small screen with no touch screen or keyboard.</li>
</ul>
<p>So what kind of product could fill in these gaps? I call it &#8220;Front Row To Go.&#8221; Think of it as a second screen for the current hardware. Something that could:</p>
<ul>
<li>Display photos on a larger screen than on the iPhones and iPods. It would also be effective as an adjunct to iPhoto on the desktop: Microsoft&#8217;s Surface prototype shows how effective it is to display pictures on a horizontal surface that can be manipulated by multiple viewers.</li>
<li>Provide a touch screen keyboard for the iPhone and Apple TV: a better input mechanism than hunting and pecking on chiclets. (Maybe this is the reason Bluetooth keyboards aren&#8217;t available for the iPhone.)</li>
<li>Show movies on a larger screen: anyone who&#8217;s taken a transoceanic flight knows that looking at the iPhone/iPod screen for more than a couple hours can be quite tiresome. An added benefit is that the player&#8217;s battery wouldn&#8217;t be consumed by the display&#8217;s power needs.</li>
<li>Provide touch input to desktop applications. Multi-touch is <a href="http://furbo.org/2007/07/16/multi-touch-on-the-desktop/">never going to happen on a vertically oriented display</a>, so make a separate device that works horizontally. An obvious benefit to developers is that they don&#8217;t have to rewrite code: if it makes sense, multi-touch can be added to enhance current applications.</li>
</ul>
<p>As with all other Apple products, Front Row To Go could obviously work as a standalone device. Sync your content onto the device and take it with you: no more dragging a laptop to a family reunion just because Aunt Bessie can&#8217;t see the tiny photos on the iPhone. Get your bookmarks and feeds from the Mac and surf the web using Front Row To Go&#8217;s version of Safari while you&#8217;re listening to music or watching TV.</p>
<p>As far as how these features would be implemented, that&#8217;s anyone&#8217;s guess. There might be an API for developers, or maybe it&#8217;s a closed system. The device might be able to play iPhone games or run multiple iPhone applications at once (much like the current Dashboard works in Mac OS X.) With a common base of OS X running throughout the product line, pretty much anything is possible.</p>
<p>And that gets to the real point of this essay: think about what Apple has learned from the halo effect surrounding the iPod (and now the iPhone.) If you have any doubt that this effect is alive and well, drop into an Apple Store on any weekend and take a look around: plenty of customers who are happy with one product and looking at others.</p>
<p>In my opinion, these consumers are the ones that Apple will target with a &#8220;netbook,&#8221; not the ones that are jonesing for a sexy little machine that fills a perceived gap in the product range. I hope I&#8217;m right, because I&#8217;d love to be one of those customers lining up to buy Front Row To Go.</p>
]]></content:encoded>
			<wfw:commentRss>http://furbo.org/2009/03/16/front-row-to-go/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Trendy</title>
		<link>http://furbo.org/2009/03/02/trendy/</link>
		<comments>http://furbo.org/2009/03/02/trendy/#comments</comments>
		<pubDate>Mon, 02 Mar 2009 20:37:42 +0000</pubDate>
		<dc:creator>Craig Hockenberry</dc:creator>
				<category><![CDATA[Advice]]></category>
		<category><![CDATA[Business]]></category>
		<category><![CDATA[Observation]]></category>

		<guid isPermaLink="false">http://furbo.org/?p=98</guid>
		<description><![CDATA[If you&#8217;re reading my essays, it&#8217;s likely that you&#8217;re selling some kind of software on the Internet. (Or soon will be.)
To be successful at this endeavor, you need to monitor your sales and plan development around the revenue. Ask anyone who&#8217;s had success with a software product, and I can guarantee you that they have [...]]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;re reading my essays, it&#8217;s likely that you&#8217;re selling some kind of software on the Internet. (Or soon will be.)</p>
<p>To be successful at this endeavor, you need to monitor your sales and plan development around the revenue. Ask anyone who&#8217;s had success with a software product, and I can guarantee you that they have some kind of metric that tells them how well they are doing.</p>
<p>What I&#8217;d like to do today is share one of my favorite methods. But before I do, let me share some advice that will help you understand why this tracking scheme is so effective.</p>
<p>If you&#8217;ve released a product, you no doubt have witnessed the &#8220;first day spike.&#8221; It&#8217;s one of the great things about doing a release: you find that people really do love your work.</p>
<p>But there can be a problem. Typically, that initial spike is followed by an exponential curve: every month you&#8217;re making half as much money. And even though your income is less and less each month, the support load from existing and new customers stays fairly constant. You&#8217;re working just as hard, but earning less.</p>
<p>So how do you work around this? As you would in any other business: by planning ahead.</p>
<p>As software developers we often fall into the &#8220;just one more feature&#8221; trap. We want a 1.0 release to be awesome, and that one more thing will only take a day or two, and people will love it, so why not?</p>
<p>Because that awesome feature could be a very good thing to generate buzz and sales for a 1.1 or a 1.2 release. And by not &#8220;doing it all&#8221; in the first release, you get your product to market faster. You&#8217;ll be making money while you implement that cool new feature.</p>
<p>And holding back can have another advantage: you might find that your users want something different than what you had planned. Their input can often change your idea, so don&#8217;t waste time doing something without feedback.</p>
<p>So when do you know that it&#8217;s a good time to do a 1.1 release? A general rule of thumb is 30-90 days after your 1.0 release. On the day you release your 1.0, you should have some code already in the works for the 1.1 release. Give yourself a head start on the next release, because you&#8217;ll find those first 30-90 days are consumed by customer support and go by <strong>very</strong> quickly.</p>
<p>(I can also guarantee that you&#8217;ll have a 1.0.1 release because of some stupid little bug you overlooked. So make sure you plan ahead for that, too.)</p>
<p>With all this in mind, I present a simple way to visualize your release cycles by graphing trends of averaged daily sales:</p>
<p><a href="http://furbo.org/wp-content/uploads/2009/02/trend_graph.png"><img src="http://furbo.org/wp-content/uploads/2009/02/trend_graph.png" alt="" width="420" height="281" /></a></p>
<p>The graph shows four hypothetical products and their sales. The Y axis shows how much the product earned. The X axis shows increasingly short time intervals. To plot each Y value, you just take the total amount sold in that period and divide it by the number of days. The intervals were chosen because they&#8217;re nice approximations of monthly, bi-monthly, quarterly, bi-yearly and yearly cycles.</p>
<p>Let&#8217;s say the Y grid lines are at $10, $20, $30 and $40 earned per day. The red product has sold about $2.50 per day over the past month, and about $10 per day over the past year. It&#8217;s a product that&#8217;s definitely in need of a version bump. An update should push it over $10 per day in the 30 day interval.</p>
<p>The gray product shows how a new release looks. Instead of seeing a spike, you&#8217;ll see the averages for all intervals go up (with the most change at the most recent intervals, of course.) You&#8217;ll also see the most recent averages go up as a result of ads, reviews and other good PR. As time goes on, the 30 day average will eventually drop. When it gets below the 60 or 90 day average, that&#8217;s a good time to do a release.</p>
<p>The goal is to end up with a product like the green one. For the most part, it trends upwards. You&#8217;re doing things right.</p>
<p>Finally, this graph also shows products that you shouldn&#8217;t spend time on. The lavender product isn&#8217;t performing as well as the others. Your time is better spent on things that are going to generate more revenue.</p>
<p>In case you&#8217;re wondering how I generated these graphs, it&#8217;s proprietary Ruby on Rails code that reads our financials and feeds them to <a href="http://www.maani.us/xml_charts/index.php">XML/SWF Charts</a>. The information in these graphs will change frequently: you&#8217;ll want to find a way to automate the collection and processing of your own sales data.</p>
<p>I&#8217;ve been talking with Dylan Bruzenak about incorporating this trend graph into <a href="http://www.ideaswarm.com/products/appviz/">AppViz</a>. Hopefully we&#8217;ll see it in a future release—make sure to <a href="http://www.ideaswarm.com/support/">let him know</a> if you&#8217;d find it helpful. (And if you&#8217;re not already using AppViz to track your iTunes sales, pull your fricken&#8217; head out and <a href="http://www.ideaswarm.com/products/appviz/">start using the trial version</a>.)</p>
<p>Who knew that accounting could be so trendy?</p>
]]></content:encoded>
			<wfw:commentRss>http://furbo.org/2009/03/02/trendy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bootstrap</title>
		<link>http://furbo.org/2009/02/19/bootstrap/</link>
		<comments>http://furbo.org/2009/02/19/bootstrap/#comments</comments>
		<pubDate>Thu, 19 Feb 2009 17:54:26 +0000</pubDate>
		<dc:creator>Craig Hockenberry</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[Observation]]></category>
		<category><![CDATA[Opinion]]></category>

		<guid isPermaLink="false">http://furbo.org/?p=93</guid>
		<description><![CDATA[A lot of people stumble upon this website because they&#8217;re looking for information about developing applications for the iPhone. If this is your first time here, welcome!
I have been developing applications for the iPhone since it was released (using both the Jailbreak and official SDK.) My company is currently selling several applications in iTunes. I [...]]]></description>
			<content:encoded><![CDATA[<p>A lot of people stumble upon this website because they&#8217;re looking for information about developing applications for the iPhone. If this is your first time here, welcome!</p>
<p>I have been developing applications for the iPhone since it was released (using both the Jailbreak and official SDK.) <a href="http://iconfactory.com/home/about">My company</a> is currently <a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewArtist?id=281795483">selling several applications in iTunes</a>. I also have many years of experience with the underlying technologies on the device (Cocoa, the predecessor to Cocoa Touch.) I&#8217;d like to share some of my experiences and give you some pointers that will help get you started.</p>
<p>The first thing you need to know is that learning how to develop applications for a mobile device isn&#8217;t easy. But it&#8217;s worth the effort, ask any seasoned iPhone developer about seeing their work run on the device for the first time: it&#8217;s fricken&#8217; amazing.</p>
<h3>Get a Feel for the Device</h3>
<p>Some of you may want to target the web with your application. If this is the case, you&#8217;ll want to start looking at a series of articles I wrote for A List Apart: <em>Put Your Content in My Pocket</em> (<a href="http://alistapart.com/articles/putyourcontentinmypocket">Part 1</a> and <a href="http://alistapart.com/articles/putyourcontentinmypocketpart2/">Part 2</a>.)</p>
<p>Even if you&#8217;re going to be writing a native application, knowing how to develop web pages for Mobile Safari will be helpful. A product information website and other ancillary information about your app will work best when your new customers can view it on their device.</p>
<p>Working with the web is also a good way to start understanding how a mobile device is so much different than a desktop. Using HTML and CSS can be an excellent way to begin thinking about your application design and doing prototypes—<a href="http://furbo.org/2007/07/02/beyond-sweet/">we&#8217;ve used this technique</a> in many of our own products.</p>
<p>After getting a feel for the web capabilities of the iPhone and iPod touch, you&#8217;ll want to look around the Apple Developer Connection (ADC) site for <a href="http://developer.apple.com/webapps/">more in-depth technical documentation for developing web applications</a>.</p>
<p>Which leads to our next topic&#8230;</p>
<h3>Buy a Mac</h3>
<p>There&#8217;s no two ways about it. If you&#8217;re going to develop iPhone applications, you&#8217;re going to do it on a Mac. The whole toolchain is Mac-only: you can&#8217;t do it in Visual Studio or Eclipse or anything else that runs on Windows.</p>
<p>Don&#8217;t think that this is some evil plan by Apple to make you use a Mac. It&#8217;s no more nefarious than Microsoft requiring Mac developers to purchase Visual Studio in order to develop Windows versions of our products.</p>
<p>Buying a Mac can be an expensive proposition: if you&#8217;re just getting started and on a shoestring budget, here&#8217;s some advice on doing it on the cheap:</p>
<ol>
<li>Buy a used machine. A lot of perfectly good hardware can be <a href="http://computers.shop.ebay.com/items/Computers-Networking__mac-book-pro_W0QQLHQ5fSiteWideConditionZUsed285fddQQ_flnZ1QQ_fromfsbZQQ_sacatZ58058QQ_ssovZ1QQ_trksidZp3286Q2ec0Q2em282">found on Ebay</a>. New models of the Mac Book Pro were recently introduced, so many people are selling hardware after they upgrade. This older hardware is perfectly fine for doing iPhone development: the apps you&#8217;re going to develop are small and compact and don&#8217;t need a lot of processor power to build and test.</li>
<li>Buy a <a href="http://www.apple.com/macmini/">Mac mini</a>. Even though you&#8217;re buying new hardware, you&#8217;ll save money because you&#8217;re supplying your own display, keyboard and other peripherals. If you&#8217;re like me, you have plenty of this stuff lying around.</li>
</ol>
<p>If you&#8217;re having a hard time justifying the hardware expenditure, remember that you can <a href="http://www.macworld.com/article/133513/2008/05/bothworlds.html">run Windows or any other x86 based OS on this machine</a>.</p>
<p>The only thing to keep in mind as you&#8217;re buying hardware: make sure that the Mac has an Intel processor. The development tools won&#8217;t run on the older PowerPC processors.</p>
<p>The good news is that once you buy the Mac, all the development tools are free. Think about <a href="https://msdn.microsoft.com/en-us/subscriptions/bb841434.aspx">all the money you spent buying Visual Studio and MSDN</a> and you&#8217;ll feel much better about spending a thousand bucks for the hardware :-)</p>
<p>So how do you get all these free development tools? Read on&#8230;</p>
<h3>Join Up and Download</h3>
<p>There are two things you&#8217;ll need to do before you can start writing applications: sign up for ADC and register to become an iPhone developer.</p>
<p>Neither of these things costs money. Everything is free until you want to put your code onto the device. At that point, you&#8217;ll need to pay $99 to get a certificate that allows you to sign the binary and put it on the device.</p>
<p>The first step is to create an Apple ID; it&#8217;s an email address that you&#8217;ll use to access the developer site. You may already have one for your iTunes account. <a href="http://developer.apple.com/iphone/program/download.html">These pages guide you through the sign-up process</a>.</p>
<p>Once you have an application that you want to test on a device and distribute on the App Store, you need to <a href="http://developer.apple.com/iphone/program/">apply to the iPhone Developer Program</a>.</p>
<p>After you have the keys to the ADC kingdom, there is a wealth of additional information available&#8230;</p>
<h3>Sit Back and Watch Some Movies</h3>
<p>Before you start diving into coding, I highly recommend spending a few hours watching the &#8220;<a href="http://developer.apple.com/iphone/index.action">Getting Started Videos&#8221; in the iPhone Dev Center</a>.</p>
<p>(Note: if the links on that page are grayed out, it&#8217;s because you&#8217;re not logged in yet. Sign in using the Apple ID that you obtained above.)</p>
<p>As I said earlier, I came into iPhone development with a fairly extensive background in the technologies used on the device: even so, I learned a lot from these videos. Make sure you take advantage of this valuable resource.</p>
<p>And make sure you do it before rushing off and hacking on code&#8230;</p>
<h3>Start Playing</h3>
<p>If you&#8217;re like me, you&#8217;ll want to start playing around with code as soon as possible. The best way to do this is with the <a href="http://developer.apple.com/iphone/samples/index.action">excellent sample code</a> that Apple provides on its developer site.</p>
<p>(Note: Again, that link is behind a login, so you&#8217;ll need an Apple ID before you can download the samples.)</p>
<p>Since you&#8217;re new to iPhone development, it&#8217;s likely that you&#8217;ll have some problems going beyond a simple build and run of the projects you download. (If you&#8217;re having problems running the sample projects, make sure that you have &#8220;Simulator&#8221; selected in the drop-down menu at the top of the project window.)</p>
<p>When you start to get confused by Xcode or the syntax of Objective-C, you&#8217;ll want to move onto the next step&#8230;</p>
<p>(Note: I said &#8220;when&#8221;, not &#8220;if&#8221;. Trust me on this.)</p>
<h3>Crack a Book or Two or Three</h3>
<p>You&#8217;re lucky that there are a lot of great books about iPhone development available now. It&#8217;s a luxury that those of us who worked on iPhone apps during the NDA are very jealous of :-)</p>
<p>If you&#8217;re just starting out, I&#8217;d highly recommend <a href="http://www.amazon.com/gp/product/1430216263?ie=UTF8&amp;tag=furboorg-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=1430216263">Beginning iPhone Development: Exploring the iPhone SDK</a> by Dave Mark and Jeff LaMarche. The best thing about this book is the step-by-step approach it takes to working with Xcode, Objective-C and the iPhone APIs. They&#8217;ll lead you through the basics and you&#8217;ll be building your own apps in no time at all.</p>
<p>As you get more comfortable with the tools and AppKit/UIKit frameworks, I&#8217;d recommend you take a look at Erica Sadun&#8217;s <a href="http://www.amazon.com/gp/product/0321555457?ie=UTF8&amp;tag=furboorg-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0321555457">iPhone Developer&#8217;s Cookbook: Building Applications with the iPhone SDK</a>. This book presumes a bit more knowledge about the SDK, but is a very handy reference both to the official and unofficial APIs. (Go ahead and play with the undocumented features, but do not use them in an application that you want to put on the App Store.) You may want to read my <a href="http://furbo.org/2008/11/13/cooking-with-gas/">in-depth review of this book</a>.</p>
<p>Since you&#8217;re going to be working with Cocoa Touch on the iPhone, you&#8217;ll also want to start thinking like a Cocoa programmer. Every great iPhone and Mac developer has nothing but wonderful things to say about <a href="http://www.amazon.com/gp/product/0321503619?ie=UTF8&amp;tag=furboorg-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0321503619">Cocoa Programming for Mac OS X</a> by Aaron Hillegass. Don&#8217;t be misled by the &#8220;for Mac OS X&#8221;—you&#8217;re going to be working with classes and design patterns that are identical on both platforms. You&#8217;ll also have a Mac that you&#8217;re using for development, so building the samples and test code isn&#8217;t a problem.</p>
<p>If you have previous development experience with C, C++ or Java, you&#8217;ll want to <a href="http://www.cocoabuilder.com/archive/message/cocoa/2008/5/15/206700">read this mailing list post</a> by Erik Buck that enumerates some of the difficulties that you&#8217;ll have coming up to speed with Objective-C and Cocoa. Make sure to take some time and read the replies to that post: many of the people commenting on that post are fellow developers whose work I hold in high regard.</p>
<p>And while we&#8217;re talking about Erik&#8217;s writing: there are a lot of experienced Cocoa developers <a href="http://www.amazon.com/gp/product/0321535022?ie=UTF8&amp;tag=furboorg-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0321535022">waiting for this book</a>. You won&#8217;t need it for awhile, but you will need it.</p>
<p>As you&#8217;ve probably figured out by now, this whole learning process is going to take awhile. I&#8217;d also be remiss if I didn&#8217;t mention that there is a pretty steep learning curve. <a href="http://furbo.org/about/">I&#8217;ve built products</a> in assembly code, BASIC, C/C++ on Unix, X11, Win32, Java and <a href="http://furbo.org/resume/">a whole bunch of other technologies</a>. Objective-C and Cocoa weren&#8217;t the easiest to pick up, but they&#8217;re definitely the ones that I plan on sticking with. Try not to get discouraged: once you &#8220;get it&#8221; developing with this language and framework is a joyous experience.</p>
<h3>Other Resources</h3>
<p>I&#8217;ve been coding long enough to remember a time when we didn&#8217;t have the Internet as a source of information. Thank God those days are behind us: here are some online resources that I use often:</p>
<ul>
<li><a href="http://www.cocoabuilder.com/archive/bydate">cocoabuilder.com</a> There are two mailing lists where other Cocoa developers and Apple engineers hang out: <a href="http://www.lists.apple.com/mailman/listinfo/cocoa-dev">Cocoa-dev</a> and <a href="http://www.omnigroup.com/mailman/listinfo/macosx-dev">MacOSX-dev</a>. The archives for both of these lists can be searched using CocoaBuilder: extremely handy when you come up against a problem that someone else has already solved.</li>
<li><a href="http://cocoadev.com/">cocoadev.com</a> A wiki that is maintained by the Cocoa developer community. This is the first place I look when I need to learn some new part of the framework. As an example, check out this entry <a href="http://www.cocoadev.com/index.pl?NSString">about the string class</a>.</li>
<li><a href="http://cocoadevcentral.com/">cocoadevcentral.com</a> A beautiful site maintained by Scott Stevenson. So many great tutorials and links to other sites and blogs that focus on Cocoa development. Spend some time exploring those links and you&#8217;ll learn a lot about our developer community.</li>
</ul>
<p>Apple recently launched another great resource: <a href="https://devforums.apple.com/community/iphone">Developer Forums</a>. It&#8217;s currently in beta, but is still an excellent place to ask fellow developers questions about iPhone SDK topics.</p>
<h3>But wait, there&#8217;s more!</h3>
<p>You&#8217;ll find a lot of iPhone content on this site. Here&#8217;s <a href="http://furbo.org/?s=iphone">proof</a>.</p>
<p>To save you some time, here are some quick links to some of the more popular essays on this site:</p>
<p><a href="http://furbo.org/2008/08/26/dealing-with-memory-loss-the-crash/">Memory management issues (part 1.)</a></p>
<p><a href="http://furbo.org/2008/08/27/dealing-with-memory-loss-the-cleanup/">Memory management issues (part 2.)</a></p>
<p><a href="http://furbo.org/2008/08/06/beta-testing-on-iphone-20/">How to run a beta test.</a></p>
<p><a href="http://furbo.org/2008/08/08/symbolicatifination/">Extracting information from crash reports.</a></p>
<p><a href="http://furbo.org/2008/11/12/the-final-test/">Final release testing.</a></p>
<p><a href="http://furbo.org/2008/11/19/release-day/">What to expect on release day.</a></p>
<p><a href="http://furbo.org/2008/11/10/debugging-with-backups/">Debugging with customer backups.</a></p>
<p><a href="http://furbo.org/2009/01/12/expiration-perspiration/">How to deal with expired certificates.</a></p>
<p>And, of course, source code for you to use in your own projects:</p>
<p><a href="http://furbo.org/2008/10/01/redacted/">[REDACTED]</a></p>
<p><a href="http://furbo.org/2008/10/07/fancy-uilabels/">Fancy UILabels</a></p>
<p>Or just have fun with:</p>
<p><a href="http://furbo.org/2008/09/19/lights-off/">Lights Off</a></p>
<p>And if you aren&#8217;t already completely bored with me crapping on about the iPhone, <a href="http://furbo.org/2009/02/02/macworld-famous/">there are videos</a>.</p>
<h3>Conclusion</h3>
<p>I hope this information has been helpful and gotten you started in the wonderful world of iPhone development. Don&#8217;t forget to subscribe to this site&#8217;s RSS feed since I have a lot more I&#8217;d like to write about :-)</p>
<p>Good luck!</p>
]]></content:encoded>
			<wfw:commentRss>http://furbo.org/2009/02/19/bootstrap/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
