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

<channel>
	<title>furbo.org &#187; Observation</title>
	<atom:link href="http://furbo.org/category/observation/feed/" rel="self" type="application/rss+xml" />
	<link>http://furbo.org</link>
	<description>by Craig Hockenberry</description>
	<lastBuildDate>Sat, 28 Jan 2012 02:36:35 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Homebase</title>
		<link>http://furbo.org/2012/01/16/homebase/</link>
		<comments>http://furbo.org/2012/01/16/homebase/#comments</comments>
		<pubDate>Mon, 16 Jan 2012 22:17:56 +0000</pubDate>
		<dc:creator>Craig Hockenberry</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[Observation]]></category>

		<guid isPermaLink="false">http://furbo.org/?p=409</guid>
		<description><![CDATA[A lot of people I know and respect have been commenting on problems associated with the iPhone mute switch:
John Gruber – On the Behavior of the iPhone Mute Switch
Andy Ihnatko – Unmuting on The Mute Question
Marco Arment – Designing “Mute”
Guy English &#8211; Mute This
Both sides of the argument have valid points-of-view. This really is a [...]]]></description>
			<content:encoded><![CDATA[<p>A lot of people I know and respect have been commenting on problems associated with the iPhone mute switch:</p>
<p><a href="http://daringfireball.net/2012/01/iphone_mute_switch_design">John Gruber – On the Behavior of the iPhone Mute Switch</a><br />
<a href="http://ihnatko.com/2012/01/15/unmuting-on-the-mute-question/">Andy Ihnatko – Unmuting on The Mute Question</a><br />
<a href="http://www.marco.org/2012/01/14/mute">Marco Arment – Designing “Mute”</a><br />
<a href="http://kickingbear.com/blog/archives/282">Guy English &#8211; Mute This</a></p>
<p>Both sides of the argument have valid points-of-view. This really is a situation with no right answer given the current mechanisms.</p>
<p>That got me thinking that there might be something missing that&#8217;s causing this ambiguity. I&#8217;ve come to the realization that this is a problem bigger than just alarms going off at inopportune moments. What we really want is for the devices in our pocket to behave differently depending on where they&#8217;re physically located.</p>
<p>Let&#8217;s imagine a new feature in iOS called &#8220;Homebase&#8221;. A user would be presented with a simple UI that lets them select a location that&#8217;s a &#8220;safe&#8221; environment. After the setup is complete, your Homebase would be recognized by GPS coordinates and/or available Wi-Fi networks. The important thing here is that the user gets to define where they feel safe with their device.</p>
<p>With that information developers can make smarter decisions:</p>
<ul>
<li>
Alarms that go off while the mute switch is on make noise at Homebase and just vibrate elsewhere. There&#8217;s no need to worry about alarms going off in public places (such as concert halls) and you won&#8217;t oversleep when you go to bed with a mute switch on.
</li>
<li>
The lock screen doesn&#8217;t need to display a Passcode lock at Homebase. People who use the Remote app with their Apple TV will no longer be annoyed by an unnecessary security precaution, nor will folks forget to turn their Passcode lock back on when they leave for the local bar (where they&#8217;re certain to get a <a href="https://twitter.com/#!/chockenberry/statuses/125410955369783296">Poopin&#8217;</a> tweet.)
</li>
<li>
Apps, like Find My Friends, could use cached Apple ID credentials at Homebase and avoid asking the user for them over and over and over and over again.
</li>
</ul>
<p>Of course, this feature is needed most by people who don&#8217;t even know the Settings app exists. It&#8217;s my opinion that if developers are careful with this additional knowledge about the user and device, default behavior can be adjusted appropriately without additional confusion. It&#8217;s analogous to the Energy Saver on the Mac: people don&#8217;t question why the screen dims when the power cord is removed because it just &#8220;makes sense&#8221;.</p>
<p>The examples above use Apple&#8217;s own apps, but the Homebase status would be useful for third-party developers, too.</p>
<p>If you&#8217;d like to see something like Homebase in iOS, please be sure to file a <a href="http://www.openradar.me/10702394">duplicate Radar</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://furbo.org/2012/01/16/homebase/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Un-Trusteer-ed</title>
		<link>http://furbo.org/2011/08/01/un-trusteer-ed/</link>
		<comments>http://furbo.org/2011/08/01/un-trusteer-ed/#comments</comments>
		<pubDate>Mon, 01 Aug 2011 16:16:17 +0000</pubDate>
		<dc:creator>Craig Hockenberry</dc:creator>
				<category><![CDATA[Advice]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[Observation]]></category>

		<guid isPermaLink="false">http://furbo.org/?p=395</guid>
		<description><![CDATA[The bank we use for our business account recently mandated the use of a product called Trusteer Rapport while accessing our information online. Although Mac OS X doesn&#8217;t have any problems with &#8220;increasingly sophisticated malware in the online environment&#8221;, I do need to periodically check our accounts and transactions so I proceeded with the installation.
The [...]]]></description>
			<content:encoded><![CDATA[<p>The bank we use for our business account recently <a href="https://www.suntrust.com/Microsites/ocm_rapport/index.htm">mandated</a> the use of a product called Trusteer Rapport while accessing our information online. Although Mac OS X doesn&#8217;t have any problems with &#8220;increasingly sophisticated malware in the online environment&#8221;, I do need to periodically check our accounts and transactions so I proceeded with the installation.</p>
<p>The first warning sign was after starting the Installer: I was prompted for an administrator password indicating that this software wanted to run from protected areas of my system. Being a developer, I immediately dug into the installer scripts and configuration files to see that the app is placing items in the Rapport/bin, PreferencePanes, LaunchDaemons and LaunchAgents folders of the main system Library folder. The launch folders indicate that the software will be run whenever my Mac is restarted and will be able to do things a normal user would not (because of elevated permissions.)</p>
<p>I placed my security concerns aside as I need to access my bank website, so I went ahead with the installation. Afterwards, I was directed to a web page describing the <a href="http://activation.trusteer.com/v3/installation-complete-osx">new software</a>.</p>
<p>Again, as a developer, my first thoughts were suspicious ones. From experience, I know that it&#8217;s not easy to modify Safari&#8217;s user interface in the way that Trusteer was doing. My guess that there would be a new, always active, background process was confirmed by the presence of &#8220;rooksd&#8221; in my process list.</p>
<p>However what happened next really opened my eyes. Safari <a href="http://files.iconfactory.net/craig/bugs/Rapport.txt">crashed</a>.</p>
<p>Of course that, in and of itself, isn&#8217;t the end of the world. But I was surprised to see a new library named RapportUtil1 while looking at the Safari crash report. It was pretty clear that the new Trusteer software caused the crash. But how?</p>
<p>As a longtime Objective-C developer, I know a thing or two about <a href="http://www.mikeash.com/pyblog/friday-qa-2010-01-29-method-replacement-for-fun-and-profit.html">&#8220;method swizzling</a>&#8220;. In a nutshell, this allows a developer to replace the functionality of code they don&#8217;t have direct access to (typically in the system or other frameworks.) </p>
<p>Seeing &#8220;_nsapplication_sendEvent_override&#8221; tells me that Trusteer is using this technique to change the behavior of Safari. The function that is being affected is <a href="http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSApplication_Class/Reference/Reference.html#//apple_ref/occ/instm/NSApplication/sendEvent:">-sendEvent:</a> &#8212; the part of every Cocoa application where mouse, keyboard and other input is routed.</p>
<p>Method swizzling is a dangerous activity. You have to make assumptions about how some other code, that you&#8217;ve never seen, is behaving. You also need to think about how that code might change in future versions. There are extreme cases where this technique can be effective: overriding the default behavior of my web browser is not one of them.</p>
<p>It&#8217;s clear that the folks taking control of my browser aren&#8217;t as clever as they think. Do you see a common theme when you search Apple&#8217;s discussion forums for &#8220;<a href="https://discussions.apple.com/search.jspa?peopleEnabled=true&#038;userID=&#038;containerType=&#038;container=&#038;spotlight=true&#038;q=RapportUtil1">RapportUtil1</a>&#8220;?</p>
<p>Even more troubling is the method being overridden: every key press or mouse movement is first being sent to Rapport and then forwarded onto Safari. Since this happens often, the intruding software can do pretty much whatever it wants, whenever it wants. And remember that part of this package is running with elevated permissions in the background.</p>
<p>After <a href="http://twitter.com/#!/chockenberry/status/97361639430553601">mentioning</a> my findings on Twitter, I got back some very interesting replies. Graham Lee (<a href="http://twitter.com/iamleeg">@iamleeg</a>) pointed out that I&#8217;m not the first developer to <a href="http://broadcast.oreilly.com/2008/12/snake-oil-legitimate-vendors-s.html">question the technical merits</a> of this software. But then Peter Hosey (<a href="http://twitter.com/boredzo">@boredzo</a>) dropped the real bomb. Trusteer tacitly admits to <a href="http://www.trusteer.com/company/press/trusteer-finds-two-thirds-internet-users-reuse-their-online-banking-credentials-other-">recording my password</a>. That&#8217;s easy to do when you take control of -sendEvent:.</p>
<p>Essentially, my bank is asking me to install is a <a href="http://en.wikipedia.org/wiki/Keystroke_logging">keylogger</a>. Just so they can warn me not to use the same password on suntrust.com and playboy.com.</p>
<p>Hopefully, the engineers behind Rapport are smart enough to be using <a href="http://en.wikipedia.org/wiki/Password#Form_of_stored_passwords">hashed passwords</a> rather than clear text. And hopefully none of the personal information Safari has access to is being forwarded to the Trusteer servers. And hopefully they&#8217;re not recording how many times I visited playboy.com last month. But that&#8217;s beside the point, because as a closed source product, no one can audit their activity. That&#8217;s not true with <a href="http://www.webkit.org/">Safari</a>. </p>
<p>Oh, and there&#8217;s one other thing: the Rapport software isn&#8217;t supported on Lion. One of the tenets of method swizzling is to test your software early and often with any new release of the system or framework that it&#8217;s modifying. As a developer, you need to be proactive about fixing any problems that pop up in the code you are overriding. Not doing so is irresponsible and puts your users at risk. The last update for Rapport was in 2009.</p>
<p>(One could speculate that the new <a href="http://arstechnica.com/apple/reviews/2011/07/mac-os-x-10-7.ars/9#privilege-separation">privilege separation architecture for Safari</a> in Lion is causing Trusteer&#8217;s developers a lot of headaches. The other tenet of method swizzling is to remember that it&#8217;s not a matter of <strong>if</strong> your hack will break in the future, but rather <strong>when</strong> it will break and how painful it will be to fix.)</p>
<p>Needless to say, I have uninstalled this software and will never be installing it again. I would recommend this course of action to any end user.</p>
<p>But that leaves me with a problem: how do I access my bank&#8217;s website? I have three options:</p>
<p>1) Find another bank. This is a difficult choice, as there are many systems that are hooked up to this account: ACH transactions for sales via iTunes, bi-weekly payroll, automatic payments for services, etc. I&#8217;d also like to give SunTrust a chance to reconsider their position in requiring this software (they will be getting a copy of this report.)</p>
<p>2) Use the telephone. I can call the bank when I need the information. Sure they&#8217;ll get tired of hearing from me, and it will cost them more for customer service, but it&#8217;s their choice to require Trusteer Rapport.</p>
<p>3) Run the Trusteer Rapport software in locked down environment. Once it&#8217;s supported on Lion, it should be possible to create a virtual machine that that will only be used to access the bank website. Needless to say this is inconvenient, a waste of resources, and severely limits my ability take advantage of my bank&#8217;s services.</p>
<p>In closing, I&#8217;ll leave you with one final irony: I will <strong>never</strong> be able to access my bank&#8217;s website from what is arguably the most secure computing device in existence today. That&#8217;s because the iPad is not a <a href="http://www.trusteer.com/supported-platforms">supported platform</a>. Apple only allows third-party applications to run in a secure sandbox where they can&#8217;t affect other applications or the operating system. What you&#8217;ve seen above is exactly the reason they&#8217;ve done this.</p>
]]></content:encoded>
			<wfw:commentRss>http://furbo.org/2011/08/01/un-trusteer-ed/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Great writing, terrible reading</title>
		<link>http://furbo.org/2011/03/17/great-writing-terrible-reading/</link>
		<comments>http://furbo.org/2011/03/17/great-writing-terrible-reading/#comments</comments>
		<pubDate>Thu, 17 Mar 2011 19:15:56 +0000</pubDate>
		<dc:creator>Craig Hockenberry</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Observation]]></category>
		<category><![CDATA[Opinion]]></category>

		<guid isPermaLink="false">http://furbo.org/?p=334</guid>
		<description><![CDATA[Apple has recently released Xcode 4—a major part of this release is an overhaul of the user interface. Change in your development environment is always a bit disruptive, but overall I think the move towards a single-window environment that adapts to different working modes is a good thing.
But this post is not to debate these [...]]]></description>
			<content:encoded><![CDATA[<p>Apple has recently released Xcode 4—a major part of this release is an overhaul of the user interface. Change in your development environment is always a bit disruptive, but overall I think the move towards a single-window environment that adapts to different working modes is a good thing.</p>
<p>But this post is not to debate these changes to the programming environment. Rather, I&#8217;d like to discuss the new documentation viewer and how it has become unsuitable for both Mac and iOS development.</p>
<p>Apple&#8217;s technical documentation has always been top-notch: well written with just the right amount of technical detail. Unfortunately, the documentation viewer that we use to read this valuable information has been declining in ease of use over the past few releases.</p>
<p>It has gotten to the point where frustration with usability overshadows the excellent content. The best way to describe these annoyances is by example: I often get the feeling that the writers who create this prose don&#8217;t understand how we use it. Hopefully, this critique will help Apple create a viewer that&#8217;s just as good as the information it holds.</p>
<h3>A corrupt index</h3>
<p>A developer coming from Xcode 3 will have a terrible first experience with the new documentation viewer. Any previously installed documentation sets are incompatible with Xcode 4. Methods that you know exist just don&#8217;t show up:</p>
<p><img src="http://furbo.org/wp-content/uploads/2011/03/Search_in_vain.png" alt="Search in vain" title="Search in vain" width="286" height="348" class="aligncenter size-full wp-image-336" /></p>
<p>There are also problems with the Jump Bar navigation stack not being recorded correctly and the browsing history being unavailable (the back button isn&#8217;t available when it should be.)</p>
<p>Presumably, there is a corrupt or incompatible index. The workaround is to delete and re-install the documentation set, but this is far from obvious.</p>
<p>Since I currently have three different versions of Xcode installed (and will continue to use Xcode 3 for the foreseeable future), I&#8217;m wondering if this corrupted/incompatible index will continue to be a problem. Fingers are crossed, but at least now we know what to fix if it breaks.</p>
<h3>Popup hell</h3>
<p>When you hold down the option key and click on a symbol in Xcode, you see the following window:</p>
<p><img src="http://furbo.org/wp-content/uploads/2011/03/Popup_hell.png" alt="Popup hell" title="Popup hell" width="421" height="312" class="aligncenter size-full wp-image-338" /></p>
<p>For novices, this window has some utility—it provides a simple way for them to dig into what is probably unfamiliar territory (&#8221;What&#8217;s a UIWindow anyway?&#8221;).</p>
<p>The problem is that this window becomes a roadblock for experienced developers. We know damn well what a UIWindow is: we need to dig into the details of this important class. Maybe we want to know more about the rootViewController instance or look at some of the methods in UIResponder (because we know it inherits from that.) This helpful popup quickly becomes a hindrance.</p>
<p>In previous versions of Xcode, holding down the shift key along with the option key gave you a quick way to avoid this popup help. In Xcode 4, that shortcut is gone.</p>
<p>Considering that this feature can get in the way hundreds of times per day, this is truly popup hell.</p>
<p><a href="http://www.openradar.me/9149588">rdar://9149588</a></p>
<h3>No methods</h3>
<p>Once you get the documentation index in working order and actually make it past the popup help, your next hurdle is to locate the information you seek. Let&#8217;s say we&#8217;re looking for some background on what happens when a new -rootViewController instance is assigned. We&#8217;ve got the page of documentation, but there aren&#8217;t any controls to show the methods for the UIWindow class:</p>
<p><a href="http://furbo.org/wp-content/uploads/2011/03/No_methods_1.png"><img src="http://furbo.org/wp-content/uploads/2011/03/No_methods_1-300x63.png" alt="No methods" title="No methods" width="300" height="63" class="aligncenter size-medium wp-image-340" /></a></p>
<p>Besides being a pain in the butt, this is wholly inconsistent with the behavior in the code editor:</p>
<p><a href="http://furbo.org/wp-content/uploads/2011/03/No_methods_2.png"><img src="http://furbo.org/wp-content/uploads/2011/03/No_methods_2-300x104.png" alt="Methods" title="Methods" width="300" height="104" class="aligncenter size-medium wp-image-341" /></a></p>
<p>(Note that typing &#8220;ro&#8221; is enough to select &#8220;rootViewController&#8221; in the code editor&#8217;s popup menu. That, followed by the enter key gets you to the code of interest.)</p>
<p>From a developer&#8217;s point-of-view, the header files and the documentation page go hand-in-hand. Make the UI affordances the same and we don&#8217;t have to think about whether we&#8217;re looking at code or the words that describe it.</p>
<p>With a little more digging, you&#8217;ll find that you can get to the rootViewController documentation with the Jump Bar. Unfortunately, it takes a lot more effort than in the code editor: you have to click on the class name, and then move the mouse until the subcategories appear. Choose &#8220;Instance Methods&#8221; and wonder why rootViewController isn&#8217;t there. Then move the mouse back and try Properties.</p>
<p>Bingo (but you don&#8217;t feel like a winner.) And forget about navigating these lists quickly and easily with the keyboard as you can with the code editor.</p>
<p><a href="http://www.openradar.me/9149638">rdar://9149638</a></p>
<h3>Unmanaged complexity</h3>
<p>Our final navigation problem is reading chapter-based documentation. These are the crown jewels of Apple&#8217;s developer documentation. Titles like The Objective-C Programming Language, iPhone Human Interface Guidelines, and the Cocoa Fundamentals Guide are essential reading for all developers, both beginner and advanced. As I began learning about Xcode 4, of course I turned to the excellent User Guide.</p>
<p>These guides typically span many chapters when sections that cover a wide range of topics. And this is how you navigate through those chapters:</p>
<p><a href="http://furbo.org/wp-content/uploads/2011/03/Unmanaged_complexity.png"><img src="http://furbo.org/wp-content/uploads/2011/03/Unmanaged_complexity-300x124.png" alt="Unmanaged complexity" title="Unmanaged complexity" width="300" height="124" class="aligncenter size-medium wp-image-344" /></a></p>
<p>Managing complexity, indeed.</p>
<p>The pity here is that someone in developer documentation has forgotten that a Table of Contents tells a much more important story than the individual chapters. A roadmap lets you visit the destinations efficiently.</p>
<p>To get an idea of how painful this is, try finding the recommended Singleton implementation in the Cocoa Fundamentals Guide using the Jump Bar. I&#8217;ll wait. (For extra credit, count how many menus you open in the process.)</p>
<p>Of course the documentation viewer has a search function, but even that&#8217;s a bit laborious because you have to click on a lot of disclosure triangles to find the right item in the results. Why aren&#8217;t the relevant results opened automatically? (And, yes, option clicking the disclosure triangle can be used to achieve this goal, but the question still remains: why isn&#8217;t this the default action?)</p>
<p><strong>Updated March 29th, 2011:</strong> Matt Neuburg has discovered that for some documents, search results don&#8217;t show where your term occurs; <a href="http://lists.apple.com/archives/xcode-users/2011/Mar/msg00658.html">you&#8217;re shown a higher-level page, but not the actual page</a>.</p>
<p>The root of the problem here and with the method names in the class documentation, is that a deep hierarchy is too hard to navigate. Present the information in a single list and it becomes much more useful. Imagine how bad the code editor navigation would be if it presented a hierarchy based upon classes, properties and methods. It&#8217;s flattened into a single menu for a reason: and those same reasons exist in the documentation viewer.</p>
<p>The Jump Bar is a great addition to Xcode, but it&#8217;s true power lies in having a predictable end point. With code, that end point is a function, property or method. With documentation, that end point is elusive: it varies depending both with the type and the structure of the documentation you&#8217;re viewing. And that&#8217;s a real problem when you&#8217;re looking for something.</p>
<p><a href="http://www.openradar.me/9149683">rdar://9149683</a></p>
<h3>ePub, not PDF</h3>
<p>While we&#8217;re on the subject of this long-form documentation, why isn&#8217;t more of it available in the ePub format used by iBooks? It&#8217;s pretty safe to assume a huge majority of Mac and iOS developers have an iPad and like to use it for technical documentation. Searching for &#8220;Apple Developer Publications&#8221; in iBooks results in only six books. That&#8217;s a great start, but there is still a lot of documentation available only in PDF.</p>
<p>PDF is, of course, an option for iBooks. But turns out to be unsuitable because there is no back button. If you click a link in the PDF file, it&#8217;s a one way proposition. And for technical documentation, that&#8217;s a deal killer.</p>
<p>ePub also has the advantage of better font control and image viewing.</p>
<p><a href="http://www.openradar.me/9149845">rdar://9149845</a></p>
<h3>Some good news</h3>
<p>Fortunately, it&#8217;s not all bad news. This new version of the documentation viewer seems to keep track of its place on the page much more reliably than in the past. Gone are the days where hitting the back button put you back as the top of the page (instead of the method or property you were looking at previously.)</p>
<p>This one simple fix will save developers a huge amount of time. Thanks!</p>
<h3>Ingredients</h3>
<p>This situation with the Xcode document viewer has gotten so bad two developers, <a href="http://twitter.com/alextgordon">Alex Gordon</a> and <a href="http://twitter.com/jeannicolas">Jean-Nicolas Jolivet</a>, have taken matters into their own hands. This ultimate workaround is an application called <a href="http://fileability.net/ingredients/">Ingredients</a>.</p>
<p>Ingredients parses the HTML files used by Apple&#8217;s own viewer and persists the information with Core Data. The result is quick access to the documentation you need with advanced options to filter and sort to your liking. Recent work by <a href="http://twitter.com/tgaul">Troy Gaul</a> added an item to the Services menu so a keyboard shortcut can be created to view the selected symbol from any text editor (include Xcode.)</p>
<p>If the problems mentioned above affect you adversely, take a look at this alternative documentation viewer. And please take a moment and file duplicate bug reports using the Radar links above. This is the best way to give Apple an idea of how much this is affecting our daily work. Thanks!</p>
<p><strong>Updated March 22nd, 2011:</strong> The developers of Ingredients are now <a href="http://fileability.net/ingredients/#donate">accepting donations</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://furbo.org/2011/03/17/great-writing-terrible-reading/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Twitterrific firsts</title>
		<link>http://furbo.org/2011/03/11/twitterrific-firsts/</link>
		<comments>http://furbo.org/2011/03/11/twitterrific-firsts/#comments</comments>
		<pubDate>Fri, 11 Mar 2011 23:09:59 +0000</pubDate>
		<dc:creator>Craig Hockenberry</dc:creator>
				<category><![CDATA[Observation]]></category>

		<guid isPermaLink="false">http://furbo.org/?p=326</guid>
		<description><![CDATA[Why are third parties important in the Twitter ecosystem?
Let Twitterrific count the ways:

First use of &#8220;tweet&#8221; to describe an update (see page 86 of Dom Sagolla&#8217;s book.)
First use of a bird icon.
First native client on Macintosh.
First character counter as you type.
First to support replies and conversations (in collaboration with Twitter engineering.)
First native client on iPhone.

And [...]]]></description>
			<content:encoded><![CDATA[<p>Why are third parties important in the Twitter ecosystem?</p>
<p>Let <a href="http://twitterrific.com">Twitterrific</a> count the ways:</p>
<ol>
<li>First use of &#8220;tweet&#8221; to describe an update (see page 86 of Dom Sagolla&#8217;s <a href="http://www.140characters.com/">book</a>.)</li>
<li>First use of a <a href="http://gedblog.com/2007/05/11/twitter-identity-transference-syndrome-twits/">bird icon</a>.</li>
<li>First native client on Macintosh.</li>
<li>First character counter as you type.</li>
<li>First to support replies and conversations (in collaboration with Twitter engineering.)</li>
<li>First native client on iPhone.</li>
</ol>
<p>And <a href="http://iconfactory.com/software/twitterrific_history">more</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://furbo.org/2011/03/11/twitterrific-firsts/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Communal computing</title>
		<link>http://furbo.org/2010/04/29/communal-computing/</link>
		<comments>http://furbo.org/2010/04/29/communal-computing/#comments</comments>
		<pubDate>Thu, 29 Apr 2010 16:07:07 +0000</pubDate>
		<dc:creator>Craig Hockenberry</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[Observation]]></category>
		<category><![CDATA[Personal]]></category>

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

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

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

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

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

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

...

- (void)viewDidLoad
{
  [super viewDidLoad];

  IFActionToolbarActionItem *actionItem = nil;

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

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

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

