<?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>White Peak Software Blog &#187; Software Development</title>
	<atom:link href="http://blog.whitepeaksoftware.com/category/software-development/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.whitepeaksoftware.com</link>
	<description>Latest word on White Peak Software and our products.</description>
	<lastBuildDate>Fri, 10 Sep 2010 19:44:25 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>My App Store Pricing Experiment: The Final Chapter</title>
		<link>http://blog.whitepeaksoftware.com/2010/09/01/my-app-store-pricing-experiment-the-final-chapter/</link>
		<comments>http://blog.whitepeaksoftware.com/2010/09/01/my-app-store-pricing-experiment-the-final-chapter/#comments</comments>
		<pubDate>Wed, 01 Sep 2010 14:52:27 +0000</pubDate>
		<dc:creator>kirbyt</dc:creator>
				<category><![CDATA[Labor Mate]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Tweet]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://blog.whitepeaksoftware.com/?p=329</guid>
		<description><![CDATA[Today is my final update on the pricing experiment I started back in May. You can read the previous posts here and here. The goal of the experiment was to see if the sales trend for Labor Mate would continue at the higher price of $1.99. After three full months, I can say the higher [...]]]></description>
			<content:encoded><![CDATA[<p>Today is my final update on the pricing experiment I started back in May. You can read the previous posts <a href="http://blog.whitepeaksoftware.com/2010/06/01/sales-are-down-but-revenue-is-up/">here</a> and <a href="http://blog.whitepeaksoftware.com/2010/07/02/sale-numbers-are-in-an-update-on-my-app-store-pricing-experiment/">here</a>. The goal of the experiment was to see if the sales trend for <a href="http://www.whitepeaksoftware.com/labormate" class="kblinker" title="More about Labor Mate &raquo;">Labor Mate</a> would continue at the higher price of $1.99. After three full months, I can say the higher price has done more harm than good.</p>
<p>Labor Mate continues to bring in over $1K per month despite the higher price, but the trend doesn&#8217;t look good. Over the last few weeks, the number of sales has decreased everywhere except in Japan. For some reason, sales are up in Japan and if not for Japanese sales in August, Labor Mate would have posted it&#8217;s worse sales month in 6 months.</p>
<p>Since it&#8217;s inception date, revenue for Labor Mate has been on a slow but steady rise. The higher price has reversed that trend. Labor Mate now appears to be on a slow but steady fall. Not only that, Labor Mate, which at one time was in the Health and Fitness Top 100 category in App Stores throughout the world, is not longer visible on any Top 100 chart, anywhere. This three month pricing experiment maybe the start of a slow death for Labor Mate, but it&#8217;s not done for yet.</p>
<p>I have big plans in the works, and a new update is just around the corner. I was planning a big release in a few weeks that would hopefully justify the $1.99 price tag in the eyes of consumers but I&#8217;m changing my strategy.  Starting today, Labor Mate is back down to 99 cents, and instead of a big update in a few weeks, I&#8217;m going to release 3 or 4 updates over the next 1 to 2 months. My goal here is to get Labor Mate back on track and return to the trend I was seeing before the price increase.</p>
<p>Update: One thing I should point out is Labor Mate has a lot of competition. The other similar apps cost between free and 99 cents. This maybe a key reason why a $1.99 Labor Mate cannot sustain the slow but steady growth seen by the 99 cent Labor Mate.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.whitepeaksoftware.com/2010/09/01/my-app-store-pricing-experiment-the-final-chapter/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Don&#8217;t Rely on UIDevice orientation for Rotation</title>
		<link>http://blog.whitepeaksoftware.com/2010/08/23/dont-rely-on-uidevice-orientation-for-rotation/</link>
		<comments>http://blog.whitepeaksoftware.com/2010/08/23/dont-rely-on-uidevice-orientation-for-rotation/#comments</comments>
		<pubDate>Mon, 23 Aug 2010 14:01:31 +0000</pubDate>
		<dc:creator>kirbyt</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Tweet]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://blog.whitepeaksoftware.com/?p=314</guid>
		<description><![CDATA[Last week I tweeted about having rotation issues with an iPad app I&#8217;m working on. This is the second time in recent weeks I&#8217;ve encountered rotation issues in an app. In both instances I was using a UIScrollView so I started thinking the UIScrollView was source of my problems. In the most recent instance the [...]]]></description>
			<content:encoded><![CDATA[<p>Last week I tweeted about having rotation issues with an iPad app I&#8217;m working on. This is the second time in recent weeks I&#8217;ve encountered rotation issues in an app. In both instances I was using a <em>UIScrollView</em> so I started thinking the <em>UIScrollView</em> was source of my problems. In the most recent instance the <em>UIScrollView</em> contains a <em>UIView</em> that uses a number of <em>CALayer</em> instances for content display.</p>
<p>For those who don&#8217;t know, in Mac OS X 10.5 and greater, <em>CALayer</em> has the <em>autoresizingMask</em> property. Unfortunately this property does not exists under iOS, so it&#8217;s up to my code to do the resizing CALayers as needed. This is where the rotation issue revealed itself.</p>
<p>As the device is rotated from portrait to landscape, or vice versa, my view must resize and adjust the layout of the CALayers. Because <em>UIView</em> does not receive the rotation notifications I decided to be smart and use the <a href="http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIDevice_Class/Reference/UIDevice.html#//apple_ref/doc/uid/TP40006902-CH3-SW3">orientation property</a> from <em>UIDevice</em>. So in my view I had code similar to this:</p>
<pre class="brush: objc;">
UIInterfaceOrientation interfaceOrientation = [[UIDevice currentDevice] orientation];
if (UIInterfaceOrientationIsLandscape(interfaceOrientation) == YES) {
  // Adjust for landscape.
} else {
  // Adjust for portrait.
}
</pre>
<p>What I failed to realize, however, is that the property <em>orientation</em> will <strong>always</strong> return 0 unless orientation notifications are enabled. Here is a quote directly from the Developer Documentation:</p>
<p><cite>&#8220;The value of this property always returns 0 unless orientation notifications have been enabled by calling beginGeneratingDeviceOrientationNotifications.&#8221;</cite></p>
<p>Doh! Guess I should have RTFM sooner.</p>
<p>Because the <em>orientation</em> property will return 0, sometimes the view in my app would not rotate. But I didn&#8217;t know this was the source of the problem at the time.</p>
<p>After banging my head over and over on the wall, I decided to investigate exactly what was happening. I never suspected [[UIDevice currentDevice] orientation] but eventually I noticed it was returning 0. This seemed odd so I checked the Developer Documentation. I wasn&#8217;t expecting to learn anything new. Boy, was I wrong. I was surprised when I read the property always returns 0 when orientation notifications are not enabled.</p>
<p>I now knew the source of my rotation problems, and a likely quick fix to the problem would have been to call beginGeneratingDeviceOrientationNotifications, get the device orientation, then call endGeneratingDeviceOrientationNotifications. But this just seemed wrong to me. The better fix, in my opinion, is to rely on the rotation notifications received by the view controller, so that&#8217;s exactly what I did.</p>
<p>Now in my particular situation, there are two times I want to resize and layout the CALayers in the <em>UIView</em>. One of those times is when the device is rotated, which is when the view controller receives the <em>willRotateToInterfaceOrientation:duration:</em> message. This was easy to solve. I added an <em>adjustLayoutToInterfaceOrientation:</em> method to my <em>UIView</em> and I call the method inside the UIViewController&#8217;s <em>willRotateToInterfaceOrientation:duration:</em> method. For example:</p>
<pre class="brush: objc;">
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
                                duration:(NSTimeInterval)duration
{
   [view_ adjustLayoutToInterfaceOrientation:toInterfaceOrientation];
}
</pre>
<p>The other time my <em>UIView</em> needs to adjust the layout of the CALayers is when the <em>UIScrollView</em> scrolls. I&#8217;m using a modified version of Matt Gallagher&#8217;s <a href="http://cocoawithlove.com/2009/01/multiple-virtual-pages-in-uiscrollview.html">virtual pages in a UIScrollView</a> approach, so the contents of my view changes as the user scrolls. This is where, previously, I was trying to be smart and use the <em>orientation</em> property from <em>UIDevice</em>. But what I really need is the current orientation as received in the most recent call to <em>willRotateToInterfaceOrientation:duration:</em>.</p>
<p>My solution was to add the ivar currentOrientation to my view controller. My view already has a reference to the view controller. I exposed currentOrientation so my view can retrieve the property value. This allowed me to replace the <em>[[UIDevice currentDevice] orientation]</em> code with <em>[controller currentOrientation]</em>. Now the view always knows the current orientation and the app does not need to enable orientation notification in code.</p>
<p>As a result, the first code snippet in this posting changes to:</p>
<pre class="brush: objc; highlight: [1];">
UIInterfaceOrientation interfaceOrientation = [controller_ currentOrientation];
if (UIInterfaceOrientationIsLandscape(interfaceOrientation) == YES) {
  // Adjust for landscape.
} else {
  // Adjust for portrait.
}
</pre>
<p>And the <em>willRotateToInterfaceOrientation:duration:</em> implementation changes to:</p>
<pre class="brush: objc; highlight: [4];">
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
                                duration:(NSTimeInterval)duration
{
   currentOrientation_ = toInterfaceOrientation;
   [view_ adjustLayoutToInterfaceOrientation:toInterfaceOrientation];
}
</pre>
<p>This has been an eye opener for me, and I now have a new rule of thumb. Never use <em>UIDevice orientation</em> in code that is responsible for the resizing and layouts of subviews and CALayers.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.whitepeaksoftware.com/2010/08/23/dont-rely-on-uidevice-orientation-for-rotation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Some Useful Books for iOS Developers</title>
		<link>http://blog.whitepeaksoftware.com/2010/07/26/some-useful-books-for-ios-developers/</link>
		<comments>http://blog.whitepeaksoftware.com/2010/07/26/some-useful-books-for-ios-developers/#comments</comments>
		<pubDate>Mon, 26 Jul 2010 21:13:44 +0000</pubDate>
		<dc:creator>kirbyt</dc:creator>
				<category><![CDATA[Books]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://blog.whitepeaksoftware.com/?p=303</guid>
		<description><![CDATA[Last week I had the opportunity to teach a one-day class on learning iPad programming. One of the students asked what books I recommend. A friend asked the same question over the weekend, so I thought I might as well post the list of books on iOS and Objective-C programming I have found helpful.

Beginning iPhone [...]]]></description>
			<content:encoded><![CDATA[<p>Last week I had the opportunity to teach a one-day class on learning iPad programming. One of the students asked what books I recommend. A friend asked the same question over the weekend, so I thought I might as well post the list of books on iOS and Objective-C programming I have found helpful.</p>
<ul>
<li><a href="http://www.amazon.com/Beginning-iPhone-Development-Exploring-SDK/dp/1430224592/ref=sr_1_1?ie=UTF8&#038;s=books&#038;qid=1280028038&#038;sr=8-1">Beginning iPhone 3 Development</a>, Dave Mark and Jeff LaMarche
<li><a href="http://www.amazon.com/More-iPhone-Development-Tackling-Beginning/dp/143022505X/ref=sr_1_2?ie=UTF8&#038;s=books&#038;qid=1280028038&#038;sr=8-2">More iPhone 3 Development</a>, Dave Mark and Jeff LaMarche
<li><a href="http://appdevmanual.com/">iPhone App Development</a>, the missing manual, Craig Hockenberry
<li><a href="http://www.pragprog.com/titles/mzcd/core-data">Core Data</a>, Marcus Zarra
<li><a href="http://www.pragprog.com/titles/amiphd/iphone-sdk-development">iPhone SDK Development</a>, Bill Dudney and Chris Adamson
<li><a href="http://www.pragprog.com/titles/sfipad/ipad-programming">iPad Programming</a>, Daniel Steinberg and Eric Freeman
<li><a href="http://www.amazon.com/iPhone-Developers-Cookbook-Building-Applications/dp/0321659570/ref=sr_1_3?ie=UTF8&#038;s=books&#038;qid=1280028038&#038;sr=8-3">The iPhone Developer&#8217;s Cookbook</a>, Erica Sadun
<li><a href="http://www.amazon.com/gp/product/0321566157/ref=s9_simh_gw_p14_i2?pf_rd_m=ATVPDKIKX0DER&#038;pf_rd_s=center-2&#038;pf_rd_r=003RBYM22CW9Q5D1EJNN&#038;pf_rd_t=101&#038;pf_rd_p=470938631&#038;pf_rd_i=507846">Programming in Objective-C</a>, Stephen Kochan
<li><a href="http://www.amazon.com/gp/product/1449381650/ref=s9_newr_gw_ir02?pf_rd_m=ATVPDKIKX0DER&#038;pf_rd_s=center-3&#038;pf_rd_r=003RBYM22CW9Q5D1EJNN&#038;pf_rd_t=101&#038;pf_rd_p=470938811&#038;pf_rd_i=507846">Tapworthy, Designing Great iPhone Apps</a>, Josh Clark
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.whitepeaksoftware.com/2010/07/26/some-useful-books-for-ios-developers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A Really Simply Timer</title>
		<link>http://blog.whitepeaksoftware.com/2010/07/19/a-really-simply-timer/</link>
		<comments>http://blog.whitepeaksoftware.com/2010/07/19/a-really-simply-timer/#comments</comments>
		<pubDate>Tue, 20 Jul 2010 03:11:17 +0000</pubDate>
		<dc:creator>kirbyt</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://blog.whitepeaksoftware.com/?p=301</guid>
		<description><![CDATA[A friend asked if I would put together a sample iOS app that shows how to display a stopwatch timer like the one used in Labor Mate. It seemed like a fun exercise to break up the night, so I said, &#8220;Sure, why not.&#8221; 
I decided others might find the sample source code useful so [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.whitepeaksoftware.com/wp-content/uploads/2010/07/SimpleTimer.png" alt="SimpleTimer.png" border="0" width="207" height="385" align="left" vspace="6" hspace="6" />A friend asked if I would put together a sample iOS app that shows how to display a stopwatch timer like the one used in <a href="http://www.whitepeaksoftware.com/labormate" class="kblinker" title="More about Labor Mate &raquo;">Labor Mate</a>. It seemed like a fun exercise to break up the night, so I said, &#8220;Sure, why not.&#8221; </p>
<p>I decided others might find the sample source code useful so I posted the project to <a href="http://github.com/kirbyt/SimpleTimer">github</a> for all to enjoy. The piece devs might find interesting is the KTStopwatch class. This is a simplified version of the class I use in Labor Mate. It supports wall clock and elapsed time.</p>
<p>The source code is licensed using The MIT License, so do with it what you like. Enjoy.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.whitepeaksoftware.com/2010/07/19/a-really-simply-timer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sale Numbers are In: An Update on My App Store Pricing Experiment</title>
		<link>http://blog.whitepeaksoftware.com/2010/07/02/sale-numbers-are-in-an-update-on-my-app-store-pricing-experiment/</link>
		<comments>http://blog.whitepeaksoftware.com/2010/07/02/sale-numbers-are-in-an-update-on-my-app-store-pricing-experiment/#comments</comments>
		<pubDate>Fri, 02 Jul 2010 13:15:06 +0000</pubDate>
		<dc:creator>kirbyt</dc:creator>
				<category><![CDATA[Labor Mate]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[White Peak Software]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[app store]]></category>

		<guid isPermaLink="false">http://blog.whitepeaksoftware.com/?p=291</guid>
		<description><![CDATA[Last month I mentioned my experiment with the pricing for Labor Mate to see what effects, if any, a price increase will have. The initial results were interesting. The number of units sold went down, but revenue had gone up. On the surface it seems the price increase was a success, but I needed more [...]]]></description>
			<content:encoded><![CDATA[<p>Last month I mentioned my <a href="http://blog.whitepeaksoftware.com/2010/06/01/sales-are-down-but-revenue-is-up/">experiment with the pricing</a> for <a href="http://www.whitepeaksoftware.com/labormate" class="kblinker" title="More about Labor Mate &raquo;">Labor Mate</a> to see what effects, if any, a price increase will have. The initial results were interesting. The number of units sold went down, but revenue had gone up. On the surface it seems the price increase was a success, but I needed more data.</p>
<p>I increased the price of Labor Mate by $1 on May 15, going from $0.99 to $1.99. By increasing the price on May 15, I was able to compare the first half of the month with the second half. And as I mentioned in the previous <a href="http://blog.whitepeaksoftware.com/2010/06/01/sales-are-down-but-revenue-is-up/">post</a> revenue had indeed gone up. But I was curious to see if this would continue and what might be the long term effects, so I left Labor Mate at $1.99. After all, I made more money in May as a result of the price increase.</p>
<p>June is over and the sales numbers are in. I&#8217;m now able to compare a full month of sales (for June) at the higher $1.99 price to a full month of sales (for April) at the lower $0.99 price. And I can compare these numbers to May&#8217;s numbers. The results might be surprising to some, but are inline with what I secretly thought would happen.</p>
<p>In June, Labor Mate earned a whooping $31.94 more money than in April, and it earned $30.90 <strong>less</strong> compared to May. In April, Labor Mate averaged $35 per day. The average was $37 per day in May, and only $36 per day in June. </p>
<p>Revenue from Labor Mate has been on a slow but steady increase since it was first released back in 2008. Though I cannot prove it, based on past trends, my gut tells me Labor Mate would have likely hit June&#8217;s revenue number in May without the price increase. And my gut, again based on the trend, says June would have probably hit May&#8217;s number without the price increase. In other words, while the price increase did improve Labor Mate&#8217;s revenue, the amount of additional revenue resulting from the price increase is actually no different from the slow and steady increase in revenue I was already seeing at the lower, 99 cent price point. As a matter of fact, I saw a bigger jump in revenue between March and April, with April bringing in a whooping $175.71 more than March.</p>
<p>I&#8217;m now convinced the price increase did little to improve revenue, and actually the price increase likely did more harm than good. Prior to the price increase Labor Mate was ranked in the Top 100 in the Health and Fitness category for a number of different countries including the U.S. Today Labor Mate is no were near ranking in the Top 100 in most stores.</p>
<p>Another negative effect caused by the price increase is that fewer people are now using Labor Mate. As I noted in the previous <a href="http://blog.whitepeaksoftware.com/2010/06/01/sales-are-down-but-revenue-is-up/">post</a>, the number of daily downloads dropped. This means fewer people are buying Labor Mate, which in turns means fewer people are using it. I believe Labor Mate&#8217;s slow but steady raise was due in part to word of mouth advertising. Now that there are fewer new moms and dads buying and using Labor Mate, there are fewer people recommending Labor Mate to other new moms and dads. And I admit, ignoring price for a moment, I&#8217;m a little disappointed that fewer people are using the app. A part of me prefers selling at a lower price point so more mom and pops to be will use it. (Hmm, maybe I should release a free, iAd supported version.)</p>
<p>So what&#8217;s next? I&#8217;ve thought about dropping the price back down to 99 cents, but this could lead to a backlash from the folks who purchased Labor Mate over the last 6 weeks. Plus, $1.99 is still cheaper than a large cup of Starbucks coffee. The better idea, and the one I have been planning all along, is to continue improving Labor Mate and make it stand out above the other 99 cent copy cats. This includes leaving the price at $1.99 for now. After all, as one recent new user said to me in email, &#8220;it is a very practical and intuitive app and certainly justified at $1.99.&#8221;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.whitepeaksoftware.com/2010/07/02/sale-numbers-are-in-an-update-on-my-app-store-pricing-experiment/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Using UIPopoverController with iOS 4</title>
		<link>http://blog.whitepeaksoftware.com/2010/06/10/using-uipopovercontroller-with-ios-4/</link>
		<comments>http://blog.whitepeaksoftware.com/2010/06/10/using-uipopovercontroller-with-ios-4/#comments</comments>
		<pubDate>Thu, 10 Jun 2010 23:37:25 +0000</pubDate>
		<dc:creator>kirbyt</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://blog.whitepeaksoftware.com/?p=271</guid>
		<description><![CDATA[I ran into an interesting bug today while testing Hey Peanut on iOS 4. For those who don&#8217;t know, Hey Peanut is a universal binary, which means it runs on both the iPhone and iPad. My iPhone has the GM version of iOS 4 installed on it, which I&#8217;m using to test my apps under [...]]]></description>
			<content:encoded><![CDATA[<p>I ran into an interesting bug today while testing <a href="http://whitepeaksoftware.com/main/hey-peanut/index" class="kblinker" title="More about Hey Peanut &raquo;">Hey Peanut</a> on iOS 4. For those who don&#8217;t know, Hey Peanut is a universal binary, which means it runs on both the iPhone and iPad. My iPhone has the GM version of iOS 4 installed on it, which I&#8217;m using to test my apps under iOS 4. </p>
<p>Because Hey Peanut can run on both the iPhone and iPad, my code must include certain checks to avoid crashes. One check the code makes is to determine if the class UIPopoverController is available or not. Prior to iOS 4, this class was only available in iOS 3.2. The current release of iOS on the iPhone is version 3.1.3, and it does not include this class. To make use of the popover I use code such as the following:</p>
<pre class="code">
   Class popoverControllerClass = NSClassFromString(@"UIPopoverController");
   if (popoverControllerClass) {
      popoverController_ = [[UIPopoverController alloc] initWithContentViewController:[self imagePicker]];
   }
</pre>
<p>Turns out there is a big problem with this code under iOS 4 causing Hey Peanut to crash each time. It wasn&#8217;t obvious to me at first why this code was failing but as I thought it more, and as I talked through the issue with an Apple engineer, I realized, &#8220;Duh! iOS 4 is running on the iPhone, not the iPad.&#8221; Simply checking for the existence of the class isn&#8217;t good enough any more. Instead, I need to also check the device type. So with a quick change to the code, shown below, I was able to fix the crash in Hey Peanut. The code now checks that the class is available and is running on a iPad.</p>
<pre class="code">
   Class popoverControllerClass = NSClassFromString(@"UIPopoverController");
   if (popoverControllerClass <b>&#038;&#038; UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad</b>) {
      popoverController_ = [[UIPopoverController alloc] initWithContentViewController:[self imagePicker]];
   }
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.whitepeaksoftware.com/2010/06/10/using-uipopovercontroller-with-ios-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Some Really Useful Xcode Plugins</title>
		<link>http://blog.whitepeaksoftware.com/2010/05/28/some-really-useful-xcode-plugins/</link>
		<comments>http://blog.whitepeaksoftware.com/2010/05/28/some-really-useful-xcode-plugins/#comments</comments>
		<pubDate>Fri, 28 May 2010 13:53:08 +0000</pubDate>
		<dc:creator>kirbyt</dc:creator>
				<category><![CDATA[Mac]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://blog.whitepeaksoftware.com/?p=257</guid>
		<description><![CDATA[Xcode is a suite of developer tools for Mac and iPhone programming. Xcode is also the IDE included in the developer tools. As far as IDEs go, Xcode has become my favorite over the years. It&#8217;s simple yet powerful. But as good as it is, there&#8217;s always room for improvement, so yesterday I asked on [...]]]></description>
			<content:encoded><![CDATA[<p>Xcode is a suite of developer tools for Mac and iPhone programming. Xcode is also the IDE included in the developer tools. As far as IDEs go, Xcode has become my favorite over the years. It&#8217;s simple yet powerful. But as good as it is, there&#8217;s always room for improvement, so yesterday I <a href="http://twitter.com/kirbyt/status/14852962957">asked on Twitter</a>, what plugins do other Xcode developers find useful? Turns out there are a number of really useful Xcode plugins. Here is the list of favorites based on responses to my tweet.</p>
<p><a href="http://macoscope.net/en/mac/codepilot/">Code Pilot</a> is by far the favorite based on the number of responses I received. Code Pilot provides easy navigation through your Xcode project. If you are a keyboard junkie like me than you owe it to yourself to try out Code Pilot.</p>
<p><a href="http://www.kevincallahan.org/software/accessorizer.html">Accessorizer</a> is the second most popular plugin. Accessorizer saves you time by generating boiler plate code for you. For instance, you can use Accessorizer to generate the @property declarations based on a set of ivars. Give the <a href="http://www.kevincallahan.org/AccessorizerDocuments/Accessorizer-QuickStartGuide.pdf">Accessorizer Quick Start Guide</a> (PDF) a read to get a sense of what Accessorizer can do for you.</p>
<p><a href="http://rentzsch.github.com/mogenerator/">Mogenerator</a> tied for second most popular plugin. It generates Objective-C code for Core Data models. It works differently than Xcode in that Mogenerator manages two classes per entity, one intended for the machine and the other intended for humans. The Mogenerator sites says, &#8220;The machine class can always be overwritten to match the data model, with humans’ work effortlessly preserved.&#8221; Perfect for Core Data projects. FYI, Mogenerator is an open source project created and maintained by the most-excellent <a href="http://rentzsch.com/">Jonathan &#8216;Wolf&#8217; Rentzsch</a>.</p>
<p><a href="http://www.obdev.at/products/completion-dictionary/index.html">Completion Dictionary</a> is a free plugin that enhances Xcode&#8217;s own code completion. It allows you to define your own expansion macros. You type a few letters and press the completion shortcut. You instantly have new code added to the file. This plugin reminds me of Delphi Live Templates, which I used religiously back when I did lots of Delphi programming. Oh, and did I mention Completion Dictionary is free?</p>
<p>What other Xcode plugins are out there? Which ones do you find useful? Post a comment if you have a favorite plugin not listed here.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.whitepeaksoftware.com/2010/05/28/some-really-useful-xcode-plugins/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>It&#8217;s Official. I&#8217;m Nuts.</title>
		<link>http://blog.whitepeaksoftware.com/2010/05/28/its-official-im-nuts/</link>
		<comments>http://blog.whitepeaksoftware.com/2010/05/28/its-official-im-nuts/#comments</comments>
		<pubDate>Fri, 28 May 2010 12:57:12 +0000</pubDate>
		<dc:creator>kirbyt</dc:creator>
				<category><![CDATA[Books]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[iPad]]></category>

		<guid isPermaLink="false">http://blog.whitepeaksoftware.com/?p=255</guid>
		<description><![CDATA[Turns out I&#8217;m nuts, and I can prove it. Last week a signed a contract to publish a book with Addison Wesley. Justin Williams at SecondGear put it best when he asked, &#8220;ARE YOU NUTS!?&#8221; Yep, apparently I am. And signing the book contract is my proof.
Kidding aside, I&#8217;m very excited about this opportunity to [...]]]></description>
			<content:encoded><![CDATA[<p>Turns out I&#8217;m nuts, and I can prove it. Last week a signed a contract to publish a book with Addison Wesley. Justin Williams at <a href="http://www.secondgearsoftware.com/">SecondGear</a> put it best when he asked, &#8220;ARE YOU NUTS!?&#8221; Yep, apparently I am. And signing the book contract is my proof.</p>
<p>Kidding aside, I&#8217;m very excited about this opportunity to contribute back to iPhone development community, a community that has been extremely helpful to me over the last couple of years. The book is on learning iPad programming. It will focus on the unique aspects of programming for the iPad and will hopefully serve as a launch pad for many new iPad programmer entering the space.</p>
<p>Writing on the book has just begun, and I have a very aggressive 6-month delivery schedule. My life is going to be busier than ever over the next 6 months, but it will be a good busy as this is something I have wanted to do for a long time. So if you don&#8217;t hear from me much between now and November, you know why.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.whitepeaksoftware.com/2010/05/28/its-official-im-nuts/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Learning While Watching Myself</title>
		<link>http://blog.whitepeaksoftware.com/2010/05/20/learning-while-watching-myself/</link>
		<comments>http://blog.whitepeaksoftware.com/2010/05/20/learning-while-watching-myself/#comments</comments>
		<pubDate>Thu, 20 May 2010 14:56:17 +0000</pubDate>
		<dc:creator>kirbyt</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://blog.whitepeaksoftware.com/?p=253</guid>
		<description><![CDATA[The video recording of my 360idev talk &#8220;Building Web Service Powered iPhone Apps&#8221; is now available from 360idev (free to attendees, for purchase for non-attendees). This was the first time a presentation I gave was recorded, and for the first time ever I get to see my own talk. I watched the video yesterday and [...]]]></description>
			<content:encoded><![CDATA[<p>The <a href="http://www.360conferences.com/conference-videos#360idevsanjose2010">video recording of my 360idev</a> talk &#8220;Building Web Service Powered iPhone Apps&#8221; is now available from 360idev (free to attendees, for purchase for non-attendees). This was the first time a presentation I gave was recorded, and for the first time ever I get to see my own talk. I watched the video yesterday and overall I&#8217;m happy with the results. The best part for me, however, is using the video to learn from my mistakes.</p>
<p>A mistake I repeatedly made was not repeating questions asked by the audience. Repeating the question is an age old speaker tip, but the tip is easily forgotten during an actual presentation. Repeating the question is helpful to others in the audience who may not have heard the original question. Repeating the question also gives you a chance to make sure you understand the question, and it buys you a few more seconds while you think of an answer. </p>
<p>Repeating the question becomes more important when your session is being recorded. In the case of the 360idev recording of my session, you cannot hear questions from the audience. This sometimes makes it hard to understand the context of the answer. I could have avoided this by repeating each question before providing an answer. The lesson learned here, and one I must remember the each time I speak, is to repeat the question before answering.</p>
<p>The other lesson I learned by watching my session is to not do live coding. Live coding can be impressive, earning you some respect points with audience members. But live coding can also slow down the presentation. This is what happened in my session. There are lulls during my talk while I type code from memory. Also audience members will often see mistakes in your code as you type and shout out tips. This can break your thought process causing confusion and delay.</p>
<p>Having now watched my session video I have decided to no longer do live coding in these types of sessions. The extra time spent typing on the keyboard is better spent sharing additional knowledge with the audience.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.whitepeaksoftware.com/2010/05/20/learning-while-watching-myself/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Section 3.3.1 Does Not Prevent Cross Platform Development</title>
		<link>http://blog.whitepeaksoftware.com/2010/05/04/section-3-3-1-does-not-prevent-cross-platform-development/</link>
		<comments>http://blog.whitepeaksoftware.com/2010/05/04/section-3-3-1-does-not-prevent-cross-platform-development/#comments</comments>
		<pubDate>Tue, 04 May 2010 15:04:49 +0000</pubDate>
		<dc:creator>kirbyt</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://blog.whitepeaksoftware.com/?p=244</guid>
		<description><![CDATA[Apple has come under fire over its latest developer agreement for iPhone OS developers.  The section causing concern is 3.3.1 which says applications must be originally written in Objective-C, C, and C++ (or JavaScript when using the WebKit engine).  This restricts developers from using other cross-platform development tools such as Adobe&#8217;s Flash CS5 [...]]]></description>
			<content:encoded><![CDATA[<p>Apple has come under fire over its latest developer agreement for iPhone OS developers.  The section causing concern is 3.3.1 which says applications must be originally written in Objective-C, C, and C++ (or JavaScript when using the WebKit engine).  This restricts developers from using other cross-platform development tools such as Adobe&#8217;s Flash CS5 packager.</p>
<p>Steve Jobs has clearly explained his <a href="http://www.apple.com/hotnews/thoughts-on-flash/">thoughts on Flash</a>, but more importantly he talks about the impact felt from third party cross platform development tools. Those of us who have been in the software industry long enough will likely agree with Steve&#8217;s comments regarding the impact cross platform development tools have on software development. </p>
<p>An interesting fact: An abstraction layer separating the developer from the platform does not have to come from a third party to cause problems. When Microsoft first released Windows 7 the only way to take full advantage of the new features was to use a development tool that allowed the developer to talk directly with the platform, in this case the Windows API. This may come as a surprise to some but it meant you could not use .NET including C# to tap into the newest Windows 7 features. Microsoft&#8217;s own layer, the .NET Framework, prevented C# developers from tapping into the latest features in Windows 7. A developer&#8217;s only option at the time was to use Visual C++ or Delphi.</p>
<p>For years programmers have dreamed of some magical development tool that would allow them to write code once and run it anywhere. Sound familiar? That was the promise made by Java over a decade ago. Guess what. It never really happened. Most cross platform applications are subpar and do not feel or behave like applications written specifically for the platform. </p>
<p>This brings me to a comment I read this morning in an <a href="http://www.electronista.com/articles/10/05/03/apple.could.dodge.ftc.complaints.with.sdk.change/">article</a> speculating Apple may change the iPhone developer agreement to avoid an antitrust case.</p>
<p><quote>&#8220;Mobile advertiser Greystripe&#8217;s CEO Michael Chang has explained that writing an app using Flash CS5 for the iPhone could cost $75,000 initially but would cost just a few thousand dollars more to port to Android. Without Adobe&#8217;s tool, however, developers could be forced to rewrite from scratch and spend as much as they did before. The sheer expense could be considered anti-competitive as it would make writing for more than one platform cost-prohibitive for smaller studios.&#8221;</quote></p>
<p>First of all, writing a top quality cross platform application is hard and costly. It doesn&#8217;t matter what development tools you are using. Second and more important, when did Flash CS5 become the <strong>only</strong> cross platform development option? Last time I checked C and C++ were considered cross platform programming languages with C being one of the more popular options for cross platform development. The iPhone developer agreement doesn&#8217;t restrict the use of these cross platform programming languages.</p>
<p>Yes, it would be great if cross platform development were cheaper but to say the expense associated with cross platform development should be considered anti-competitive is just down right stupid. The developer agreement is not preventing cross platform development. It is preventing the use of third party cross platform abstraction layers that separate the developer from the platform. </p>
<p>Why stop with Flash? Let&#8217;s start a petition against Apple because I can&#8217;t use my favorite programming language, Pascal. I think I should be able to use Pascal as my programming language of choice and not just for iPhone OS development. I want to use Pascal for any device and platform. Pascal should be a first class programming language for the Kindle, PSP and DSi, and Amazon, Sony and Nintendo should be responsible for making this happen otherwise face accusations of being anti-competitive.</p>
<p>This grumbling about section 3.3.1 in the iPhone developer agreement boils down to two things:</p>
<p>1) Businesses want to reduce development cost.</p>
<p>2) There are lots of lazy programmers out there.</p>
<p>Let&#8217;s discuss these 2 points a bit further. Building a cross platform application using a tool like Flash CS5 might help businesses reduce development cost. Will it help a business be successful? Maybe and maybe not. Success depends on whether or not customers like the apps produced by the business. Personally I dislike non-native apps because most are subpar and behave differently. If the apps are subpar then a business will likely not succeed despite using third party cross platform development tools and saving a few dollars in development cost.</p>
<p>Now on to lazy programmers. Actually saying &#8220;lazy&#8221; is probably the wrong word to use. I often say I&#8217;m a good programmer because I&#8217;m lazy. I don&#8217;t like to repeat the same task over and over, so I write a program to do the task for me.  This makes me lazy because I find ways to reduce the amount of work I need to do. So being a lazy programmer can actually be a good thing. The <a href="http://en.wikipedia.org/wiki/Don't_repeat_yourself">DRY</a> principle is another example of being a good type of lazy programmer.</p>
<p>In my second point I&#8217;m referring to a different type of lazy programmer, a bad lazy programmer. This is typically a programmer who does programming as a job and programming is just that, a job. This type of programmer doesn&#8217;t have the same love for programming that someone like me has. This type of programmer isn&#8217;t interested in learning new programming languages and this type of programmer definitely is not the type who would be programming even if he or she didn&#8217;t get paid to do it.</p>
<p>The bad lazy programmer wants everything to be easy. He wants to write an app once and have it run everywhere. He&#8217;s main goal is to move up the corporate ladder in hopes of making more money. And what better way to move up the ranks than showing your company how it can reduce development cost by using a third party abstraction layer and tool.</p>
<p>These are the types of programmers complaining about section 3.3.1. Programmers too lazy to learn a new programming language such as Objective-C, C or C++. Yes, these languages are harder to learn than many of the newer programming languages including those fun scripting languages used by many today. And yes, I might be a little basis because I first learned C over 25 years ago and I have no problems using it today. But instead of bitching about terms in the developer agreement why not accept the fact that cross platform development is hard and costly. After all you can still use the same C and C++ code in both iPhone and Android apps. Yes, that&#8217;s right. The <a href="http://developer.android.com/sdk/ndk/index.html">Android NDK</a> (Native Development Kit) does exists and allows C and C++ code to be used to implement parts of your application. It&#8217;s not easy but it&#8217;s possible.</p>
<p>Adding more fuel to my fire is this comment in NY Post <a href="http://www.nypost.com/p/news/business/an_antitrust_app_buvCWcJdjFoLD5vBSkguGO#ixzz0myFnh9pP">article</a> from yesterday:</p>
<p><quote>&#8220;Regulators, this person said, are days away from making a decision about which agency will launch the inquiry. It will focus on whether the policy, which took effect last month, kills competition by forcing programmers to choose between developing apps that can run only on Apple gizmos or come up with apps that are platform neutral, and can be used on a variety of operating systems, such as those from rivals Google, Microsoft and Research In Motion.&#8221;</quote></p>
<p>Yes, exactly what world needs. Apps that are platform neutral. But wait! Don&#8217;t we already have that today in the form of web-based apps? And doesn&#8217;t the iPhone and iPad come with Mobile Safari capable of running web-based applications &#8220;that are platform neutral and can be used on a variety of operating systems&#8221;?</p>
<p>Ah, but you say you want native built apps that take advantage of the platform. That&#8217;s cool. You can have that too. But this notation that you can have a native built app that is also platform neutral is just crazy talk. It&#8217;s not going to happen anytime soon and it shouldn&#8217;t be Apple sole responsibility to make it happen.</p>
<p>I wonder, if Objective-C were more popular would the torch carrying mob go after Google, Research in Motion, and Microsoft for not supporting it on their mobile devices?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.whitepeaksoftware.com/2010/05/04/section-3-3-1-does-not-prevent-cross-platform-development/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
