<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>SteveX Compiled</title>
	
	<link>http://blog.stevex.net</link>
	<description>Software development and other notes.</description>
	<lastBuildDate>Fri, 04 May 2012 20:50:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/stevex-blog" /><feedburner:info uri="stevex-blog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Editable UITextView with Links</title>
		<link>http://feedproxy.google.com/~r/stevex-blog/~3/DK0rZbvUkI4/</link>
		<comments>http://blog.stevex.net/2012/05/editable-uitextview-with-links/#comments</comments>
		<pubDate>Fri, 04 May 2012 19:46:35 +0000</pubDate>
		<dc:creator>stevex</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.stevex.net/?p=2057</guid>
		<description><![CDATA[A number of users requested that they be able to add notes to a meal in MealPlan, and users have also requested being able to add links. I wanted to add a single field for notes, which could include one or more links. The note field would need to be editable, but the links also [...]]]></description>
			<content:encoded><![CDATA[<p>A number of users requested that they be able to add notes to a meal in <a href="http://www.falldaysoftware.com/mealplan-ipad.html">MealPlan</a>, and users have also requested being able to add links.  I wanted to add a single field for notes, which could include one or more links.  The note field would need to be editable, but the links also need to be clickable.</p>
<p>UITextView supports both these things, but not at the same time.</p>
<p>I wanted this when viewing:</p>
<p><img src="http://blog.stevex.net/files/2012/05/201205041639-1.jpg" height="189" width="317" border="1" hspace="4" vspace="4" alt="201205041639-1" /><br />
But when you tap to edit, the field becomes editable.</p>
<p><img src="http://blog.stevex.net/files/2012/05/201205041639.jpg" height="189" width="314" border="1" hspace="4" vspace="4" alt="201205041639" /><br />
Turns out this is very easy to set up.  </p>
<p>In a nutshell, you install a tap gesture recogniser on the view that, when a users taps on it, makes it editable and assigns keyboard focus to it.  The tap gesture recogniser is triggered when the user taps anywhere on the field, but if the user taps and holds on the link, they are given the opportunity to open it.</p>
<p><img src="http://blog.stevex.net/files/2012/05/201205041641.jpg" height="230" width="326" border="1" hspace="4" vspace="4" alt="201205041641" /></p>
<p>Setting this up requires a gesture recogniser on the UITextView that makes the field editable and transfers focus to it when the user taps on it, and requires that your UITextViewDelegate set the field back to non-editable when the user is done editing.  Here&#8217;s code that accomplishes all these things.</p>
<div class="codecolorer-container objc dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:600px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #11740a; font-style: italic;">// Add the tap gesture recogniser to the view.</span><br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>configureTextView <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; UITapGestureRecognizer <span style="color: #002200;">*</span>recognizer <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UITapGestureRecognizer alloc<span style="color: #002200;">&#93;</span> initWithTarget<span style="color: #002200;">:</span>self &nbsp; &nbsp;action<span style="color: #002200;">:</span><span style="color: #a61390;">@selector</span><span style="color: #002200;">&#40;</span>textViewTapped<span style="color: #002200;">:</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; textView.editable <span style="color: #002200;">=</span> <span style="color: #a61390;">NO</span>;<br />
&nbsp; &nbsp; textView.dataDetectorTypes <span style="color: #002200;">=</span> UIDataDetectorTypeLink;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>textView addGestureRecognizer<span style="color: #002200;">:</span>recognizer<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#125;</span><br />
<br />
<span style="color: #11740a; font-style: italic;">// Notification from the recogniser that the UITextView was tapped</span><br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>textViewTapped<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIGestureRecognizer <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>recognizer <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; UITextView <span style="color: #002200;">*</span>textView <span style="color: #002200;">=</span> <span style="color: #002200;">&#40;</span>UITextView <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>recognizer.view;<br />
&nbsp; &nbsp; textView.editable <span style="color: #002200;">=</span> <span style="color: #a61390;">YES</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>textView becomeFirstResponder<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#125;</span><br />
<br />
<span style="color: #11740a; font-style: italic;">// UITextViewDelegate method</span><br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>textViewDidEndEditing<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UITextView <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>textView <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; textView.editable <span style="color: #002200;">=</span> <span style="color: #a61390;">NO</span>;<br />
<span style="color: #002200;">&#125;</span></div></td></tr></tbody></table></div>
<img src="http://feeds.feedburner.com/~r/stevex-blog/~4/DK0rZbvUkI4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.stevex.net/2012/05/editable-uitextview-with-links/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.stevex.net/2012/05/editable-uitextview-with-links/</feedburner:origLink></item>
		<item>
		<title>Static Libraries in Xcode</title>
		<link>http://feedproxy.google.com/~r/stevex-blog/~3/ENGuwJFHUW8/</link>
		<comments>http://blog.stevex.net/2012/04/static-libraries-in-xcode/#comments</comments>
		<pubDate>Fri, 27 Apr 2012 08:44:12 +0000</pubDate>
		<dc:creator>stevex</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.stevex.net/?p=2050</guid>
		<description><![CDATA[I wanted to do something that I think is straightforward, basic IDE functionality. Have a project that references a static library, use the static library from a client application (including referencing headers and linking with it), and have the library automatically rebuild when changes are made. With most IDEs this is functionality that you get [...]]]></description>
			<content:encoded><![CDATA[<p>I wanted to do something that I think is straightforward, basic IDE functionality.  Have a project that references a static library, use the static library from a client application (including referencing headers and linking with it), and have the library automatically rebuild when changes are made.</p>
<p>With most IDEs this is functionality that you get without even having to think too hard about it.  You create a library, you say &#8220;this application depends on this library&#8221;, and *poof* it just works.  Xcode makes you jump through a few hoops.</p>
<p>Here are the steps involved in making this work, starting from scratch.</p>
<p>1. Create a new workspace.  We&#8217;ll start from scratch so we&#8217;re both on the same page.  BTW, I&#8217;m using Xcode 4.3.2.</p>
<p>2. Create the application project.  I&#8217;m creating an empty iOS project called TestApp.  Build and run, make sure it works.</p>
<p>3. Create the library project.  I created a Cocoa Touch Static Library called TestLib.  One gotcha here is that the default location for the library project will be inside the TestApp project.  That&#8217;s not what I wanted; I wanted the library and the project that uses it as peers in the Project Navigator (so that the library can be shared with other projects).  To make this happen, make sure you select the workspace as the group for the new project when the file dialog appears to ask you where to save it:</p>
<p><img src="http://blog.stevex.net/files/2012/04/201204270643-1.jpg" height="126" width="356" border="1" hspace="4" vspace="4" alt="201204270643-1" /><br />
The first thing I want to accomplish is getting access to the library&#8217;s public headers from the app.  Xcode will copy the library&#8217;s public headers as a build step, but this needs a little configuration.  Here are the steps for that:</p>
<p>4. Mark the library project as Shared.  Open the Manage Schemes… panel and click the Shared checkbox for the library project.<br />
<img src="http://blog.stevex.net/files/2012/04/201204270648.jpg" height="142" width="312" border="1" hspace="4" vspace="4" alt="201204270648" /></p>
<p><img src="http://blog.stevex.net/files/2012/04/201204270647-1.jpg" height="123" width="652" border="1" hspace="4" vspace="4" alt="201204270647-1" /></p>
<p>5.  Add the headers we want to share to the static library&#8217;s Copy Headers build step.  Click on TestLib in the project navigator, click on the target, and drag TestLib.h into the Public section of the Copy Headers item.</p>
<p><img src="http://blog.stevex.net/files/2012/04/201204270650.jpg" height="105" width="708" border="1" hspace="4" vspace="4" alt="201204270650" /></p>
<p>Now if you build the test library project, you should see this header being copied in the build output. </p>
<p><img src="http://blog.stevex.net/files/2012/04/201204270707.jpg" height="118" width="844" border="1" hspace="4" vspace="4" alt="201204270707" /></p>
<p>That crazy target path means the headers are going into Xcode&#8217;s derived data folder, in the folder it creates for products of our build.  If you wanted your headers in a subdirectory so that you could include them as &lt;TestLib/MyHeader.h&gt; then you can edit the &#8220;Public Headers Folder Path&#8221; in Build Settings for the library project.</p>
<p>6. Set the Skip Install setting in the static library to YES.  Otherwise, you can run into trouble archiving your project.</p>
<p>So the library is ready.  Now we need to make TestApp depend on the library.  There are a couple of steps to setting this up. </p>
<p>7. Edit the TestApp scheme, and in the Build section, add TestLib as a target to build.</p>
<p><img src="http://blog.stevex.net/files/2012/04/201204270655.jpg" height="161" width="697" border="1" hspace="4" vspace="4" alt="201204270655" /></p>
<p>8.  Add the TestLib library to TestApp.  Click on the TestApp project, and in the TestApp target, on the Summary tab, in the Linked Frameworks and Libraries section, hit the + button and add the TestLib library.</p>
<p><img src="http://blog.stevex.net/files/2012/04/201204270727.jpg" height="139" width="240" border="1" hspace="4" vspace="4" alt="201204270727" /></p>
<p>9. Add the common location for the public header files to the header search path.</p>
<p><img src="http://blog.stevex.net/files/2012/04/201204270703.jpg" height="100" width="598" border="1" hspace="4" vspace="4" alt="201204270703" /></p>
<p>Now to test things out.  Let&#8217;s add some code to the object whose header file we made public.  I&#8217;ll add a simple method, &#8220;testString&#8221;, that returns a string.</p>
<p>In TestLib.h:</p>
<p><span style="font-family:monospace;color:#aa0d91;font-size:11pt;">@interface</span><span style="font-family:monospace;font-size:11pt;"> TestLib : </span><span style="font-family:monospace;color:#5c2699;font-size:11pt;">NSObject</span><span style="font-family:monospace;font-size:11pt;"><br />
    + (</span><span style="font-family:monospace;color:#5c2699;font-size:11pt;">NSString</span><span style="font-family:monospace;font-size:11pt;"> *)testString;<br />
</span><span style="font-family:monospace;color:#aa0d91;font-size:11pt;">@end</span><span style="font-family:monospace;font-size:11pt;"><br />
</span><br />
and</p>
<p>In TestLib.m:</p>
<p><span style="font-family:monospace;font-size:11pt;">+ (</span><span style="font-family:monospace;color:#5c2699;font-size:11pt;">NSString</span><span style="font-family:monospace;font-size:11pt;"> *)testString {<br />
</span><span style="font-family:monospace;color:#aa0d91;font-size:11pt;">    return</span><span style="font-family:monospace;font-size:11pt;"> </span><span style="font-family:monospace;color:#c41a16;font-size:11pt;">@&#8221;Hello&#8221;</span><span style="font-family:monospace;font-size:11pt;">;<br />
}<br />
</span><br />
And in the test application, where Xcode created a default AppDelegate object, simply add an NSLog that uses this test method to see the string printed.</p>
<p>In MYAppDelegate.m:</p>
<p><span style="font-family:monospace;color:#643820;font-size:11pt;">#import </span><span style="font-family:monospace;color:#c41a16;font-size:11pt;">&#8220;TestLib.h&#8221;<br />
</span><span style="font-family:monospace;color:#007400;font-size:11pt;">// and later</span><span style="font-family:monospace;font-size:11pt;"><br />
NSLog(</span><span style="font-family:monospace;color:#c41a16;font-size:11pt;">@&#8221;%@&#8221;</span><span style="font-family:monospace;font-size:11pt;">, [TestLib testString]);<br />
</span><br />
Build and run the application.  With any luck, it will print &#8220;Hello&#8221; to the console.</p>
<p>Now, back in the static library, change &#8220;Hello&#8221; to &#8220;Goodbye&#8221;, and run again.  This prints &#8220;Hello&#8221;, indicating that Xcode didn&#8217;t recompile the static library. You want the static library to rebuild when you change files in it and run the test app, and there seems to be a bug in Xcode 4.3.2 that causes this to not work (so this fix may not apply if you&#8217;re running a newer version).  There&#8217;s a workaround for this <a href="http://www.kihongames.com/blog/labs/2011/06/labs-xcode-static-library-pitfalls/">here</a> but in a nutshell…</p>
<p>10.  Select the static library in the Navigator pane.</p>
<p><img src="http://blog.stevex.net/files/2012/04/201204270737-1.jpg" height="80" width="258" border="1" hspace="4" vspace="4" alt="201204270737-1" /></p>
<p>11. In the File Inspector on the right, change the Location to Relative to Build Products.</p>
<p><img src="http://blog.stevex.net/files/2012/04/201204270739.jpg" height="197" width="288" border="1" hspace="4" vspace="4" alt="201204270739" /></p>
<p>12. Select TestApp and select Show in Finder.  This should open a Finder window containing the Xcode project.</p>
<p>13. Select the Xcode project and right-click or Control-click to bring up the context menu, and select Show Package Contents.</p>
<p>14. Select the &#8220;project.pbxproj&#8221; file and Open it with TextEdit.</p>
<p>15. Look for the reference to libTestLib.a and change it so that instead of being a relative path, it&#8217;s just the filename.  For example, if it&#8217;s &#8220;../Debug/libTestLib.a&#8221; change it to just &#8220;libTestLib.a&#8221;.</p>
<p>16. Run TestApp again.  This time, and from now on, the static library should rebuild whenever you change something in it.</p>
<p>Most of this writeup is basic &#8220;how to use a static library in Xcode&#8221;, but steps 12 through 15 are a workaround for what seems to be a bug in Xcode.  </p>
<p>If you still have trouble with this, check out <a href="http://www.kihongames.com/blog/labs/2011/06/labs-xcode-static-library-pitfalls/">this page</a>, which has some great information on troubleshooting static libraries.  This page is a modified version of the method he suggests, where I&#8217;m copying the public headers during the build process (which seems to be how Xcode is designed to work) and he&#8217;s adding them as Source Trees.  Switching between these two methods isn&#8217;t a big deal and doesn&#8217;t affect the overall process much, so you can pick one you like.</p>
<img src="http://feeds.feedburner.com/~r/stevex-blog/~4/ENGuwJFHUW8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.stevex.net/2012/04/static-libraries-in-xcode/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.stevex.net/2012/04/static-libraries-in-xcode/</feedburner:origLink></item>
		<item>
		<title>Avoid Premature Localization</title>
		<link>http://feedproxy.google.com/~r/stevex-blog/~3/CUr12Dg0U6o/</link>
		<comments>http://blog.stevex.net/2012/04/avoid-premature-localization/#comments</comments>
		<pubDate>Sat, 21 Apr 2012 10:39:23 +0000</pubDate>
		<dc:creator>stevex</dc:creator>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://blog.stevex.net/?p=2036</guid>
		<description><![CDATA[Localization is one of the signs of a mature software product. I did a bit of research into whether localizing an app translates into increased sales, and in my non-scientific review of blog posts and forum posts from developers discussing the issue, the conclusion I came to is that localization doesn&#8217;t make that much sense [...]]]></description>
			<content:encoded><![CDATA[<p>Localization is one of the signs of a mature software product.  I did a bit of research into whether localizing an app translates into increased sales, and in my non-scientific review of blog posts and forum posts from developers discussing the issue, the conclusion I came to is that localization doesn&#8217;t make that much sense for games, but does increase sales of non-game apps by about 25%.</p>
<p>25% isn&#8217;t incredible but it&#8217;s nothing to sneeze at either.  It&#8217;s not a lot of work to localize an iOS app.  Xcode and Cocoa makes it easy to do from the development side, and there are translation houses that will provide localization services on the order of $0.05 per word.  The apps I&#8217;ve been working on seem to average about 2000 words, so that&#8217;s $100 to translate, per language. French, German and Italian currently provide the best localized app sales (<a href="http://www.iphonedevsdk.com/forum/promotion-techniques/41432-localize-your-app-worth-effort.html">reference</a>), so that&#8217;s $300 to translate.</p>
<p>There&#8217;s another cost to localization that&#8217;s important to take into account, and that&#8217;s the incremental cost of developing your application.</p>
<p>Localization means having multiple copies of any resource that includes text.  This includes your nib files, storyboard files, localized string files, graphics, and any other assets (sample documents, for example).</p>
<p>Once you&#8217;ve localized, any change to your application will need to be translated.  If you need to fix a bug, and the bug fix requires a new error message, then that means a trip through the localization service for that new error message.  This increases your turnaround time for fixing that bug.</p>
<p>Same with any new features.  If you add new user interface to your main storyboard, you&#8217;ll need to send it for translation, and then when it comes back, you&#8217;ll need to go into the UI for each language and make sure it looks good, that the strings fit, and so on.</p>
<p>And you&#8217;ll need to test your app in every language, on every device.  I expect many developers take shortcuts here and just check the interface in Interface Builder, but I have been going to the trouble to reboot the device in every language I support and run the app to make sure things work.</p>
<p>The message I&#8217;m trying to convey here is, localization is worthwhile, but put it off until your app has reached a point where you&#8217;re not actively developing it.  Take a look at your product&#8217;s roadmap (or make one, if you haven&#8217;t considered it) and look for a spot where it makes sense to localize.  </p>
<p>In my case, with <a href="http://itunes.apple.com/us/app/mealplan/id486013055?mt=8">MealPlan</a>, I have a roadmap that includes adding iPhone support and adding iCloud support.  Once these two major features are done, I will localize it.  Otherwise I know I&#8217;d be making multiple localization passes, and those features would take longer to develop if the app were already localized.</p>
<p>(Note that I&#8217;m talking about localization here &#8211; localization is really part two of making an app world-ready.  Part one is globalization, which means making sure that your app is <a href="https://developer.apple.com/library/mac/documentation/cocoa/reference/foundation/miscellaneous/foundation_functions/reference/reference.html#//apple_ref/c/macro/NSLocalizedString">referencing strings in a localizable way</a>, not hard-coding things like date formats and number formats and so on.  Globalization should be done from day one).</p>
<p>One last comment on localization.  Support.  If you ship your app with a German translation and a German user sends you a question in German, what are you going to do?  I don&#8217;t have an answer for that one yet.</p>
<img src="http://feeds.feedburner.com/~r/stevex-blog/~4/CUr12Dg0U6o" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.stevex.net/2012/04/avoid-premature-localization/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.stevex.net/2012/04/avoid-premature-localization/</feedburner:origLink></item>
		<item>
		<title>Fall Day Software</title>
		<link>http://feedproxy.google.com/~r/stevex-blog/~3/V3XdBCxH6Vc/</link>
		<comments>http://blog.stevex.net/2012/04/fall-day-software/#comments</comments>
		<pubDate>Fri, 20 Apr 2012 00:07:01 +0000</pubDate>
		<dc:creator>stevex</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.stevex.net/?p=2031</guid>
		<description><![CDATA[It&#8217;s been 5 months since my employment with Adobe ended. I&#8217;ve been doing some interesting contracting work since then, but also putting some effort into my own independent iPhone and iPad apps. That&#8217;s been a lot of fun. I started a company called Fall Day Software (http://www.falldaysoftware.com) and built two apps I&#8217;m really proud of, [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s been 5 months since my employment with Adobe ended.  I&#8217;ve been doing some interesting contracting work since then, but also putting some effort into my own independent iPhone and iPad apps.</p>
<p>That&#8217;s been a lot of fun.  I started a company called Fall Day Software (http://www.falldaysoftware.com) and built two apps I&#8217;m really proud of, as well as a couple of smaller kid-focused apps that I did for our own kids.</p>
<p>MealPlan was my first app, and it&#8217;s one I created for myself.  I still use it, every week, to plan out our meals, and my own usage drive the features I add to the app.  I&#8217;m working on an update now that will add automatic grocery list generation, which I think will be a real time saver.  Once you fill out the week&#8217;s meal plan (with the help of the &#8220;magic wand&#8221; that makes suggestions and fills things in for you), the app will know what groceries you need, and you can toggle &#8220;need it&#8221; or &#8220;have it&#8221; for each item.  </p>
<p>Eventually I want to have an iPhone version so that with iCloud syncing, you could bring up the meal plan on your phone, but for now the workflow will likely be that you an print it or email a copy to yourself to refer to in the store.</p>
<p>The other app I built, which is now available for both the iPhone and the iPad, is Resume Designer.  It was originally called Resume Maker but that name seems to be already in use, so I changed it.  I think Resume Designer is turning out quite nicely.</p>
<p>The different usage patterns of users picking up MealPlan and Resume Designer makes for a bit of a quandary.  MealPlan users will use the app regularly, and appreciate feature updates.  Resume Designer users use the app once, or just a few times, and then forget the app even exists.</p>
<p>I&#8217;d like to think that Fall Day Software is building personal productivity tools and will someday build a following of people who appreciate the kind of apps I&#8217;m building.  Maybe a community of users won&#8217;t spring up around Resume Designer, but that is a goal I have for my other apps.</p>
<img src="http://feeds.feedburner.com/~r/stevex-blog/~4/V3XdBCxH6Vc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.stevex.net/2012/04/fall-day-software/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.stevex.net/2012/04/fall-day-software/</feedburner:origLink></item>
		<item>
		<title>That’s one way to find viruses</title>
		<link>http://feedproxy.google.com/~r/stevex-blog/~3/nO2THKWh4gw/</link>
		<comments>http://blog.stevex.net/2012/04/thats-one-way-to-find-viruses/#comments</comments>
		<pubDate>Fri, 06 Apr 2012 13:22:38 +0000</pubDate>
		<dc:creator>stevex</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.stevex.net/?p=2028</guid>
		<description><![CDATA[I just received an obviously-spam email, that was sent to an email address I don&#8217;t use along with a bunch of other people. The URL looked interesting because it used words like wiki and Railroad. I used to open these in a browser just to see what&#8217;s what, but since Mac attacks have been stepping [...]]]></description>
			<content:encoded><![CDATA[<p>I just received an obviously-spam email, that was sent to an email address I don&#8217;t use along with a bunch of other people.  The URL looked interesting because it used words like wiki and Railroad.  I used to open these in a browser just to see what&#8217;s what, but since Mac attacks have been stepping up lately, I took a look in curl.</p>
<p>The URL in the email looked like a hacked wiki, which pointed to a throwaway domain, which pointed to what looks like a generated addresss on a site who&#8217;s name makes it sound like it&#8217;s a Microsoft Security site (but obviously isn&#8217;t, as it&#8217;s in the .info TLD).</p>
<p>Anyway, here&#8217;s the core of the page&#8217;s virus scanning engine:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:600px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">per = Math.round((i*100)/503);</div></td></tr></tbody></table></div>
<p>And it would use this value to pick which trojan it was going to tell you it &#8220;found&#8221; on your computer.</p>
<img src="http://feeds.feedburner.com/~r/stevex-blog/~4/nO2THKWh4gw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.stevex.net/2012/04/thats-one-way-to-find-viruses/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.stevex.net/2012/04/thats-one-way-to-find-viruses/</feedburner:origLink></item>
		<item>
		<title>No Recourse</title>
		<link>http://feedproxy.google.com/~r/stevex-blog/~3/IBYHGVf7gCw/</link>
		<comments>http://blog.stevex.net/2012/03/no-recourse/#comments</comments>
		<pubDate>Wed, 28 Mar 2012 12:39:03 +0000</pubDate>
		<dc:creator>stevex</dc:creator>
				<category><![CDATA[Apple]]></category>

		<guid isPermaLink="false">http://blog.stevex.net/?p=2024</guid>
		<description><![CDATA[This is a frustrating situation for me. My iPad app, Resume Maker, has received a bad review. I know that bad reviews are just part of doing business &#8211; some users will give a one-star review because your app doesn&#8217;t have a feature that they thought it might have, I guess as an encouragement for [...]]]></description>
			<content:encoded><![CDATA[<p>This is a frustrating situation for me.  My iPad app, <a href="http://www.falldaysoftware.com/resume-maker-ipad.html">Resume Maker</a>, has received a bad review.</p>
<p>I know that bad reviews are just part of doing business &#8211; some users will give a one-star review because your app doesn&#8217;t have a feature that they thought it might have, I guess as an encouragement for you to add the feature.  But this particular bad review was troubling.  Here it is:</p>
<blockquote><p>
This app started off great&#8230; Spend hours typing up my resume on an ipad&#8230;click the email function as per picture&#8230;app immediately closes. So if you want an resume only available on your ipad, this app is for you! Everybody else who needs to email a resume they spent hours on only to find out that you can&#8217;t stay away!
</p></blockquote>
<p>This was a one-star review by a user named Neurochippy in Australia.</p>
<p>Here&#8217;s why this review is bothering me:  There is absolutely nothing I can do to help this user.</p>
<p>Rather than contacting me, they posted their problem as a review.  There&#8217;s a Report a Problem link on the same page where you&#8217;d post a review, but instead of asking for help, this user took to the soapbox to warn other users not to use the app.</p>
<p>I can understand this.  It&#8217;s frustrating to lose a lot of time to a crashy app.  But I don&#8217;t believe Resume Maker is a crashy app.</p>
<p>For one thing, I&#8217;ve sold quite a few copies.  If the app really did crash for users when they used its most important function, I&#8217;d have heard about it by now.  So there&#8217;s something going on for Neurochippy that&#8217;s not happening to other people, and I&#8217;d love to know what.</p>
<p>iTunes Connect, the site that app developers use to track their apps once they&#8217;re in the store, has a section for downloading crash reports.  But in my experience, it takes a lot of crashes before the crash report shows up in iTunes Connect, so for smaller apps, or apps that don&#8217;t crash often, this isn&#8217;t as useful as it sounds.  There are no crash reports for Resume Maker.</p>
<p>So what are my options?</p>
<p>It seems to me I only have two.  I can sit back and wait for iTunes Connect to gather enough crash reports that it will tell me what&#8217;s going on, or I can sit back and wait for a user to email me for support, at which point I can ask them to send me a crash log. </p>
<p>Neither of these options is very good.</p>
<p>In the meantime, there&#8217;s my app, in the store, with one review, and that one review is warning people not to download the app.  It&#8217;s a serious deterrent to future customers, and there&#8217;s nothing I can do about it.</p>
<img src="http://feeds.feedburner.com/~r/stevex-blog/~4/IBYHGVf7gCw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.stevex.net/2012/03/no-recourse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.stevex.net/2012/03/no-recourse/</feedburner:origLink></item>
		<item>
		<title>Visioneer DocAir App and iCloud Sync</title>
		<link>http://feedproxy.google.com/~r/stevex-blog/~3/E5hsnTU2TLs/</link>
		<comments>http://blog.stevex.net/2012/03/visioneer-docair-app-and-icloud-sync/#comments</comments>
		<pubDate>Mon, 26 Mar 2012 23:22:11 +0000</pubDate>
		<dc:creator>stevex</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.stevex.net/?p=2019</guid>
		<description><![CDATA[One of the projects I&#8217;ve been working on lately is iOS software to accompany Visioneer&#8217;s cordless mobile scanner. The app is in the App Store now, here, but you&#8217;ll need one of these to use it. One of the things that makes this app special is that it uses iCloud to sync your scanned documents [...]]]></description>
			<content:encoded><![CDATA[<p>One of the projects I&#8217;ve been working on lately is iOS software to accompany Visioneer&#8217;s cordless mobile scanner.  The app is in the App Store now, <a href="http://itunes.apple.com/us/app/docair/id505550264?mt=8">here</a>, but you&#8217;ll need <a href="http://www.visioneer.com/products/item.asp?PN=90-0537-00W">one of these</a> to use it. </p>
<p>One of the things that makes this app special is that it uses iCloud to sync your scanned documents between devices.  This makes for a slick workflow when you&#8217;re on the road.  You can scan a document using the scanner in a hotel room or at a customer&#8217;s site, and the document will automatically sync, through iCloud, to any other iOS device on the same iCloud account.</p>
<p>In developing this, I came across an incredibly useful feature of iCloud, where Apple will actually host images for you and provide links to the document in iCloud that you can include in email messages.</p>
<p>It&#8217;s easy, using a high resolution scanner that can output multi-page PDF files, to make very large documents.  So you&#8217;ve scanned an 80mb PDF and now you want to send it to someone.  What do you do?  </p>
<p>The magic here is NSFileManager&#8217;s <a href="http://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/nsfilemanager_Class/Reference/Reference.html#//apple_ref/occ/instm/NSFileManager/URLForPublishingUbiquitousItemAtURL:expirationDate:error:">URLForPublishingUbiquitousItemAtURL:expirationDate:error:</a>, which lets you query iCloud for an URL that you can use to refer to the item in iCloud.</p>
<p>This function gives you a URL like this one:</p>
<p>https://www.icloud.com/documents/dl/?p=03&#038;t=BAJ_zAdNJv869B6wNp4BKYhjFjWsGPzJS2kB</p>
<p>There&#8217;s no credentials required to access the data at the URL, but the URL itself is not guessable and the request is https, so this is as secure as your email.  The link will expire at some point (you can request a particular expiry time, but I believe the default is about a week) so this isn&#8217;t permanent hosting, but it&#8217;s a good way to send a scanned image to someone.</p>
<p>You could do this with DropBox or other services, or by uploading the file to an FTP site, but the nice thing about doing this with iCloud is there&#8217;s zero setup.  Assuming the device is already using iCloud (and most iOS devices are), this just works.</p>
<img src="http://feeds.feedburner.com/~r/stevex-blog/~4/E5hsnTU2TLs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.stevex.net/2012/03/visioneer-docair-app-and-icloud-sync/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.stevex.net/2012/03/visioneer-docair-app-and-icloud-sync/</feedburner:origLink></item>
		<item>
		<title>Worst Case Scenario</title>
		<link>http://feedproxy.google.com/~r/stevex-blog/~3/RYIKyUJlnck/</link>
		<comments>http://blog.stevex.net/2012/03/worst-case-scenario/#comments</comments>
		<pubDate>Mon, 19 Mar 2012 11:03:59 +0000</pubDate>
		<dc:creator>stevex</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.stevex.net/?p=2017</guid>
		<description><![CDATA[Well, that was no fun. Yesterday morning, I ran my iPad app, MealPlan, and it crashed. It wouldn&#8217;t launch &#8211; it just exited. I wasn&#8217;t at home, where I could debug it, and I wanted to show the app to someone, and I figured the problem was something to do with the fact that I [...]]]></description>
			<content:encoded><![CDATA[<p>Well, that was no fun.  Yesterday morning, I ran my iPad app, <a href="http://www.falldaysoftware.com/mealplan-ipad.html">MealPlan</a>, and it crashed.  It wouldn&#8217;t launch &#8211; it just exited.  I wasn&#8217;t at home, where I could debug it, and I wanted to show the app to someone, and I figured the problem was something to do with the fact that I had two copies of the app installed (one by Xcode and one by the App Store) so I just deleted and reinstalled it.</p>
<p>Later yesterday, I got an email from a user, telling me that the app was crashing on launch.</p>
<p>Uh oh.</p>
<p>I apologized to the user, said that they were &#8220;the first report person to report this&#8221; (when I hear that from a company I always assume they&#8217;re just saying that to make me feel better, but in this case it really was true), and asked if they wouldn&#8217;t mind sending me a crash log.</p>
<p>I had checked iTunes Connect, and there were no crash reports.  Even now, it still says &#8220;Too few reports have been submitted for a report to be shown&#8221;.  But without a crash log, I had no idea what was going on.  The instructions I sent to the user were:</p>
<blockquote><p>One thing that would help would be if you could send me a crash log.  It&#8217;s a bit of work to go and get it, but it would help give me some idea what&#8217;s going wrong in the application.  To get a crash log, sync the iPad with your computer, and then look in these directories on your computer:</p>
<p>Mac: /Library/Logs/CrashReporter/MobileDevice/&lt;iPad name&gt;<br />
Windows: Application Data/Apple Computer/Logs/CrashReporter/MobileDevice/&lt;iPad name&gt;</p></blockquote>
<p>Fortunately the user was willing to go to some trouble to get the app working again, so they sent me a crash log.  The crash log showed MealPlan on the call stack:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:600px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Thread 0 name: &nbsp;Dispatch queue: com.apple.main-thread<br />
Thread 0 Crashed:<br />
0 &nbsp; libsystem_kernel.dylib &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; 0x3691e32c 0x3690d000 + 70444<br />
1 &nbsp; libsystem_c.dylib &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0x36b77208 0x36b2a000 + 315912<br />
2 &nbsp; libsystem_c.dylib &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0x36b70298 0x36b2a000 + 287384<br />
3 &nbsp; libsystem_c.dylib &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0x36b90cba 0x36b2a000 + 421050<br />
4 &nbsp; MealPlan &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; 0x00043f84 0x3a000 + 40836<br />
5 &nbsp; MealPlan &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; 0x000401b2 0x3a000 + 25010<br />
6 &nbsp; MealPlan &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; 0x0003cf6c 0x3a000 + 12140<br />
7 &nbsp; UIKit &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0x30f88a7e 0x30f5c000 + 182910<br />
8 &nbsp; UIKit &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0x310868fc 0x30f5c000 + 1222908</div></td></tr></tbody></table></div>
<p>So this was a real clue.  The crash log from the device doesn&#8217;t show symbols, and to know what&#8217;s going on I needed to turn the locations in the crash log into symbols that I could look up in my source.  Xcode makes this easy:  Drop the .crash file onto the Device Logs section of the Organizer window.</p>
<p><img src="http://blog.stevex.net/files/2012/03/201203190650-1.jpg" height="88" width="175" border="1" hspace="4" vspace="4" alt="201203190650-1" /></p>
<p>If everything is working, the bottom of the Organizer window will briefly say that it&#8217;s Symbolicating your crash log:</p>
<p><img src="http://blog.stevex.net/files/2012/03/201203190652.jpg" height="27" width="379" border="1" hspace="4" vspace="4" alt="201203190652" /></p>
<p>And then it will show you the crash log with the locations in the crash log converted into symbols that point right to where the problem is happening in your source.</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:600px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Thread 0 name: &nbsp;Dispatch queue: com.apple.main-thread<br />
Thread 0 Crashed:<br />
0 &nbsp; libsystem_kernel.dylib &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; 0x3691e32c __pthread_kill + 8<br />
1 &nbsp; libsystem_c.dylib &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0x36b77208 pthread_kill + 48<br />
2 &nbsp; libsystem_c.dylib &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0x36b70298 abort + 88<br />
3 &nbsp; libsystem_c.dylib &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0x36b90cba __assert_rtn + 174<br />
4 &nbsp; MealPlan &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; 0x00043f84 -[MPDocument day:] (MPDocument.m:76)<br />
5 &nbsp; MealPlan &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; 0x000401b2 -[MPViewController populate] (MPViewController.m:197)<br />
6 &nbsp; MealPlan &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; 0x0003cf6c -[MPMainView scrollViewDidScroll:] (MPMainView.m:78)<br />
7 &nbsp; UIKit &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0x30f88a7e -[UIScrollView setContentOffset:] + 682<br />
8 &nbsp; UIKit &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0x310868fc -[UIScrollView(Static) _smoothScroll:] + 3604</div></td></tr></tbody></table></div>
<p>Note that for this process to work, Xcode must have access to the symbols for the binary you submitted to the App Store.  When you choose Archive for your project, Xcode builds an archive file and adds it to the organizer.  <em>You must keep this archive file</em> for any binary you submit to the App Store, so that you can symbolicate your crash logs.</p>
<p>Anyway, once symbolicated, the problem became a bit more clear.  I had an assertion at line 76 of MPDocument.m that would fire if there were duplicate entries in my Core Data database.  Basically if the app went to get a record for a particular day, and found more than one, it would assert.  I leave these asserts on in the release version so that if something does go wrong, even at runtime, the app will crash, rather than continuing on with bad data.  The assert pointed right to the problem, where if I didn&#8217;t have the assert, the app may have continued but would have been updating the wrong record &#8211; so sometimes the data from one of the duplicate rows would show up, and sometimes the other would.  No good.</p>
<p>After a bit of sleuthing, I managed to figure out what was going on.  MealPlan uses UIManagedDocument, and opening a UIManagedDocument is asynchronous.  MealPlan would ask the document to open, and then when the document opened, would populate the main view.</p>
<p>Problem is, the main view was active during the brief window while this was happening, and if the user tapped on a row during this interval, the app would create a record in the database before the document was completely open.  This led to the inconsistency.  The solution for me was to set userInteractionEnabled to NO on my main view while the document was opening, and then set it back to YES when the UIManagedDocument&#8217;s open completion handler was called.  And to clean up the mess that the previous version had made.</p>
<p>The update to 1.0.1 is waiting in Apple&#8217;s submission queue, and due to the nature of the problem, I&#8217;ve submitted a request for an expedited review (there&#8217;s a form for that <a href="https://developer.apple.com/appstore/contact/appreviewteam/index.html">here</a>).  So hopefully the fix will go live today.</p>
<p>It&#8217;s really disappointing when users run into a problem like this &#8220;in the wild&#8221;.  For some reason, a lot of people ran into this problem yesterday &#8211; I had five reports by the end of the day &#8211; even though there&#8217;s nothing special about yesterday that should have triggered this.  But in every case, users weren&#8217;t angry or looking for a refund, they just wanted to get back to using the app.  That makes me happy.  :)</p>
<img src="http://feeds.feedburner.com/~r/stevex-blog/~4/RYIKyUJlnck" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.stevex.net/2012/03/worst-case-scenario/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.stevex.net/2012/03/worst-case-scenario/</feedburner:origLink></item>
		<item>
		<title>Pre-thoughts on the new iPad</title>
		<link>http://feedproxy.google.com/~r/stevex-blog/~3/rhafB6xMAro/</link>
		<comments>http://blog.stevex.net/2012/03/pre-thoughts-on-the-new-ipad/#comments</comments>
		<pubDate>Fri, 16 Mar 2012 03:06:46 +0000</pubDate>
		<dc:creator>stevex</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.stevex.net/?p=2011</guid>
		<description><![CDATA[Tomorrow this time I should have my iPad (3rd generation). I&#8217;m looking forward to it. The retina display will look as good as everyone says it does, and that&#8217;s about it as far as what I&#8217;m looking forward to. Yes, the camera is better, but I&#8217;ve taken maybe 5 pictures with my iPad and I [...]]]></description>
			<content:encoded><![CDATA[<p>Tomorrow this time I should have my iPad (3rd generation).  I&#8217;m looking forward to it.  The retina display will look as good as everyone says it does, and that&#8217;s about it as far as what I&#8217;m looking forward to.</p>
<p>Yes, the camera is better, but I&#8217;ve taken maybe 5 pictures with my iPad and I don&#8217;t see that changing.  And I didn&#8217;t get an LTE-capable version, so that innovation is lost on me.</p>
<p>I do have some concerns about this new iPad.</p>
<p>It&#8217;s thicker, and heavier than the old one.  Not by much, and I&#8217;m sure that will fade into the background in time, but as Gruber says, it&#8217;s a compromise.  And I&#8217;m sure it&#8217;s a compromised they worked really hard to not have, and that&#8217;s what worries me.</p>
<p>The new iPad has a much bigger battery, reportedly 70% bigger, but has the same battery life, around 10 hours.  This means more power consumption, and power consumption means heat.  The iPad has no fan, no vents, so no way for heat to get out of the thing.  Early reviews are reporting that they can feel it getting hot in one particular area.</p>
<p>Heat scares me. </p>
<p>I&#8217;ve seen three MacBook Pro systems die to the nVidia chip problem, where heat makes the GPU separate from the motherboard and basically bricks the system.  Heat can be a killer, and the iPad wasn&#8217;t really designed to dissipate heat.  I&#8217;m afraid that in an effort to get the retina display into the iPad, Apple made some tradeoffs that are going to come back to bite them.</p>
<p>I don&#8217;t know if this is going to be a problem or not, but it&#8217;s the one thing I&#8217;m worried about with the new iPad.</p>
<img src="http://feeds.feedburner.com/~r/stevex-blog/~4/rhafB6xMAro" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.stevex.net/2012/03/pre-thoughts-on-the-new-ipad/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.stevex.net/2012/03/pre-thoughts-on-the-new-ipad/</feedburner:origLink></item>
		<item>
		<title>Resume Maker for iPad</title>
		<link>http://feedproxy.google.com/~r/stevex-blog/~3/Mdu9zYHJBsQ/</link>
		<comments>http://blog.stevex.net/2012/03/resume-maker-for-ipad/#comments</comments>
		<pubDate>Thu, 15 Mar 2012 00:32:19 +0000</pubDate>
		<dc:creator>stevex</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.stevex.net/?p=2004</guid>
		<description><![CDATA[A few days ago, I released my second iPad application, Resume Maker. Two things that motivated me to create this particular application. One is that I&#8217;m currently unemployed, so I have been thinking about resumes. But the second, more significant reason is that I&#8217;ve recently been asked by a couple of different people to help [...]]]></description>
			<content:encoded><![CDATA[<p>A few days ago, I released my second iPad application, <a href="http://itunes.apple.com/ca/app/resume-maker/id500891223?mt=8">Resume Maker</a>.</p>
<p><img src="http://blog.stevex.net/files/2012/03/201203142238.jpg" height="387" width="500" border="0" hspace="4" vspace="4" alt="201203142238" /></p>
<p>Two things that motivated me to create this particular application. One is that I&#8217;m currently unemployed, so I have been thinking about resumes.</p>
<p>But the second, more significant reason is that I&#8217;ve recently been asked by a couple of different people to help them put together a resume for themselves, which shows me that there are people that need a resume, and don&#8217;t know that much about putting one together.</p>
<p><img src="http://blog.stevex.net/files/2012/03/201203142247-2.jpg" height="387" width="500" border="0" hspace="4" vspace="4" alt="201203142247-2" /></p>
<p>A resume is essentially a data capture and presentation problem.  It&#8217;s not really a free-form document. There is particular information that is usually presented in particular ways.  So, Resume Maker takes a form-based approach to building a resume, where you supply information in input forms, and a custom rendering engine pours this data into a template that produces a resume.</p>
<p>This works pretty well. I used my own resume as well as the ones I created for friends to come up with the built in template, and it produces a nice, professional result.  Here&#8217;s a <a href="http://www.falldaysoftware.com/files/ResumeMaker-SampleResume.pdf">sample resume</a> generated by the app.</p>
<p>There&#8217;re a lot of different directions I can go with this product I&#8217;m looking forward to feedback from the first purchasers to help define what features are most important for future versions.</p>
<p>Some obvious features are more control over the appearance of the resume, including margins, fonts, and even additional templates. I&#8217;ll be working on all this in the first update, assuming user requests don&#8217;t suggest a different direction.</p>
<p>Check it out in the app store:  <a href="http://itunes.apple.com/ca/app/resume-maker/id500891223?mt=8">Resume Maker</a></p>
<img src="http://feeds.feedburner.com/~r/stevex-blog/~4/Mdu9zYHJBsQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.stevex.net/2012/03/resume-maker-for-ipad/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.stevex.net/2012/03/resume-maker-for-ipad/</feedburner:origLink></item>
	</channel>
</rss>

