<?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"
	>

<channel>
	<title>Red Sweater Blog &#187; Articles</title>
	<atom:link href="http://www.red-sweater.com/blog/category/articles/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.red-sweater.com/blog</link>
	<description>Mac &#38; Technology Writings by Daniel Jalkut</description>
	<pubDate>Thu, 14 Aug 2008 22:56:42 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6</generator>
	<language>en</language>
			<item>
		<title>Core Intuition 6: Bug And Baby Tracking</title>
		<link>http://www.red-sweater.com/blog/544/core_intuition_6</link>
		<comments>http://www.red-sweater.com/blog/544/core_intuition_6#comments</comments>
		<pubDate>Thu, 07 Aug 2008 04:58:20 +0000</pubDate>
		<dc:creator>Daniel Jalkut</dc:creator>
		
		<category><![CDATA[Apple]]></category>

		<category><![CDATA[Humor]]></category>

		<category><![CDATA[Links]]></category>

		<guid isPermaLink="false">http://www.red-sweater.com/blog/?p=544</guid>
		<description><![CDATA[A Reminder: This blog post and the accompanying podcast audio media are covered by the terms of the Core Intuition NDA.

The contents of this podcast, expressed or otherwise, including but not limited to hints as to the veracity therein, triple-entendres relating to its verbosity, and also covering private or public scrutiny as to the tenacity [...]]]></description>
			<content:encoded><![CDATA[<div style="padding:1em; background-color:#FFC"><strong>A Reminder: </strong>This blog post and the accompanying podcast audio media are covered by the terms of the <strong>Core Intuition NDA</strong>.</p>
<p>
The contents of this podcast, expressed or otherwise, including but not limited to hints as to the veracity therein, triple-entendres relating to its verbosity, and also covering private or public scrutiny as to the tenacity of this agreement <strong>shall not, under any circumstances be conveyed, portrayed, imbibed, or parlayed to or by Apple Inc, its affiliates, or its aficionados.</strong>
</p>
<p>
(Spread the word! <strong>But don&#8217;t tell Apple!</strong>)
</p>
</div>
<p>
Just posted! <a href="http://www.coreint.org/">Core Intuition 6</a>, in which Manton and I leave a love note to <a href="http://www.thetalkshow.net/">The Talk Show</a>, yack it up about bug tracking systems, and discuss juggling an indie business with new-dad responsibilities.
</p>
<p>
Thanks for listening!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.red-sweater.com/blog/544/core_intuition_6/feed</wfw:commentRss>
		</item>
		<item>
		<title>Unit Testing Roadblocks</title>
		<link>http://www.red-sweater.com/blog/536/unit-testing-roadblocks</link>
		<comments>http://www.red-sweater.com/blog/536/unit-testing-roadblocks#comments</comments>
		<pubDate>Fri, 01 Aug 2008 17:49:26 +0000</pubDate>
		<dc:creator>Daniel Jalkut</dc:creator>
		
		<category><![CDATA[Apple]]></category>

		<category><![CDATA[Cocoa]]></category>

		<category><![CDATA[Programming]]></category>

		<category><![CDATA[Technology]]></category>

		<category><![CDATA[Xcode]]></category>

		<guid isPermaLink="false">http://www.red-sweater.com/blog/?p=536</guid>
		<description><![CDATA[Unit testing is a good idea. Ask any random developer what they think about unit testing and you&#8217;re likely to get one of four responses:

I don&#8217;t know what they are.
I love them! You should always use them!
I hate them! You should never use them!
I appreciate them, but I&#8217;m lazy and don&#8217;t use them that much.



Of [...]]]></description>
			<content:encoded><![CDATA[<p>Unit testing is a good idea. Ask any random developer what they think about unit testing and you&#8217;re likely to get one of four responses:</p>
<ol>
<li>I don&#8217;t know what they are.</li>
<li>I love them! You should <em>always</em> use them!</li>
<li>I hate them! You should <em>never</em> use them!</li>
<li>I appreciate them, but I&#8217;m lazy and don&#8217;t use them that much.
</li>
</ol>
<p>
Of these, I have the most respect for the first and fourth. If you don&#8217;t know what unit testing is, you can hardly be blamed for failing to employ them. Go <a href="http://en.wikipedia.org/wiki/Unit_testing">learn more about them</a> and maybe you&#8217;ll enjoy the rest of this entry a bit more. If you are familiar with them but feel that you don&#8217;t use them enough, don&#8217;t beat yourself up. You&#8217;re probably using them &#8220;about the right amount.&#8221; That is to say, as much as you need to, in order to alleviate your pains.
</p>
<p>
Groups 2 and 3 could practically be folded into one, because each is about as useless the other. Some things in life demand a strict behavioral code, but programming is not one of them. Some kinds of code bases and programming tasks are extremely conducive to unit testing, and others are not. Use them wherever they make sense, and where they accelerate your ability to improve upon your existing code base. I won&#8217;t go into much more about the whens and ifs, but <a href="http://www.wilshipley.com/blog/2005/09/unit-testing-is-teh-suck-urr.html">Wil Shipley</a> and <a href="http://www.friday.com/bbum/2005/09/24/unit-testing/">Bill Bumgarner</a> have delved deeper into this question, if you&#8217;re interested in reading more.
</p>
<p><h3>Laziness Incubators</h3>
</p>
<p>
Let&#8217;s assume for the sake of argument that you&#8217;ve learned about unit testing, and self-disqualified yourself from either of the extremist groups described above. You probably find yourself in that fuzzy group that I&#8217;ve labeled lazy yet appreciative. Laziness on its own is one thing, but it doesn&#8217;t help when tedious roadblocks are put in our way to incubate further laziness.
</p>
<p>
<strong>&#8220;I should really add a unit test suite for this complicated class.&#8221;</strong>
</p>
<p>
&#8230;
</p>
<p>
<strong>&#8220;But then I&#8217;d have to create a new unit test file, and stuff&#8230;&#8221;</strong>
</p>
<p>
I&#8217;m ashamed to admit that this is how many a unit test has been put off. Other laziness incubators include the friction of adding a suitable unit test bundle target to a project, and the difficulty of deciding how to factor your unit tests so that they make sense in the context of your project. Oh, and let&#8217;s not overlook the difficulty of having to think up how to write the specific unit tests themselves.
</p>
<p>
Apple makes some of these roadblocks somewhat easier, with <a href="http://developer.apple.com/documentation/DeveloperTools/Conceptual/UnitTesting/UnitTesting.html">built-in unit testing support</a> for Xcode. Unfortunately, they only go about 80% of the way in many regards, leaving us floundering to figure out how to fill the gaps for the remaining assistance we might need. These gaps where we&#8217;re forced to scramble for solutions can be a great deterrent to using unit tests as much as we might like.
</p>
<p><h3>Debugging Unit Tests</h3>
</p>
<p>
So you&#8217;ve overcome inertia and established unit testing build targets in your projects. You came up with an approach that makes sense for your code, created a new unit test suite source file, and actually written a few tests for your code. But now you&#8217;re bound to run into a vexing question: <strong>&#8220;how the heck do I debug this thing?&#8221;</strong>. Since unit tests are generally built into a standalone bundle, there&#8217;s nothing for Xcode to run. But when you come across a failing unit test and you can&#8217;t figure out why, you find yourself wishing you could step through the code just as you might in an application.
</p>
<p>
The answer to this question, as well as many other &#8220;missing pieces&#8221; for unit test support in Xcode, comes from Chris Hanson, who shares a great deal of useful information on his blog, including this gem on <a href="http://chanson.livejournal.com/120740.html">debugging unit tests</a>. This post also contains a number of useful links if you&#8217;re still struggling with the other roadblocks such as adding a target, etc.
</p>
<p>
What we learn from Chris is essentially that the easiest way to debug unit tests in your project is to set up some executable, <em>any executable</em>, and arrange for your unit test bundle to be &#8220;injected&#8221; into the executable at runtime. Now, to debug your unit tests, you just ask Xcode to debug the injected executable.
</p>
<p>
It turns out this isn&#8217;t very difficult, but it&#8217;s tedious. To set up this custom executable, you need to add a bunch of cryptic command line arguments and environment variables to your project. Yuck! This cumbersome  process has caused me on many occasions to &#8220;just skip doing unit tests for now.&#8221; That&#8217;s not really helpful to me or to the health of my code, so I finally got off by butt and wrote a handy AppleScript to do it for me:
</p>
<p>
Download <a href="http://www.red-sweater.com/AppleScript/AddUnitTestExecutable.zip">Add Unit Test Executable</a>. Free AppleScript.
</p>
<p>
What does this script do? In a nutshell, it asks for the name of your unit test bundle. Provide it, without the &#8220;.octest&#8221; extention, and the script will add a custom executable to your application, with all the gross arguments and environment variables needed to &#8220;make it work&#8221; in both Xcode 3 and Xcode 3.1. I added it to my Xcode application-specific scripts folder, and select it (using <a href="http://www.red-sweater.com/fastscripts/">FastScripts</a>) whenever I find myself in a project that doesn&#8217;t already have a suitable custom executable for debugging unit tests.
</p>
<p>
My script uses TextEdit.app as the test harness application, because it&#8217;s on everybody&#8217;s Mac, and because it seems like a fairly innocuous host application. Of course, you could use your own application, or another custom host application of your choosing. Just edit the script to suit your needs.
</p>
<p>
Hope this helps some of you overcome one source of laziness getting in the way of writing excellent unit tests!</p>
<p>
<strong>Update: </strong>It just occurred to me that this script could probably be made even smarter by assuming that the selected target in the active project is in fact the test bundle we want to debug. That would eliminate the clumsy need to ask the user for the name of the test bundle.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.red-sweater.com/blog/536/unit-testing-roadblocks/feed</wfw:commentRss>
		</item>
		<item>
		<title>Core Intuition 5: The AppStore</title>
		<link>http://www.red-sweater.com/blog/521/core-intuition-5-the-appstore</link>
		<comments>http://www.red-sweater.com/blog/521/core-intuition-5-the-appstore#comments</comments>
		<pubDate>Wed, 16 Jul 2008 21:34:11 +0000</pubDate>
		<dc:creator>Daniel Jalkut</dc:creator>
		
		<category><![CDATA[Business]]></category>

		<category><![CDATA[Cocoa]]></category>

		<category><![CDATA[Links]]></category>

		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://www.red-sweater.com/blog/?p=521</guid>
		<description><![CDATA[Manton and I sat down to chat about everything under the sun, but inevitably everything turned to Apple&#8217;s newly launched AppStore for iPhone and iPod touch.

In the podcast I mentioned a funny picture I had seen of many copies of Sudoku installed on the same iPhone. I mistakenly (tentatively, though!) credited Glenn Fleishman as the [...]]]></description>
			<content:encoded><![CDATA[<p>Manton and I <a href="http://www.coreint.org/">sat down to chat</a> about everything under the sun, but inevitably everything turned to Apple&#8217;s newly launched AppStore for iPhone and iPod touch.</p>
<p>
In the podcast I mentioned a funny picture I had seen of many copies of Sudoku installed on the same iPhone. I mistakenly (tentatively, though!) credited <a href="http://blog.glennf.com/">Glenn Fleishman</a> as the source of the picture, but in fact it was Dan Frakes, whose article on the subject just appeared in Macworld: <a href="http://www.pcworld.com/article/148495/best_sudoku_apps_for_iphone_and_ipod_touch.html">Best Sudoku Apps for iPhone and iPod Touch</a>. Here&#8217;s the original <a href="http://twitpic.com/3ze0">image he posted</a> to Twitter.
</p>
<p>
<strong>Update:</strong> Here&#8217;s a <a href="http://twitpic.com/48de">later picture</a> from Dan, where he&#8217;s truly taken Sudoku to the max!
</p>
<p>
Hope you enjoy the show! As always, your feedback is welcomed.
</p></p>
]]></content:encoded>
			<wfw:commentRss>http://www.red-sweater.com/blog/521/core-intuition-5-the-appstore/feed</wfw:commentRss>
		</item>
		<item>
		<title>Generating Footnotes With MarsEdit</title>
		<link>http://www.red-sweater.com/blog/517/generating-footnotes-with-marsedit</link>
		<comments>http://www.red-sweater.com/blog/517/generating-footnotes-with-marsedit#comments</comments>
		<pubDate>Tue, 15 Jul 2008 03:01:33 +0000</pubDate>
		<dc:creator>Daniel Jalkut</dc:creator>
		
		<category><![CDATA[AppleScript]]></category>

		<category><![CDATA[Links]]></category>

		<category><![CDATA[MarsEdit]]></category>

		<guid isPermaLink="false">http://www.red-sweater.com/blog/?p=517</guid>
		<description><![CDATA[One of the aspects of MarsEdit which appeals to me is the way it hides much of its power and versatility beneath a relatively simple interface. Shimone Samuel recognized the power of MarsEdit&#8217;s scriptability and powerful markup macros, and came up with a pretty cool solution for automating footnote generation.

Nice work, Shimone! It&#8217;s great to [...]]]></description>
			<content:encoded><![CDATA[<p>One of the aspects of MarsEdit which appeals to me is the way it hides much of its power and versatility beneath a relatively simple interface. Shimone Samuel recognized the power of MarsEdit&#8217;s scriptability and powerful markup macros, and came up with a pretty cool <a href="http://www.likewowonline.net/web/dev/footnotes-applescript-marsedit.html">solution for automating footnote generation</a>.</p>
<p>
Nice work, Shimone! It&#8217;s great to see examples like this. As I said, I think it&#8217;s nice the way MarsEdit hides much of its functionality away, but the flip side of that is of course that it can be difficult to realize its full potential. Blog posts such as Shimone&#8217;s do a good job of showing off its hidden strengths.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.red-sweater.com/blog/517/generating-footnotes-with-marsedit/feed</wfw:commentRss>
		</item>
		<item>
		<title>Core Intuition: The Design Awards</title>
		<link>http://www.red-sweater.com/blog/516/core-intuition-the-design-awards</link>
		<comments>http://www.red-sweater.com/blog/516/core-intuition-the-design-awards#comments</comments>
		<pubDate>Tue, 01 Jul 2008 18:52:43 +0000</pubDate>
		<dc:creator>Daniel Jalkut</dc:creator>
		
		<category><![CDATA[Business]]></category>

		<category><![CDATA[Indie]]></category>

		<category><![CDATA[Links]]></category>

		<guid isPermaLink="false">http://www.red-sweater.com/blog/?p=516</guid>
		<description><![CDATA[In Episode 4, Manton and I discuss the Apple Design Awards, which were handed out at WWDC. We also go off on a fun tangent about application versioning, and how the traditional &#8220;Mac way&#8221; of doing it is is frequently overlooked or ignored by new developers to the platform.
]]></description>
			<content:encoded><![CDATA[<p>In <a href="http://coreint.org/">Episode 4</a>, Manton and I discuss the Apple Design Awards, which were handed out at WWDC. We also go off on a fun tangent about application versioning, and how the traditional &#8220;Mac way&#8221; of doing it is is frequently overlooked or ignored by new developers to the platform.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.red-sweater.com/blog/516/core-intuition-the-design-awards/feed</wfw:commentRss>
		</item>
		<item>
		<title>Disabled Menus Are Usable</title>
		<link>http://www.red-sweater.com/blog/515/disabled-menus-are-usable</link>
		<comments>http://www.red-sweater.com/blog/515/disabled-menus-are-usable#comments</comments>
		<pubDate>Tue, 01 Jul 2008 16:52:27 +0000</pubDate>
		<dc:creator>Daniel Jalkut</dc:creator>
		
		<category><![CDATA[Cocoa]]></category>

		<category><![CDATA[Design]]></category>

		<category><![CDATA[Links]]></category>

		<category><![CDATA[Programming]]></category>

		<category><![CDATA[Usability]]></category>

		<guid isPermaLink="false">http://www.red-sweater.com/blog/?p=515</guid>
		<description><![CDATA[Joel Spolsky has a remarkable track record of speaking truth to programmers on his blog: Joel On Software.  Occasionally he says something with which I disagree, but usually it&#8217;s on a subtle point, or it&#8217;s an issue where his passion for doing things one way is motivated by his preferred platforms: Windows and the [...]]]></description>
			<content:encoded><![CDATA[<p>Joel Spolsky has a remarkable track record of speaking truth to programmers on his blog: <a href="http://www.joelonsoftware.com/">Joel On Software</a>.  Occasionally he says something with which I disagree, but usually it&#8217;s on a subtle point, or it&#8217;s an issue where his passion for doing things one way is motivated by his preferred platforms: Windows and the web.</p>
<p>
Today Joel shared a very short and dangerous pronouncement on the use of <a href="http://www.joelonsoftware.com/items/2008/07/01.html">hidden and disabled menu items</a>:
</p>
<blockquote><p>
A long time ago, it became fashionable, even recommended, to disable menu items when they could not be used.</p>
<p>Don&#8217;t do this. Users see the disabled menu item that they want to click on, and are left entirely without a clue of what they are supposed to do to get the menu item to work.</p>
<p>Instead, leave the menu item enabled. If there&#8217;s some reason you can&#8217;t complete the action, the menu item can display a message telling the user why.
</p></blockquote>
<p>
He&#8217;s absolutely right about hidden menu items, but on the subject he emphasizes, disabled menu items, he&#8217;s absolutely wrong.
</p>
<p>
Joel argues that instead of disabling a menu item, applications should leave them enabled, and instead display an informative message when the user tries to use them. This solves one problem: that of the user who is perplexed as to why a menu item is disabled. I recognize and applaud the desire to fix this issue. But enabling every menu item creates more usability problems than it solves.
</p>
<p>
Disabled menu items convey valuable information. Users who are skimming menus in order to figure out what to do are trained by years of experience to skim past disabled items and look for enabled ones instead.  The more complex the application is, the more valuable this dichotomy becomes. In essence, disabling menu items gives application designers a means of &#8220;funneling&#8221; user attention to the actions in an application that will actually work at this moment in time.
</p>
<p>
Sure, it&#8217;s frustrating when you can&#8217;t figure out why a menu item is disabled. But what would be unbelievably frustrating is drowning in a sea of enabled menu items, for which the application offers no immediate usability guidance. Instead of skimming past disabled items, a user could be forced to select several, each time receiving a valuable instruction (punishment) as to why it was a worthless move.  In time the user would learn to avoid these irritatingly enabled menu items, but they would be offered no future assistance in actually avoiding them.
</p>
<p>
Joel is right that it&#8217;s a bad idea to outright hide menu items. Users become comfortable with an application by learning its topography: where each menu item is in relation to its menu and the other items in that menu. When you go about willy-nilly removing and adding items, it can cause confusion. If you&#8217;ve ever visited an old home town after years away, you know this problem. You&#8217;re sure your favorite restaurant is around here somewhere, but so many of the shops and landmarks have changed, it&#8217;s hard to find it as quickly as you once could.
</p>
<p>
Joel&#8217;s suggestion may increase the learnability of an application in one very specific way, but at the expense of long-term usability.  Although it can be argued that an application needs to be learnable in order to attract long-term users, I think user loyalty will be greater when the usability of the application is maximized.
</p>
<p>
What would be a better solution? The idea is to answer the naive user&#8217;s question: why is the menu item disabled? For this purpose I can think of many solutions. The application might show tool tips as the mouse hovers over the disabled menu item. Or if the problem is especially grievous, it could warrant a dedicated reference page in the documentation, where users could easily look up the cause of their frustration. The point is to build a framework for application learnability that does not seriously affect the usability of the application for experienced users.
</p>
<p>
It&#8217;s not often I get to say it, but hear me loud and clear today: <strong>don&#8217;t listen to what Joel says about menu items!</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.red-sweater.com/blog/515/disabled-menus-are-usable/feed</wfw:commentRss>
		</item>
		<item>
		<title>Development Phase Code Signing</title>
		<link>http://www.red-sweater.com/blog/514/development-phase-code-signing</link>
		<comments>http://www.red-sweater.com/blog/514/development-phase-code-signing#comments</comments>
		<pubDate>Sun, 29 Jun 2008 18:41:34 +0000</pubDate>
		<dc:creator>Daniel Jalkut</dc:creator>
		
		<category><![CDATA[Apple]]></category>

		<category><![CDATA[Cocoa]]></category>

		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.red-sweater.com/blog/?p=514</guid>
		<description><![CDATA[Code signing is a technology for associating a cryptographically secure signature with your application&#8217;s executable code.  This signature makes it possible for the operating system or other services to make confident assumptions of authenticity based on the unique signature which you&#8217;ve supplied.

Thus, code signing is a technology which is rather useless in itself, but [...]]]></description>
			<content:encoded><![CDATA[<p>Code signing is a technology for associating a cryptographically secure signature with your application&#8217;s executable code.  This signature makes it possible for the operating system or other services to make confident assumptions of authenticity based on the unique signature which you&#8217;ve supplied.</p>
<p>
Thus, code signing is a technology which is rather useless in itself, but which <em>can be utilized</em> by other services to achieve specific goals. Starting with Mac OS X 10.5, Apple built some features into the operating system which take advantage of code signing, including some features which make accessing secure items from the keychain less of a nuisance.
</p>
<p>
In particular, consider the scenario in which an application asks permission from the user to access items in the keychain.  Once the user gives permission to &#8220;always allow,&#8221; the application can thereafter obtain a secret value from the keychain without user intervention. This is very handy for internet passwords, etc. But once the application changes, e.g. a new version comes out, the user must be asked again to permit the access. This is to ensure that malicious code hasn&#8217;t been snuck into the application.
</p>
<p>
But with code signing, the users permission can be expanded to cover any release of the application that was signed by the same certificate. The idea is that if users approve one version of an application, then they&#8217;ll likely approve the next version, as long as they are guaranteed it came from the same developer.
</p>
<p>
I have so far not signed any of my publicly released applications. I may do so soon, because these conveniences would remove one more tedious task for users who are updating to the newest versions of my applications.
</p>
<p>
But the user who has it worst of all is me myself, as I&#8217;m constantly revising the application, leading the system to request new approvals every time my changed application accesses the keychain. To get around these constant requests, I finally decided to at take advantage of code signing during the development phase. What does that mean? It means I&#8217;m committing to signing my own code for my own internal purposes, but not yet committing to signing publicly shipped products.
</p>
<p><h3>From Zero To Code Signed In 300 Seconds</h3>
</p>
<p>
With Xcode 3.0, code signing is easy, but takes a little work to set up. Since I just went through the somewhat tedious task myself, I thought I&#8217;d share with you how it&#8217;s done easily and predictably:
</p>
<p><ol>
<li><strong>Establish a self-signing certificate.</strong> Apple offers <a href="http://developer.apple.com/documentation/Security/Conceptual/CodeSigningGuide/Procedures/chapter_3_section_2.html#//apple_ref/doc/uid/TP40005929-CH4-SW1">simple instructions</a> for how to do this with the Apple-provided Keychain Access utility. When you create the certificate, you&#8217;ll be asked to give it a name. Name it whatever you like, for instance &#8220;My Cert&#8221;. The certificate is stored in your keychain, where it can be easily referenced by name.</li>
<li><strong>Add a custom build phase to Xcode.</strong> Xcode will not automatically sign your code, but it&#8217;s easy enough to add a build phase that does. Select your target in Xcode and choose <span style="white-space:nowrap;">&#8220;Project -> New Build Phase -> New Run Script Build Phase&#8221;</span> from the main menu. Paste in the following script:
<pre style="font-size:1.0em;">
if [[ ${CONFIGURATION} == &quot;Debug&quot; ]]
then
	# -f means force to re-sign even if already signed
	codesign -f -s &quot;My Cert&quot; &quot;${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/&quot;
fi
</pre>
<p>Observe that the &#8220;My Cert&#8221; text can obviously be changed to whatever you ended up naming your certificate. Also notice that because of my hesitation to ship a code signed application yet, I am restricting the action to only the Debug build configuration. If you&#8217;re ready to go public, just remove the test and the code signing will happen for all build configurations.
</li>
<li><strong>There&#8217;s no step 3! Enjoy.</strong></li>
</ol>
<p>Constantly approving those keychain approval dialogs is one of the things that I just fell into the habit of tediously doing. Thanks to Apple&#8217;s code signing efforts in 10.5, there&#8217;s no longer any reason for me to do that. Hopefully if you use the keychain in your own development products, you&#8217;ll find this productivity upgrade useful as well.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.red-sweater.com/blog/514/development-phase-code-signing/feed</wfw:commentRss>
		</item>
		<item>
		<title>LiveDiscKit From Rogue Amoeba</title>
		<link>http://www.red-sweater.com/blog/513/livedisckit-from-rogue-amoeba</link>
		<comments>http://www.red-sweater.com/blog/513/livedisckit-from-rogue-amoeba#comments</comments>
		<pubDate>Fri, 27 Jun 2008 20:49:15 +0000</pubDate>
		<dc:creator>Daniel Jalkut</dc:creator>
		
		<category><![CDATA[Business]]></category>

		<category><![CDATA[Indie]]></category>

		<category><![CDATA[Links]]></category>

		<guid isPermaLink="false">http://www.red-sweater.com/blog/?p=513</guid>
		<description><![CDATA[At this year&#8217;s Macworld conference, the guys at Rogue Amoeba decided to do what many trade show exhibitors do: give away a free demo CD to interested attendees. But recognizing the conventional drawback of these demos, that they are obsolete from almost the minute the disc is burned, they invested in developing a clever application [...]]]></description>
			<content:encoded><![CDATA[<p>At this year&#8217;s Macworld conference, the guys at Rogue Amoeba decided to do what many trade show exhibitors do: give away a free demo CD to interested attendees. But recognizing the conventional drawback of these demos, that they are obsolete from almost the minute the disc is burned, they invested in developing a clever application that runs from the disc, and conveniently presents the latest copies of all of their software to the user.  If what&#8217;s on the disc is still fresh, the user runs it. Otherwise, the latest version is downloaded from the web and that&#8217;s what the user sees instead.</p>
<p>
I spoke to them about their solution at the time, and was impressed by it. It certainly seemed like a good way to avoid turning those thousands of plastic discs into guaranteed landfill fodder. But what&#8217;s even cooler is that they&#8217;ve now decided to share the technology so that other companies who are interested can pull of the same feat with a minimum of work:
</p>
<p>
<a href="http://www.rogueamoeba.com/utm/2008/06/27/announcing-livedisckit/">Announcing LiveDiscKit</a>
</p>
<p>
It&#8217;s also worth reading to near the end of the article, where they confess that even with the clever technology in place, the discs did not turn out to be all that effective as marketing tools:</p>
<blockquote><p>
Of the 5,000 discs we gave out, 5.8% were ever used. That may seem a bit low, but it gets quite depressing when converted to an absolute count: 288. Out of 5000 CDs given out, no more than 300 were used - perhaps giving away CDs isn’t the best idea after all
</p></blockquote>
<p>
Well, you can&#8217;t win them all! On the bright side, I don&#8217;t think they would have been able to gather this information without putting in the effort to make the discs smart enough to &#8220;check for updates.&#8221; It was a valiant effort, and a very cool idea that other companies might still find useful.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.red-sweater.com/blog/513/livedisckit-from-rogue-amoeba/feed</wfw:commentRss>
		</item>
		<item>
		<title>WordPress To Disable Remote Access</title>
		<link>http://www.red-sweater.com/blog/512/wordpress-to-disable-remote-access</link>
		<comments>http://www.red-sweater.com/blog/512/wordpress-to-disable-remote-access#comments</comments>
		<pubDate>Tue, 24 Jun 2008 18:32:48 +0000</pubDate>
		<dc:creator>Daniel Jalkut</dc:creator>
		
		<category><![CDATA[MarsEdit]]></category>

		<category><![CDATA[Rant]]></category>

		<category><![CDATA[Web]]></category>

		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.red-sweater.com/blog/?p=512</guid>
		<description><![CDATA[The WordPress developers have decided that, starting with WordPress 2.6, access to the XMLRPC and AtomPub-based remote publishing interfaces will be disabled by default. Users who wish to use a remote client such as MarsEdit will have to go out of their way to enable the required functionality in their blog&#8217;s settings.

There are good arguments [...]]]></description>
			<content:encoded><![CDATA[<p>The WordPress developers have decided that, starting with WordPress 2.6, access to the XMLRPC and AtomPub-based remote publishing interfaces <a href="http://westi.wordpress.com/2008/06/20/making-the-default-install-more-secure/">will be disabled by default</a>. Users who wish to use a remote client such as <a href="http://www.red-sweater.com/marsedit/">MarsEdit</a> will have to go out of their way to enable the required functionality in their blog&#8217;s settings.</p>
<p>
There are good arguments for this, at least on the face of things. They can be packed into a nutshell: <strong>it <em>may</em> reduce the security risks of having these access points opened by default.</strong>
</p>
<p>
But in my opinion, there are also good arguments to be made for <em>rejecting the change</em> as a damaging and misguided solution.
</p>
<p>
First, and obviously near to my heart, is the fact that this <strong>marginalizes remote clients.</strong> For users who would find value in a remote client, this decision will put one more roadblock in their way. Historically, the remote editor interface is already compromised such that remote editors do not have access to all the same functionality as the web interface.  With this change in place, things get even worse. While a screen-scraping application will easily log in and authenticate a fragile WordPress session via the web interface, the well-behaved API clients will be refused access by default. All in the name of improving security.
</p>
<p>
Second, and probably most important, is that this is <strong>not a fundamental security improvement</strong>. Consider a bank with two sets of automated cash machines: one for drive-through cars, and one for walk-up pedestrians.  Two vastly different sets of customers are being served securely by different interfaces, yet the transactions are secure because they ultimately travel through the same bottlenecked safeguard. A fundamental design consideration on the part of the bank is that these two classes of customer are equally important, and each deserves unfettered access.
</p>
<p>
WordPress&#8217;s decision to shut off remote access by default is analogous to a bank offering unrestricted drive-through access to its cash machines, while requiring pedestrians to ring a bell and wait for a security guard to open the door to the machines.
</p>
<p>
Also worth considering: if a service is disabled by default for security considerations, what message does that send to people who choose to, or who are encouraged to turn the service back on? It sets up a perception of insecurity which may not even be warranted. If the remote publishing interfaces are insecure, they should be fixed, not merely disabled!
</p>
<p><h3>A Real Solution</h3>
</p>
<p>
If I&#8217;m so smart, what should WordPress be doing instead?  A real security improvement would be bottlenecking all access to the blog&#8217;s vital authorized content, and making sure that the remote APIs and the web interface all go through the same interface.
</p>
<p>
In my opinion, an entire class of problems with WordPress (and other blogging systems) stems from this interface bifurcation. Establishing a single interface to WordPress would be comparable to the  &#8220;pin code + card&#8221; interface at your bank.  You pass through it by car, on foot, and even at the counter when they ask you to swipe before doing any transaction.
</p>
<p>
If you&#8217;ve only got one &#8220;real API&#8221; that touches the critically important data, then you&#8217;ve only got one door to secure. Furthermore, when all views into the blog are required to share the same API, suddenly none of them is deprived of functionality that the other has.
</p>
<p>
Imagine if the API that the web interface uses to access all features of a blog could be just as easily employed by MarsEdit or any other application you authorized. The end result would be lots less work &#8220;playing catch up&#8221; for the XMLRPC and Atom developers, and more time focusing on innovative and cool features <em>for all blog users</em>.
</p>
<p>
If this sounds like a pipe dream, it&#8217;s worth pointing out that one very popular web service is already employing this strategy, and it works brilliantly. <a href="http://flickr.com/">Flickr</a>, Yahoo&#8217;s incredibly popular photo sharing site, is built on the <a href="http://www.flickr.com/services/api/">very same APIs</a> it makes available to clients. This results in some truly incredible <a href="http://connectedflow.com/flickrexport/">Flickr-enabled applications</a> and web services. And you don&#8217;t see any sign of Flickr disabling access to their API, because there&#8217;s too much at stake.
</p>
<p>
If your web service only provides one, first-class API through which all access flows, then you&#8217;ve only got one point to secure, you&#8217;re likely to have feature parity across interfaces, and the risk of marginalizing one interface is dramatically decreased.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.red-sweater.com/blog/512/wordpress-to-disable-remote-access/feed</wfw:commentRss>
		</item>
		<item>
		<title>Core Intuition Episode 3</title>
		<link>http://www.red-sweater.com/blog/510/core-intuition-episode-3</link>
		<comments>http://www.red-sweater.com/blog/510/core-intuition-episode-3#comments</comments>
		<pubDate>Sat, 21 Jun 2008 07:32:24 +0000</pubDate>
		<dc:creator>Daniel Jalkut</dc:creator>
		
		<category><![CDATA[Apple]]></category>

		<category><![CDATA[Business]]></category>

		<category><![CDATA[Links]]></category>

		<category><![CDATA[Macintosh]]></category>

		<guid isPermaLink="false">http://www.red-sweater.com/blog/?p=510</guid>
		<description><![CDATA[Manton and I are still at it. We&#8217;ve heard the feedback, some of it lukewarm, some of it intentionally discouraging, but most of it extremely enthusiastic.

We&#8217;re proud to announce the immediate availability of episode 3, where we talk about WWDC, MobileMe, iPhone 3G, and a bunch of relatively unrelated stuff.


Check us out!
]]></description>
			<content:encoded><![CDATA[<p>Manton and I are still at it. We&#8217;ve heard the feedback, some of it lukewarm, some of it <em>intentionally discouraging</em>, but most of it <strong>extremely enthusiastic</strong>.</p>
<p>
We&#8217;re proud to announce the immediate availability of <a href="http://www.coreint.org/">episode 3</a>, where we talk about WWDC, MobileMe, iPhone 3G, and a bunch of relatively unrelated stuff.
</p>
<p>
Check us out!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.red-sweater.com/blog/510/core-intuition-episode-3/feed</wfw:commentRss>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 0.711 seconds -->
