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

<channel>
	<title>Philomathy</title>
	<atom:link href="http://www.reitshamer.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.reitshamer.com</link>
	<description>Adventures in indie software development</description>
	<lastBuildDate>Wed, 25 Aug 2010 15:51:51 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>&#8220;Technical debt&#8221; concept can be harmful</title>
		<link>http://www.reitshamer.com/2010/08/technical-debt-concept-is-harmful/</link>
		<comments>http://www.reitshamer.com/2010/08/technical-debt-concept-is-harmful/#comments</comments>
		<pubDate>Wed, 25 Aug 2010 13:42:41 +0000</pubDate>
		<dc:creator>stefan</dc:creator>
				<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.reitshamer.com/?p=62</guid>
		<description><![CDATA[﻿I think classifying certain types of programming as &#8220;paying down technical debt&#8221; via &#8220;rewrite&#8221; can be harmful. In my experience, when people say &#8220;pay down technical debt&#8221; they often mean stop moving forward on the product and spend some time &#8220;rewriting&#8221; or &#8220;investing in infrastructure&#8221;. They do the work in a vacuum, without the context of [...]]]></description>
			<content:encoded><![CDATA[<p>﻿I think classifying certain types of programming as &#8220;paying down technical debt&#8221; via &#8220;rewrite&#8221; can be harmful. In my experience, when people say &#8220;pay down technical debt&#8221; they often mean stop moving forward on the product and spend some time &#8220;rewriting&#8221; or &#8220;investing in infrastructure&#8221;. They do the work in a vacuum, without the context of actually solving problems / adding features. They end up either a) achieving subjective code beautification (&#8220;making the code less hacky&#8221;), or b) adding premature optimizations (&#8220;We need to add support for ___ so that we can scale later&#8221;).</p>
<p>Rewriting is almost never a good idea, as Joel Spolsky explained in a <a href="http://www.joelonsoftware.com/articles/fog0000000069.html">memorable essay</a>. And premature optimization is <a href="http://en.wikipedia.org/wiki/Program_optimization">&#8220;the root of all evil&#8221;</a> about 97% of the time, according to Donald Knuth. Bug fixes removed in the name of clarity will have to be re-discovered and re-added; wrong-headed optimizations will have to be removed.</p>
<p>And who decides which code issues should be classified as &#8220;technical debt&#8221;? It seems very subjective.</p>
<p>Programming isn&#8217;t a code-production activity, it&#8217;s a knowledge-acquisition activity. Good programmers don&#8217;t focus on cranking out code and then fixing it later. They continually rewrite code as necessary to solve problems / add features / improve performance as their understanding of the problem increases.</p>
<p>If you&#8217;re managing programmers and they say something about accumulating technical debt, ask them about it. Ask why they consider it technical debt. Have a discussion about what it really means and whether it&#8217;s a valid concept or an excuse.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.reitshamer.com/2010/08/technical-debt-concept-is-harmful/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The shift away from personal computers</title>
		<link>http://www.reitshamer.com/2010/04/the-shift-away-from-personal-computers/</link>
		<comments>http://www.reitshamer.com/2010/04/the-shift-away-from-personal-computers/#comments</comments>
		<pubDate>Fri, 30 Apr 2010 13:49:38 +0000</pubDate>
		<dc:creator>stefan</dc:creator>
				<category><![CDATA[cloud computing]]></category>

		<guid isPermaLink="false">http://www.reitshamer.com/?p=55</guid>
		<description><![CDATA[Apple does not have a Mac category for their Apple Design Awards this year at their Worldwide Developers Conference. Instead, Apple is focusing on iPhone and iPad apps.
Some Mac developers think this is a signal that the Mac is not so important to Apple anymore. Mac sales for the second quarter of fiscal 2010 were [...]]]></description>
			<content:encoded><![CDATA[<p>Apple does not have a Mac category for their <a href="http://developer.apple.com/wwdc/ada/">Apple Design Awards</a> this year at their Worldwide Developers Conference. Instead, Apple is focusing on iPhone and iPad apps.</p>
<p>Some Mac developers think this is a signal that the Mac is not so important to Apple anymore. Mac sales for the second quarter of fiscal 2010 were up 32% year-over-year, but is that growth sustainable over the longer term?</p>
<p>Charlie Stross&#8217;s <a href="http://www.antipope.org/charlie/blog-static/2010/04/why-steve-jobs-hates-flash.html">insightful post</a> suggests the personal computer industry will become much more of a commoditized &#8220;profitability wasteland&#8221; because underlying prices keep dropping, and that coming wireless networking speeds will increase to the point where users can move their data to the cloud because they&#8217;ll finally have fast-enough access to it from anywhere. Apple is <a href="http://www.readwriteweb.com/cloud/2010/02/a-first-look-at-apples-massive.php">building a $1 billion data center in North Carolina</a>, perhaps to be ready for this shift.</p>
<p>So what does the future look like then? For Apple it seems to be centered around the iPad and iPhone.</p>
<p>If you&#8217;re a typical consumer, in a few years you won&#8217;t buy a &#8220;computer&#8221; anymore, and you&#8217;ll probably be glad to be free of its headaches. Instead, you&#8217;ll buy an iPad and an Apple Service &#8220;subscription&#8221;. Everything else will be taken care of, at least from Apple&#8217;s point of view. All your information will be stored and (hopefully) protected by the Apple Service. Your information will be usable from several devices, as long as they&#8217;re all Apple devices. And you&#8217;ll keep buying &#8220;apps&#8221;, which scale much better as a business for Apple &#8212; Apple collects 30% of the sale at near-zero per-unit cost compared to hardware.</p>
<p>Consumers will take to this approach, at least for a while. In a comment on the post <a href="http://radar.oreilly.com/2010/04/the-ipad-isnt-a-computer-its-a.html">The iPad isn&#8217;t a computer, it&#8217;s a distribution channel</a>, Mike Jones <a href="http://radar.oreilly.com/2010/04/the-ipad-isnt-a-computer-its-a.html#comment-2433282">writes</a>, &#8220;as long as people demand more performance than can be delivered, an integrated and closed platform is the best way to deliver. As soon as the market becomes over served, people will start demanding flexibility and customization, and then the platform (or a competitors) will open up just like a PC.&#8221; I hope so.</p>
<p>This shift raises lots of questions for me, such as: </p>
<p>What about people who value privacy and control over their data?</p>
<p>What does it mean for an independent Mac software vendor over the next 5-10 years? </p>
]]></content:encoded>
			<wfw:commentRss>http://www.reitshamer.com/2010/04/the-shift-away-from-personal-computers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mac app version utility</title>
		<link>http://www.reitshamer.com/2009/09/mac-app-version-utility/</link>
		<comments>http://www.reitshamer.com/2009/09/mac-app-version-utility/#comments</comments>
		<pubDate>Tue, 22 Sep 2009 14:44:48 +0000</pubDate>
		<dc:creator>stefan</dc:creator>
				<category><![CDATA[mac]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.reitshamer.com/?p=26</guid>
		<description><![CDATA[As part of my process for releasing a new version of Arq, I needed a way for my script to get the version of an app bundle.
So, I wrote a simple utility called appversion which prints the value for the CFBundleVersion key in an app&#8217;s Info.plist.
For example:
	appversion /Applications/iPhoto.app
yields:
	8.1
Download the 32/64-bit Universal binary (in a zip [...]]]></description>
			<content:encoded><![CDATA[<p>As part of my process for releasing a new version of <a href="http://www.haystacksoftware.com/">Arq</a>, I needed a way for my script to get the version of an app bundle.</p>
<p>So, I wrote a simple utility called <strong>appversion</strong> which prints the value for the CFBundleVersion key in an app&#8217;s Info.plist.</p>
<p>For example:</p>
<pre>	appversion /Applications/iPhoto.app</pre>
<p>yields:</p>
<pre>	8.1</pre>
<p>Download the 32/64-bit Universal binary (in a zip file) here:</p>
<p><a href="http://www.reitshamer.com/binaries/appversion.zip">appversion.zip</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.reitshamer.com/2009/09/mac-app-version-utility/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using Breakpad on Mac OS X 10.6</title>
		<link>http://www.reitshamer.com/2009/09/using-breakpad-on-mac-os-x-10-6/</link>
		<comments>http://www.reitshamer.com/2009/09/using-breakpad-on-mac-os-x-10-6/#comments</comments>
		<pubDate>Fri, 18 Sep 2009 16:21:18 +0000</pubDate>
		<dc:creator>stefan</dc:creator>
				<category><![CDATA[mac]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.reitshamer.com/?p=18</guid>
		<description><![CDATA[Unlike web apps, desktop apps crash without the app&#8217;s developer knowing about it, unless the user sends a crash report to the developer. Whenever an app crashes, OS X puts up a dialog for the user to submit a crash report to Apple. Unfortunately for non-Apple apps that crash report never gets to the developer!
So, [...]]]></description>
			<content:encoded><![CDATA[<p>Unlike web apps, desktop apps crash without the app&#8217;s developer knowing about it, unless the user sends a crash report to the developer. Whenever an app crashes, OS X puts up a dialog for the user to submit a crash report to Apple. Unfortunately for non-Apple apps that crash report never gets to the developer!</p>
<p>So, <a href="www.haystacksoftware.com">Arq</a> needs its own &#8220;crash reporter&#8221;. After reading Daniel Jalkut&#8217;s nice <a href="http://www.red-sweater.com/blog/860/crash-reporter-roundup">roundup of crash reporters</a>, I chose <a href="http://code.google.com/p/google-breakpad/">Breakpad</a> because it seems the most similar to Apple&#8217;s built-in crash reporter.</p>
<p>Adding Breakpad to your Mac OS X app is easy since the Breakpad team created a Framework around it.</p>
<h2>Building Breakpad</h2>
<p>Just download the <a href="http://code.google.com/p/google-breakpad/source/checkout">source</a>, open the XCode project under src/client/mac and compile the target &#8220;All&#8221;.</p>
<p>If you&#8217;re on 10.6 though, you&#8217;ll need to set the compiler for all the targets and sub-projects to &#8220;GCC 4.0&#8243;, or else you&#8217;ll get an error &#8220;GCC 4.2 is not compatible with the Mac OS X 10.4 SDK&#8221;.</p>
<p>The default settings for the project (at least as of svn revision 394) create a &#8220;32-bit Universal&#8221; build. 64-bit isn&#8217;t supported yet. See the Breakpad <a href="http://code.google.com/p/google-breakpad/issues/list">issues list</a> for more details.</p>
<h2>Adding Breakpad to Your App</h2>
<p>Once you&#8217;ve built Breakpad, drag Breakpad.framework into the Linked Frameworks folder of your XCode project. Be sure to check the &#8220;copy items into the destination group&#8217;s folder&#8221; box in the sheet that appears. Also check the target you want to add Breakpad to.</p>
<p>Next, create a &#8220;Copy Files&#8221; build phase in your target with a destination of &#8220;Frameworks&#8221;, and drag Breakpad.framework into that.</p>
<p>Next, add a bunch of variables to your app&#8217;s Info.plist, including:</p>
<pre>	BreakpadProduct
	BreakpadProductDisplay
	BreakpadVersion
	BreakpadVendor
	BreakpadURL
	BreakpadRequestComments</pre>
<p>See the comments in Breakpad.h for how to set those variables. One tricky bit: BreakpadRequestComments should be a <code>&lt;string&gt;</code> with a value of <code>"TRUE"</code> in your Info.plist, not a <code>&lt;true&gt;</code>.</p>
<p>As an example, here&#8217;s how I set my plist variables for Arq:</p>
<pre>    &lt;key&gt;BreakpadProduct&lt;/key&gt;
    &lt;string&gt;Arq&lt;/string&gt;
    &lt;key&gt;BreakpadProductDisplay&lt;/key&gt;
    &lt;string&gt;Arq&lt;/string&gt;
    &lt;key&gt;BreakpadVersion&lt;/key&gt;
    &lt;string&gt;1.1&lt;/string&gt;
    &lt;key&gt;BreakpadVendor&lt;/key&gt;
    &lt;string&gt;Haystack Software&lt;/string&gt;
    &lt;key&gt;BreakpadURL&lt;/key&gt;
    &lt;string&gt;http://crashreport.&lt;yourserverhere&gt;.com/arq/new&lt;/string&gt;
    &lt;key&gt;BreakpadReportInterval&lt;/key&gt;
    &lt;string&gt;0&lt;/string&gt;
    &lt;key&gt;BreakpadLogFiles&lt;/key&gt;
    &lt;array&gt;
        &lt;string&gt;/var/log/system.log&lt;/string&gt;
    &lt;/array&gt;
    &lt;key&gt;BreakpadLogFileTailSize&lt;/key&gt;
    &lt;string&gt;40000&lt;/string&gt;</pre>
<p>Finally, create a Breakpad object in your app:</p>
<pre>    BreakpadRef bp = BreakpadCreate([[NSBundle mainBundle] infoDictionary]);
    if (bp == NULL) {
        NSLog(@"failed to create Breakpad");
    }</pre>
<p>That&#8217;s it! Now crash your app to try it out <img src='http://www.reitshamer.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>On the server side, you&#8217;ll need something to process the report. I&#8217;ll post my server-side code soon. Tweet me @reitshamer if you need it right now.</p>
<p>UPDATE: I put the server-side code at <a href="http://github.com/sreitshamer/breakpadserver">http://github.com/sreitshamer/breakpadserver</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.reitshamer.com/2009/09/using-breakpad-on-mac-os-x-10-6/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Computer as a Service</title>
		<link>http://www.reitshamer.com/2009/07/computer-as-a-service/</link>
		<comments>http://www.reitshamer.com/2009/07/computer-as-a-service/#comments</comments>
		<pubDate>Tue, 14 Jul 2009 14:56:22 +0000</pubDate>
		<dc:creator>stefan</dc:creator>
				<category><![CDATA[cloud computing]]></category>

		<guid isPermaLink="false">http://www.reitshamer.com/?p=8</guid>
		<description><![CDATA[Microsoft plans to give customers the option of running Office Web on their own servers, according to InformationWeek.
This would be a powerful way for large enterprises to get around the data ownership issues in cloud computing, especially SaaS-type offerings. But it misses out on many of the benefits of cloud computing.
A hybrid system &#8212; let&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p>Microsoft plans to give customers the option of running Office Web on their own servers, <a href="http://www.informationweek.com/news/software/hosted/showArticle.jhtml?articleID=218500287">according to InformationWeek</a>.</p>
<p>This would be a powerful way for large enterprises to get around the data ownership issues in cloud computing, especially <a href="http://en.wikipedia.org/wiki/Software_as_a_service">SaaS</a>-type offerings. But it misses out on many of the benefits of cloud computing.</p>
<p>A hybrid system &#8212; let&#8217;s call it &#8220;Computer as a Service&#8221; (CaaS) &#8212; could deliver the benefits of cloud computing while mitigating data ownership issues.</p>
<h2>CaaS</h2>
<p>With CaaS, the &#8220;service&#8221; part delivers my (virtual) corporate servers, and I pick and choose CaaS-compatible applications to put on those corporate servers. Those CaaS-compatible apps should be auto-installing, self-updating and self-managing.</p>
<p>With this approach I could reap many of the benefits of cloud computing, including:</p>
<ul>
<li>compliance best practices &#8212; experts handle security, backups, etc.</li>
<li>no capital outlay</li>
<li>much less support cost, fewer IT hires</li>
<li>instant scalability</li>
</ul>
<p>The service part of this approach could be simply my corporate <a href="http://aws.amazon.com/">Amazon Web Services</a> account. A CaaS-compatible app that I buy could install itself on EC2 instances in my account, use S3 for storage and CloudFront for content delivery, etc.</p>
<h2>Owned Cloud</h2>
<p>I get cloud computing, but I own my data, albeit on Amazon&#8217;s servers. And I&#8217;ve eliminated SaaS-type dependency because I have the app and my AWS instances in my control, unlike a SaaS offering which may change or even disappear before I&#8217;m ready to change.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.reitshamer.com/2009/07/computer-as-a-service/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
