<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="en" xml:base="http://boredzo.org/blog/wp-atom.php">
	<title type="text">Idle Time</title>
	<subtitle type="text">The personal weblog of Peter Hosey.</subtitle>

	<updated>2012-01-06T22:21:41Z</updated>

	<link rel="alternate" type="text/html" href="http://boredzo.org/blog" />
	<id>http://boredzo.org/blog/feed/atom</id>
	

	<generator uri="http://wordpress.org/" version="3.1">WordPress</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/domainofthebored" /><feedburner:info uri="domainofthebored" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" /><entry>
		<author>
			<name>Peter Hosey</name>
						<uri>http://boredzo.org./</uri>
					</author>
		<title type="html"><![CDATA[Why you should almost always write a test app for your Radar bug reports]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/domainofthebored/~3/J3Xy6hvPAVg/why-you-should-almost-always-write-a-test-app-for-your-radar-bug-reports" />
		<id>http://boredzo.org/blog/?p=1514</id>
		<updated>2011-11-09T19:23:59Z</updated>
		<published>2011-11-09T19:17:22Z</published>
		<category scheme="http://boredzo.org/blog" term="Apple" /><category scheme="http://boredzo.org/blog" term="Apple Bug Friday" /><category scheme="http://boredzo.org/blog" term="Best practices" /><category scheme="http://boredzo.org/blog" term="Programming" />		<summary type="html"><![CDATA[You&#8217;ll understand the bug better. This means you can write a better bug report, which will help Apple fix it more quickly (meaning you may get the fix more quickly). They&#8217;ll understand the bug better. This, too, helps Apple fix it more quickly. You may find that it is not a bug in the API [...]]]></summary>
		<content type="html" xml:base="http://boredzo.org/blog/archives/2011-11-09/why-you-should-almost-always-write-a-test-app-for-your-radar-bug-reports">&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;You&amp;#8217;ll understand the bug better. This means you can write a better bug report, which will help Apple fix it more quickly (meaning you may get the fix more quickly).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;They&amp;#8217;ll understand the bug better. This, too, helps Apple fix it more quickly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You may find that it is not a bug in the API at all, but that you were misusing it. Perhaps you were using something on a thread that you shouldn&amp;#8217;t have been, or expecting some argument to be used a certain way when it&amp;#8217;s actually used differently.&lt;/p&gt;
&lt;p&gt;In this case, you may be able to use the API after all, saving you the time you would have spent hacking around a non-bug. This also saves them the time they would have spent triaging and eventually responding to a non-bug.&lt;/p&gt;
&lt;p&gt;If your misunderstanding was borne out of poor documentation (misleading, inaccurate, vague, incomplete), you can file a bug report about that instead. Then the documentation gets better and future users of the same API avoid making the same error you did.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A test app isn&amp;#8217;t appropriate for every kind of Radar, but when it is, including it helps everyone.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/domainofthebored?a=J3Xy6hvPAVg:HjO9ImkBvoE:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/domainofthebored?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/domainofthebored?a=J3Xy6hvPAVg:HjO9ImkBvoE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/domainofthebored?i=J3Xy6hvPAVg:HjO9ImkBvoE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/domainofthebored/~4/J3Xy6hvPAVg" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://boredzo.org/blog/archives/2011-11-09/why-you-should-almost-always-write-a-test-app-for-your-radar-bug-reports#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://boredzo.org/blog/archives/2011-11-09/why-you-should-almost-always-write-a-test-app-for-your-radar-bug-reports/feed/atom" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://boredzo.org/blog/archives/2011-11-09/why-you-should-almost-always-write-a-test-app-for-your-radar-bug-reports</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Peter Hosey</name>
						<uri>http://boredzo.org./</uri>
					</author>
		<title type="html"><![CDATA[iOS device user guides on the iBookstore]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/domainofthebored/~3/T2rNWao5jZo/ios-device-user-guides-on-the-ibookstore" />
		<id>http://boredzo.org/blog/?p=1512</id>
		<updated>2011-10-16T22:00:56Z</updated>
		<published>2011-10-16T22:00:50Z</published>
		<category scheme="http://boredzo.org/blog" term="Apple" /><category scheme="http://boredzo.org/blog" term="iPhone" /><category scheme="http://boredzo.org/blog" term="iTunes/iPod" /><category scheme="http://boredzo.org/blog" term="ebooks" /><category scheme="http://boredzo.org/blog" term="free" /><category scheme="http://boredzo.org/blog" term="iBooks" /><category scheme="http://boredzo.org/blog" term="iBookstore" /><category scheme="http://boredzo.org/blog" term="iPad" /><category scheme="http://boredzo.org/blog" term="iPod touch" />		<summary type="html"><![CDATA[Apple has user guides for their three iOS devices (not counting the &#xf8ff;TV, in which iOS is an implementation detail), for both iOS 4.3 and 5, free on the iBookstore: iOS 4.3 iPhone User Guide for iOS 4.2 and 4.3 iPod touch User Guide for iOS 4.3 iPad User Guide for iOS 4.3 iOS 5 [...]]]></summary>
		<content type="html" xml:base="http://boredzo.org/blog/archives/2011-10-16/ios-device-user-guides-on-the-ibookstore">&lt;p&gt;Apple has user guides for their three iOS devices (not counting the &amp;#xf8ff;TV, in which iOS is an implementation detail), for both iOS 4.3 and 5, free on the iBookstore:&lt;/p&gt;
&lt;h3&gt;iOS 4.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://itunes.apple.com/us/book/iphone-user-guide-for-ios/id423864828?mt=11"&gt;iPhone User Guide for iOS 4.2 and 4.3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://itunes.apple.com/us/book/ipod-touch-user-guide-for/id422961051?mt=11"&gt;iPod touch User Guide for iOS 4.3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://itunes.apple.com/us/book/ipad-user-guide-for-ios-4.3/id423853345?mt=11"&gt;iPad User Guide for iOS 4.3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;iOS 5&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://itunes.apple.com/us/book/iphone-user-guide-for-ios-5/id470309864?mt=11"&gt;iPhone User Guide for iOS 5&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://itunes.apple.com/us/book/ipod-touch-user-guide-for-ios-5/id470310538?mt=11"&gt;iPod touch User Guide for iOS 5&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://itunes.apple.com/us/book/ipad-user-guide-for-ios-5/id470308101?mt=11"&gt;iPad User Guide for iOS 5&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/domainofthebored?a=T2rNWao5jZo:Mz698TnrFaw:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/domainofthebored?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/domainofthebored?a=T2rNWao5jZo:Mz698TnrFaw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/domainofthebored?i=T2rNWao5jZo:Mz698TnrFaw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/domainofthebored/~4/T2rNWao5jZo" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://boredzo.org/blog/archives/2011-10-16/ios-device-user-guides-on-the-ibookstore#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://boredzo.org/blog/archives/2011-10-16/ios-device-user-guides-on-the-ibookstore/feed/atom" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://boredzo.org/blog/archives/2011-10-16/ios-device-user-guides-on-the-ibookstore</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Peter Hosey</name>
						<uri>http://boredzo.org./</uri>
					</author>
		<title type="html"><![CDATA[Much faster]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/domainofthebored/~3/SD6iVDMQEQA/iso-8601-date-formatter-speed-improvements" />
		<id>http://boredzo.org/blog/?p=1506</id>
		<updated>2011-10-15T23:35:52Z</updated>
		<published>2011-10-15T23:13:33Z</published>
		<category scheme="http://boredzo.org/blog" term="Cocoa" /><category scheme="http://boredzo.org/blog" term="Creations" /><category scheme="http://boredzo.org/blog" term="Programming" /><category scheme="http://boredzo.org/blog" term="iso8601dateformatter" />		<summary type="html"><![CDATA[I&#8217;ve just pushed a couple of improvements to my ISO 8601 date formatter. Previously, it was pathetically slow compared to C standard library parsing and unparsing; now, it is faster. Timing ISO8601DateFormatter Time taken: 0.130194 seconds Number of dates and strings computed: 10000 each Time taken per date: 0.000013 seconds Timing C standard library parsing [...]]]></summary>
		<content type="html" xml:base="http://boredzo.org/blog/archives/2011-10-15/iso-8601-date-formatter-speed-improvements">&lt;p&gt;I&amp;#8217;ve just pushed a couple of improvements to &lt;a href="https://bitbucket.org/boredzo/iso-8601-parser-unparser"&gt;my ISO 8601 date formatter&lt;/a&gt;. Previously, &lt;a href="http://samsoff.es/posts/how-to-drastically-improve-your-app-with-an-afternoon-and-instruments"&gt;it was pathetically slow compared to C standard library parsing and unparsing&lt;/a&gt;; now, it is faster.&lt;/p&gt;
&lt;blockquote&gt;&lt;pre&gt;Timing ISO8601DateFormatter
Time taken: 0.130194 seconds
Number of dates and strings computed: 10000 each
Time taken per date: 0.000013 seconds
Timing C standard library parsing and unparsing
Time taken: 0.192645 seconds
Number of dates and strings computed: 10000 each
Time taken per date: 0.000019 seconds
&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;You&amp;#8217;ll want at least revision [61d2959c6921] or later.&lt;/p&gt;
&lt;p&gt;My thanks to Sam Soffes and Rudy Richter for alerting me to the speed problem.&lt;/p&gt;
&lt;p style="font-style: italic"&gt;Edited at 16:35. Previously, it was almost as fast as C stdlib. Now it is faster.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/domainofthebored?a=SD6iVDMQEQA:22vZNKWG3ic:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/domainofthebored?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/domainofthebored?a=SD6iVDMQEQA:22vZNKWG3ic:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/domainofthebored?i=SD6iVDMQEQA:22vZNKWG3ic:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/domainofthebored/~4/SD6iVDMQEQA" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://boredzo.org/blog/archives/2011-10-15/iso-8601-date-formatter-speed-improvements#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://boredzo.org/blog/archives/2011-10-15/iso-8601-date-formatter-speed-improvements/feed/atom" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://boredzo.org/blog/archives/2011-10-15/iso-8601-date-formatter-speed-improvements</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Peter Hosey</name>
						<uri>http://boredzo.org./</uri>
					</author>
		<title type="html"><![CDATA[Desktop picture: Yawning Void]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/domainofthebored/~3/al4tMpFj6QM/desktop-picture-yawning-void" />
		<id>http://boredzo.org/blog/?p=1504</id>
		<updated>2011-09-16T05:10:06Z</updated>
		<published>2011-09-16T05:10:04Z</published>
		<category scheme="http://boredzo.org/blog" term="Creations" />		<summary type="html"><![CDATA[This is a desktop picture for Macs running at 1366 by 768, such as the 11-inch MacBook Air: No, it&#8217;s not pure black. Yes, that bar at the top is part of it. It&#8217;s meant to be used at that resolution and no other, with menu-bar translucency turned on. Scaling it, especially vertically, will make [...]]]></summary>
		<content type="html" xml:base="http://boredzo.org/blog/archives/2011-09-15/desktop-picture-yawning-void">&lt;p&gt;This is a desktop picture for Macs running at 1366 by 768, such as the 11-inch MacBook Air:&lt;/p&gt;
&lt;p class="image"&gt;&lt;a href="http://boredzo.org/blog/wp-content/uploads/2011/09/Yawning-void.png"&gt;&lt;img alt="Yawning void" border="0" width="600" height="337" src="http://boredzo.org/blog/wp-content/uploads/2011/09/Yawning-void.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;No, it&amp;#8217;s not pure black. Yes, that bar at the top is part of it.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s meant to be used at that resolution and no other, with menu-bar translucency turned &lt;em&gt;on&lt;/em&gt;. Scaling it, especially vertically, will make it look wrong.&lt;/p&gt;
&lt;p&gt;If you want to adapt it to a different size, &lt;a href="http://boredzo.org/blog/wp-content/uploads/2011/09/YawningVoid-nopreview.lineform.zip"&gt;here&amp;#8217;s the original document&lt;/a&gt;, editable in &lt;a href="http://freeverse.com/lineform/"&gt;Lineform&lt;/a&gt;. You should scale the document and the background to the desired screen size, and the menu-bar background to the desired width.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/domainofthebored?a=al4tMpFj6QM:AFFGC4kM-QM:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/domainofthebored?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/domainofthebored?a=al4tMpFj6QM:AFFGC4kM-QM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/domainofthebored?i=al4tMpFj6QM:AFFGC4kM-QM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/domainofthebored/~4/al4tMpFj6QM" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://boredzo.org/blog/archives/2011-09-15/desktop-picture-yawning-void#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://boredzo.org/blog/archives/2011-09-15/desktop-picture-yawning-void/feed/atom" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://boredzo.org/blog/archives/2011-09-15/desktop-picture-yawning-void</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Peter Hosey</name>
						<uri>http://boredzo.org./</uri>
					</author>
		<title type="html"><![CDATA[Conferences 2011]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/domainofthebored/~3/1prpzGzdHmQ/conferences-2011" />
		<id>http://boredzo.org/blog/?p=1494</id>
		<updated>2011-09-14T22:31:29Z</updated>
		<published>2011-09-12T14:12:23Z</published>
		<category scheme="http://boredzo.org/blog" term="Cocoa" /><category scheme="http://boredzo.org/blog" term="Conferences" /><category scheme="http://boredzo.org/blog" term="iPhone" /><category scheme="http://boredzo.org/blog" term="Mac OS X" /><category scheme="http://boredzo.org/blog" term="Programming" />		<summary type="html"><![CDATA[It&#8217;s that time again! Just like last year, there are a bunch of different conferences going on; unlike last year, I&#8217;m not going to even attempt to list all of them. The two that I have a reason to mention are: Voices That Matter. This time it&#8217;s in Boston, November 12 and 13. Their early [...]]]></summary>
		<content type="html" xml:base="http://boredzo.org/blog/archives/2011-09-12/conferences-2011">&lt;p&gt;It&amp;#8217;s that time again! Just like last year, there are a bunch of different conferences going on; unlike last year, I&amp;#8217;m not going to even attempt to list all of them.&lt;/p&gt;
&lt;p&gt;The two that I have a reason to mention are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://ios2011.voicesthatmatter.com/" style="font-weight: bold"&gt;Voices That Matter.&lt;/a&gt; This time it&amp;#8217;s in Boston, November 12 and 13. Their early bird pricing is still on through September; I&amp;#8217;ll let their site tell you more. As I do whenever I mention it here, I have a coupon code for it, which is &lt;code&gt;BSTBLOG&lt;/code&gt;. As usual, due to time and expense constraints, I won&amp;#8217;t be attending this one.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mactech.com/conference/" style="font-weight: bold"&gt;MacTech Conference.&lt;/a&gt; I&amp;#8217;m presenting again—same topic as last year, how to recognize, find, and fix bugs in Cocoa applications, but this time it&amp;#8217;s the Xcode 4 edition. The early bird period has ended, but you can get the same $500 off by signing up through &lt;a href="http://www.mactech.com/conference/special-reg_Hosey"&gt;this referral link&lt;/a&gt;. The time and place is November 2, 3, and 4 in Universal City, California.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Last year at the MacTech Conference, I brought with me some of my &lt;a href="http://boredzo.org/cocoa-links-card/"&gt;useful Cocoa links business card&lt;/a&gt;. I&amp;#8217;ll be doing that again this year, so if you attend the MacTech Conference, feel free to ask me for one.&lt;/p&gt;
&lt;p&gt;I hope to see you at the MacTech Conference!&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/domainofthebored?a=1prpzGzdHmQ:ScjxVH0u9C4:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/domainofthebored?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/domainofthebored?a=1prpzGzdHmQ:ScjxVH0u9C4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/domainofthebored?i=1prpzGzdHmQ:ScjxVH0u9C4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/domainofthebored/~4/1prpzGzdHmQ" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://boredzo.org/blog/archives/2011-09-12/conferences-2011#comments" thr:count="1" />
		<link rel="replies" type="application/atom+xml" href="http://boredzo.org/blog/archives/2011-09-12/conferences-2011/feed/atom" thr:count="1" />
		<thr:total>1</thr:total>
	<feedburner:origLink>http://boredzo.org/blog/archives/2011-09-12/conferences-2011</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Peter Hosey</name>
						<uri>http://boredzo.org./</uri>
					</author>
		<title type="html"><![CDATA[SD card sleeve]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/domainofthebored/~3/qLALVZJuYtU/sd-card-sleeve" />
		<id>http://boredzo.org/blog/?p=1487</id>
		<updated>2011-07-10T09:44:51Z</updated>
		<published>2011-07-10T08:54:21Z</published>
		<category scheme="http://boredzo.org/blog" term="Creations" /><category scheme="http://boredzo.org/blog" term="flash memory" /><category scheme="http://boredzo.org/blog" term="printable" /><category scheme="http://boredzo.org/blog" term="sd" /><category scheme="http://boredzo.org/blog" term="secure digital" /><category scheme="http://boredzo.org/blog" term="securedigital" /><category scheme="http://boredzo.org/blog" term="sleeve" /><category scheme="http://boredzo.org/blog" term="template" />		<summary type="html"><![CDATA[If you have an SD card without a case, you may find this handy. SD-card-sleeve.pdf A PDF file from which you can print out nine sleeves per US Letter sheet. Make sure you print at 100% scale. Assembly instructions Cut out a sleeve along the thick lines. Place the card in the center of the sleeve [...]]]></summary>
		<content type="html" xml:base="http://boredzo.org/blog/archives/2011-07-10/sd-card-sleeve">&lt;p&gt;If you have an SD card without a case, you may find this handy.&lt;/p&gt;
&lt;p class="image"&gt;&lt;img src="http://boredzo.org/blog/wp-content/uploads/2011/07/SD-card-sleeve-front.jpg.jpg" alt="Front of sleeve, labeled." border="0" width="400" height="300" /&gt;&lt;br /&gt;
&lt;img src="http://boredzo.org/blog/wp-content/uploads/2011/07/SD-card-sleeve-back.jpg.jpg" alt="The back of the SD card sleeve, closed." border="0" width="400" height="300" /&gt;&lt;br /&gt;
&lt;img style="display:block; margin-left:auto; margin-right:auto;" src="http://boredzo.org/blog/wp-content/uploads/2011/07/SD-card-sleeve-back-open.jpg.jpg" alt="The back of the SD card sleeve, open, showing the card inside." border="0" width="400" height="300" /&gt;&lt;/p&gt;
&lt;div class="file-sidebar"&gt;
&lt;p class="header"&gt;&lt;img width="24" height="24" style="vertical-align: middle" alt="File:" src="http://boredzo.org/pdf-24.png" /&gt; &lt;a href="http://boredzo.org/blog/wp-content/uploads/2011/07/SD-card-sleeve.pdf"&gt;SD-card-sleeve.pdf&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A PDF file from which you can print out nine sleeves per US Letter sheet. Make sure you print at 100% scale.&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;Assembly instructions&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Cut out a sleeve along the thick lines.&lt;/li&gt;
&lt;li&gt;Place the card in the center of the sleeve so that it is outlined by the thin lines.&lt;/li&gt;
&lt;li&gt;Fold the bottom (rectangular flap) over first.&lt;/li&gt;
&lt;li&gt;Fold the side flaps over.&lt;/li&gt;
&lt;li&gt;Secure the bottom and side flaps with one square piece of three-quarter-inch Scotch tape.&lt;/li&gt;
&lt;li&gt;Fold the top flap over and inside.&lt;/li&gt;
&lt;li&gt;Flip the sleeve over and label it on the seamless side.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/domainofthebored?a=qLALVZJuYtU:TQ6_tFb96q0:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/domainofthebored?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/domainofthebored?a=qLALVZJuYtU:TQ6_tFb96q0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/domainofthebored?i=qLALVZJuYtU:TQ6_tFb96q0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/domainofthebored/~4/qLALVZJuYtU" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://boredzo.org/blog/archives/2011-07-10/sd-card-sleeve#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://boredzo.org/blog/archives/2011-07-10/sd-card-sleeve/feed/atom" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://boredzo.org/blog/archives/2011-07-10/sd-card-sleeve</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Peter Hosey</name>
						<uri>http://boredzo.org./</uri>
					</author>
		<title type="html"><![CDATA[How to make the Help key do something useful]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/domainofthebored/~3/Ny-c0PYtJMg/help-key-made-useful" />
		<id>http://boredzo.org/blog/?p=1480</id>
		<updated>2011-06-14T09:52:11Z</updated>
		<published>2011-06-14T09:51:52Z</published>
		<category scheme="http://boredzo.org/blog" term="Cocoa" /><category scheme="http://boredzo.org/blog" term="Documentation" /><category scheme="http://boredzo.org/blog" term="Programming" />		<summary type="html"><![CDATA[If you want to see the techniques explored in this blog post in a working application, download ContextHelpTest and/or its source code. If you&#8217;ve used Mac OS X with an Apple extended keyboard of some sort, chances are you&#8217;ve seen this: That&#8217;s the cursor that comes up when you press the Help key. And every [...]]]></summary>
		<content type="html" xml:base="http://boredzo.org/blog/archives/2011-06-14/help-key-made-useful">&lt;p style="font-style: italic"&gt;If you want to see the techniques explored in this blog post in a working application, download &lt;a href="https://bitbucket.org/boredzo/contexthelptest/downloads"&gt;ContextHelpTest&lt;/a&gt; and/or &lt;a href="https://bitbucket.org/boredzo/contexthelptest/"&gt;its source code&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;ve used Mac OS X with an Apple extended keyboard of some sort, chances are you&amp;#8217;ve seen this:&lt;/p&gt;
&lt;p class="screenshot"&gt;&lt;img src="http://boredzo.org/blog/wp-content/uploads/2011/06/HelpCursor.png" alt="The Help cursor, a question mark." border="0" width="32" height="32" /&gt;&lt;/p&gt;
&lt;p&gt;That&amp;#8217;s the cursor that comes up when you press the Help key. And every time, if you click while that cursor is up, you get a beep and the cursor changes back. (If you press a key instead, the cursor changes back and the keystroke goes through, which often will still get you a beep.)&lt;/p&gt;
&lt;p&gt;So most of us probably forget the Help key exists, and curse it when we are reminded of it by pressing it by accident.&lt;/p&gt;
&lt;p&gt;But what does it &lt;em&gt;do&lt;/em&gt;, really? What is it meant to do?&lt;/p&gt;
&lt;p&gt;Every &lt;a href="http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSResponder_Class/"&gt;responder&lt;/a&gt; can respond to a message called &lt;a href="http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSResponder_Class/Reference/Reference.html#//apple_ref/occ/instm/NSResponder/helpRequested:"&gt;&lt;code&gt;helpRequested:&lt;/code&gt;&lt;/a&gt;. The default implementation is to ask &lt;a href="http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSHelpManager_Class/"&gt;the help manager&lt;/a&gt; for &lt;a href="http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSHelpManager_Class/Reference/Reference.html#//apple_ref/occ/instm/NSHelpManager/contextHelpForObject:"&gt;the attributed string set as help for itself&lt;/a&gt;. If you&amp;#8217;ve never &lt;a href="http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSHelpManager_Class/Reference/Reference.html#//apple_ref/occ/instm/NSHelpManager/setContextHelp:forObject:"&gt;set any help for it&lt;/a&gt;, then the help manager will return &lt;code&gt;nil&lt;/code&gt;, and the default &lt;code&gt;helpRequested:&lt;/code&gt; implementation will pass the message on to the next responder. If you have set help for the responder, then it will tell the help manager to &lt;a href="http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSHelpManager_Class/Reference/Reference.html#//apple_ref/occ/instm/NSHelpManager/showContextHelpForObject:locationHint:"&gt;show that help&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;So here&amp;#8217;s what you need to do:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;To associate a help text with a view or other object, send &lt;a href="http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSHelpManager_Class/Reference/Reference.html#//apple_ref/occ/clm/NSHelpManager/sharedHelpManager"&gt;the help manager&lt;/a&gt; a &lt;a href="http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSHelpManager_Class/Reference/Reference.html#//apple_ref/occ/instm/NSHelpManager/setContextHelp:forObject:"&gt;&lt;code&gt;setContextHelp:forObject:&lt;/code&gt;&lt;/a&gt; message, passing the help attributed string and the view/other object. When the object is a view, this is all you need to do for Help-clicking on the view to do the right thing.&lt;/li&gt;
&lt;li&gt;To programmatically show context help for an object, use &lt;a href="http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSHelpManager_Class/Reference/Reference.html#//apple_ref/occ/instm/NSHelpManager/showContextHelpForObject:locationHint:"&gt;&lt;code&gt;showContextHelpForObject:locationHint:&lt;/code&gt;&lt;/a&gt;. Note that you pass the object to look up, not the help text, here. The location hint is where the user might have Help-clicked to bring up the context help.&lt;/li&gt;
&lt;li&gt;To make your custom view able to show context help for things it draws within itself, override &lt;code&gt;helpRequested:&lt;/code&gt;, find what the user clicked on, lazily set the context help for the clicked object (if appropriate), and &lt;a href="http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSHelpManager_Class/Reference/Reference.html#//apple_ref/occ/instm/NSHelpManager/showContextHelpForObject:locationHint:"&gt;look it up&lt;/a&gt;. If the user didn&amp;#8217;t click on anything or you don&amp;#8217;t have any help worth providing for it, pass the message on to &lt;code&gt;super&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;To programmatically enter Help-key mode, &lt;a href="http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSApplication_Class/Reference/Reference.html#//apple_ref/occ/instm/NSApplication/activateContextHelpMode:"&gt;send the &lt;code&gt;activateContextHelpMode:&lt;/code&gt; action message to the application object&lt;/a&gt;. If you want to make a control or menu item in a nib do this, connect it to that action on the First Responder.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note that the help manager does not retain your definable objects. If an object that has help set for it is deallocated, that will cause a crash later on. Therefore, when setting context help for a view, the view itself should do so within its &lt;code&gt;initWithFrame:&lt;/code&gt; (or other designated initializer) and &lt;code&gt;initWithCoder:&lt;/code&gt; methods, and &lt;a href="http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSHelpManager_Class/Reference/Reference.html#//apple_ref/occ/instm/NSHelpManager/removeContextHelpForObject:"&gt;remove itself from context help&lt;/a&gt; in &lt;code&gt;dealloc&lt;/code&gt;. (I don&amp;#8217;t know how this goes under GC or ARC.)&lt;/p&gt;
&lt;p&gt;You might also have noticed that I&amp;#8217;m not simply saying “view” or “responder”. The help manager does not restrict you to setting help for responders or views; any object can have context help set for it. This includes model objects. This is very, very useful for implementing a view that does selective context help on things within it: You set context help for each model object, and the view tells the help manager to show help for the clicked model object.&lt;/p&gt;
&lt;p&gt;When setting context help for a non-responder, the controller that owns it should do that, and should remove the object from context help before releasing the ownership.&lt;/p&gt;
&lt;p&gt;So, &lt;a href="https://bitbucket.org/boredzo/contexthelptest"&gt;here&amp;#8217;s a test app&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Context help works the usual way on the word-count field:&lt;/p&gt;
&lt;p class="screenshot"&gt;&lt;img src="http://boredzo.org/blog/wp-content/uploads/2011/06/ContextHelpTest-WordCountHelp.png" alt="Help-clicking on the word-count field shows a tooltip-looking popover that shows the context help associated with the field." border="0" width="245" height="59" /&gt;&lt;/p&gt;
&lt;p&gt;The text view is a subclass of NSTextView that implements &lt;code&gt;helpRequested:&lt;/code&gt; by determining what word the user clicked on (by sending itself &lt;a href="http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSTextView_Class/Reference/Reference.html#//apple_ref/occ/instm/NSTextView/characterIndexForInsertionAtPoint:"&gt;&lt;code&gt;characterIndexForInsertionAtPoint:&lt;/code&gt;&lt;/a&gt; and then using a &lt;a href="http://developer.apple.com/library/mac/documentation/CoreFoundation/Reference/CFStringTokenizerRef/"&gt;CFStringTokenizer&lt;/a&gt; to walk through its words) and then &lt;a href="http://developer.apple.com/library/mac/documentation/UserExperience/Reference/DictionaryServicesRef/Reference/reference.html#//apple_ref/c/func/DCSCopyTextDefinition"&gt;looking that word up in the dictionary&lt;/a&gt;.&lt;/p&gt;
&lt;p class="screenshot"&gt;&lt;img src="http://boredzo.org/blog/wp-content/uploads/2011/06/ContextHelpTest-DefineWord.png" alt="Help-clicking on the word-count field shows a tooltip-looking popover that shows the dictionary definition associated with the clicked-on word." border="0" width="540" height="350" /&gt;&lt;/p&gt;
&lt;p&gt;Naturally, since &lt;a href="http://pckeyboards.stores.yahoo.net/mightymouse.html"&gt;not everybody has a Help key anymore&lt;/a&gt;, I provided an alternative.&lt;/p&gt;
&lt;p class="screenshot"&gt;&lt;img src="http://boredzo.org/blog/wp-content/uploads/2011/06/ContextHelpTest-EditMenu.png" alt="The Edit menu contains a Define menu item, with the keyboard shortcut of ctrl-slash." border="0" width="287" height="375" /&gt;&lt;/p&gt;
&lt;p&gt;I look forward to seeing what uses you come up with in your apps for this.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/domainofthebored?a=Ny-c0PYtJMg:4B7JpU6jJiw:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/domainofthebored?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/domainofthebored?a=Ny-c0PYtJMg:4B7JpU6jJiw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/domainofthebored?i=Ny-c0PYtJMg:4B7JpU6jJiw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/domainofthebored/~4/Ny-c0PYtJMg" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://boredzo.org/blog/archives/2011-06-14/help-key-made-useful#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://boredzo.org/blog/archives/2011-06-14/help-key-made-useful/feed/atom" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://boredzo.org/blog/archives/2011-06-14/help-key-made-useful</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Peter Hosey</name>
						<uri>http://boredzo.org./</uri>
					</author>
		<title type="html"><![CDATA[The Temporal Orphanage]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/domainofthebored/~3/DXatGs2Fcbc/the-temporal-orphanage" />
		<id>http://boredzo.org/blog/?p=1472</id>
		<updated>2011-06-01T02:11:10Z</updated>
		<published>2011-06-01T02:11:09Z</published>
		<category scheme="http://boredzo.org/blog" term="Fiction" /><category scheme="http://boredzo.org/blog" term="fiction" /><category scheme="http://boredzo.org/blog" term="orphanage" /><category scheme="http://boredzo.org/blog" term="short story" /><category scheme="http://boredzo.org/blog" term="time travel" />		<summary type="html"><![CDATA[The Temporal Orphanage was a novel solution to the problem of parentless children. Every child who entered the Orphanage had to sign an agreement stating that they would return in 20 years. As the only licensed user of time-travel technology, the Orphanage used it to send the 20-year-old orphan back in time 20 years to [...]]]></summary>
		<content type="html" xml:base="http://boredzo.org/blog/archives/2011-05-31/the-temporal-orphanage">&lt;p&gt;The Temporal Orphanage was a novel solution to the problem of parentless children.&lt;/p&gt;
&lt;p&gt;Every child who entered the Orphanage had to sign an agreement stating that they would return in 20 years. As the only licensed user of time-travel technology, the Orphanage used it to send the 20-year-old orphan back in time 20 years to be their own adoptive parent.&lt;/p&gt;
&lt;p&gt;Deferments were granted, on a case-by-case basis, to orphans who would eventually marry. The Orphanage preferred the children to be raised by couples, so they granted nearly every request, but undeferred single parents were not uncommon. Every orphan found out within a month of their acceptance whether they would be single or married when they arrived to pick themselves up, and no review was necessary at the time of the deferment application because they already knew whether they would accept it.&lt;/p&gt;
&lt;p&gt;A few new laws had to be passed shortly after the Orphanage commenced operations. Some were amendments or repeals to legislation that had assumed time travel did not exist or was completely banned, but one new law that could be tied directly to the Orphanage required life insurance companies to consider the number of years that each insured person lived, not merely the subtraction between their dates of birth and death.&lt;/p&gt;
&lt;p&gt;The Orphanage was financed in two parts. The first, and minor, part was by a toy store occupying the other half of the building. Some orphans simply kept all of their toys as they grew up to bring back with them all at once, but this was disfavored by the Orphanage, both because it did not bring in income and because the greater mass made the travel more expensive.&lt;/p&gt;
&lt;p&gt;The other part was an apartment complex. Grown-up orphans would begin renting or buy their own residence in their late teens, but then have to go back 20-plus years to a time when they had no home besides the orphanage. Each parent who arrived rented an apartment within the Orphanage&amp;#8217;s own apartment building—guaranteed to have an opening—until they could find another, cheaper temporary apartment elsewhere. The trickiest part was remembering to pay the rent upon returning to the apartment they&amp;#8217;d left a calendar month/20 biological years ago.&lt;/p&gt;
&lt;p&gt;The Orphanage was almost closed down by OSHA, but managed to remain open with the promise of no further hiring, after a power surge uncaused the deaths of all of the staff.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/domainofthebored?a=DXatGs2Fcbc:ipLNdSo8KkA:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/domainofthebored?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/domainofthebored?a=DXatGs2Fcbc:ipLNdSo8KkA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/domainofthebored?i=DXatGs2Fcbc:ipLNdSo8KkA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/domainofthebored/~4/DXatGs2Fcbc" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://boredzo.org/blog/archives/2011-05-31/the-temporal-orphanage#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://boredzo.org/blog/archives/2011-05-31/the-temporal-orphanage/feed/atom" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://boredzo.org/blog/archives/2011-05-31/the-temporal-orphanage</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Peter Hosey</name>
						<uri>http://boredzo.org./</uri>
					</author>
		<title type="html"><![CDATA[How to make me lose all interest in your app and not even want to try it much less buy it]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/domainofthebored/~3/tkbz82PEORg/making-your-app-look-good-making-your-app-look-bad" />
		<id>http://boredzo.org/blog/?p=1466</id>
		<updated>2011-04-26T22:29:45Z</updated>
		<published>2011-04-26T22:29:19Z</published>
		<category scheme="http://boredzo.org/blog" term="iPhone" /><category scheme="http://boredzo.org/blog" term="Software distribution" />		<summary type="html"><![CDATA[Choose any—or, preferably, none: Make custom buttons, but don&#8217;t hire a professional designer to design them. Draw your UI in your pirated copy of Photoshop and make the best buttons you, fellow non-graphically-superpowered programmer, can manage, which look like you downloaded them from GeoCities in 1995 or got them out of a “1001 Buttons!” book [...]]]></summary>
		<content type="html" xml:base="http://boredzo.org/blog/archives/2011-04-26/making-your-app-look-good-making-your-app-look-bad">&lt;p&gt;Choose any—or, preferably, none:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Make custom buttons, but don&amp;#8217;t hire a professional designer to design them. Draw your UI in your pirated copy of Photoshop and make the best buttons you, fellow non-graphically-superpowered programmer, can manage, which look like you downloaded them from GeoCities in 1995 or got them out of a “1001 Buttons!” book from the same year.&lt;/li&gt;
&lt;li&gt;Make custom UI controls (especially buttons) simply because you can.&lt;/li&gt;
&lt;li&gt;Fill your App Store page&amp;#8217;s “screenshots” section with images that are not purely screenshots. Showing an iPhone 4 with your app on it is a minus. Showing an older iPhone is another minus. Putting in your own &lt;del&gt;inane blather&lt;/del&gt; marketing copy with your paint program&amp;#8217;s text tool is a minus. Putting the iPhone and/or text on any kind of background is a minus. Any image that does not show the app at all is 500 minuses.&lt;/li&gt;
&lt;li&gt;Show screenshots, but only of some of the app. Leave me wondering whether your app has the feature or UI pattern I&amp;#8217;m looking for. (If your app is free, I&amp;#8217;ll try it and find out. If it&amp;#8217;s not, I won&amp;#8217;t.)&lt;/li&gt;
&lt;li&gt;Custom backgrounds without (&lt;em&gt;good&lt;/em&gt;) custom UI. Extra debit if your background is plain white.&lt;/li&gt;
&lt;li&gt;Abbr btn nms.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;How to keep me actually interested and maybe even get me to buy your app:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;If you make custom UI, make it awesome. Make a truly original UI that would belong on the cover of Macworld. Make it a custom UI with a purpose that guides and justifies the customizations. (Beware the difference between “purpose” and “theme”.) Otherwise, stick to plain Cocoa Touch controls wherever possible. Functional beats ugly.&lt;/li&gt;
&lt;li&gt;If you go functional, follow the HIG. Either way, keep things clean and well-organized. Don&amp;#8217;t force too much into a single screen. If you “have to” pack multiple things on a line, that&amp;#8217;s too much. If you “have to” abbreviate words, that&amp;#8217;s too much. Consider cutting features; simplicity is a virtue. If you need to break things out into other views, do it.&lt;/li&gt;
&lt;li&gt;The screenshots section is for &lt;em&gt;screenshots only&lt;/em&gt;. If you need to indicate a gesture, composite in a finger and an arrow, and don&amp;#8217;t do that in more than one screenshot. No added text. Ever.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Don&amp;#8217;t miss the comments. I&amp;#8217;m sure some of you have some other don&amp;#8217;ts to suggest that I forgot.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/domainofthebored?a=tkbz82PEORg:L8Z0sZ67DmY:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/domainofthebored?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/domainofthebored?a=tkbz82PEORg:L8Z0sZ67DmY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/domainofthebored?i=tkbz82PEORg:L8Z0sZ67DmY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/domainofthebored/~4/tkbz82PEORg" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://boredzo.org/blog/archives/2011-04-26/making-your-app-look-good-making-your-app-look-bad#comments" thr:count="2" />
		<link rel="replies" type="application/atom+xml" href="http://boredzo.org/blog/archives/2011-04-26/making-your-app-look-good-making-your-app-look-bad/feed/atom" thr:count="2" />
		<thr:total>2</thr:total>
	<feedburner:origLink>http://boredzo.org/blog/archives/2011-04-26/making-your-app-look-good-making-your-app-look-bad</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Peter Hosey</name>
						<uri>http://boredzo.org./</uri>
					</author>
		<title type="html"><![CDATA[Portal 2]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/domainofthebored/~3/hcjVNbBTXf0/portal-2" />
		<id>http://boredzo.org/blog/?p=1464</id>
		<updated>2011-06-12T22:44:37Z</updated>
		<published>2011-04-25T00:45:06Z</published>
		<category scheme="http://boredzo.org/blog" term="Gaming" /><category scheme="http://boredzo.org/blog" term="Reviews" />		<summary type="html"><![CDATA[The best works of fiction all have in common a certain feeling. It comes at the end. You&#8217;ve finished it. There is no more; you know this, and it hurts you, because you want more, you want the enjoyment you&#8217;ve just had to continue forever, and yet you know that if there were always more, [...]]]></summary>
		<content type="html" xml:base="http://boredzo.org/blog/archives/2011-04-24/portal-2">&lt;p&gt;The best works of fiction all have in common a certain feeling.&lt;/p&gt;
&lt;p&gt;It comes at the end. You&amp;#8217;ve finished it. There is no more; you know this, and it hurts you, because you want more, you want the enjoyment you&amp;#8217;ve just had to continue forever, and yet you know that if there were always more, if it ran forever, eventually it would get boring, so it is good that is over, and yet it hurts.&lt;/p&gt;
&lt;p&gt;Portal 2—which is great, all the way through—leaves you with that feeling. The ending is great, the best ending I&amp;#8217;ve ever seen in a video game, and it hurts.&lt;/p&gt;
&lt;p&gt;You should play it.&lt;/p&gt;
&lt;p&gt;Play the first one first, and then play the second. And then you should probably play them both again—I know there&amp;#8217;s some stuff I&amp;#8217;ll view differently when I play Portal 2 the second time.&lt;/p&gt;
&lt;p&gt;The only thing it left me wanting was a soundtrack album. I only bought the one song (you know the one) from the Orange Box soundtrack, but I would happily buy the whole soundtrack to this game. The music is as wonderful as the game it accompanies. I hope, someday, preferably someday soon, I can go to the iTunes Store or Amazon MP3 and buy it.&lt;/p&gt;
&lt;p&gt;Valve and everybody else involved in making this game (and the original): You rock.&lt;/p&gt;
&lt;p&gt;&lt;span class="update"&gt;EDIT 2011-06-12:&lt;/span&gt; Just found &lt;a href="http://tvtropes.org/pmwiki/pmwiki.php/Main/AwesomenessWithdrawal"&gt;this phenomenon on TVTropes&lt;/a&gt;. (To be clear, they had it first.)&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/domainofthebored?a=hcjVNbBTXf0:kY9Akf33jmc:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/domainofthebored?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/domainofthebored?a=hcjVNbBTXf0:kY9Akf33jmc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/domainofthebored?i=hcjVNbBTXf0:kY9Akf33jmc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/domainofthebored/~4/hcjVNbBTXf0" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://boredzo.org/blog/archives/2011-04-24/portal-2#comments" thr:count="1" />
		<link rel="replies" type="application/atom+xml" href="http://boredzo.org/blog/archives/2011-04-24/portal-2/feed/atom" thr:count="1" />
		<thr:total>1</thr:total>
	<feedburner:origLink>http://boredzo.org/blog/archives/2011-04-24/portal-2</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Peter Hosey</name>
						<uri>http://boredzo.org./</uri>
					</author>
		<title type="html"><![CDATA[Writing, n.]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/domainofthebored/~3/YbugFuoYNNs/writing" />
		<id>http://boredzo.org/blog/?p=1462</id>
		<updated>2011-03-24T23:01:58Z</updated>
		<published>2011-03-24T23:01:56Z</published>
		<category scheme="http://boredzo.org/blog" term="Life" /><category scheme="http://boredzo.org/blog" term="Programming" />		<summary type="html"><![CDATA[Over on Tumblr (where I have also started writing), Andy Matuschak and Christopher Bowns have challenged each other: Long story short: Andy and I threw down our respective gloves after throwing back the third glass of whiskey, and came up with this: every Tuesday, we’ll spend 20 minutes of our respective shuttle rides to work [...]]]></summary>
		<content type="html" xml:base="http://boredzo.org/blog/archives/2011-03-24/writing">&lt;p&gt;Over on Tumblr (&lt;a href="http://boredzo.tumblr.com/"&gt;where I have also started writing&lt;/a&gt;), &lt;a href="http://confusatory.org/post/4066495734/contested"&gt;Andy Matuschak and Christopher Bowns have challenged each other&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Long story short: Andy and I threw down our respective gloves after throwing back the third glass of whiskey, and came up with this: every Tuesday, we’ll spend 20 minutes of our respective shuttle rides to work writing something. It doesn’t matter what, but when those 20 minutes are up, you publish it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;After Christopher published that, Colin Barrett entered with &lt;a href="http://iamthewalr.us/blog/2011/03/be-your-own-editor/"&gt;this piece&lt;/a&gt;. Discussion ensued on Twitter, as it so often does, and it included &lt;a href="https://twitter.com/cbowns/status/51030867820281856"&gt;this tweet from Christopher&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;@cbarrett Perfect. I think &amp;#8220;overthinking it&amp;#8221; can cripple your writing, but it&amp;#8217;s hard to let go of, because it&amp;#8217;s so &lt;em&gt;useful&lt;/em&gt; in engineering.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://twitter.com/boredzo/status/51032973390249984"&gt;I responded there&lt;/a&gt;, but I&amp;#8217;d now like to expand in a somewhat different direction here.&lt;/p&gt;
&lt;p&gt;Writing programs &lt;em&gt;is writing&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Consider this: If you write a program that no human can read, you have written it badly, and may have even written an outright bad program. Switch out “program” for “manuscript” and I hope you see my point.&lt;/p&gt;
&lt;p&gt;Don&amp;#8217;t confuse this with &lt;a href="http://en.wikipedia.org/wiki/Literate_programming"&gt;literate programming&lt;/a&gt;. That has you write a more-or-less human-only text, and then run a program such as WEB or CWEB to translate it to source code.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://software-carpentry.org/2011/03/4069/"&gt;The problem with literate programming&lt;/a&gt; is the problem with all translation from one language to another, especially &lt;a href="http://translate.google.com/"&gt;automatic&lt;/a&gt; &lt;a href="http://babelfish.yahoo.com/"&gt;translation&lt;/a&gt;: Error.&lt;/p&gt;
&lt;p&gt;Just as translating a human-only text from one human language to another human language can produce &lt;a href="http://tashian.com/multibabel/"&gt;a garbled mash&lt;/a&gt;, so can translating a program from one language to another produce a nonsense, or at least broken, program.&lt;/p&gt;
&lt;p&gt;Hence the justified suspicion of programs that “upgrade” a program even just from one version of the same language to another: It isn&amp;#8217;t the same language; not really. Similar, but not the same. Going from Python 2 to Python 3, for example, is not much different from going from 18th-century English to 21st-century English. Do these words mean the same thing? &lt;a href="http://docs.python.org/2.7/library/functions.html#range"&gt;Maybe&lt;/a&gt; &lt;a href="http://docs.python.org/3.2/library/stdtypes.html#sequence-types-str-bytes-bytearray-list-tuple-range"&gt;not&lt;/a&gt;. This is why such translators invariably come with warnings to check the hell out of the result.&lt;/p&gt;
&lt;p id="writing-defined-fn1-orig"&gt;No, I&amp;#8217;m not talking about literate programming. I&amp;#8217;m talking about regular programming, where &lt;em&gt;you&lt;/em&gt; write the true text of the program, the text that the interpreter interprets or the compiler converts into machine code.&lt;a href="#writing-defined-fn1"&gt;*&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Programming is a fusion of a couple of skills. It&amp;#8217;s often called “software engineering”, but that&amp;#8217;s only half of it. Writing is the other half. I define “writing” here as writing text into an editor, whatever the language, and “engineering” as designing a thing to be built. Things like OOP, unit testing, and design patterns are aspects of software engineering. Things like DRY, commenting practices, naming practices, and style rules are aspects of writing.&lt;/p&gt;
&lt;p&gt;If you write a program well, you write it not only for the interpreter or compiler, but for any humans who will read the program after you, &lt;a href="http://www.cimgf.com/2009/03/26/dont-blindly-trust-debb/"&gt;including yourself&lt;/a&gt;. It is a text like any other.&lt;/p&gt;
&lt;p&gt;Writing a program &lt;em&gt;is writing&lt;/em&gt;. Every rule, observation, and prescription you apply to writing for humans only, apply also to programming, and vice versa. If the rule does not work, chances are it was not a good rule to begin with.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Suggested reading&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://bartleby.com/141/"&gt;The Elements of Style&lt;/a&gt;, by William Strunk, Jr. Feedbooks has &lt;a href="http://www.feedbooks.com/book/3697/the-elements-of-style" title="The Elements of Style, by William Strunk, Jr., in ebook formats"&gt;an ebook version&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;On Writing, by Stephen King.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;div class="footnotes"&gt;
&lt;p id="writing-defined-fn1"&gt;* This is, itself, a form of translation; the C standard even calls it such. That&amp;#8217;s part of why compiler bugs are possible, and why compiler authors are extremely careful about their work, which is why &lt;a href="http://boredzo.org/blog/archives/2010-11-13/four-rules-of-debugging"&gt;compiler bugs are so rare&lt;/a&gt;. &lt;a href="#writing-defined-fn1-orig"&gt;↶&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/domainofthebored?a=YbugFuoYNNs:EB4hzZ-LNqI:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/domainofthebored?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/domainofthebored?a=YbugFuoYNNs:EB4hzZ-LNqI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/domainofthebored?i=YbugFuoYNNs:EB4hzZ-LNqI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/domainofthebored/~4/YbugFuoYNNs" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://boredzo.org/blog/archives/2011-03-24/writing#comments" thr:count="4" />
		<link rel="replies" type="application/atom+xml" href="http://boredzo.org/blog/archives/2011-03-24/writing/feed/atom" thr:count="4" />
		<thr:total>4</thr:total>
	<feedburner:origLink>http://boredzo.org/blog/archives/2011-03-24/writing</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Peter Hosey</name>
						<uri>http://boredzo.org./</uri>
					</author>
		<title type="html"><![CDATA[The application delegate and the new singletons]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/domainofthebored/~3/mThrQdWBU5k/application-delegate-singletons" />
		<id>http://boredzo.org/blog/?p=1460</id>
		<updated>2011-03-19T00:26:59Z</updated>
		<published>2011-03-19T00:26:57Z</published>
		<category scheme="http://boredzo.org/blog" term="Best practices" /><category scheme="http://boredzo.org/blog" term="Cocoa" /><category scheme="http://boredzo.org/blog" term="iPhone" /><category scheme="http://boredzo.org/blog" term="Programming" />		<summary type="html"><![CDATA[Here is a global variable: Wizard *gWizard; I&#8217;ll call this a zeroth-order global, on the premise that I need to talk to exactly zero objects (including classes) to gain access to this object. Next, let&#8217;s look at a singleton: [Wizard sharedWizard]; //hope he's not busy I&#8217;ll call this a first-order global, as we need to [...]]]></summary>
		<content type="html" xml:base="http://boredzo.org/blog/archives/2011-03-18/application-delegate-singletons">&lt;p&gt;Here is a global variable:&lt;/p&gt;
&lt;pre&gt;Wizard *gWizard;&lt;/pre&gt;
&lt;p&gt;I&amp;#8217;ll call this a zeroth-order global, on the premise that I need to talk to exactly zero objects (including classes) to gain access to this object.&lt;/p&gt;
&lt;p&gt;Next, let&amp;#8217;s look at a singleton:&lt;/p&gt;
&lt;pre&gt;[Wizard sharedWizard]; //hope he's not busy&lt;/pre&gt;
&lt;p&gt;I&amp;#8217;ll call this a first-order global, as we need to ask the class for it (1 step) to gain access to it.&lt;/p&gt;
&lt;p&gt;Now, here&amp;#8217;s a second-order global:&lt;/p&gt;
&lt;pre&gt;MyAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];&lt;/pre&gt;
&lt;p&gt;(I use UIApplication here because I see this most frequently in Cocoa Touch code, but the pattern applies equally to Cocoa.)&lt;/p&gt;
&lt;p&gt;And here&amp;#8217;s a third-order global:&lt;/p&gt;
&lt;pre&gt;Wizard *wizard = [appDelegate wizard];&lt;/pre&gt;
&lt;p&gt;I need to (1) ask the UIApplication class for the application object, (2) ask that for its delegate, and (3) ask that for the wizard. (Assume here that &lt;code&gt;wizard&lt;/code&gt; is a property, not a factory method that creates Wizards on the fly.)&lt;/p&gt;
&lt;p&gt;None of these is any less global. If I can get to it from anywhere in the program without knowing about it directly, it is global.&lt;/p&gt;
&lt;p&gt;Therefore, all the problems of globals apply:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What if two threads want to use the same Wizard?&lt;/li&gt;
&lt;li&gt;What if the Wizard has a delegate of its own, and I have two objects that want to be its delegate?&lt;/li&gt;
&lt;li&gt;What if the Wizard keeps internal state that may be corrupted by multiple objects trying to use it? (Nothing should have to worry about this outside of the Wizard itself.)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;Your application&amp;#8217;s objects form a graph. It should not be a complex one like this:&lt;/p&gt;
&lt;p class="image"&gt;&lt;img width="305" height="249" alt="At the top, the application object. From it, its delegate. From it, your controller objects and a wizard. From each controller object, a path (colored in red) back to the delegate and then to the wizard." src="http://i.imgur.com/aiwJE.png" /&gt;&lt;/p&gt;
&lt;p&gt;Whenever you have paths bouncing around off of other objects like that, that&amp;#8217;s a problem. The red arrows in the problem graph show where you violate the &lt;a href="http://en.wikipedia.org/w/index.php?title=Law_of_Demeter&amp;#038;oldid=411550367"&gt;Law of Demeter&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Your object graph should, instead, be straightforward:&lt;/p&gt;
&lt;p class="image"&gt;&lt;img width="221" height="334" alt="At the top, the application object. From it, its delegate. From it, your controller objects. From each one, a wizard." src="http://i.imgur.com/8O4ua.png" /&gt;&lt;/p&gt;
&lt;p&gt;Note that each of your controllers should own—or, if you prefer, &lt;em&gt;hire&lt;/em&gt;—a Wizard all to itself. This eliminates contention between objects and reduces the likelihood of contention between threads (assuming each of the owning objects is supposed to only work on a single thread and not juggle multiple threads).&lt;/p&gt;
&lt;p&gt;If contention is not a problem and you have a good reason why there should be only one Wizard, such as memory pressure or union regulations, then use a singleton. But use &lt;a href="http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/CocoaObjects.html#//apple_ref/doc/uid/TP40002974-CH4-SW32"&gt;a real singleton&lt;/a&gt;, and only when necessary, and beware of singletons in disguise.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/domainofthebored?a=mThrQdWBU5k:_3Jw4sMbjz4:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/domainofthebored?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/domainofthebored?a=mThrQdWBU5k:_3Jw4sMbjz4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/domainofthebored?i=mThrQdWBU5k:_3Jw4sMbjz4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/domainofthebored/~4/mThrQdWBU5k" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://boredzo.org/blog/archives/2011-03-18/application-delegate-singletons#comments" thr:count="1" />
		<link rel="replies" type="application/atom+xml" href="http://boredzo.org/blog/archives/2011-03-18/application-delegate-singletons/feed/atom" thr:count="1" />
		<thr:total>1</thr:total>
	<feedburner:origLink>http://boredzo.org/blog/archives/2011-03-18/application-delegate-singletons</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Peter Hosey</name>
						<uri>http://boredzo.org./</uri>
					</author>
		<title type="html"><![CDATA[The new and improved Cocoa links card]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/domainofthebored/~3/yDRFbRVgPhg/useful-cocoa-links-card" />
		<id>http://boredzo.org/blog/?p=1458</id>
		<updated>2011-03-15T15:16:16Z</updated>
		<published>2011-03-15T15:16:12Z</published>
		<category scheme="http://boredzo.org/blog" term="Cocoa" /><category scheme="http://boredzo.org/blog" term="CocoaHeads" /><category scheme="http://boredzo.org/blog" term="Documentation" /><category scheme="http://boredzo.org/blog" term="iPhone" /><category scheme="http://boredzo.org/blog" term="Programming" /><category scheme="http://boredzo.org/blog" term="Website" />		<summary type="html"><![CDATA[I&#8217;ve previously mentioned that I made a business card full of useful Cocoa and Cocoa Touch links to give to new Cocoa and Cocoa Touch programmers at events such as CocoaHeads. Today, I have updated it and given it a web page. 1-up and 10-up (US Letter) PDFs are available there, as well as the [...]]]></summary>
		<content type="html" xml:base="http://boredzo.org/blog/archives/2011-03-15/useful-cocoa-links-card">&lt;p&gt;I&amp;#8217;ve &lt;a href="http://boredzo.org/blog/archives/2010-11-06/helping-people"&gt;previously&lt;/a&gt; mentioned that I made a business card full of useful Cocoa and Cocoa Touch links to give to new Cocoa and Cocoa Touch programmers at events such as CocoaHeads.&lt;/p&gt;
&lt;p&gt;Today, I have updated it and given it &lt;a href="http://boredzo.org/cocoa-links-card/"&gt;a web page&lt;/a&gt;. 1-up and 10-up (US Letter) PDFs are available there, as well as the full list of unshortened links.&lt;/p&gt;
&lt;p&gt;I encourage you to print out the 10-up onto perforated business card paper, or have it professionally printed (keeping in mind that you probably won&amp;#8217;t need 1000 of them), and make the cards available to novice Cocoa and Cocoa Touch programmers at the CocoaHeads or NSCoderNight events you attend. Just please be sure to print both sides, since my credit link is on the back.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/domainofthebored?a=yDRFbRVgPhg:rObw_V6PVs0:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/domainofthebored?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/domainofthebored?a=yDRFbRVgPhg:rObw_V6PVs0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/domainofthebored?i=yDRFbRVgPhg:rObw_V6PVs0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/domainofthebored/~4/yDRFbRVgPhg" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://boredzo.org/blog/archives/2011-03-15/useful-cocoa-links-card#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://boredzo.org/blog/archives/2011-03-15/useful-cocoa-links-card/feed/atom" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://boredzo.org/blog/archives/2011-03-15/useful-cocoa-links-card</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Peter Hosey</name>
						<uri>http://boredzo.org./</uri>
					</author>
		<title type="html"><![CDATA[Mentoring]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/domainofthebored/~3/mLQK-t4ojRE/mentoring" />
		<id>http://boredzo.org/blog/?p=1456</id>
		<updated>2011-03-09T04:08:16Z</updated>
		<published>2011-03-09T04:08:12Z</published>
		<category scheme="http://boredzo.org/blog" term="Adium" /><category scheme="http://boredzo.org/blog" term="Best practices" /><category scheme="http://boredzo.org/blog" term="Programming" />		<summary type="html"><![CDATA[I originally wrote this for the Adium development list, in a discussion of the upcoming Google Summer of Code, for the benefit of those of our developers who have never mentored students in GSoC before and may be considering doing so. Read this in that context; for example, “our” means “the Adium project&#8217;s”. Work with [...]]]></summary>
		<content type="html" xml:base="http://boredzo.org/blog/archives/2011-03-08/mentoring">&lt;p&gt;I originally wrote this for the Adium development list, in a discussion of the upcoming &lt;a href="http://code.google.com/soc/"&gt;Google Summer of Code&lt;/a&gt;, for the benefit of those of our developers who have never mentored students in GSoC before and may be considering doing so. Read this in that context; for example, “our” means “the Adium project&amp;#8217;s”.&lt;/p&gt;
&lt;hr /&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Work with students from the very beginning on the quality of their [application] submissions. 90% of the submissions will be crap. Look past this. See what lies within. If it can be improved, try to get them to improve it. Those who do will be good students.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Spur your student to work on code. Make sure they&amp;#8217;re committing at a regular and satisfactory rate.&lt;/p&gt;
&lt;/li&gt;
&lt;li id="gsoc_mentoring_fn1_orig"&gt;
&lt;p&gt;Ensure your student actually writes code and doesn&amp;#8217;t just crib together tutorials and/or Stack Overflow answers and/or ask you to provide code&lt;a href="#gsoc_mentoring_fn1"&gt;*&lt;/a&gt; for various tasks they need to accomplish. Wildly varying coding styles, inconsistent variable and method naming, and poor indentation are warning signs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Communicate constantly.&lt;/strong&gt; This includes the aforementioned spurring your student to work as well as being available to answer any questions they have about where things are in our code base, what they need to do to achieve certain goals or specific sub-tasks, etc. These questions are virtuous; you should encourage them, just short of demanding them. The student is not that only in name; they are here both to write code and to learn.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Find a medium that works for both of you. For me, email (or Twitter, nowadays) would be best. Maybe you prefer IM, or even voice chat/phone (if it isn&amp;#8217;t too expensive). Don&amp;#8217;t try to force your habits on the student; if you love the phone but they hate it (or vice versa), a happy medium will work better.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Be sure they understand and use Mercurial and good VCS practices generally. Frequent, discrete commits; neither waiting “until it&amp;#8217;s done” to commit (it should compile) nor committing half-done work periodically (e.g., daily) nor committing amalgams of unrelated work (they should commit specific sections that comprise a single change).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Nowadays, I recommend that you have them fork our &lt;a href="https://bitbucket.org/"&gt;Bitbucket&lt;/a&gt; repo and push to their fork.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Review their code constantly. Subscribe to the commits list (or their fork&amp;#8217;s commits feed) and review everything they write.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Read their commit messages, not just their code. Lists are a warning sign (unrelated changes lumped together). Inadequately describing the change is also a problem. Work the student out of these habits as soon as possible.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Don&amp;#8217;t wait until mid-term exams to sit your student down for a serious talk about their work or lack thereof. If they&amp;#8217;re committing garbage, set them straight as soon as possible—do not wait. If they don&amp;#8217;t commit, get them writing and committing as soon as possible.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Always be ready to fail your student. Be compassionate, understanding of life&amp;#8217;s realities; they&amp;#8217;re not a slave. But they are here to work, and if they don&amp;#8217;t do the job or if they do a bad job, be ready to fail them.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Make sure they know where they stand. If there&amp;#8217;s 1–2 weeks before exams and they&amp;#8217;re still in danger of failing, make sure they know what&amp;#8217;ll happen if they don&amp;#8217;t shape up.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I can&amp;#8217;t claim to have been perfect in all of these points in my own mentoring (many of these I learned by &lt;em&gt;not&lt;/em&gt; doing them), but it&amp;#8217;s what I&amp;#8217;ve found works.&lt;/p&gt;
&lt;p&gt;There might also be something on the GSoC sites about this. Some viewpoints vary, particularly along the leniency-to-hardassness spectrum.&lt;/p&gt;
&lt;p&gt;If you are not willing to do all of this, or don&amp;#8217;t think you&amp;#8217;ll have the time, you should not mentor a student.&lt;/p&gt;
&lt;div class="footnotes"&gt;
&lt;p id="gsoc_mentoring_fn1"&gt;* Six words that should worry every mentor or other help-offerer: &amp;ldquo;Can you show me a sample?&amp;rdquo; &lt;a href="#gsoc_mentoring_fn1_orig"&gt;&amp;#x21b6;&lt;/a&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/domainofthebored?a=mLQK-t4ojRE:gGKQlaxv3pE:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/domainofthebored?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/domainofthebored?a=mLQK-t4ojRE:gGKQlaxv3pE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/domainofthebored?i=mLQK-t4ojRE:gGKQlaxv3pE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/domainofthebored/~4/mLQK-t4ojRE" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://boredzo.org/blog/archives/2011-03-08/mentoring#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://boredzo.org/blog/archives/2011-03-08/mentoring/feed/atom" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://boredzo.org/blog/archives/2011-03-08/mentoring</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Peter Hosey</name>
						<uri>http://boredzo.org./</uri>
					</author>
		<title type="html"><![CDATA[Apple documentation search that works]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/domainofthebored/~3/-MMdXGmuEOk/chrome-omniweb-adc-searches" />
		<id>http://boredzo.org/blog/?p=1445</id>
		<updated>2011-03-07T09:36:24Z</updated>
		<published>2011-03-06T23:58:19Z</published>
		<category scheme="http://boredzo.org/blog" term="Cocoa" /><category scheme="http://boredzo.org/blog" term="Core Image" /><category scheme="http://boredzo.org/blog" term="Documentation" /><category scheme="http://boredzo.org/blog" term="Interface Builder" /><category scheme="http://boredzo.org/blog" term="iPhone" /><category scheme="http://boredzo.org/blog" term="Mac OS X" /><category scheme="http://boredzo.org/blog" term="Programming" /><category scheme="http://boredzo.org/blog" term="Quartz" /><category scheme="http://boredzo.org/blog" term="QuickTime" /><category scheme="http://boredzo.org/blog" term="Safari/WebKit" /><category scheme="http://boredzo.org/blog" term="Toolchain" /><category scheme="http://boredzo.org/blog" term="Xcode" />		<summary type="html"><![CDATA[You&#8217;ve probably tried searching Apple&#8217;s developer documentation like this: Edit: That&#8217;s the filter field, which is not what this post is about. The filter sucks. This isn&#8217;t just an easy way to use the filter field; it&#8217;s an entirely different solution. Read on. You&#8217;ve probably been searching it like this: (And yes, I know about [...]]]></summary>
		<content type="html" xml:base="http://boredzo.org/blog/archives/2011-03-06/chrome-omniweb-adc-searches">&lt;p&gt;You&amp;#8217;ve probably tried searching Apple&amp;#8217;s developer documentation like this:&lt;/p&gt;
&lt;p class="screenshot"&gt;&lt;a href="http://imgur.com/pEq82"&gt;&lt;img width="454" height="383" src="http://i.imgur.com/pEq82.png" alt="The filter field on the ADC documentation library navigation page." /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Edit: &lt;strong&gt;That&amp;#8217;s the filter field, which is not what this post is about&lt;/strong&gt;. The filter sucks. This isn&amp;#8217;t just an easy way to use the filter field; it&amp;#8217;s an entirely different solution. Read on.&lt;/p&gt;
&lt;p&gt;You&amp;#8217;ve probably been searching it like this:&lt;/p&gt;
&lt;p class="screenshot"&gt;&lt;a href="http://imgur.com/PVRIg"&gt;&lt;img width="454" height="383" src="http://i.imgur.com/PVRIg.png" alt="Google." /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;(And yes, I know about site:developer.apple.com. That often isn&amp;#8217;t much better than without it. Again, read on.)&lt;/p&gt;
&lt;p&gt;There is a better way.&lt;/p&gt;
&lt;p&gt;Better than that: A &lt;em&gt;best&lt;/em&gt; way.&lt;/p&gt;
&lt;h3&gt;Setup&lt;/h3&gt;
&lt;p&gt;First, you must use &lt;a href="http://chrome.google.com/"&gt;Google Chrome&lt;/a&gt; or &lt;a href="http://omnigroup.com/applications/omniweb/"&gt;OmniWeb&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Go to your list of custom searches. In Chrome, open the Preferences and click on Manage:&lt;/p&gt;
&lt;p class="screenshot"&gt;&lt;img src="http://i.imgur.com/J8YzM.png" alt="Screenshot with arrow pointing to the Manage button." /&gt;&lt;/p&gt;
&lt;p&gt;In OmniWeb, open the Preferences and click on Shortcuts:&lt;/p&gt;
&lt;p class="screenshot"&gt;&lt;img src="http://i.imgur.com/jUepc.png" alt="Screenshot of OmniWeb's Shortcuts pane." /&gt;&lt;/p&gt;
&lt;p&gt;Then add one or both of these searches:&lt;/p&gt;
&lt;h3&gt;For the Mac&lt;/h3&gt;
&lt;table border="1"&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Chrome&lt;/th&gt;
&lt;th&gt;OmniWeb&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;td colspan="2" align="center"&gt;ADC Mac OS X Library&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;Keyword&lt;/th&gt;
&lt;td&gt;adcmac&lt;/td&gt;
&lt;td&gt;adcmac@&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;URL&lt;/th&gt;
&lt;td&gt;http://developer.apple.com/library/mac/search/?q=%s&lt;/td&gt;
&lt;td&gt;http://developer.apple.com/library/mac/search/?q=%@&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;h3&gt;For iOS&lt;/h3&gt;
&lt;table border="1"&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Chrome&lt;/th&gt;
&lt;th&gt;OmniWeb&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;td colspan="2" align="center"&gt;ADC iOS Library&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;Keyword&lt;/th&gt;
&lt;td&gt;adcios&lt;/td&gt;
&lt;td&gt;adcios@&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;URL&lt;/th&gt;
&lt;td&gt;http://developer.apple.com/library/ios/search/?q=%s&lt;/td&gt;
&lt;td&gt;http://developer.apple.com/library/ios/search/?q=%@&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;h3&gt;Result&lt;/h3&gt;
&lt;p class="screenshot"&gt;&lt;a href="http://imgur.com/XV9u3?full"&gt;&lt;img width="454" height="383" src="http://i.imgur.com/XV9u3.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Notice how the results page gives you both guides and references at once, even giving specific-chapter links when relevant. You even get relevant technotes and Q&amp;amp;As. No wild goose chases, no PDF mines, no third-party old backup copies, no having to scroll past six hits of mailing-list threads and Stack Overflow questions. You get the docs, the right docs, and nothing but the docs.&lt;/p&gt;
&lt;p&gt;For this specific purpose, you now have something better than Google.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/domainofthebored?a=-MMdXGmuEOk:5bfUd3_Ni00:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/domainofthebored?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/domainofthebored?a=-MMdXGmuEOk:5bfUd3_Ni00:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/domainofthebored?i=-MMdXGmuEOk:5bfUd3_Ni00:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/domainofthebored/~4/-MMdXGmuEOk" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://boredzo.org/blog/archives/2011-03-06/chrome-omniweb-adc-searches#comments" thr:count="26" />
		<link rel="replies" type="application/atom+xml" href="http://boredzo.org/blog/archives/2011-03-06/chrome-omniweb-adc-searches/feed/atom" thr:count="26" />
		<thr:total>26</thr:total>
	<feedburner:origLink>http://boredzo.org/blog/archives/2011-03-06/chrome-omniweb-adc-searches</feedburner:origLink></entry>
	</feed><!-- Dynamic Page Served (once) in 0.247 seconds --><!-- Cached page served by WP-Cache -->

