<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Random Ideas From Jiva DeVoe</title>
    <link>http://www.random-ideas.net/Blog</link>
    <description>Random Ideas From Jiva DeVoe</description>
    <item>
      <title>How to do Real Voice Dictation on iPad</title>
      <description>&lt;h2&gt;Greetings from the future.&lt;/h2&gt;
&lt;p&gt;For those of you who don&amp;#8217;t know, I&amp;#8217;m a big fan of speech recognition software. In particular, I especially like &lt;a href="http://www.macspeech.com/"&gt;MacSpeech Dictate&lt;/a&gt;. I&amp;#8217;ve used it successfully to dictate numerous help files, letters, reports, and even a complete 500 page book, &lt;a href="http://www.amazon.com/dp/0470481072?tag=randidea01-20&amp;amp;camp=14573&amp;amp;creative=327641&amp;amp;linkCode=as1&amp;amp;creativeASIN=0470481072&amp;amp;adid=0AQZQ84SYN262YJ5XKZZ"&gt;Cocoa Touch or IPhone OS 3&lt;/a&gt; . I&amp;#8217;m even using it to dictate my next book, &lt;a href="http://www.amazon.com/Objective-C-Developer-Reference-Jiva-DeVoe/dp/0470479221/ref=sr_1_3?ie=UTF8&amp;amp;s=books&amp;amp;qid=1271494238&amp;amp;sr=8-3"&gt;Objective-C Developer Reference&lt;/a&gt; .&lt;/p&gt;
&lt;p&gt;For the most part, I find MacSpeech Dictate&amp;#8217;s accuracy to be excellent. Though you have to teach yourself how to dictate to the computer, once you learn how to do it, you can dictate quite quickly.&lt;/p&gt;
&lt;p&gt;Perhaps the most difficult part of learning to dictate to the computer is in learning to think your sentences through completely before speaking to the computer. It&amp;#8217;s surprising how difficult this is to do in practice.&lt;/p&gt;
&lt;p&gt;That said, just being able to use dictation software in general is futuristic. It&amp;#8217;s amazing to think that we have the technology available today that I can sit and talk to my computer and it will actually type exactly what I&amp;#8217;m saying with outstanding accuracy.&lt;/p&gt;
&lt;p&gt;What would make it even more futuristic and more amazing would be if I could be freed from being tethered to my computer. If I could sit in my easy chair, for example, holding a Star Trek like pad in my hands with a direct link to my computer. Dictating my sentences to it and verifying on the screen in my hand that the computer was hearing me correctly. Imagine being able to walk around your house, talking into the air, and having your computer follow every word!&lt;/p&gt;
&lt;p&gt;Well, I can tell you, the future is now. I am able to do this today using a combination of three technologies.&lt;/p&gt;
&lt;h2&gt;The Main Computer&lt;/h2&gt;
&lt;p&gt;The first, of course, is my MacBook Pro, running MacSpeech Dictate. Typically, I dictate directly into the MacSpeech notebook application. I do this, because the notebook application is able to better cache and track my dictation than if I were dictating directly into a third-party application.&lt;/p&gt;
&lt;p&gt;When I&amp;#8217;m finished dictating a section of my book, I copy and paste the text from the notebook application into Scrivener.&lt;/p&gt;
&lt;p&gt;This works very well for most of my writing needs. The only exception, of course, is that it doesn&amp;#8217;t necessarily know many of the specific technical terms that I need to dictate as part of the technical books I&amp;#8217;m writing. Fortunately, the MacSpeech Dictate dictionary is easy to customize, allowing me to add whatever specific terms it doesn&amp;#8217;t have that I may require. I don&amp;#8217;t always do this, because sometimes it&amp;#8217;s easier to just type the term into the document and go along my merry way. I usually only modify the dictionary in cases where I&amp;#8217;m going to be reusing the term over and over again.&lt;/p&gt;
&lt;h2&gt;The Comm-Link&lt;/h2&gt;
&lt;p&gt;The second technology that I use to enable this workflow is a wireless headset by Plantronics. I use the &lt;a href="http://www.plantronics.com/north_america/en_US/products/computer/multi-use-computer-headsets/audio-995"&gt;Plantronics Audio 995 Wireless&lt;/a&gt;  model of headset. It does a pretty decent job. When I bought it, it was the only wireless model my local store had.  I see now that Plantronics has many other wireless headsets, so I&amp;#8217;d definitely investigate, and perhaps choose a smaller model if I was buying again today.&lt;/p&gt;
&lt;p&gt;My only complaints with it, are that it&amp;#8217;s a little bit tight around my ears, and the frequency that it uses occasionally interferes with my household wi-fi. The WiFi problem is not one that comes up very often, and the ear tightness I solve by simply hanging the headphones around my neck rather than clamping them over my ears. I don&amp;#8217;t actually care about hearing anything from the computer, so I&amp;#8217;m actually simply using it as a wireless microphone.&lt;/p&gt;
&lt;h2&gt;The Handheld Pad&lt;/h2&gt;
&lt;p&gt;The last and coolest part of this trio of technologies, is my iPad. I use it to watch the screen of my MacBook Pro so that if I need to make any corrections, I can do it as I go. The application that I use to view my MacBook Pro screen is a decent &lt;span class="caps"&gt;VNC&lt;/span&gt; program called &lt;a href="http://itunes.apple.com/us/app/mocha-vnc/id284981670?mt=8"&gt;Mocha &lt;span class="caps"&gt;VNC&lt;/span&gt;&lt;/a&gt; . I chose this particular &lt;span class="caps"&gt;VNC&lt;/span&gt; app because it has a &amp;#8220;view only&amp;#8221; mode which I like. I enable view-only so that if I accidentally touch the screen, it doesn&amp;#8217;t deselect the dictation window.&lt;/p&gt;
&lt;p&gt;This combination of technologies enables me to sit anywhere I want, anyway I want, dictate to the computer, and verify that the computer is taking my dictation correctly. I don&amp;#8217;t even have to be in the same room as my computer. I can even go sit outside if I want to.&lt;/p&gt;
&lt;p&gt;It is, to steal a term from Steve Jobs, magical.&lt;/p&gt;
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;It&amp;#8217;s amazing to think that some of the futuristic technologies that science-fiction authors of the last century only dreamed about have become a reality today.&lt;/p&gt;
&lt;p&gt;Truly, we live in the future. But now the next question is, where do we go from here?  We have incredible enabling technologies at our fingertips!  What are you creating with them?&lt;/p&gt;</description>
      <guid>http://www.random-ideas.net/posts/48</guid>
    </item>
    <item>
      <title>iPad Developers: Three Steps to a Better UI for Content Consumption Apps</title>
      <description>&lt;h1&gt;Read Me Now, and Hear Me Later&lt;/h1&gt;
&lt;p&gt;First, let me preface this by saying, the instructions I&amp;#8217;m about to give apply primarily to apps that are used for reading or consuming content.  If your app is primarily for the purposes of &lt;strong&gt;creating&lt;/strong&gt; content, then probably the user will have their hands all over your screen anyway.  The usage model I&amp;#8217;m going to talk about here has to do with cases where the user is sitting, holding their iPad like a book and reading or watching videos.  The apps affected are things like eBook readers, &lt;span class="caps"&gt;RSS&lt;/span&gt; readers, Twitter clients, etc.&lt;/p&gt;
&lt;p&gt;If you are an iPad developer, please, Please, &lt;span class="caps"&gt;PLEASE&lt;/span&gt;, follow my instructions in the rest of this post very carefully.&lt;/p&gt;
&lt;h2&gt;Step #1:&lt;/h2&gt;
&lt;p&gt;Load your app on an actual iPad.&lt;/p&gt;
&lt;h2&gt;Step #2:&lt;/h2&gt;
&lt;p&gt;Sit down with said iPad in an easy chair.  Hold the iPad with both hands.  Your fingers behind it to support it and your thumbs on the front.&lt;/p&gt;
&lt;h2&gt;Step #3:&lt;/h2&gt;
&lt;p&gt;Use your thumbs as the only means of controlling the user experience for about 15-30 minutes.  Try your app in &lt;strong&gt;both landscape and portrait modes&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Most apps have very very commonly used buttons.  Are those buttons located near where your thumbs rest naturally?  If you&amp;#8217;re spending a lot of time lifting your hand from holding the iPad and reaching across the screen to tap a &amp;#8220;Next&amp;#8221; or similar button, then listen up&amp;#8230; &lt;strong&gt;You&amp;#8217;re doing it &lt;em&gt;wrong&lt;/em&gt;&lt;/strong&gt;!  &lt;span class="caps"&gt;FIX&lt;/span&gt; &lt;span class="caps"&gt;THAT&lt;/span&gt;.  Make sure those buttons are near where the user&amp;#8217;s thumbs naturally rest!  I can&amp;#8217;t stress this enough!&lt;/p&gt;
&lt;p&gt;Also, hold your hand over those same buttons for an extended period of time.  Does your hand or arm get tired because you&amp;#8217;re trying to keep your hand from touching the screen?  Does your hand or arm obscure part of the screen making you have to move your arm to read all the content?  Again.. &lt;strong&gt;You&amp;#8217;re doing it &lt;em&gt;wrong&lt;/em&gt;&lt;/strong&gt;!  &lt;span class="caps"&gt;FIX&lt;/span&gt; IT.&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s look at a couple examples of how &lt;span class="caps"&gt;NOT&lt;/span&gt; to do it&amp;#8230;&lt;/p&gt;
&lt;h1&gt;NewsRack&lt;/h1&gt;
&lt;p&gt;&lt;img src="/images/blog/tipsforipad1.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://itunes.apple.com/us/app/newsrack/id288815275?mt=8"&gt;NewsRack&lt;/a&gt; is a good &lt;span class="caps"&gt;RSS&lt;/span&gt; reader.  It&amp;#8217;s UI has some quirks (for example, I&amp;#8217;d like it if it adopted a three-paned view, but that&amp;#8217;s just me.)  But regardless, it&amp;#8217;s a great example of the kind of app I&amp;#8217;m talking about.  Imagine that an &lt;span class="caps"&gt;RSS&lt;/span&gt; reader is going to be read in chairs, on the couch, etc.. any time the user might be lounging around.&lt;/p&gt;
&lt;p&gt;In landscape mode, the app isn&amp;#8217;t too bad.  You can use your left thumb to tap the &amp;#8220;Unread&amp;#8221; button, which then brings up all the unread articles, then tap through the articles one by one with your left thumb.  Pretty good.  If you&amp;#8217;re southpaw-challenged (read: a rightie, not a leftie) all this left-thumb action can get tiring pretty quickly, but I&amp;#8217;m not gonna ding them on that.  It&amp;#8217;s usable.  The real problem with NewsRack comes when you switch to portrait mode.&lt;/p&gt;
&lt;p&gt;&lt;img src="/images/blog/tipsforipad2.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Notice, in portrait mode, the article itself takes up the entire screen, where did the article list go?  It&amp;#8217;s in the popup from the button on the top bar.  Ok, that&amp;#8217;s fine, that matches what the &lt;span class="caps"&gt;HIG&lt;/span&gt; suggests, but here&amp;#8217;s where the real problem lies: Where do you tap to get to the next article if you just want to tap through them?&lt;/p&gt;
&lt;p&gt;The answer is, it&amp;#8217;s in the upper left, too far for the left thumb to reach.  So in order to just bounce to the next article, you have to constantly move your right hand across the screen to press the button.  If you want to just tap-tap-tap through the articles, you have to hold your hand at the top of the screen, obscuring the main content.  For an otherwise decent app, this is a &lt;span class="caps"&gt;PITA&lt;/span&gt;.&lt;/p&gt;
&lt;h1&gt;GoodReader&lt;/h1&gt;
&lt;p&gt;&lt;a href="http://itunes.apple.com/us/app/goodreader-for-ipad/id363448914?mt=8"&gt;GoodReader&lt;/a&gt; is an excellent &lt;span class="caps"&gt;PDF&lt;/span&gt; reading app that again, has a little bit of a quirky UI.  For the purposes of this post, however, I&amp;#8217;m going to focus on one central item. The use-case in question, is that of paging through a &lt;span class="caps"&gt;PDF&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="/images/blog/tipsforipad3.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;This is the &lt;span class="caps"&gt;PDF&lt;/span&gt; reading screen of GoodReader.  Notice that to proceed to the next page, you don&amp;#8217;t tap where you would intuitively thing to tap, the right and left sides of the page, but instead the top or bottom!  Virtually every other eBook reader I have seen follows the convention of right and left sides of the page to go forward and backward, respectively.  GoodReader fails here.  This would have been incredibly obvious to the developers if they had just sat down and used their app like one would expect.  In a reading posture as if they&amp;#8217;re reading a book.  The real shame here is this is so central to the whole functionality of the app that it kind of ruins the whole experience.&lt;/p&gt;
&lt;h1&gt;Where Do Your Thumbs Rest?&lt;/h1&gt;
&lt;p&gt;&lt;img src="/images/blog/tipsforipad4.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;I just made this little guide by pulling up Sketchbook Pro, and just wiggling my thumbs there they landed.  The red marks are middle of the screen holding, the orange ones are if I&amp;#8217;m feeling frisky and holding it at the bottom.  Your most used operations in portrait-mode should be in these zones.  I have pretty long fingers too, so I probably have more flexibility here than some folks do.  Keep that in mind.&lt;/p&gt;
&lt;h1&gt;Summary&lt;/h1&gt;
&lt;p&gt;So, to sum up, if the app you&amp;#8217;re making is for reading, remember that users are going to hold your app like a book, and plan accordingly.  Don&amp;#8217;t make us stretch our thumbs!&lt;/p&gt;</description>
      <guid>http://www.random-ideas.net/posts/47</guid>
    </item>
    <item>
      <title>iZen Garden for iPad</title>
      <description>&lt;p&gt;I&amp;#8217;ve been quiet lately&amp;#8230; why?  Been workin!  Been busting my hump to ship.  There&amp;#8217;s this new thing from Apple&amp;#8230; might&amp;#8217;ve heard of it&amp;#8230; called i&amp;#8230; somethin&amp;#8230; iPAD! that&amp;#8217;s it&amp;#8230; iPad&amp;#8230; and yeah&amp;#8230; we&amp;#8217;ve been working furiously to ship a fantastic, gorgeous app for it.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m pleased to say, &lt;a href="http://www.random-ideas.net/Software/iZenGardenPad/"&gt;we succeeded&lt;/a&gt;.  It&amp;#8217;s so awesome, I want to coin a term for the new category of app it creates.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Coffee Table Apps&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Like coffee table books &amp;#8211; apps so beautiful that you want to own them just so when you&amp;#8217;re showing off your new iPad to your friends you have something utterly great that they can play with. They just beg to be left out on your coffee table and used as a conversation piece.&lt;/p&gt;
&lt;p&gt;This is what iZen Garden for the iPad is.  I&amp;#8217;m really proud of our efforts.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ll be writing more about the iPad in the coming weeks.  I&amp;#8217;m also giving a demo at the San Tan Apple Store this Wednesday to show off the app and talk about the design and development process that went into creating it.&lt;/p&gt;
&lt;p&gt;Right now, I&amp;#8217;m polishing up version 1.1 of it to submit to the App Store tonight.  Without actual hardware to test on, we had a few rotation bugs that needed to be resolved.  I hear updates are going through very quickly, so I&amp;#8217;m hopeful it&amp;#8217;ll be up soon.&lt;/p&gt;</description>
      <guid>http://www.random-ideas.net/posts/46</guid>
    </item>
    <item>
      <title>Who do I follow? </title>
      <description>&lt;p&gt;I&amp;#8217;ve been asked a few times now who to follow on Twitter for Cocoa/iPhone development news and information.  Sadly, I find follow suggestions to be like movie reviews.  Very subjective.  What &lt;em&gt;I&lt;/em&gt; find useful may or may not be useful to &lt;em&gt;you&lt;/em&gt;, and simply spouting off a list of names won&amp;#8217;t give you the context of why I suggest following them.  Therefore, &lt;a href="http://twitter.com/sleeman44/status/8729380476"&gt;when I recently got the question again&lt;/a&gt; I thought it would be useful to not just make a list, but to make a list with &lt;strong&gt;reasons&lt;/strong&gt; for why I think they are good people to follow.  You can then pick and choose.&lt;/p&gt;
&lt;p&gt;A note to my friends/etc&amp;#8230; if I forgot you or missed you on this list, or you&amp;#8217;re mad for whatever reason because I did not include you&amp;#8230; get over it. ;)  This is a very specific list about a very specific topic, and I&amp;#8217;m sure I left off a lot of awesome people.  I apologize.&lt;/p&gt;
&lt;p&gt;Coding:&lt;br /&gt;
&lt;a href="http://twitter,com/bbum"&gt;@bbum&lt;/a&gt; Bill is a brilliant developer working at Apple.  Hella smart.  Regularly imparts that smartitude on sites like Stack Overflow.  When he does, he&amp;#8217;ll sometimes link to the especially good ones.  The end result: A periodic burst of knowledge-flavor that&amp;#8217;s really useful.  His blog is also excellent. Also a foodie, and worth following just for that. ;) &lt;br /&gt;
&lt;a href="http://twitter,com/eschaton"&gt;@eschaton&lt;/a&gt; Like Bill, he works at Apple. Like Bill, he often imparts wisdom on Stack Overflow and his blog.&lt;br /&gt;
&lt;a href="http://twitter,com/chockenberry"&gt;@chockenberry&lt;/a&gt; Ignore the &lt;span class="caps"&gt;CHOCKLOCK&lt;/span&gt; updates if they bother you, those are not the point. He&amp;#8217;s worth following for the once or twice a week that he is amazingly insightful and helpful.  Again, keep an eye on his blog, because that&amp;#8217;s usually where the good stuff is.  Follow him on twitter for additional commentary. &lt;br /&gt;
&lt;a href="http://twitter,com/mikeash"&gt;@mikeash&lt;/a&gt; Mac developer for Rogue Amoeba.  Notable for his Friday Q&amp;amp;A series on his blog which is great stuff.&lt;br /&gt;
&lt;a href="http://twitter,com/jeff_lamarche"&gt;@jeff_lamarche&lt;/a&gt; Author of Beginning iPhone Development.  His OpenGL series on his blog is excellent.  All around great guy.  &lt;br /&gt;
&lt;a href="http://twitter,com/wilshipley"&gt;@wilshipley&lt;/a&gt; Developer of Delicious Library. Comments on the state of Apple and Xcode and development. Sometimes shares useful coding tips via his blog/etc.&lt;br /&gt;
&lt;a href="http://twitter,com/kickingbear"&gt;@kickingbear&lt;/a&gt; OpenGL, Tap Tap Revenge, RadioShift.  Smart dude.&lt;/p&gt;
&lt;p&gt;Development Conferences:&lt;br /&gt;
&lt;a href=":http://twitter,com/macdevnet"&gt;@macdevnet&lt;/a&gt; Organizer of NSConference, host of the Mac Developer Network.  Scotty works very hard to try to spread Mac coding info far and wide.&lt;br /&gt;
&lt;a href="http://twitter,com/rentzsch"&gt;@rentzsch&lt;/a&gt; Organizer of C4 conference.  Developer of ClickToFlash.&lt;br /&gt;
&lt;a href=":http://twitter,com/360idev"&gt;@360idev&lt;/a&gt; 360 iDev Conference. &lt;br /&gt;
Special note: Most of these make additional material from the conferences available online.  So even if you don&amp;#8217;t go to the conferences, following them can be useful for finding more resources online.&lt;/p&gt;
&lt;p&gt;Development News:&lt;br /&gt;
&lt;a href="http://twitter,com/jurewitz"&gt;@jurewitz&lt;/a&gt; Apple developer technologies evangelist.  Often posts developer news items first.&lt;br /&gt;
&lt;a href="http://twitter,com/majicdave"&gt;@majicdave&lt;/a&gt; Developer of MajicRank. Useful to follow because he usually knows about App Store ranking algorithm changes before anyone else.&lt;br /&gt;
&lt;a href="http://twitter,com/kshepherd"&gt;@kshepherd&lt;/a&gt; /&lt;a href="http://twitter,com/nattylux"&gt;@nattylux&lt;/a&gt; Husband/Wife team that developed HarborMaster and some other games. Primarily useful because they watch their ranking very closely, and are usually the first ones to tweet when something happens in the AppStore.&lt;br /&gt;
&lt;a href="http://twitter,com/drbarnard"&gt;@drbarnard&lt;/a&gt; Same reason to follow as &lt;code&gt;kshepherd/&lt;/code&gt;nattylux.  Often first to tweet when something is &amp;#8220;afoot&amp;#8221;.&lt;/p&gt;
&lt;p&gt;Commentary:&lt;br /&gt;
&lt;a href="http://twitter,com/gruber"&gt;@gruber&lt;/a&gt; The host of Daring Fireball (@daringfireball). Insightful commentary on design, the mac, the iPhone, the industry, and rude gestures. If you don&amp;#8217;t already subscribe to Daring Fireball, you should.  And if you can&amp;#8217;t get enough from just the blog, follow @gruber for just a little bit more. (Note: Unfollow during the world series ;))&lt;/p&gt;
&lt;p&gt;Marketing and Design:&lt;br /&gt;
&lt;a href="http://twitter,com/taptaptap"&gt;@taptaptap&lt;/a&gt; Developers of Convert, Voices, Classics, more hit apps than you can shake a stick at.  Brilliant marketers.  Excellent developers.  Awesome designers.  They&amp;#8217;ve boiled &amp;#8220;getting a hit on the app store&amp;#8221; down to a science, and they&amp;#8217;ve shared tips on that via their blog more than once.  They have strong opinions and are not afraid to share them.  What they do works for them, though, and it&amp;#8217;s worth following them and learning from them.  Whether you choose to emulate them is up to you.&lt;br /&gt;
&lt;a href="http://twitter,com/markjardine"&gt;@markjardine&lt;/a&gt; Designer for &lt;a href="http://twitter,com/tapbots"&gt;@tapbots&lt;/a&gt;.  &lt;span class="caps"&gt;IMO&lt;/span&gt;, one of the most consistently great designers for the iPhone.  Designed WeightBot, ConvertBot, PasteBot.  Brilliant when it comes to branding an app transparently.&lt;br /&gt;
&lt;a href="http://twitter,com/danwood"&gt;@danwood&lt;/a&gt; Old school Mac Developer.  Been around forever.  Notable for establishing the term &amp;#8220;Sherlocked&amp;#8221;. ;)  These days, however, he&amp;#8217;s been sharing marketing advice on his blog. Every one of his posts have been insightful and useful.  Go read them.  Then follow him.  Do it now.&lt;/p&gt;
&lt;p&gt;So that&amp;#8217;s my list.  There are many like it, but this one is my own. I bet there&amp;#8217;s lots of other great Cocoa/iPhone people to follow.  This is certainly not a comprehensive list.   Feel free to post your own favorite people to follow in the comments below.&lt;/p&gt;</description>
      <guid>http://www.random-ideas.net/posts/45</guid>
    </item>
    <item>
      <title>Some Words About Advertising</title>
      <description>&lt;p&gt;I&amp;#8217;m not a huge fan of advertising.  Advertising today seems to be ineffective, ignored, ignorant, and ill-conceived.  But, as a businessman, I recognize that it&amp;#8217;s vital to get the word out to people about your products.  You have to let people know you exist, or you&amp;#8217;ll never sell anything.&lt;/p&gt;
&lt;p&gt;As a result, I recently started an Ad Campaign on the &lt;a href="http://fusionads.net/"&gt;Fusion&lt;/a&gt; ad network for iZen Garden 2.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve spent a lot of time over the last year looking at various advertising opportunities, and I thought it might be useful to others to reveal some of my thought process that brought me to advertising on the Fusion network, and also to reveal some interesting problems with Google AdWords and the like.&lt;/p&gt;
&lt;h2&gt;The Problems with AdWords.&lt;/h2&gt;
&lt;p&gt;First, I want to describe a couple of issues with &lt;a href="http://adwords.google.com/"&gt;Google AdWords&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;AdWords seems like a pretty good deal for advertisers.  In theory, you enter keywords, and Google places your ads alongside content and search results that match those keywords.  Unfortunately, in practice, (at least in my experience) the placement is far from ideal.  First off, it appears from what I can see that there&amp;#8217;s no way to get graphical ads to display alongside search results at all.  Search result ads are limited to text-only.  The text you can enter for those ads is &lt;strong&gt;extremely&lt;/strong&gt; limited, and as a result, it&amp;#8217;s really hard to get any kind of branding out there using text-only ads.&lt;/p&gt;
&lt;p&gt;iZen Garden seems to benefit greatest from graphical ads as well.  By far, we get much more click-throughs for our graphical ads than our text ads.  I think this is a by-product of the fact that it&amp;#8217;s a very graphically rich application and appeals primarily to people who appreciate such things.&lt;/p&gt;
&lt;p&gt;In addition to all that &amp;#8211; I&amp;#8217;m sorry Google, but your text ads look horrible.  There, I said it.  They&amp;#8217;re ugly,  and you dress them funny.&lt;/p&gt;
&lt;p&gt;So the point here is: I want to use graphical ads.  Ok, fine, you can do that on AdWords.  The problem, though, is that in order to get virtually any impressions, you have to run those graphical ads on Google&amp;#8217;s &amp;#8220;Automatic Placements Ad Network,&amp;#8221; and it&amp;#8217;s here that the biggest problem with AdWords lies.&lt;/p&gt;
&lt;h2&gt;AdWords &amp;#8211; Paying Pirates to Pirate My App&lt;/h2&gt;
&lt;p&gt;So I set up an ad campaign on AdWords a couple of months ago.  And I watched as things simmered along &amp;#8211; low traffic, low click-throughs &amp;#8211; for a few weeks.  Then suddenly, one day, my traffic and click-throughs jumped.  There was no increase in sales, but my click-throughs increased about 200% overnight.  How strange, I thought, as I looked through the source of the increase in traffic.  I pay for each click using AdWords, so I tend to keep an eye on where things are coming from as a result.  I was shocked when I found that the majority of this new traffic was in fact coming from a pirate iPhone app site.&lt;br /&gt;
Apparently, Google had allowed a site that openly pirates iPhone apps to be one of their partners.  In fact, they had actually allowed 3 sites of this nature to run AdWords ads!  I would think Google would do a better job of vetting their partners.  Sadly, it appears that&amp;#8217;s not the case.&lt;/p&gt;
&lt;p&gt;Consider the irony, since the click-throughs on the ads on these sites &lt;strong&gt;paid the sites&lt;/strong&gt;, that I was actually paying people who pirated my work!&lt;/p&gt;
&lt;p&gt;Now I&amp;#8217;m not the kind of person who is vindictive about these kinds of things.  I don&amp;#8217;t, typically, spend much time thinking about piracy.  I prefer to err on the side of expending effort improving my products rather than going after customers who probably wouldn&amp;#8217;t buy it anyway.  However, I&amp;#8217;m certainly not going to give them my money as well!  To quote Jeff Lebowski, &lt;em&gt;&amp;#8220;That will not stand.&amp;#8221;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I quickly blacklisted the sites from my ad campaign and went along my merry way, but it got me looking closely at the other sites in the network list, and I was saddened to find that frankly, the vast majority of the high traffic sites that my ad was showing on were not sites I wanted my product to be featured on at all!  &lt;strong&gt;Most of them&lt;/strong&gt; were basically &lt;strong&gt;internet scams and pirates&lt;/strong&gt;!&lt;/p&gt;
&lt;p&gt;I want to associate my company and my products with only the highest quality web sites and products.  Sites like &lt;a href="http://www.tuaw.com"&gt;&lt;span class="caps"&gt;TUAW&lt;/span&gt;&lt;/a&gt;, &lt;a href="http://minimalmac.com/"&gt;Minimal Mac&lt;/a&gt;, and so on.  Sites I would be proud to be featured on.&lt;/p&gt;
&lt;p&gt;I recognize that I can choose not to be on the Automated Placement network and then I won&amp;#8217;t have this problem.  The issue is, I&amp;#8217;m a very busy person, and frankly, Google, you&amp;#8217;re supposed to be the experts!  I&amp;#8217;m paying you to make my product look good and be on sites that will make me proud.  If I have to do it all myself, it&amp;#8217;s not really worth it to me.  I just don&amp;#8217;t have the time to figure out all the premier websites and what ads they take.  I want you to have figured that out for me already.&lt;/p&gt;
&lt;p&gt;Anyway, in short, AdWords is like the WalMart of advertising.  It&amp;#8217;s ugly, and cheap, and your products get stuck in among the toilet paper and the pickles.&lt;/p&gt;
&lt;h2&gt;AdMob &amp;#8211; People Who Download Ad-Supported Apps Don&amp;#8217;t Buy Pay-For Apps&lt;/h2&gt;
&lt;p&gt;I&amp;#8217;ve also tried AdMob ads.  And after burning through several hundred dollars in mere minutes without a single tiny uptick in sales, I have yet to find any value in advertising with them.&lt;/p&gt;
&lt;p&gt;I credit this to two problems.  The first is that I think the majority of AdMob ads run on free apps that are ad-supported, and I think people who download such apps are simply not likely to buy paid apps.  If I were to advertise something free, I think that would be a much better fit.&lt;/p&gt;
&lt;p&gt;The second problem I think is much more insidious.  It&amp;#8217;s that I think there&amp;#8217;s a very large portion of developers who deliberately place ads near where you need to touch to use the UI.  With the inaccuracy of multi-touch being what it is, it&amp;#8217;s only natural that there are probably a lot of mis-clicks that trigger a click-through when it&amp;#8217;s not intentional.  I&amp;#8217;m not going to go so far as to say that this is actual click-fraud, but I would say it&amp;#8217;s not far from it, and regardless, it causes me to have to pay for click-throughs from people who had &lt;strong&gt;no intention&lt;/strong&gt; of clicking my ad and no interest in buying my product!&lt;/p&gt;
&lt;h2&gt;Fusion &amp;#8211; A Welcome Respite&lt;/h2&gt;
&lt;p&gt;So this brings me to what I feel is a conclusion and a solution for this situation.&lt;/p&gt;
&lt;p&gt;To summarize once more, I want:&lt;/p&gt;
&lt;p&gt;My ads to be beautiful.&lt;/p&gt;
&lt;p&gt;My ads to run on websites that are beautiful, and high quality.&lt;/p&gt;
&lt;p&gt;My ads to be displayed to people who appreciate beauty and good design.&lt;/p&gt;
&lt;p&gt;My ads to be displayed to people who spend money on apps.&lt;/p&gt;
&lt;p&gt;My ads to be displayed in locations that don&amp;#8217;t allow for mis-clicks, or at the least, to be paid for by display duration rather than click-throughs or impressions &amp;#8211; both of which kinda stink.&lt;/p&gt;
&lt;p&gt;The Fusion Ad network supports all of this and does it brilliantly.  They only allow the highest quality, attractive ads on their network, which means that they are able to advertise on sites that &lt;strong&gt;care about how their sites look&lt;/strong&gt;.  You buy your ads based on a timeframe of running on their network, so if they get a million impressions in a week, you get an even share of that with the other advertisers.&lt;/p&gt;
&lt;p&gt;So far, I really like them.  I&amp;#8217;m not sure how the end result is in terms of actual sales, but I can honestly say that I am proud to have my product shown along every one of the other ones on their network, and I&amp;#8217;m proud to have my product advertised on every one of their network partners.&lt;/p&gt;
&lt;p&gt;In addition to all this, Fusion is the only ad network I have ever actually clicked-on and purchased items from myself.&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;re an iPhone developer, I urge you to check them out.  They are reasonably priced, friendly, and they &amp;#8220;get it.&amp;#8221;&lt;/p&gt;</description>
      <guid>http://www.random-ideas.net/posts/44</guid>
    </item>
    <item>
      <title>iZen Garden 2</title>
      <description>&lt;p&gt;We are absolutely thrilled to announce the release of &lt;a href="http://www.random-ideas.net/Software/iZenGarden/"&gt;iZen Garden 2&lt;/a&gt; !  The next generation of our award winning relaxation app, iZen Garden!&lt;/p&gt;
&lt;p&gt;More than likely, if you&amp;#8217;re a subscriber to this Blog, you&amp;#8217;ve already heard of iZen Garden.  This is a totally new version with a bunch of new incredible features and content.&lt;/p&gt;
&lt;p&gt;The biggest new features are a built-in meditation timer, a sleep timer, and the ability to share your gardens on Twitter, Facebook, and email.&lt;/p&gt;
&lt;p&gt;A lot of users asked for the sleep timer.  They found the relaxation sound tracks so relaxing, they wanted the ability to fire up iZen Garden and let it play it&amp;#8217;s audio tracks until they fell asleep but they didn&amp;#8217;t want their battery to run down.  So we added a timer which will slowly fade the audio at the end of some predetermined period, and then when the audio is completely off, it&amp;#8217;ll allow your phone to go to sleep.  Perfect for falling asleep to.&lt;/p&gt;
&lt;p&gt;Since we were adding all the code for the sleep timer, the meditation timer made a lot of sense too.  This is a feature I use regularly myself.  I&amp;#8217;ll tell ya, it&amp;#8217;s amazingly satisfying to fire up iZen Garden, work on my garden a bit, then meditate for a bit &amp;#8211; all within the same app.  I used to use another app for timing my meditations, but now with this version I don&amp;#8217;t need to.&lt;/p&gt;
&lt;p&gt;It wouldn&amp;#8217;t be a new version without new elements and content.  We&amp;#8217;ve added 2 new audio sound tracks which sound fabulous!  But in addition to that, we also went back over our old sound tracks and cleaned up the looping a bit so that they sound even better than before!  We&amp;#8217;re really happy with the results, and we think you will be too!&lt;/p&gt;
&lt;p&gt;We&amp;#8217;ve added a bunch of new objects that can be placed in your garden.  But perhaps one of the biggest improvements to the content in iZen Garden is the addition of hundreds of new Daily Zen sayings.  We now have over 300 sayings!  You can now get a new Daily Zen every day for almost a year without repeat!&lt;/p&gt;
&lt;p&gt;We&amp;#8217;re really excited about this new version of iZen Garden, and we think you will be too!&lt;/p&gt;</description>
      <guid>http://www.random-ideas.net/posts/43</guid>
    </item>
    <item>
      <title>Displaying and Searching PDF Content on iPhone</title>
      <description>&lt;p&gt;&lt;span class="caps"&gt;PDF&lt;/span&gt; parsing is a black art that most programmers avoid. &amp;#8220;Madness lurks here.&amp;#8221; They mumble to themselves quietly. Choosing instead to push their PDFs through UIWebViews and commit other crimes against humanity.&lt;/p&gt;
&lt;p&gt;It doesn&#8217;t have to be this way, however.  Parsing, displaying, and searching PDFs natively and at a low level is actually surprisingly easy if you&#8217;re not afraid to get your hands a little dirty with the Core Graphics &lt;span class="caps"&gt;PDF&lt;/span&gt; functions.  I&#8217;m going to show you how.&lt;/p&gt;
&lt;h2&gt;Where&#8217;s it hiding?&lt;/h2&gt;
&lt;p&gt;The first thing to know is that in order to do this, you need to use Core Graphics calls.  So you need to include the Core Graphics framework in your project, and in any files you want to use the calls, you have to include the &lt;code&gt;CoreGraphics.h&lt;/code&gt; header.  It&#8217;s probably also worthwhile to review the &lt;a href="http://developer.apple.com/mac/library/documentation/CoreFoundation/Conceptual/CFMemoryMgmt/CFMemoryMgmt.html"&gt;Core Foundation memory management rules&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Once you&#8217;ve done this, it&amp;#8217;s very straight forward to read your &lt;span class="caps"&gt;PDF&lt;/span&gt; files and display them in a custom view.  Let&amp;#8217;s take a look at how we do that.&lt;/p&gt;
&lt;h2&gt;Initializing a &lt;span class="caps"&gt;PDF&lt;/span&gt; Document&lt;/h2&gt;
&lt;p&gt;To initialize a &lt;span class="caps"&gt;PDF&lt;/span&gt; document, you first have to use the call &lt;code&gt;CGPDFDocumentCreate&lt;/code&gt;, passing in the &lt;span class="caps"&gt;URL&lt;/span&gt; to the document you want to open.  Since &lt;code&gt;NSURL&lt;/code&gt; is toll free bridged to &lt;code&gt;CFURLRef&lt;/code&gt;, you can create a &lt;code&gt;CFURLRef&lt;/code&gt; just using plain old &lt;code&gt;NSURL&lt;/code&gt; like so:&lt;/p&gt;
&lt;div class="code"&gt;
&lt;pre&gt;&lt;code&gt;NSString *pathToPdfDoc = [[NSBundle mainBundle] 
                                        pathForResource:@"mypdf" ofType:@"pdf"];
NSURL *pdfUrl = [NSURL fileURLWithPath:pathToPdfDoc];&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Then, to create the &lt;code&gt;CGPDFDocumentRef&lt;/code&gt;, call &lt;code&gt;CGPDFDocumentCreateWithURL&lt;/code&gt;:&lt;/p&gt;
&lt;div class="code"&gt;
&lt;pre&gt;&lt;code&gt;CGPDFDocumentRef document = CGPDFDocumentCreateWithURL((CFURLRef)pdfUrl);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h2&gt;Displaying Pages&lt;/h2&gt;
&lt;p&gt;So now you have a document.  To display the content of the document, you have to get the content in the form of pages.  PDFs are already formatted by pages, so all you need to do is get at that data.  Fortunately Core Graphics has functions for that too.&lt;/p&gt;
&lt;p&gt;To get the total count of the pages in the document, you use the call &lt;code&gt;CGPDFDocumentGetNumberOfPages&lt;/code&gt;, which takes as a parameter, the document you created above.  So, for example:&lt;/p&gt;
&lt;div class="code"&gt;
&lt;pre&gt;&lt;code&gt;size_t pageCount = CGPDFDocumentGetNumberOfPages(document);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Then, to get an individual page to display in your view, you use the function &lt;code&gt;CGPDFDocumentGetPage&lt;/code&gt;, passing the document and the page number you want.  Like so:&lt;/p&gt;
&lt;div class="code"&gt;
&lt;pre&gt;&lt;code&gt;CGPDFPageRef page = CGPDFDocumentGetPage(document, currentPage);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Note that the currentPage parameter here is 1 based, not 0 based as is the usual case in programming.  This means that the first page of the &lt;span class="caps"&gt;PDF&lt;/span&gt; document is in fact, page 1, and not page 0.&lt;/p&gt;
&lt;p&gt;Once you have the page, you can display it in your custom view.  The only complicated part here is that on iPhone, the coordinate system is flipped compared to the Mac.  This causes a problem because the Core Graphics &lt;span class="caps"&gt;PDF&lt;/span&gt; system uses the desktop coordinate system even on iPhone.  (It&amp;#8217;s yucky, I know.)  The solution to this is to flip the page (this can be done in your &lt;code&gt;drawRect&lt;/code&gt; method when you go to draw the content):&lt;/p&gt;
&lt;div class="code"&gt;
&lt;pre&gt;&lt;code&gt;CGPDFPageRef page = CGPDFDocumentGetPage(document, currentPage);&lt;/code&gt;

&lt;code&gt;CGContextRef ctx = UIGraphicsGetCurrentContext();&lt;/code&gt;
        
&lt;code&gt;CGContextSaveGState(ctx);&lt;/code&gt;
        
&lt;code&gt;CGContextTranslateCTM(ctx, 0.0, [self bounds].size.height);
CGContextScaleCTM(ctx, 1.0, -1.0);
CGContextConcatCTM(ctx, 
           CGPDFPageGetDrawingTransform(page, kCGPDFCropBox, [self bounds], 0, true));&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;The key here is the call to &lt;code&gt;CGContextScaleCTM&lt;/code&gt;.  What we do, is we get the current drawing context, and then we scale it&amp;#8217;s coordinate system on it&amp;#8217;s y axis by -1.0.  This, effectively, flips it upside down along it&amp;#8217;s horizontal (x) axis.&lt;/p&gt;
&lt;p&gt;Finally, we draw the page into the context using the &lt;code&gt;CGContextDrawPDFPage&lt;/code&gt; function:&lt;/p&gt;
&lt;div class="code"&gt;
&lt;pre&gt;&lt;code&gt;CGContextDrawPDFPage(ctx, page);    
CGContextRestoreGState(ctx);&lt;/code&gt;

&lt;code&gt;
p. &amp;lt;/div&amp;gt;&lt;/code&gt;

&lt;code&gt;So basically, a full on @drawRect@ method for a custom view that draws content from a PDF page, looks something like this:&lt;/code&gt;

&lt;code&gt;&amp;lt;div class="code"&amp;gt;
bc.. -(void)drawRect:(CGRect)inRect;
{
    if(document)
    {
        CGPDFPageRef page = CGPDFDocumentGetPage(document, currentPage);&lt;/code&gt;

&lt;code&gt;        CGContextRef ctx = UIGraphicsGetCurrentContext();&lt;/code&gt;
        
&lt;code&gt;        CGContextSaveGState(ctx);&lt;/code&gt;
        
&lt;code&gt;        CGContextTranslateCTM(ctx, 0.0, [self bounds].size.height);
        CGContextScaleCTM(ctx, 1.0, -1.0);
        CGContextConcatCTM(ctx, 
                         CGPDFPageGetDrawingTransform(page, kCGPDFCropBox, 
                          [self bounds], 0, true));&lt;/code&gt;
        
&lt;code&gt;        CGContextDrawPDFPage(ctx, page);    
        CGContextRestoreGState(ctx);
    }
}&lt;/code&gt;

&lt;code&gt;
p. &amp;lt;/div&amp;gt;&lt;/code&gt;

&lt;code&gt;That's all there is to it!&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Searching PDFs&lt;/h2&gt;
&lt;p&gt;One of the things that seems to be particularly scary to programmers is searching PDFs.  I agree that it&amp;#8217;s certainly not pleasant stuff to code, but it&amp;#8217;s not hard either.&lt;/p&gt;
&lt;p&gt;Now, I want to preface this by saying that I feel this code is a bit of a hack, but it definitely works, and seems to work quite well.  Perhaps there&amp;#8217;s a better way to do this, and if you know of one, please &lt;a href="mailto:feedback@random-ideas.net"&gt;let me know&lt;/a&gt;.  That said, however, here&amp;#8217;s how I&amp;#8217;ve done it.&lt;/p&gt;
&lt;p&gt;The first thing to know is that &lt;span class="caps"&gt;PDF&lt;/span&gt; files are made up of operators which delineate the data within them.  So, for example, all text in a &lt;span class="caps"&gt;PDF&lt;/span&gt; document is stored as glyphs and prefixed by operators of type either &amp;#8220;Tj&amp;#8221;, in the case of a string, or &amp;#8220;TJ&amp;#8221; in the case of an array of strings.  Knowing this, you can access the &lt;span class="caps"&gt;PDF&lt;/span&gt; data as a stream and create a scanner which will call callback methods you specify when these operators are encountered.  You can then retrieve the data after the operator and use it to build your search corpus.&lt;/p&gt;
&lt;p&gt;That probably sounds intimidating, but it&amp;#8217;t not.  You start out by creating a class that will be your &amp;#8220;page searcher.&amp;#8221;  This will hold the state for your search engine.  Here&amp;#8217;s the listing for the interface for this class:&lt;/p&gt;
&lt;div class="code"&gt;
&lt;pre&gt;&lt;code&gt;#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;/code&gt;

&lt;code&gt;@interface PDFSearcher : NSObject 
{
    CGPDFOperatorTableRef table;
    NSMutableString *currentData;
}
@property (nonatomic, retain) NSMutableString * currentData;
-(id)init;
-(BOOL)page:(CGPDFPageRef)inPage containsString:(NSString *)inSearchString;
@end&lt;/code&gt;

&lt;code&gt;
p. &amp;lt;/div&amp;gt;&lt;/code&gt;

&lt;code&gt;Pretty straight forward stuff.  We use the currentData member to store the text of the page being scanned.  This is a member variable rather than a local variable because we're going to be using C functions to fill it in.  Don't worry, that'll make sense in a moment.&lt;/code&gt;

&lt;code&gt;The @init@ method for the class actually creates the callback table:&lt;/code&gt;

&lt;code&gt;&amp;lt;div class="code"&amp;gt;
bc.. -(id)init
{
    if(self = [super init])
    {
        table = CGPDFOperatorTableCreate();
        CGPDFOperatorTableSetCallback(table, "TJ", arrayCallback);
        CGPDFOperatorTableSetCallback(table, "Tj", stringCallback);
    }
    return self;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;arrayCallback&lt;/code&gt; and the &lt;code&gt;stringCallback&lt;/code&gt; functions are C functions that will be called by the scanner.  They&amp;#8217;re shown here:&lt;/p&gt;
&lt;div class="code"&gt;
&lt;pre&gt;&lt;code&gt;void arrayCallback(CGPDFScannerRef inScanner, void *userInfo)
{
    PDFSearcher * searcher = (PDFSearcher *)userInfo;&lt;/code&gt;

&lt;code&gt;    CGPDFArrayRef array;&lt;/code&gt;
    
&lt;code&gt;    bool success = CGPDFScannerPopArray(inScanner, &amp;amp;array);&lt;/code&gt;
    
&lt;code&gt;    for(size_t n = 0; n &amp;lt; CGPDFArrayGetCount(array); n += 2)
    {
        if(n &amp;gt;= CGPDFArrayGetCount(array))
            continue;&lt;/code&gt;
        
&lt;code&gt;        CGPDFStringRef string;
        success = CGPDFArrayGetString(array, n, &amp;amp;string);
        if(success)
        {
            NSString *data = (NSString *)CGPDFStringCopyTextString(string);
            [searcher.currentData appendFormat:@"%@", data];
            [data release];
        }
    }
}&lt;/code&gt;

&lt;code&gt;void stringCallback(CGPDFScannerRef inScanner, void *userInfo)
{
    PDFSearcher *searcher = (PDFSearcher *)userInfo;&lt;/code&gt;
    
&lt;code&gt;    CGPDFStringRef string;&lt;/code&gt;
    
&lt;code&gt;    bool success = CGPDFScannerPopString(inScanner, &amp;amp;string);&lt;/code&gt;

&lt;code&gt;    if(success)
    {
        NSString *data = (NSString *)CGPDFStringCopyTextString(string);
        [searcher.currentData appendFormat:@" %@", data];
        [data release];
    }
}&lt;/code&gt;

&lt;code&gt;
p. &amp;lt;/div&amp;gt;&lt;/code&gt;

&lt;code&gt;As you can see, these will be called when the operators fire.  When they do, we pop the data off the scanner, and add it to the searcher's corpus.  The userinfo pointer is actually pointing to our searcher object (based on the fact that we will pass it as the second parameter to @CGPDFScannerCreate@ in the next code).  So we can typecast it to a PDFSearcher and then access that currentData member (remember I said it would make sense later?).  &lt;/code&gt;

&lt;code&gt;The actual search method looks like this:&lt;/code&gt;

&lt;code&gt;&amp;lt;div class="code"&amp;gt;
bc.. -(BOOL)page:(CGPDFPageRef)inPage containsString:(NSString *)inSearchString;&lt;/code&gt;

&lt;code&gt;{
    [self setCurrentData:[NSMutableString string]];
    CGPDFContentStreamRef contentStream = CGPDFContentStreamCreateWithPage(inPage);
    CGPDFScannerRef scanner = CGPDFScannerCreate(contentStream, table, self);
    bool ret = CGPDFScannerScan(scanner);
    CGPDFScannerRelease(scanner);
    CGPDFContentStreamRelease(contentStream);
    return ([[currentData uppercaseString] 
          rangeOfString:[inSearchString uppercaseString]].location != NSNotFound);
}&lt;/code&gt;

&lt;code&gt;
p. &amp;lt;/div&amp;gt;&lt;/code&gt;

&lt;code&gt;Basically, we create a stream from the page data, then use that and our callback table to create a scanner.  We then scan the data.  It's at this point our currentData member is being filled with the data from the PDF as strings.  Finally, we just search that string for our search string.&lt;/code&gt;

&lt;code&gt;Easy peezy.&lt;/code&gt;

&lt;code&gt;Note: much of this code is only sight compiled.  I pulled it from some code I had, but it wasn't a straight across copy, so if you find an error, please let me know.
 &lt;/code&gt;&lt;/pre&gt;</description>
      <guid>http://www.random-ideas.net/posts/42</guid>
    </item>
    <item>
      <title>The Executive Washroom Is Gone</title>
      <description>&lt;p&gt;I&#8217;ve heard various sources say that the 2010&#8217;s will be the decade of the entrepreneur, and I think that&#8217;s true.  Globalization is causing more markets to open, while digital distribution and reach is making it easier for the creative class to distribute to those markets.&lt;/p&gt;
&lt;p&gt;What this means is that all the layers between the creators of goods and the consumers of those goods are disappearing.&lt;/p&gt;
&lt;p&gt;Today, I sell my software to people around the world.  I receive emails from people in Europe, Asia, Africa &amp;#8211; or my personal favorite, even the tiniest pacific islands thousands of miles from anywhere.&lt;/p&gt;
&lt;p&gt;That&#8217;s cool.&lt;/p&gt;
&lt;p&gt;For Christmas, I bought my wife a pair of baskets for her bicycle.  I bought them from &lt;a href="http://www.cynthiastwigs.com/"&gt;Cynthia&#8217;s Twigs&lt;/a&gt; by suggestion of my wife.  I don&#8217;t know where she heard of Cynthia, but here&#8217;s someone who specializes in creating something: Baskets.  Ten years ago, she&#8217;d be limited to a tiny storefront in her little town to sell her baskets, and she probably wouldn&#8217;t do very well.  But today, she sells them online, direct to the consumer.  When I placed my order, it was with Cynthia herself.&lt;/p&gt;
&lt;p&gt;That&#8217;s cool too.&lt;/p&gt;
&lt;p&gt;We&#8217;re in the midst of a socioeconomic revolution.  Perhaps we hear the most about this recession because it&#8217;s drastically impacting people who have, in the past, had power, but contributed little to the quality of the actual products we use.  Namely executives and middle management.  We saw a shakeout of middle managers in the nineties, but it built up again, and in the early naughties, we were back again to professional managers, rather than entrepreneurs and creatives, driving products.  I think we&#8217;re going through that again, but this time, I think it&#8217;ll be permanent.&lt;/p&gt;
&lt;p&gt;If you&#8217;re not creative, if you&#8217;re not entrepreneurial, you&#8217;re going to struggle in the new economy.&lt;/p&gt;
&lt;p&gt;The executive washroom is gone.  If you make your living by pushing papers rather than making something, your days are numbered.  If you create things, embrace the new global economy and welcome the exciting world it opens up to you.&lt;/p&gt;</description>
      <guid>http://www.random-ideas.net/posts/39</guid>
    </item>
    <item>
      <title>My Wristwatch is Drinking My Pulse</title>
      <description>&lt;p&gt;For some reason, I was reminded of this poem by my father today.  And when I thought about it, and re-read it, it reminded me a lot of software.  So, I share it with you&amp;#8230;&lt;/p&gt;
&lt;h3&gt;My Wristwatch is Drinking My Pulse&lt;/h3&gt;
&lt;p&gt;My work persists under the cover of the night&lt;br /&gt;
and I lay stone upon color&lt;br /&gt;
until they sound right,&lt;br /&gt;
and leave it all hanging in the air&lt;br /&gt;
like haunted conversation carried by nightwind&lt;br /&gt;
through a bedroom window.&lt;/p&gt;
&lt;p&gt;Time thrusts me on&lt;br /&gt;
and the old enemy&lt;br /&gt;
closes the gap a little more each day.&lt;/p&gt;
&lt;p&gt;I wonder -&lt;br /&gt;
when his hand is finally on my throat -&lt;br /&gt;
will my glistening webs endure?&lt;br /&gt;
Will I have time enough to spin it all out?&lt;/p&gt;
&lt;p&gt;Will that hand close on a paper leaf throat&lt;br /&gt;
dry and already fallen&lt;br /&gt;
the last gold already gone brown&lt;br /&gt;
as the exhausted fire played itself out?&lt;/p&gt;
&lt;p&gt;(I know one thing well&lt;br /&gt;
no spider spins to catch a fly.&lt;br /&gt;
The spider wraps forever in his string&lt;br /&gt;
and lives forever in the wonder of his descendants.)&lt;/p&gt;
&lt;p&gt;All I ask is a chance to finish the web;&lt;br /&gt;
catching things is for fishermen and nets.&lt;br /&gt;
Weaving cobwebs in the stars is what I do&lt;br /&gt;
and I must hurry&lt;/p&gt;
&lt;p&gt;For he&amp;#8217;s gaining on me,&lt;br /&gt;
and my wristwatch is drinking my pulse.&lt;/p&gt;
&lt;p&gt;- &lt;strong&gt;Robert DeVoe&lt;/strong&gt;&lt;/p&gt;</description>
      <guid>http://www.random-ideas.net/posts/38</guid>
    </item>
    <item>
      <title>Why Droid is Destined to be an "Also Ran"</title>
      <description>&lt;p&gt;I visited a Verizon store tonight to check out the new Droid.  I&amp;#8217;ve heard tons of great things about it in the tech press.  The most accurate sounding review that I have heard is &amp;#8220;If the iPhone didn&amp;#8217;t exist, the Droid would be &lt;strong&gt;the&lt;/strong&gt; must have smart phone.&amp;#8221;&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m not so impressed however.&lt;/p&gt;
&lt;p&gt;Now you might think I am simply an iPhone snob.  That no matter what magic they deliver in Android I won&amp;#8217;t be convinced it&amp;#8217;s a better platform.  The truth is, I have no inner prejudice against Android.  I&amp;#8217;ll admit that since the platform requires Java for development, it&amp;#8217;s not my first choice, but despite that, we do receive requests from customers to port our apps to Android, and I hope eventually to support the platform, if nothing else, just to expand our userbase.&lt;/p&gt;
&lt;p&gt;No, my opinion of Droid has absolutely nothing to do with the technical viability of the device.  Nothing to do with it, at all.&lt;/p&gt;
&lt;p&gt;When I visited the Verizon store tonight, it was empty.  I was the only customer there.  (I&amp;#8217;d just come from the Apple store two doors down, which was packed with people.)  I yelled to the salesman at the desk at the back of the room &amp;#8220;Do you have the new Droid phone?&amp;#8221;&lt;/p&gt;
&lt;p&gt;He said &amp;#8220;Yep! Got it right here!&amp;#8221; and he reached behind himself and put a box on the counter.&lt;/p&gt;
&lt;p&gt;I walked, then, to the back of the store, past the rows upon rows of other phones&amp;#8230; to the counter, and picked up the phone he had laid out for me.  I started playing with it.  It felt nice enough in my hands.. the UI was responsive.  I fumbled, trying to slide out the physical keyboard.&lt;/p&gt;
&lt;p&gt;Not being able to get it to come out, I said finally, &amp;#8220;How do you get the keyboard to slide out?&amp;#8221;&lt;/p&gt;
&lt;p&gt;&amp;#8220;Oh, that one doesn&amp;#8217;t have the physical keyboard,&amp;#8221; he said.&lt;/p&gt;
&lt;p&gt;&amp;#8220;Then it&amp;#8217;s not the Droid.&amp;#8221; I responded.&lt;/p&gt;
&lt;p&gt;He insisted: &amp;#8220;Sure it is.  The &lt;span class="caps"&gt;HTC&lt;/span&gt; Android phone.&amp;#8221;&lt;/p&gt;
&lt;p&gt;&amp;#8220;No, the Droid&amp;#8230; y&amp;#8217;know, the new one.&amp;#8221; I said.&lt;/p&gt;
&lt;p&gt;At this point, he brought out the phone I actually wanted to see.  The Droid.&lt;/p&gt;
&lt;p&gt;As he handed it to me, he said &amp;#8220;Look, you really don&amp;#8217;t want that phone.  It&amp;#8217;s a piece of junk.  The &lt;span class="caps"&gt;HTC&lt;/span&gt; is the best Android phone out there.&amp;#8221;&lt;/p&gt;
&lt;p&gt;The Droid&amp;#8217;s battery wasn&amp;#8217;t charged.  It wouldn&amp;#8217;t turn on.  I asked him &amp;#8220;Do you have one that&amp;#8217;s charged?&amp;#8221;&lt;/p&gt;
&lt;p&gt;&amp;#8220;No,&amp;#8221; he said.  &amp;#8220;And anyway, even if it was charged, it won&amp;#8217;t connect to the network anyway.&amp;#8221;&lt;/p&gt;
&lt;p&gt;I stood there a few more minutes&amp;#8230; the full impact of this horribly negative shopping experience settling on my brow.  He continued to explain how Motorola makes crappy phones, and I really didn&amp;#8217;t want the Droid because it&amp;#8217;s destined to suck.&lt;/p&gt;
&lt;p&gt;It occurred to me then, why the Droid can&amp;#8217;t possibly beat the iPhone.  Here I was, someone asking to see a specific phone.  I walked into the store.  I demonstrated my interest, and basically I&amp;#8217;m being told that the device I am interested in sucks.  I&amp;#8217;m having this salesman&amp;#8217;s prejudices stuffed down my throat.  I already know the other Android phones are not as good as the iPhone, and I&amp;#8217;m not interested in them.  But here this guy is telling me this one sucks too.&lt;/p&gt;
&lt;p&gt;Think about that for a minute.  This salesman is effectively badmouthing his own company&amp;#8217;s product.  Even though it&amp;#8217;s a Verizon store and a Motorola phone, the point is that if you&amp;#8217;re going to sell a product in your store, you had damn well better believe in it.  You had better believe in &lt;strong&gt;all&lt;/strong&gt; the products in your store.  I am putting my trust in you that everything you sell is great.  If you&amp;#8217;re telling me that your store sells a crappy product, then how am I to know that &lt;b&gt;all&lt;/b&gt; your products don&amp;#8217;t suck?&lt;/p&gt;
&lt;p&gt;Contrast this with the shopping experience in the Apple store.  You go in, and they are &lt;strong&gt;always&lt;/strong&gt; helpful and &lt;strong&gt;positive&lt;/strong&gt; in everything they say.  I don&amp;#8217;t think I&amp;#8217;ve ever even seen an Apple employee badmouth other technology &amp;#8211; let alone their &lt;strong&gt;own&lt;/strong&gt; products!  I&amp;#8217;m never confused by a salesman pushing his own agenda on me.&lt;/p&gt;
&lt;p&gt;So, in short, this rant isn&amp;#8217;t about Droid technology because I can&amp;#8217;t really say I have &lt;strong&gt;seen&lt;/strong&gt; Droid technology.  No, in fact, from my experience in the Verizon store, the message I got from the salesman was:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Droid UI sucks.. it was nothing but a black screen (not charged, dur).&lt;/li&gt;
	&lt;li&gt;Droid has no apps &amp;#8211; couldn&amp;#8217;t see any, couldn&amp;#8217;t try any.&lt;/li&gt;
	&lt;li&gt;Droid cell coverage sucks. IF I could turn it on, salesman says it won&amp;#8217;t connect.&lt;/li&gt;
	&lt;li&gt;Verizon sells sucky products.&lt;/li&gt;
	&lt;li&gt;Motorola sells sucky products.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What an amazingly negative experience!  Wow!  Is it any wonder Apple is the only company making money right now?&lt;/p&gt;
&lt;p&gt;The point here is that if Droid succeeds, it will be in spite of it&amp;#8217;s sales channel.  I can&amp;#8217;t imagine any average user wanting to buy a phone in that kind of environment.&lt;/p&gt;</description>
      <guid>http://www.random-ideas.net/posts/37</guid>
    </item>
    <item>
      <title>How To Use In-App Purchasing To Offer Discount Upgrade Pricing To Existing Customers</title>
      <description>&lt;h3&gt;Or How I learned To Stop Worrying and Love the App Store&lt;/h3&gt;
&lt;p&gt;First off, I should state up front here that I have not actually tried this myself, nor have I had any indication from Apple that they would actually allow this in the App Store.  Consider this more or less a thought experiment that I think is useful to share with you, gentle reader, in the hopes of expanding both our minds, and in the hope that someone, somewhere, will try it, and see what happens!&lt;/p&gt;
&lt;p&gt;So, that said, your mileage may vary.  Offer void where prohibited.  This post contains chemicals known by the state of California to cause cancer.  Wear protective clothing when handling.&lt;/p&gt;
&lt;p&gt;Now&amp;#8230; to the meat.&lt;/p&gt;
&lt;h3&gt;The Problem&lt;/h3&gt;
&lt;p&gt;A common discussion point among App Store developers is the point that one can&amp;#8217;t do paid upgrades of your application without releasing a totally new version, which has, &lt;a href="http://justanotheriphoneblog.com/wordpress/iphone-software/tweetie-2-new-app-will-spit-on-existing-old-app-users"&gt;in some cases&lt;/a&gt; caused strife and complaints from end users.&lt;/p&gt;
&lt;p&gt;&amp;#8220;Why,&amp;#8221; they ask, &amp;#8220;must I pay full price for the new version when I already own the older version?&amp;#8221;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://iphonedevelopment.blogspot.com/2009/09/sense-of-entitlement-tweetie-2.html"&gt;Some have rightfully pointed out&lt;/a&gt; that this is a little bit absurd, considering the low price point of most iPhone apps.  But nonetheless, the issue is there.  And indeed, I would agree, that at the least, it sure would be convenient if the App Store provided some mechanism that at least let developers give a discount to existing customers while providing full functionality to new purchasers.&lt;/p&gt;
&lt;p&gt;I should probably explain what I mean here, to make it clear exactly what I am talking about.&lt;/p&gt;
&lt;h3&gt;Traditional Software Upgrade Models&lt;/h3&gt;
&lt;p&gt;Traditionally, desktop software has followed a model of charging for upgrades.  Indeed, arguably, this is the only way most software businesses stay in business.  However, in order to encourage customer loyalty, they normally give a discount to existing customers in the form of &amp;#8220;Upgrade Pricing&amp;#8221;.  Thus, the user, when purchasing the software for the first time, pays full price, but when upgrading, say, from 1.0 to 2.0, they pay a discounted upgrade price.&lt;/p&gt;
&lt;p&gt;The App Store has not had this sort of capability, and in fact, I think this is one of the things that many iPhone devs have nighttime sweats about.&lt;/p&gt;
&lt;p&gt;In-App purchasing has seemed to be a possible solution to this conundrum.  It has promised the ability to &amp;#8220;up sell&amp;#8221; content in apps.  But it still forces you to treat all your customers at the same level.  There&amp;#8217;s no &amp;#8220;built-in&amp;#8221; mechanism that enables you to say &amp;#8220;This customer has had this software since version 1.0, I&amp;#8217;m going to offer them a discount on this upgrade.&amp;#8221; Or, conversely, &amp;#8220;This is a brand new customer, I&amp;#8217;m going to unlock all functionality, because they just paid the full price on this version.&amp;#8221;&lt;/p&gt;
&lt;p&gt;The second statement may sound confusing, so I am going to explain it in slightly more detail before I proceed to make sure it&amp;#8217;s clear.&lt;/p&gt;
&lt;p&gt;What I think developers really want is to have the ability when releasing a new version of their app to charge new customers and existing customers different prices.  For new customers buying the app fresh, they get all the features in the app and pay the &amp;#8220;full current price.&amp;#8221;  For existing customers, who purchased a prior version of the app, they want to provide a way for them to &amp;#8220;upgrade&amp;#8221; at a discounted price and get the all the same features of the person who just bought the full version.&lt;/p&gt;
&lt;p&gt;This business model allows a developer to release a version of their app that is less functional (due to less time spent developing it initially) in the beginning, then, over time, add more features to the software, and release an upgrade that perhaps even raises the price of the app, while crediting existing loyal customers for their previous purchase.&lt;/p&gt;
&lt;p&gt;In other words, imagine an app which ships with feature A on version 1.0.  Perhaps that feature is worth $.99 to begin with.  They sell a few thousand copies.&lt;/p&gt;
&lt;p&gt;Eventually, they release version 2.0, with features B and C.  The addition of these features makes the app now worth, say $2.99.&lt;/p&gt;
&lt;p&gt;The developer now has two choices.  He can release version 2.0 as a new app, which means all his customers will have to pay full price for it.  Or, he can give version 2.0 to his old customers basically for free, even if the customers might have been happy to pay the difference in price for the new functionality.  Thus, leaving money on the table.&lt;/p&gt;
&lt;p&gt;To be clear, if the developer is thinking he will make 2.0 a new app, existing customers will wind up paying the &lt;strong&gt;full&lt;/strong&gt; $2.99 for the new app!  This is in addition to the $.99 they already paid!  This basically penalizes loyal users and is exactly the problem that Tweetie ran into.  If the developer chooses to just give away all upgrades for free forever, he will probably eventually go out of business, which also penalizes users since they&amp;#8217;ll no longer be able to get great software from this developer.&lt;/p&gt;
&lt;p&gt;What&amp;#8217;s a developer to do?&lt;/p&gt;
&lt;h3&gt;A Possible Third Option&lt;/h3&gt;
&lt;p&gt;There is a possible third scenario, however.  One that matches the traditional model very closely.&lt;/p&gt;
&lt;p&gt;What the developer in our previous example &lt;strong&gt;wants&lt;/strong&gt; to do is to charge $2.99 to new users, but for existing users charge say, only another $.99.  Thus, the existing, loyal user is only paying a total of $1.99 (a nice discount for getting in early) and new users are paying the full amount.&lt;/p&gt;
&lt;p&gt;With the In-App purchase system, developers can charge users for the &amp;#8220;new features&amp;#8221; in their apps.  How those features are unlocked is entirely up to the developer.  Additionally, what the developer sells is entirely developer-defined as well.  Meaning, you absolutely &lt;span class="caps"&gt;CAN&lt;/span&gt; charge existing customers an upgrade fee if you can somehow determine, reliably, if a customer has been running you app prior to this new version or not.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.amazon.com/dp/0470481072?tag=randidea01-20&amp;amp;camp=14573&amp;amp;creative=327641&amp;amp;linkCode=as1&amp;amp;creativeASIN=0470481072&amp;amp;adid=1K3CPB64KTC4D9BQ35FE"&gt;I talk about this a bit in my book&lt;/a&gt; , but I&amp;#8217;ll reiterate it here for the purpose of discussion.  Unlocking paid content in applications is entirely implementation defined.  Most developers, I imagine, will use something like NSUserDefaults to set boolean values that are checked at runtime to allow or disallow content that has been purchased to be displayed.&lt;/p&gt;
&lt;p&gt;Given this knowledge, you &lt;span class="caps"&gt;CAN&lt;/span&gt; ship a new version of an app with new capabilities in the application, and if you can determine if the user has only just now purchased the app, you can choose to set the flag that enables all functionality.  If the user is an existing customer, you can offer to sell them the &amp;#8220;upgrade&amp;#8221; (at a discounted price) and if they choose not to take the offer, simply leave them with the same features they had before.&lt;/p&gt;
&lt;p&gt;This is sort of a weird, backwards way of looking at how In-App purchased content is typically enabled, but in this case, it works.&lt;/p&gt;
&lt;p&gt;In this way, you both reward the existing customers with a lower price for the new features as well as charge new customers the full price for all the features.  This is, basically, the traditional model in App Store form.&lt;/p&gt;
&lt;p&gt;The key then to understanding the problem we need to solve is this:  How do you &lt;strong&gt;reliably&lt;/strong&gt; determine if a user is new or not?  The naive response might be simply to set a flag, again in NSUserDefaults, but the problem with this approach is that the user could wipe out the defaults by simply uninstalling the app before downloading the update.  What is really needed is an external storage mechanism which stores information about when the user originally installed the app, and the device it was installed on.  In short, it needs activation.&lt;/p&gt;
&lt;p&gt;Now, I should take a small side trip here, and just point out, I hate activation as much as the next guy, and I&amp;#8217;m not really sure I&amp;#8217;m advocating this.  Again, this is a thought experiment.  The fact is, however, this would work to solve the problem.&lt;/p&gt;
&lt;p&gt;To implement activation, you could simply have your app ping your server (with user permission) when it is initially started.  As part of this ping, you could have the app &lt;br /&gt;
send the &lt;span class="caps"&gt;UDID&lt;/span&gt; of the device and the version of the app that is installed.  This information is then stored.  When new versions of the app come out, the app can ping again, and the server can respond with whether or not this user has previously activated the software on this device.  If they have, then you can consider them an existing customer, and offer them the upgrade pricing,  If they have not previously activated on this device, you can consider them a new user, and unlock full functionality.&lt;/p&gt;
&lt;p&gt;Using this mechanism, you can accomplish discounted upgrade pricing for existing users, and full paid pricing for new users.  Exactly the way existing software businesses work.&lt;/p&gt;
&lt;p&gt;Again &amp;#8211; would Apple allow this?  No idea.  Hoping someone will try it and see.&lt;/p&gt;</description>
      <guid>http://www.random-ideas.net/posts/36</guid>
    </item>
    <item>
      <title>A Review of the Kindle 2</title>
      <description>&lt;p&gt;On Thursday, I bought a &lt;a href="http://www.amazon.com/gp/product/B00154JDAI?ie=UTF8&amp;amp;tag=randidea01-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=B00154JDAI"&gt;Kindle 2&lt;/a&gt; .  And with it, I expected to usher in the future.  A bold new era, wherein I would convert my fairly massive book collection to a simple, thin device.  How&#8217;s it gone?  Read on dear friend and see!&lt;/p&gt;
&lt;h3&gt;Expectations&lt;/h3&gt;
&lt;p&gt;First, I should tell you the kinds of books I read and my expectations.  I&#8217;m not a big novel person.  Generally, I read technical books, books on business and marketing, and philosophical books.  One of the books that was nudging me towards the Kindle was in fact, Richard Dawkins&#8217; newest book &lt;a href="http://www.amazon.com/gp/product/1416594787?ie=UTF8&amp;amp;tag=randidea01-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=1416594787"&gt;The Greatest Show on Earth: The Evidence for Evolution&lt;/a&gt; which is currently in hardcover, and therefore expensive at $30.00 list price.  The Kindle price was a mere $9.99!  A real smokin&#8217; deal.  I&#8217;ve also been reading a lot of Seth Godin&#8217;s books, such as &lt;a href="http://www.amazon.com/gp/product/1591843170?ie=UTF8&amp;amp;tag=randidea01-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=1591843170"&gt;Purple Cow&lt;/a&gt; and &lt;a href="http://www.amazon.com/gp/product/0684856360?ie=UTF8&amp;amp;tag=randidea01-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0684856360"&gt;Permission Marketing&lt;/a&gt; , both of which are also available as Kindle editions at a substantially improved price.  By far, however, my current book collection is mostly programming books, a category that the Kindle is decidedly not known to be good at.&lt;/p&gt;
&lt;p&gt;Given the bad reputation of the Kindle with regard to technical books, my expectations were &lt;strong&gt;not&lt;/strong&gt; very high, but I still had hope.  In fact, the single biggest reason I wanted the kindle was to reduce my technical book collection from the three full bookcases full of books I currently have to perhaps one small device.  I very much wanted to achieve a more Zen-Like simplicity in my house and possessions.  Clearing it of the clutter that is, unfortunately, required by my line of work.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.flickr.com/photos/50726346@N00/4002394336/" title="IMG_0442 by jivadevoe, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2616/4002394336_b0e9363ef0.jpg" width="500" height="362" alt="IMG_0442" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Realities&lt;/h3&gt;
&lt;p&gt;Which brings us to the first question of Kindle success, can it be used to replace all of my old books?  And the answer is&amp;#8230; sort of.&lt;/p&gt;
&lt;p&gt;The problem here is several fold.  First off, if you want to replace your old books, they all have to be available on the Kindle.  This actually isn&#8217;t too bad of an issue.  All of the &#8220;current technology&#8221; books that I wanted to replace were definitely available, either as direct replacements, or through newer editions.  The few that were not available directly on the Kindle store (mostly Pragmatic Programmer books) I found were available directly through the publisher&#8217;s website.  The bigger problem though, is one of cost.  Programming books are expensive!  Replacing all those books at once was definitely going to be a no-go.  I actually took some of my books to a local used bookstore to see if they would be interested in buying them.  I figured if I could get even a quarter or half the price of the original cover price, I&#8217;d be in good shape.  I was shocked, however, to find that for a stack of about 10 books, they were willing to pay only about $6.00.  $4.00 of which was for &lt;strong&gt;one particular book&lt;/strong&gt;.  I was reminded, at this point, of one of the arguments by Kindle-haters, that one loses the right of first sale on eBooks.  To them, I say &#8220;Have you ever tried to sell a used dead tree book? You may have the &lt;span class="caps"&gt;RIGHT&lt;/span&gt; to sell it, but finding someone who will pay you anything for it is nigh impossible.&#8221;  I also tried &lt;a href="http://www.amazon.com/gp/shops/storefront/index.html?ie=UTF8&amp;amp;marketplaceID=ATVPDKIKX0DER&amp;amp;sellerID=AFFKXYNGZ9UGE"&gt;selling some of my books online as used books&lt;/a&gt; .  So far, no bites there either.  The fact is, people like new over used, and books, like cars, apparently lose about 90% of their resale value just by you taking them home.  So my plans of replacing my existing books immediately were pretty much dashed.  I&#8217;ll probably do it eventually, but just not today.&lt;/p&gt;
&lt;p&gt;A common question, of course, is that of the quality of &lt;strong&gt;reading&lt;/strong&gt; said technical books if you do replace them.  The usual argument is that people like the &#8220;feel&#8221; of reading physical coding books.  That there&#8217;s value in being able to flip through the pages to find something in particular.  I can definitely see the merit of this argument.  Reading technical books on the Kindle is &lt;strong&gt;definitely&lt;/strong&gt; a degraded experience if you want to be able to flip through the pages in search of something.  On the other hand, the ability to cut out code samples and save them as text for later use, and the ability to get rid of reams and reams of tree carcasses I think more than offsets this minor change in work habits.  As far as navigation alternatives, I&#8217;m finding I simply use the table of contents and the search more often, and so far, this seems to be working great.  I&#8217;ve only got a couple of technical books on the Kindle so far, so we&#8217;ll have to see what happens as I get more real hardcore reference material on there.&lt;/p&gt;
&lt;p&gt;Something that would make a nice improvement here would be a &amp;#8220;scan&amp;#8221; button.  One that enabled rapidly flipping of pages in a chapter to help facilitate finding a particular passage.  The problem is, the Kindle screen refreshes too slowly for this to be practical.&lt;/p&gt;
&lt;p&gt;An oft-cited benefit of the Kindle is it&#8217;s eInk screen.  As far as reading quality goes, it&#8217;s reputation is certainly well deserved.  However, this is in fact one area where I think the hype goes a bit beyond the truth of the matter.  Before buying the Kindle, I had a lot of trouble visualizing how big the screen really is.  The answer is, the size of the Kindle 2 screen is nearly perfect for it&amp;#8217;s purpose.  I&amp;#8217;m actually really glad I got the smaller one rather than the DX.  The entire device is almost exactly the size of a &lt;a href="http://www.moleskine.com/catalogue/classic/soft/squared_soft_notebook__large.php"&gt;large Moleskine&lt;/a&gt; .  So if you are curious to know if you&amp;#8217;ll like the size or not, go to your local stationary store, and check out the feel of one of these notebooks.  The screen itself is inset somewhat, and naturally, smaller.  But it really is &lt;strong&gt;just right&lt;/strong&gt; for most reading.  Anything smaller would have been too small.  Would I like a bigger screen?  Sure.  But not at the cost of a bigger device.&lt;/p&gt;
&lt;p&gt;That said, other than the size of the screen, I don&#8217;t see that the quality is really &lt;strong&gt;that&lt;/strong&gt; substantially better than say, the screen on my iPhone.  The resolution is simply not a huge deal for me.  In fact, the fact that it is greyscale only tends to be a bit off-putting for me.  I like color.  More importantly, however, I notice a disturbing &#8220;ghosting&#8221; effect that seems to occur as you go from page to page.  Almost as if the previous page doesn&#8217;t always erase completely.  In general practice, this isn&#8217;t really an issue for readability, but it definitely is annoying considering the cost of the device.  This would be something I would see Steve Jobs going apeshit over if it happened on Apple hardware, and it&#8217;s disappointing that the Amazon engineers are not similarly driven to perfection.  On the other hand, I recognize that eInk is a new technology, and it is due in large part to the use of eInk on this device that it gets it&#8217;s long battery life.  Because of this, I can pretty much overlook this minor issue.  Again, it doesn&#8217;t affect readability, it is only due to my looking at the screen with a critical eye that I even notice it.&lt;/p&gt;
&lt;p&gt;Speaking of battery life.  I think the rumors you have heard are true.  Two or three days with the wireless on, and weeks without it.  Because of this disparity, I definitely recommend turning off the wireless whenever you can.  If you go to access the Kindle store with it off, it helpfully offers to turn it back on.&lt;/p&gt;
&lt;h3&gt;Converting Existing eBooks&lt;/h3&gt;
&lt;p&gt;While I have had the Kindle, I have taken several different kinds of PDFs and converted them various ways to get them onto the device.  My results have been mixed.  For novels, or books with mostly all text, you really can&#8217;t go wrong.  Anything more complicated and you have to take special steps.  (By complicated, I mean things with graphics and code.)  What I found is that &lt;a href="http://www.lexcycle.com/"&gt;Stanza&lt;/a&gt; , though it&#8217;s a great app, simply doesn&#8217;t cut it for converting these kinds of books.  I tried another app, called &lt;a href="http://calibre.kovidgoyal.net/"&gt;Calibre&lt;/a&gt; , which is open source, and does a much better job, though it&#8217;s UI is SO buggy it&#8217;s appalling.  Even Calibre, however, had a hard time converting the code to a proper monospaced font.  In the end, the best conversion service I found was Kindle&#8217;s own free conversion service.  To use it, you just email your doc to the email address you set up for your kindle @free.kindle.com.  A few minutes later, it responds with your converted document.  The only issue I have found is that because you&#8217;re emailing it, some large documents will have issues getting through your mail server.  You can also email it to @kindle.com where it will wirelessly send it directly to your kindle for a small ($.15 as of this writing) fee.  This has the added advantage of syncing your last read location among multiple devices if you also read using the Kindle app on iPhone, as I do.&lt;/p&gt;
&lt;p&gt;One big disappointment I had was that the book organization tools in the Kindle kinda suck.  There&#8217;s no ability to sort one&#8217;s books into folders, and over time, the screen gets very cluttered.  I can&#8217;t even imagine if you had hundreds or even thousands of books on this device.  It would be a disaster.&lt;/p&gt;
&lt;h3&gt;It&#8217;s Not a Tablet&lt;/h3&gt;
&lt;p&gt;The final aspect I wanted to be sure to mention, is that of web browsing on the Kindle.  You may have heard, the Kindle has both an experimental web browser built in, as well as the ability to download blogs and read them.  The reality of this is, you should pretend these features don&#8217;t exist.  The web browser is crap, and they charge $2 per month to download blogs that are free on the web.  Money that I am willing to bet doesn&#8217;t even go to the authors of the blogs.  (Note: This is conjecture, I don&#8217;t know if the bloggers actually get any money from Amazon)  So in short, just forget those features.  This is not an iTablet.  This is a single-tasker.  It reads books.  That&#8217;s it.  And if that&#8217;s what you want, then you&#8217;ll be happy.  If you want more.  Wait for the iTablet from Apple.&lt;/p&gt;
&lt;h3&gt;Summary&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;Great book reader.  Easy to use.  Nice styling. Long battery.  Easy to read screen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;Web experience sucks.  Book organization sucks.  Some small detail issues.  Replacing  existing books is expensive.&lt;/p&gt;
&lt;p&gt;PS: As a &lt;a href="http://www.amazon.com/dp/0470481072?tag=randidea01-20&amp;amp;camp=14573&amp;amp;creative=327641&amp;amp;linkCode=as1&amp;amp;creativeASIN=0470481072&amp;amp;adid=07XEDVJ1FJBHYJV63MMS"&gt;published author&lt;/a&gt; I feel I have a right to comment on the subject of the text-to-speech mechanism in the Kindle 2.  My opinion is, it&amp;#8217;s awesome.  Authors are crazy to oppose it.  I ultimately have no control over whether it &lt;span class="caps"&gt;WILL&lt;/span&gt; be enabled on my book or not, that&amp;#8217;s up to my publisher, who actually owns the rights to my book in that regard.  However, I do get paid royalties on my book whether it&amp;#8217;s sold in electronic form or printed form.  To me, buying it in electronic form gives you the right to listen to the &lt;span class="caps"&gt;TTS&lt;/span&gt; version of it.  Additionally, it opens my book up to people who might otherwise have had issues reading it.&lt;/p&gt;</description>
      <guid>http://www.random-ideas.net/posts/35</guid>
    </item>
    <item>
      <title>A Practical Use for Scoped Objects in Objective-C</title>
      <description>&lt;h3&gt;Logging Methods As They Are Called&lt;/h3&gt;
&lt;p&gt;Been meaning to write this blog entry for a while.&lt;/p&gt;
&lt;p&gt;When I saw a &lt;a href="http://kickingbear.com/blog/archives/13"&gt;recent blog post by Guy English&lt;/a&gt; about creating scoped objects in Objective-C, I thought to myself &amp;#8220;Finally!! I have &lt;span class="caps"&gt;JUST&lt;/span&gt; the problem for this solution!&amp;#8221; and then I filed it away for when I would eventually get around to actually using it.&lt;/p&gt;
&lt;p&gt;And time passed&amp;#8230;&lt;/p&gt;
&lt;p&gt;Until today.&lt;/p&gt;
&lt;p&gt;Wait&amp;#8230; rewind&amp;#8230; some back story&amp;#8230;&lt;/p&gt;
&lt;p&gt;I started coding C++ in 1992.  (Wow.. damn&amp;#8230; that&amp;#8217;s a long time.)  Obviously, over the years, I built up a lot of utility code that helped me in debugging and in using various design patterns in C++.  In particular, one of the very handy little utility modules that found it&amp;#8217;s way into my toolbox was a method for logging the name of a method as you enter and leave it.&lt;/p&gt;
&lt;p&gt;Of particular importance here: Note that I said as you enter &lt;strong&gt;and&lt;/strong&gt; leave the method.  So in other words, the goal of this module was to enable me to code something like this:&lt;/p&gt;
&lt;div class="code"&gt;
&lt;pre&gt;&lt;code&gt;void SomeClass::someMethod()
{
    TRACE;
    // ... logic and code ....
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;and then you&amp;#8217;d get in your log files:&lt;/p&gt;
&lt;div class="code"&gt;
&lt;pre&gt;&lt;code&gt;2009-09-21 11:37: Entered: void SomeClass::someMethod();
2009-09-21 11:38: Exited: void SomeClass::someMethod();&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;So, the nice thing here is that with just one extra line of code, you get a log entry when you enter the method, and then you get another log entry showing exiting the method.  This can be really helpful when trying to chase down weird pointer bugs (Hello C++!).&lt;/p&gt;
&lt;p&gt;Now, the pattern for the implementation of this code is pretty straight forward.  The way it works is it exploits scoping to generate the desired log messages.  There&amp;#8217;s an object hidden in that &lt;code&gt;TRACE&lt;/code&gt; macro, and the entry log message is in it&amp;#8217;s constructor, and the exit log message is in the destructor.  So when the &lt;code&gt;TRACE&lt;/code&gt; macro is used, a new instance of the class is created on the stack, the constructor is called, and the entry message is logged.  When that instance goes out of scope, the destructor is called, and the exit message is logged.&lt;/p&gt;
&lt;p&gt;Ok, got all that?  &lt;strong&gt;Cool!&lt;/strong&gt;  I&amp;#8217;m not gonna show you the C++ code, because C++ is something only certain types of masochists enjoy. I speak as someone who&amp;#8217;s personally accepted that particular burden for many years.  Take it from me&amp;#8230; if your project can use Objective-C instead of C++, then do it!&lt;/p&gt;
&lt;p&gt;That said&amp;#8230; having been writing Objective-C now for about 8 years&amp;#8230; there have been times&amp;#8230; rarely.. when I &lt;strong&gt;really&lt;/strong&gt; wanted something &lt;strong&gt;just&lt;/strong&gt; like this.  Unfortunately, since Objective-C objects are all always dynamically allocated on the heap, it&amp;#8217;s really not been possible&amp;#8230; until I saw Guy&amp;#8217;s post&amp;#8230; and then I said &amp;#8220;Aha!!! That&amp;#8217;s how I can do it!&amp;#8221;&lt;/p&gt;
&lt;p&gt;Well, I finally had a bug today which called for this form of primitive caveman debugging.  That is, I really needed to just toss a bunch of logging into the app and see the interaction between the methods that are being called and the crash itself.  So I decided to put Guy&amp;#8217;s idea to the test and see if I could make it work like my old C++ mechanism.&lt;/p&gt;
&lt;p&gt;And it did.&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s the code&amp;#8230; the header:&lt;/p&gt;
&lt;div class="code"&gt;
&lt;pre&gt;&lt;code&gt;//
//  MethodLogger.h
//
//  Created by Jiva DeVoe on 9/21/09.
//  Copyright 2009 Random Ideas, LLC. Free for any use commercial or personal
//&lt;/code&gt;

&lt;code&gt;#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;/code&gt;

&lt;code&gt;@interface MethodLogger : NSObject 
{
    NSString *methodSig;
}
@property (retain, nonatomic) NSString * methodSig;
-(id)initWithMethodSignature:(const char *)inMethodSig;&lt;/code&gt;

&lt;code&gt;@end
extern void $kb_scopeReleaseObject( id *scopeReleasedObject );&lt;/code&gt;

&lt;code&gt;#define KBScopeReleased __attribute__((cleanup($kb_scopeReleaseObject)))
#define TRACE MethodLogger *logger KBScopeReleased = [[MethodLogger alloc] \
initWithMethodSignature:__PRETTY_FUNCTION__]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;And the implementation:&lt;/p&gt;
&lt;div class="code"&gt;
&lt;pre&gt;&lt;code&gt;//
//  MethodLogger.m
//
//  Created by Jiva DeVoe on 9/21/09.
//  Copyright 2009 Random Ideas, LLC. Free for any use, commercial or personal
//&lt;/code&gt;

&lt;code&gt;#import "MethodLogger.h"&lt;/code&gt;

&lt;code&gt;void $kb_scopeReleaseObject( id *scopeReleasedObject )
{
    [*scopeReleasedObject release];
    *scopeReleasedObject = nil;
}&lt;/code&gt;

&lt;code&gt;@implementation MethodLogger
@synthesize methodSig;
-(id)initWithMethodSignature:(const char *)inMethodSig;
{
    if(self == [super init])
    {
        [self setMethodSig:[NSString stringWithUTF8String:inMethodSig]];
        NSLog(@"-=&amp;gt; %@", methodSig);
    }
    return self;&lt;/code&gt;
    
&lt;code&gt;}&lt;/code&gt;

&lt;code&gt;-(void)dealloc;
{
    NSLog(@"&amp;lt;=- %@", methodSig);
    [self setMethodSig:nil];
    [super dealloc];
}&lt;/code&gt;

&lt;code&gt;@end&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/div&gt;Note the &lt;code&gt;TRACE&lt;/code&gt; macro.  We&amp;#8217;re creating a new MethodLogger object, and passing as an argument, the special &lt;span class="caps"&gt;GCC&lt;/span&gt; preprocessor macro &lt;code&gt;__PRETTY_FUNCTION__&lt;/code&gt; which will give you a nice string describing the method you are currently in with the macro.&lt;/p&gt;
&lt;p&gt;So there it is!  Now one thing to note, &lt;span class="caps"&gt;CLANG&lt;/span&gt; will complain that you have an unfreed object in your &lt;span class="caps"&gt;TRACE&lt;/span&gt; macro.  Maybe there&amp;#8217;s some annotations to get rid of that, but I haven&amp;#8217;t figured it out.  So that said, I wouldn&amp;#8217;t leave these in your code permanently.  But in those cases where you need something like this, it&amp;#8217;s nice to know you can do it.&lt;/p&gt;
&lt;h3&gt;PS: What About Using Autorelease Instead?&lt;/h3&gt;
&lt;p&gt;Guy touches on this a little bit, but more specific to our little solution here, I&amp;#8217;ll say a word or two about it as well.&lt;/p&gt;
&lt;p&gt;We can&amp;#8217;t use autorelease here, because autorelease just means that your object will receive a release call when your application&amp;#8217;s runloop gets around to it.  We really want to know &lt;strong&gt;when&lt;/strong&gt; we left the method.  So what we really want to see is a hard release at the end of the method.  Using the scoped object mechanism gives us that.&lt;/p&gt;</description>
      <guid>http://www.random-ideas.net/posts/34</guid>
    </item>
    <item>
      <title>Tiling</title>
      <description>&lt;p&gt;We&amp;#8217;re tiling our house&amp;#8230; slowly&amp;#8230; one room at a time&amp;#8230; moving furniture from one side of a room to the other, tiling, moving it back&amp;#8230; etc&amp;#8230; it is slow&amp;#8230; laborious&amp;#8230; tiring&amp;#8230; but so worth it.&lt;/p&gt;
&lt;p&gt;It looks awesome.&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s some pics&amp;#8230;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://farm3.static.flickr.com/2524/3902056273_8be83ab5b4.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Starting&lt;/p&gt;
&lt;p&gt;&lt;img src="http://farm3.static.flickr.com/2431/3902055981_fe47c1c8f2.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://farm3.static.flickr.com/2446/3902834238_804a559c02.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Working around the nook&amp;#8230;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://farm3.static.flickr.com/2534/3902833758_437b2dcc92.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;The pattern we chose to do is a really complex one.  It requires two sizes of tiles, 6&amp;quot; and 12&amp;quot;, with the 6&amp;quot; titles in a windmill pattern around the 12&amp;quot;.  The end result is a really pretty stair stepping pattern that also has sort of a diamond shape to it.  It&amp;#8217;s really nice.&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s a pic:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://farm3.static.flickr.com/2634/3902210655_43ba8be650.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;We also added about every 9th 6&amp;quot; title as a &amp;#8220;Special Decorative&amp;#8221; tile.  You can see it in this pic in the upper left.&lt;/p&gt;
&lt;p&gt;These are much more expensive, but give a beautiful little flourish all through the room.  Doing them every 6&amp;quot; tile would be too much.  But doing them like this is just right.&lt;/p&gt;
&lt;p&gt;When my father was alive, he began every painting he made by drawing a tiny Om symbol in the center of the canvas.  It would be painted over, of course, but it was his way of sort of &amp;#8220;blessing&amp;#8221; the canvas.&lt;/p&gt;
&lt;p&gt;Now the best part of this project is this:  We (the kids, and my wife, and I) wrote a special message on the back of each of the special tiles.  Things like &amp;#8220;Jiva + Dawn&amp;#8221; and things like that.&lt;/p&gt;
&lt;p&gt;And on the very center tile in the house&amp;#8230; in the center of that tile, on the underside&amp;#8230; I put an Om symbol too.&lt;/p&gt;</description>
      <guid>http://www.random-ideas.net/posts/33</guid>
    </item>
    <item>
      <title>A New Renaissance</title>
      <description>&lt;p&gt;In 1486, Giovanni Pico Della Mirandola penned his &#8220;Manifesto of the Renaissance&#8221;, his  &lt;a href="http://www.cscs.umich.edu/~crshalizi/Mirandola/"&gt;Oration on the Dignity of Man&lt;/a&gt; .  In it, he wrote, &#8220;Oh wondrous and unsurpassable felicity of man, to whom it is granted to have what he chooses, to be what he wills to be!&#8221; and later, &#8220;It will be in your power to descend to the lower, brutish forms of life; you will be able, through your own decision, to rise again to the superior orders whose life is divine.&amp;#8217;&amp;#8217;&lt;/p&gt;
&lt;p&gt;What he was really talking about was the liberation of the spirit of humanity.  He meant that among all the creatures of creation, Man alone had the capability to be like any of them.  That he could be brutish, evil, and base and succumb to his more savage desires, or, through the depth and power of his own intellect, creativity and will, he could transcend his existence, and become virtually divine.&lt;/p&gt;
&lt;p&gt;The most important part of his message, though, is that we have a choice.  We choose what we are and what we will be.&lt;/p&gt;
&lt;p&gt;Every day, mankind makes a choice to live the life we do.  We make a choice to build the things we build, and, perhaps most importantly, we choose what skills of our own to improve.&lt;/p&gt;
&lt;p&gt;No other creature on earth has as much choice in how to live their lives than we do.  No other creature has at it&#8217;s disposal such a vast and incredible array of knowledge and expertise.&lt;/p&gt;
&lt;p&gt;I read an estimate the other day, that the &lt;a href="http://www.nytimes.com"&gt;New York Times&lt;/a&gt; prints, daily, more knowledge than a typical 5th century peasant could have been exposed to in an entire lifetime.&lt;/p&gt;
&lt;p&gt;We, as a species are more connected, more educated, and more capable, than any other species that has ever existed on the face of the earth.  And through all of that, we have the greatest potential for growth ever to exist.&lt;/p&gt;
&lt;p&gt;It is an amazing gift that we are given.&lt;/p&gt;
&lt;p&gt;I say it often when talking about technology.  &#8220;We live in the future&#8221;.  We have Star Trek level devices sitting in our pockets and on our desks.  Need proof? I have in my hand, smaller than a deck of cards, a device that lets me instantly access virtually every aspect of human knowledge, via the Internet.  It&#8217;s screen is able to be manipulated simply by the touch of my fingers.  It can also be used to instantly communicate with friends or even strangers anywhere in the world, by voice, by text, and soon, by video.  My desktop computer listens when I talk to it, and can write letters, or even this article simply by me dictating to it.  It contains enough music and videos to play for days without repeating the same thing twice.&lt;/p&gt;
&lt;p&gt;Even the elements of our lives that enable us to support ourselves are more liberating today than they have ever been before.  We, alone, in all of history, have greater potential for creating new and exciting things and distributing them to more people than the world has ever known.&lt;/p&gt;
&lt;p&gt;I believe that we owe it to the universe to reinvent ourselves every day.  To constantly be striving to improve ourselves.  What defines a renaissance man is his ability to master multiple disciplines.   &lt;a href="http://en.wikipedia.org/wiki/Michelangelo"&gt;Michelangelo&lt;/a&gt; , a true renaissance man, was an accomplished (some would say the greatest) painter, sculptor, architect, poet and engineer.  &lt;a href="http://en.wikipedia.org/wiki/Leonardo_da_Vinci"&gt;Da Vinci&lt;/a&gt; , a contemporary to Michelangelo, had an even larger list of professions.  While these men may exemplify the renaissance ideal, &lt;a href="http://en.wikipedia.org/wiki/Polymath"&gt;they are not alone in their accomplishments&lt;/a&gt; .&lt;/p&gt;
&lt;p&gt;And consider&amp;#8230; that all of the renaissance men of the past had less resources available to them in their entire lives than you and I have on a daily basis.&lt;/p&gt;
&lt;p&gt;We, you and I, owe it to ourselves, and to mankind, to strive.  To press ourselves forward at every opportunity.  To seek out and crave knowledge.  To explore and expand our own capabilities.&lt;/p&gt;
&lt;p&gt;If you&#8217;re lucky, &lt;a href="http://en.wikipedia.org/wiki/Life_expectancy"&gt;you&#8217;ve got about 67 years on earth to do it in&lt;/a&gt; .  That&#8217;s 804 months.  Or 24,455 days.  Or 586,920 hours.  Considering you&#8217;re old enough to be reading this, you&#8217;ve probably burned a good chunk of that already.  In the big scheme of things, this is a blink of an eye.&lt;/p&gt;
&lt;p&gt;We have a choice of what we do with the opportunity we call life.  What will you choose to do with yours today?&lt;/p&gt;</description>
      <guid>http://www.random-ideas.net/posts/30</guid>
    </item>
    <item>
      <title>A Tiny Xcode tip...</title>
      <description>&lt;p&gt;Placed here more so I can remember them rather than for you&amp;#8230;&lt;/p&gt;
&lt;p&gt;To fix braces so they go on the line &lt;span class="caps"&gt;AFTER&lt;/span&gt; the if/else/for/etc&amp;#8230;.&lt;/p&gt;
&lt;p&gt;defaults write com.apple.Xcode XCCodeSenseFormattingOptions &amp;#8216;{ &amp;#8220;BlockSeparator&amp;#8221; = &amp;#8220;\n&amp;#8221; ; }&amp;#8217;&lt;/p&gt;</description>
      <guid>http://www.random-ideas.net/posts/29</guid>
    </item>
    <item>
      <title>The Book is DONE!</title>
      <description>&lt;p&gt;Well, ok, technically, it was done (writing wise) last month, but I just finished Author Review this past sunday.  So it&amp;#8217;s &lt;span class="caps"&gt;OFF&lt;/span&gt; TO &lt;span class="caps"&gt;THE&lt;/span&gt; &lt;span class="caps"&gt;PRINTERS&lt;/span&gt;! Hopefully to be in stores in October.  If you&amp;#8217;re interested in a copy, &lt;a href="http://www.amazon.com/dp/0470481072?tag=randidea01-20"&gt;visit amazon&lt;/a&gt; .&lt;/p&gt;</description>
      <guid>http://www.random-ideas.net/posts/28</guid>
    </item>
    <item>
      <title>WWDC First Time Attendee Tipsheet</title>
      <description>&lt;p&gt;Was writing up an email for a friend who is a first time &lt;span class="caps"&gt;WWDC&lt;/span&gt; attendee and thought it might be of interest to others.&lt;/p&gt;
&lt;p&gt;SF natives would probably call my list touristy &amp;#8211; I don&amp;#8217;t know the local lore as much as they do.  So be it.  I&amp;#8217;m not ashamed to be a tourist! ;)  I love SF though, and have been enough times that I have a few favorite places to go and things to do.  Some of these have been covered by other folks as well.&lt;/p&gt;
&lt;p&gt;So without further ado&amp;#8230;&lt;/p&gt;
&lt;p&gt;Some tips for you as a first time &lt;span class="caps"&gt;WWDC&lt;/span&gt; attendee:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Hope your hotel is close to the convention center.  SF is the most pedestrian friendly city in the world, and parking is a pain.  If it is, plan to &lt;span class="caps"&gt;NOT&lt;/span&gt; rent a car and instead, just take the &lt;span class="caps"&gt;BART&lt;/span&gt; from the airport to the station closest to your hotel.  Wear good walking shoes.&lt;/li&gt;
	&lt;li&gt;Badge pickup begins on sunday.  Get it done if you can rather than wait for monday morning.&lt;/li&gt;
	&lt;li&gt;You&amp;#8217;re going to be in an overflow room for the keynote.  Just plan on it.  Some freaks start lining up the night before the keynote to make sure they get good seats in the main room.  Personally, I don&amp;#8217;t bother.&lt;/li&gt;
	&lt;li&gt;Due to #3 above&amp;#8230; plan monday to travel light.  You&amp;#8217;re going to be waiting in line a &lt;span class="caps"&gt;LONG&lt;/span&gt; time&amp;#8230; we&amp;#8217;re talking longer than disney land long.&lt;/li&gt;
	&lt;li&gt;Don&amp;#8217;t lose your badge.  They do not replace them, and you&amp;#8217;re not getting in without one.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;More specific to SF rather than &lt;span class="caps"&gt;WWDC&lt;/span&gt;:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;The cable cars will take you to most of the interesting things around town.  You can get a pass for them at the end-of-the-line stop near the convention center.  The passes allow you to ride as much as you want for a day, 3 days, or a week.&lt;/li&gt;
	&lt;li&gt;The end-of-the-line stop at Fisherman&amp;#8217;s Wharf tends to get a long line.  You can sometimes avoid it by walking a few blocks along the cablecar route and hopping on there instead.  Those few blocks are uphill, however.&lt;/li&gt;
	&lt;li&gt;You owe it to yourself to visit Chinatown and Fisherman&amp;#8217;s Wharf at the least.  Wander the shops, see the sights.&lt;/li&gt;
	&lt;li&gt;No, you will not be able to get tickets to Alcatraz.&lt;/li&gt;
	&lt;li&gt;The Ghirardelli Chocolate Factory self-guided walking tour is a great way to spend an evening when nothing else is going on.&lt;/li&gt;
	&lt;li&gt;The Golden Gate bridge is visible from Fisherman&amp;#8217;s Wharf, but if you want a truly postcard view, you might consider taking a bus to the Golden Gate park.&lt;/li&gt;
	&lt;li&gt;Food-wise&amp;#8230; Chinatown for Chinese (natch) North Beach for Italian.  Some would say Fisherman&amp;#8217;s Wharf for seafood, but honestly, I have yet to find a good place down there.  There&amp;#8217;s also some good places on columbus ave.  The Stinking Rose comes to mind.&lt;/li&gt;
	&lt;li&gt;Dress warm.  It gets really chilly at night  Remember the Mark Twain quote: &amp;#8220;The coldest winter I ever knew was a summer in San Francisco.&amp;#8221;  It&amp;#8217;s 100% true.  It gets windy and cold, and icky.  (Course, maybe it&amp;#8217;s my thin Arizona blood talking there.)&lt;/li&gt;
&lt;/ol&gt;
&lt;li&gt;</description>
      <guid>http://www.random-ideas.net/posts/27</guid>
    </item>
    <item>
      <title>Be An Acorn</title>
      <description>&lt;p&gt;From a book I&amp;#8217;m reading on business development &lt;a href="http://www.amazon.com/Growing-Business-Paul-Hawken/dp/0671671642/ref=pd_bbs_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1237953722&amp;amp;sr=8-1"&gt;Growing a Business&lt;/a&gt; by Paul Hawken:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;#8220;Do you want to be a mushroom or an oak tree? Spores beat out Acorns every time in growth rates, but never in longevity or durability.&amp;#8221;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;He&amp;#8217;s referring to whether you want to grow fast or slow.&lt;/p&gt;
&lt;p&gt;Hawken advocates a middle-ground growth rate that suits your business and is sustainable.  He says that while everyone knows growing too little can cause a business to fail, our society&amp;#8217;s focus on the fastest growth as a measure of success is misguided, and that companies that grow too fast can quickly outstrip their ability to manage themselves.&lt;/p&gt;
&lt;p&gt;Related, he also advises that during recessions is the time to expand, and during booms is the time to be fiscally conservative.&lt;/p&gt;
&lt;p&gt;This is counter-intuitive, but if you think about it, it makes a lot of sense.&lt;/p&gt;
&lt;p&gt;If you are able to expand during recession times without going into debt, then you know that you can maintain that expanded size (and the costs associated with it) during more financially tight periods.  Similarly, staying conservative during booms is wise, because all booms eventually end, and it&amp;#8217;s important not to become reliant on that boom-time revenue to the point that when it is gone, you have no choice but to cut costs.&lt;/p&gt;
&lt;p&gt;I think he&amp;#8217;s absolutely right on both counts, and it&amp;#8217;s something that those of us who are experiencing rapid growth due to the success of the iPhone should keep in mind.&lt;/p&gt;
&lt;p&gt;I want our business to be an oak&amp;#8230; long lasting and strong.  The economy is in recession now, and we&amp;#8217;re doing well.  Does that mean we should be pressing forward on expansion?  Or is the iPhone creating an artificial bubble of success and we should be being conservative?&lt;/p&gt;
&lt;p&gt;Decisions.&lt;/p&gt;</description>
      <guid>http://www.random-ideas.net/posts/26</guid>
    </item>
    <item>
      <title>Why Brick and Mortar Bookstores are Going to Die</title>
      <description>&lt;p&gt;Tonight, I&amp;#8217;d like to buy two books.  I have the money in my hand, and I know exactly what they are.&lt;/p&gt;
&lt;p&gt;The first was recommended by &lt;a href="http://www.daringfireball.net"&gt;John Gruber&lt;/a&gt; and is &lt;a href="http://www.amazon.com/Elements-Style-Text-Original-1918/dp/B001O8NXDI/ref=kinw_dp_ke?ie=UTF8&amp;amp;qid=1237954624&amp;amp;sr=8-1"&gt;Elements of Style&lt;/a&gt; .  As a writer-in-progress, though I certainly don&amp;#8217;t aspire to high literature, it seems useful to me to study what good writing style is, and to apply that to my work.&lt;/p&gt;
&lt;p&gt;The second, was a book I found as a result of a discussion I had with a friend today about growing my software business, &lt;a href="http://www.amazon.com/Growing-Business-Paul-Hawken/dp/0671671642/ref=pd_bbs_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1237953722&amp;amp;sr=8-1"&gt;Growing a Business&lt;/a&gt; .&lt;/p&gt;
&lt;p&gt;Now, it&amp;#8217;s useful to note that both of those links are from Amazon.  I said to myself tonight, &amp;quot;I&amp;#8217;d really like these books&amp;#8230; if I can get em at my local Barnes and Noble, I&amp;#8217;ll do that.  So I immediately went to the &lt;a href="http://www.barnesandnoble.com"&gt;Barnes and Noble&lt;/a&gt; website, to check local availability for them.&lt;/p&gt;
&lt;p&gt;&amp;#8220;Growing a Business&amp;#8221; was &lt;a href="http://search.barnesandnoble.com/booksearch/store.asp?EAN=9780671671648&amp;amp;distance=2&amp;amp;zipcode=85297&amp;amp;x=26&amp;amp;y=20"&gt;out of stock&lt;/a&gt; everywhere. &amp;#8220;Elements of Style&amp;#8221;  &lt;a href="http://search.barnesandnoble.com/booksearch/store.asp?EAN=9780205309023&amp;amp;distance=2&amp;amp;zipcode=85297&amp;amp;x=28&amp;amp;y=23"&gt;was available&lt;/a&gt; , but if you notice the link I originally gave for Elements, that link was to the Kindle version, which cost a mere $2.39 and I can download it &lt;strong&gt;tonight&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;So in other words, I want to buy two books tonight.  I have money in my pocket, and I am willing to drive 15 minutes to the bookstore to get em.  Just tell me where to go and I&amp;#8217;m there&amp;#8230;. and lo and behold.. I either can&amp;#8217;t get them, or they are &lt;strong&gt;so much cheaper and easier&lt;/strong&gt; through Amazon, that I&amp;#8217;d be foolish to buy it locally.&lt;/p&gt;
&lt;p&gt;I love going to the bookstore.  I love sitting in the coffee shop and browsing books.  It&amp;#8217;s as fun as going to a baseball game would be for others.  It makes me sad to see that this past time of mine is soon going to be dead.  I hope buying books online with wireless delivery continues to improve to the point that I will someday enjoy it as much.&lt;/p&gt;</description>
      <guid>http://www.random-ideas.net/posts/25</guid>
    </item>
    <item>
      <title>Late Night Cocoa #40</title>
      <description>&lt;p&gt;&lt;a href="http://tinyurl.com/bo9f7q"&gt;Late Night Cocoa podcast starring ME! has been released&lt;/a&gt; Topic is Design Patterns.  Complaints/Critisism/Rants can be sent to email, comments or null&amp;#8230;&lt;/p&gt;</description>
      <guid>http://www.random-ideas.net/posts/24</guid>
    </item>
    <item>
      <title>Three Truths about the App Store</title>
      <description>&lt;p&gt;&lt;strong&gt;Preface&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I got an email the other day from someone who was asking me where to start when it came to writing iPhone apps.&lt;/p&gt;
&lt;p&gt;Those of us for whom the response to the question &amp;#8220;What do you do for a living?&amp;#8221; is &amp;#8220;I make iPhone apps&amp;#8230;&amp;#8221; know all too well, that the very next words that follow that question are usually &amp;#8220;Really? I have a great idea for an app&amp;#8230;&amp;#8221;  This almost always leads to either &amp;#8220;Do you think you could write this app for me?&amp;#8221; or &amp;#8220;Can you tell me how to write this app?&amp;#8221;  So the point is, we get asked those kinds of questions a lot.&lt;/p&gt;
&lt;p&gt;So in response, I wrote up this email, and when I was finished, I said &amp;#8220;Y&amp;#8217;know, this would make a good Blog post&amp;#8230;&amp;#8221; so here it is&amp;#8230;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;#8220;I can has iPhone code pls? kthxbai&amp;#8221;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve been writing code for 15+ years, and been thinking about interactions with multi-touch devices for at least the last 8 years as well as writing Objective-C for 7 years.&lt;/p&gt;
&lt;p&gt;Yes, it&amp;#8217;s true, even before multi-touch was a sparkle in Jeff Han&amp;#8217;s projector, I was telling friends how cool it would be if we had touch displays that enabled more than one finger to be used on them at a time.  I had been writing mobile apps for Fujitsu touch-screen tablet computers as early as the late 90&amp;#8217;s.  (Things have come a &lt;span class="caps"&gt;LONG&lt;/span&gt; way since then.)&lt;/p&gt;
&lt;p&gt;Anyway, when the iPhone &lt;span class="caps"&gt;SDK&lt;/span&gt; came out, I was all over it.  This was my moment&amp;#8230; everything I had done in my career was leading up to this, and I wanted to make the most of it.&lt;/p&gt;
&lt;p&gt;For my ideas, I wanted to develop apps that would help people.  Apps that would help them relax, achieve goals, etc.  Implementation was pretty straight forward because I already had the experience to do it.  I knew Objective-C.  I knew the limitations of mobile platforms.  With my liberal arts background (I studied to be an artist before I got into computing) I had a keen sense of design and what makes beautiful art.  The point here is that I had the resources, and the ability to turn my ideas into an actual app.&lt;/p&gt;
&lt;p&gt;And that brings me to my first cold hard truth &lt;span class="caps"&gt;WRT&lt;/span&gt; iPhone apps:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Truth #1:&lt;/strong&gt; Ideas are cheap.  The key to turning an idea into an app is in implementation and execution.  If you can&amp;#8217;t implement the app, you have nothing.&lt;/p&gt;
&lt;p&gt;I should be clear here, I don&amp;#8217;t mean in any way to reduce the importance of your idea. It may be a great idea. And it&amp;#8217;s great that you&amp;#8217;re thinking about these kinds of things. But the point I&amp;#8217;m trying to make here is that unless you can execute on that idea or partner with somebody who can, an idea is nothing more than vapor. So it&amp;#8217;s really, really important that you focus on what you need to do to execute the idea. An idea is 1% of a project. The execution and implementation is the other 99%. If you can&amp;#8217;t deliver that extra 99% then you don&amp;#8217;t really have anything.&lt;/p&gt;
&lt;p&gt;The second thing to consider is that you&amp;#8217;re working with a platform that is new, revolutionary, and crowded. When I first started working with the iPhone &lt;span class="caps"&gt;SDK&lt;/span&gt; I was one of the early beta users. When I started using it, interface builder didn&amp;#8217;t even work.  We had to do everything strictly through code (And walk uphill in the snow barefoot both ways). I realized that this was an incredible opportunity that I had been given. I took it as my responsibility to deliver something worthwhile. It was important to me to build something that was worthy of the platform.  In a lot of ways, I still don&amp;#8217;t feel I have achieved that, but that&amp;#8217;s my goal every day when I get up and start coding.  Whenever I have a decision to make about what features to include or leave out, I ask myself, how can I most deliver the &amp;#8220;Zen&amp;#8221; that fits within the iPhone platform, that is worthy of running along side other great apps that I admire.&lt;/p&gt;
&lt;p&gt;Today, in order to stand out, you still need to build something worthy of the iPhone. You need to build something worth talking about. Doing it halfway wastes everybody&amp;#8217;s time, and the App Store is a cruel mistress. If you put something out there that is not your best work then the people that review your app will waste no time picking it apart in every way that they can. So this brings me to my second cold hard truth:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Truth #2:&lt;/strong&gt; Build something worth talking about and worthy of running on the iPhone or don&amp;#8217;t bother.&lt;/p&gt;
&lt;p&gt;Finally, I read a bit of inspiration the other day from &lt;a href="http://www.furbo.org"&gt;Craig Hockenberry&lt;/a&gt; and &lt;a href="http://furbo.org/2009/02/16/raising-prices/"&gt;he was talking about how he had been talking to someone from Apple when he was at MacWorld&lt;/a&gt; . The person from Apple told him to look around him and see that they were celebrating the 25th anniversary of the Macintosh platform. The iPhone platform is just now being born. It&amp;#8217;s new, it&amp;#8217;s exciting, and it is full of opportunity. While the rest of the world is talking about how the economy is melting down, we are enjoying good sales and reliable income from making iPhone applications. There is definitely opportunity if you have a great idea and great execution, but more interesting is to think&amp;#8230; where will the iPhone and Cocoa Touch be in 25 years?  What will this platform become?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Truth #3:&lt;/strong&gt; Be in it for the long haul.  Get rich slow.  Sure, some folks are winning the lottery, but don&amp;#8217;t plan on it.  If it comes, then good for you.&lt;/p&gt;</description>
      <guid>http://www.random-ideas.net/posts/23</guid>
    </item>
    <item>
      <title>When in Doubt, Move the Pencil</title>
      <description>&lt;p&gt;When I was about 16 years old, I was enrolled in a summertime art program at an art school in Orlando Florida. Every weekend, we would gather in a classroom and draw the subjects laid out in front of us. I wasn&amp;#8217;t a particularly good student, partially because I didn&amp;#8217;t really like the work of the teacher. So it was hard to appreciate taking instruction from her when sometimes I felt like she really didn&amp;#8217;t know what she was talking about.&lt;/p&gt;
&lt;p&gt;Being young, I was absolutely certain that I already knew everything that I could ever possibly know about everything. Ahh those were the days!  To quote the song, &amp;#8220;I was so much older then, I&amp;#8217;m younger than that now.&amp;#8221;&lt;/p&gt;
&lt;p&gt;That said, there was one particular incident that had a huge impact on me even to this day.&lt;/p&gt;
&lt;p&gt;It was a warm sunny afternoon, and the class sat in a circle around a still life of seashells and fruit.  The door to the classroom was open, and I sat on my easel with my back to the singing birds outside.&lt;/p&gt;
&lt;p&gt;My paper was blank.  I was uninspired.  I couldn&amp;#8217;t bring myself to begin.  I didn&amp;#8217;t even know where to start.&lt;/p&gt;
&lt;p&gt;I was suffering from artists block. The scene seemed so complex and I couldn&amp;#8217;t even imagine where my first pencil strokes should go. I sat with my blank paper, my pencil in my hand, frozen in inaction.&lt;/p&gt;
&lt;p&gt;My instructor came by eventually, and asked over my shoulder, &amp;#8220;Why haven&amp;#8217;t you drawn anything?&amp;#8221;&lt;/p&gt;
&lt;p&gt;I replied simply, &amp;#8220;I just don&amp;#8217;t know where to start.&amp;#8221;&lt;/p&gt;
&lt;p&gt;And then she said to me the words that I will always remember: &amp;#8220;When in doubt, move your pencil.&amp;#8221;&lt;/p&gt;
&lt;p&gt;Her point of course was that if you just start drawing something, even if it&amp;#8217;s bad, it loosens up your mind and your hand and eventually, before you know it, rough lines lead to tighter more confident strokes and eventually to a finished drawing.&lt;/p&gt;
&lt;p&gt;She was right. I started sketching. Loosely drawing out the big shapes, and then adding detail over the forms. When I was finished I had what I felt was one of the best drawings that I had ever done.&lt;/p&gt;
&lt;p&gt;Since that time, I&amp;#8217;ve applied this over and over throughout my life.&lt;/p&gt;
&lt;p&gt;Whenever I&amp;#8217;ve been stuck, I force myself to just move my pencil.&lt;/p&gt;
&lt;p&gt;If it&amp;#8217;s code that I&amp;#8217;m stuck on, I just start writing even if it&amp;#8217;s not particularly good. I can always re-factor it later.&lt;/p&gt;
&lt;p&gt;Now today as I begin work on my book, I find myself again looking at this huge project and not always knowing for sure where to start. So what do I do? I just start writing, even if it&amp;#8217;s bad. I can always change it later. Call it a rough draft.&lt;/p&gt;
&lt;p&gt;And amazingly enough, it still works.&lt;/p&gt;</description>
      <guid>http://www.random-ideas.net/posts/22</guid>
    </item>
    <item>
      <title>How to make your Apache SSL cert not request a password</title>
      <description>&lt;p&gt;I&amp;#8217;m going to start writing these things in my Blog so I can remember them myself.&lt;/p&gt;
&lt;p&gt;Consider this a micro-blog entry&amp;#8230;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How To Make Apache Not Prompt for a Password with an &lt;span class="caps"&gt;SSL&lt;/span&gt; Certificate&lt;/strong&gt; :&lt;/p&gt;
&lt;p&gt;&lt;code&gt;cp server.key server.key.org&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;openssl rsa -in server.key.org -out server.key&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This makes your server.key not require a password.&lt;/p&gt;
&lt;p&gt;Warning: this may mean your key can be compromised, so be sure to keep it safe after you do this.&lt;/p&gt;</description>
      <guid>http://www.random-ideas.net/posts/21</guid>
    </item>
    <item>
      <title>Coming Soon to a Bookstore Near You!</title>
      <description>&lt;p&gt;I have some exciting news to share!&lt;/p&gt;
&lt;p&gt;Over the last couple of months I have been in negotiations with &lt;a href="http://www.wiley.com/WileyCDA/"&gt;Wiley and Sons Publishing&lt;/a&gt; on a book proposal and we have finally settled on the final version of the table of contents. The contracts have been signed, and were moving forward. The name of the book will be &amp;#8220;Cocoa and Cocoa Touch Programming&amp;#8221; and it will naturally be about exactly that topic! It will be a part of their Apple Developer series of books, and should be going to print sometime this fall.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m really excited to be working on this project.  For many years I thought it would be exciting to write a book and when this opportunity presented itself I immediately jumped at it.&lt;/p&gt;
&lt;p&gt;Writing books is not particularly lucrative, so this doesn&amp;#8217;t in any way supersede any of the fantastic work we&amp;#8217;re doing here on iPhone and Mac OS X apps.  This is simply an additional project that we&amp;#8217;re taking on.&lt;/p&gt;
&lt;p&gt;Over the long term, this means that in addition to the blog postings about Random Ideas applications and products,  I will probably write occasionally in this blog about some of my experiences in writing this book so keep an eye out for that.&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s to more cool stuff in 2009!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Edit&lt;/strong&gt;: &lt;em&gt;Big shout out to &lt;a href="http://www.stepwise.com"&gt;Scott Anguish&lt;/a&gt; who referred Wiley to me.  A decision I&amp;#8217;m sure he&amp;#8217;ll regret eventually. ;)  Many thanks Scott!&lt;/em&gt;&lt;/p&gt;</description>
      <guid>http://www.random-ideas.net/posts/20</guid>
    </item>
    <item>
      <title>Changes!</title>
      <description>&lt;p&gt;Just a little note&amp;#8230; a few minor changes around the site here.  New blog software that I wrote myself using &lt;a href="http://www.rubyonrails.org"&gt;Ruby on Rails&lt;/a&gt; &amp;#8230; a bunch of html cleanups&amp;#8230; better &lt;span class="caps"&gt;CSS&lt;/span&gt;&amp;#8230;  etc&amp;#8230;&lt;/p&gt;
&lt;p&gt;Most of which you&amp;#8217;d never know if you just looked at the site, but I&amp;#8217;m proud of it.  It should make running things a little easier for me.&lt;/p&gt;
&lt;p&gt;The biggest backend change is that I am slowly weening myself off &lt;a href="http://www.zope.org"&gt;Zope&lt;/a&gt; .  It&amp;#8217;s served me well over the last 10 years&amp;#8230; but it just hasn&amp;#8217;t kept up with the times.  It was time to change.&lt;/p&gt;
&lt;p&gt;Anyway, I&amp;#8217;m liking it.  It feels good.. shiny.. clean&amp;#8230; fresh smelling&amp;#8230;&lt;/p&gt;
&lt;p&gt;If you run into issues with the site (broken links and the like), drop me an email.&lt;/p&gt;</description>
      <guid>http://www.random-ideas.net/posts/19</guid>
    </item>
    <item>
      <title>A List of Favorite Things</title>
      <description>&lt;p&gt;It being the new year, I thought that I would do like everyone else, and list sort of a retrospective of 2008 technologies that have been making a significant difference in my life. However, instead of only looking at it as if it&amp;#8217;s a retrospective, I&amp;#8217;d rather look at it from the perspective of looking forward, meaning that this is a list of technologies that I&amp;#8217;m currently so enjoying using that I really look forward to using them in 2009 to do more great things.&lt;/p&gt;
&lt;p&gt;So, here&amp;#8217;s a list of technologies that really helped me in 2008, and I really hope that I will get more opportunities to use in 2009:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;iPhone and the App Store&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Obviously, I would be remiss if I didn&amp;#8217;t mention the iPhone. If there&amp;#8217;s any one thing that made a huge difference in my life last year, it&amp;#8217;s been the iPhone and the App Store. I won&amp;#8217;t rehash all the things that make the iPhone a wonderful platform to develop on.  I&amp;#8217;ll just say it is, and leave it at that.  I &lt;b&gt;love&lt;/b&gt; doing iPhone development.  It&amp;#8217;s really returned to me the passion that I used to have for writing code.  It inspires me, and excites me.  As hokey as it sounds, I feel like writing apps for this platform is what I was born to do.&lt;/p&gt;
&lt;p&gt;When the App Store launched in July, we had two applications available in it. They were iZen Garden and Tiles. Between the two of them, we&amp;#8217;d spent about three months of development time building them, and were very nervous to see how they&amp;#8217;d do. Would they flop? Would they be a great success? Thankfully, it was the latter, they were a tremendous success. This enabled us to create even more applications, and we later shipped Edibles, and What&amp;#8217;s Goin down. These have made 2008 our best year yet.&lt;/p&gt;
&lt;p&gt;As a result, in 2009, we&amp;#8217;re looking forward to continuing our success by growing our iPhone business significantly. We already have updates in the queue for Edibles, and we expect to be updating our other applications in the coming weeks and months. In addition to that, we&amp;#8217;re going to expand our product line and introduce new applications. I hope that by this time next year I&amp;#8217;ll be saying the same thing, that 2009 was our best year yet &amp;#8211; even better than 2008!&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Ruby on Rails&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;In conjunction with our iPhone development, I began to work with Ruby on Rails. I have to say, Ruby on Rails is one of the best web development environments I&amp;#8217;ve ever used. For the last 10 years, I&amp;#8217;ve been using Zope for almost all my web development. I really haven&amp;#8217;t had much need to change, and it&amp;#8217;s really done a pretty decent job of getting the job done. However, my experience with Ruby on rails this year has caused me to decide that it&amp;#8217;s finally time to dump Zope. So in 2009 I hope to transition all of my Zope based websites to Ruby on Rails instead.&lt;/p&gt;
&lt;p&gt;You might wonder, what brought me to this decision. Zope has been very faithful to me, but at the end of the day it&amp;#8217;s simply not been advancing to move with the times. Ruby on Rails gives me everything that I once used Zope for and even more. In particular, I&amp;#8217;m really excited by how Ruby on Rails embraces modern technologies like &lt;span class="caps"&gt;CSS&lt;/span&gt;, and unit testing.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve already written my own blog software implementation in Rails, and with a few more tweaks, I&amp;#8217;ll be ready to deploy it.  It&amp;#8217;s already more powerful, and more integrated than COREBlog which is what I use here now.  I have a secret project completely written in Rails that I&amp;#8217;ll be unveiling very very soon.  So overall, yeah, I&amp;#8217;m totally in love with Rails currently.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Time Machine&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve never really been very good about backups, and in fact actually one might say that I&amp;#8217;ve always sort of lived on the edge with my data. I&amp;#8217;ve always had good backups of my source code of course, but all my other stuff like documents, settings, and software, I&amp;#8217;ve never really backed up.&lt;/p&gt;
&lt;p&gt;So, when Apple added Time Machine to Mac OS X, I saw it as an opportunity to finally have the backup system that I very badly needed. Thankfully, I&amp;#8217;ve only actually had to use Time Machine&amp;#8217;s restore capabilities a couple of times since I started using it. However, it gives me comfort at night, knowing that my data is safe and if I need to use it I can.&lt;/p&gt;
&lt;p&gt;Additionally, when we recently upgraded a machine, the machine that we were replacing was using Time Machine with an external &lt;span class="caps"&gt;USB&lt;/span&gt; drive, when we brought in the new machine, we simply plugged in the old time machine backup drive, and chose to restore our settings from there. The new machine basically did the entire operating system installation and all of our software, and then booted up with almost no interaction from us required.&lt;/p&gt;
&lt;p&gt;That&amp;#8217;s the way that technology should be, it should just work, silently in the background.&lt;/p&gt;
&lt;p&gt;I said when I started this that I wanted to talk about things I hope to use more of in 2009.  Since Time Machine only really gets &lt;span class="caps"&gt;USED&lt;/span&gt; when there&amp;#8217;s data loss, I&amp;#8217;ll say I hope I continue to not have to use it at all.  That said though, it&amp;#8217;s nice to know that if I need to, it&amp;#8217;ll be there for me!&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Notebooks&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;No, I don&amp;#8217;t mean notebook computers. I mean, notebooks. The paper, bound kind. When the iPhone &lt;span class="caps"&gt;SDK&lt;/span&gt; came out, I was so filled with ideas for applications, I knew that if I didn&amp;#8217;t write them down, I would lose them. So I immediately went out and bought several notebooks and designated them for ideas, bug lists, to-do lists, and so forth. I was surprised at how effective it was to write things down as I went so that I could free my mind to focus on the current task by queuing up future tasks in my notebooks. I started off in April with just some lab notebooks from Staples, and by the end of the year, I was spending far more money than I should be on fancy Moleskines.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m particularly fond of the ones with graph paper. I find that they&amp;#8217;re useful not only for taking notes, but also for doing user interface diagrams, or graphing test results.&lt;/p&gt;
&lt;p&gt;In 2009, I expect to continue to use notebooks on a daily basis. I now carry a small one with me at all times for whenever inspiration strikes, as well as having particular ones designated for new ideas, and bug lists, and so forth.&lt;/p&gt;
&lt;p&gt;So, in summary, as they say, &amp;#8220;these are a few of my favorite things.&amp;#8221; I&amp;#8217;m looking forward to using these in 2009 to do great things.&lt;/p&gt;
&lt;p&gt;The creator of &amp;#8220;Lost,&amp;#8221; J.J. Abrams has a saying about Macintosh computers, &amp;#8220;They challenge me to do things worthy of them.&amp;#8221;&lt;/p&gt;
&lt;p&gt;To me, this is the epitome of a great tool.  A tool so great, so awesome, so beautiful, that you crave to use it, and hope that you can make something with it that is worthy of the tool being used upon it.  I feel that way about Macs too&amp;#8230; and all the things I&amp;#8217;ve listed above.  They are things that are so great, that I want to make things just so I can use them.&lt;/p&gt;
&lt;p&gt;That&amp;#8217;s what we should all strive to instill in our own products.&lt;/p&gt;</description>
      <guid>http://www.random-ideas.net/posts/6</guid>
    </item>
    <item>
      <title>Happy Holidays!</title>
      <description>&lt;p&gt;Just wanted to wish all our customers and friends a very &lt;b&gt;Happy Holidays!&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s been a great year for Random Ideas, our best yet!  And we&amp;#8217;re thrilled and excited  to welcome 2009 and the wonderful possibilities that it holds!  We&amp;#8217;re fortunate to have such awesome customers, and to be able to spend our time helping make a positive impact on people&amp;#8217;s lives.&lt;/p&gt;
&lt;p&gt;We&amp;#8217;re particularly thankful to be bringing especially large donations to our charities this year.  We realize that with the economy not doing as well as it should be, it can be hard to find the resources to donate to charity.  So we&amp;#8217;re very glad to be able to do that this year.&lt;/p&gt;
&lt;p&gt;If you find yourself similarly blessed, I encourage you to also take a moment and try to give with your heart to those who need it.&lt;/p&gt;
&lt;p&gt;Again, thanks for the great year!  We look forward to bringing you more great products in 2009!&lt;/p&gt;
&lt;p&gt;&amp;#8212;&lt;/p&gt;
&lt;p&gt;Jiva DeVoe&lt;/p&gt;
&lt;p&gt;Chief Software Craftsman&lt;/p&gt;
&lt;p&gt;Random Ideas, &lt;span class="caps"&gt;LLC&lt;/span&gt;&lt;/p&gt;</description>
      <guid>http://www.random-ideas.net/posts/7</guid>
    </item>
    <item>
      <title>Mac Developer Roundtable on the iPhone SDK</title>
      <description>&lt;p&gt;Back in November, Scotty over at the Mac Developer Network invited me to join him on his Mac Developer Roundtable podcast to talk about the iPhone &lt;span class="caps"&gt;SDK&lt;/span&gt;.    I&amp;#8217;m pleased to say it&amp;#8217;s &lt;a href="http://www.mac-developer-network.com/podcasts/macdeveloperroundtable/index.html"&gt;up now&lt;/a&gt; !  So head on over there and subscribe!  We talk about all kinds of good stuff!&lt;/p&gt;</description>
      <guid>http://www.random-ideas.net/posts/8</guid>
    </item>
    <item>
      <title>Automated UI Testing for iPhone</title>
      <description>&lt;p&gt;Really awesome UI testing article over at &lt;a href="http://www.cocoawithlove.com"&gt;Cocoa with Love&lt;/a&gt; today.&lt;/p&gt;
&lt;p&gt;From the &lt;a href="http://cocoawithlove.com/2008/11/automated-user-interface-testing-on.html"&gt;article:&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;#8220;Automated testing of application user interfaces can be tricky since user interfaces are designed for use by humans not automated tools. The iPhone is particularly challenging since existing tools that aid user interface testing on the Mac are not available. This post will show you a way to run automated, scripted tests on an iPhone app&amp;#8217;s user interface.&amp;#8221;&lt;/p&gt;</description>
      <guid>http://www.random-ideas.net/posts/9</guid>
    </item>
    <item>
      <title>Updates! Updates! Updates!</title>
      <description>&lt;p&gt;Just a little heads up&amp;#8230; a new Edibles and a new What&amp;#8217;s Goin Down just popped up in the App Store.  Just some bug fixes really.  We have some really &lt;span class="caps"&gt;REALLY&lt;/span&gt; cool stuff coming for those apps that I can&amp;#8217;t talk about yet&amp;#8230; but we wanted to take a brief side jump to fix a couple of minor issues while you guys are waiting for the good stuff!&lt;/p&gt;
&lt;p&gt;We also put up a new iZen Garden a week or so ago too!  The new iZen Garden is &lt;span class="caps"&gt;LOADED&lt;/span&gt; with new features including an additional 50(!!!) new elements you can place, and 4 more relaxation sound tracks!  The new elements include things like a &lt;span class="caps"&gt;TON&lt;/span&gt; of new fossils, shells, and totally new: Fall leaves!&lt;/p&gt;
&lt;p&gt;&lt;a href="img:/Blog/ArticleImages/33/ss1.jpg"&gt;iZen Garden&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Figure: *&lt;/strong&gt; &lt;strong&gt;iZen Garden&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We&amp;#8217;re excited because this is the best iZen Garden yet!  It&amp;#8217;s got a few other new features too, but you have to &lt;a href="http://www.random-ideas.net/Software/iZenGarden"&gt;download it to see em!&lt;/a&gt;  So what are you waiting for?&lt;/p&gt;
&lt;p&gt;Finally, we opened a shop on &lt;a href="http://www.cafepress.com/RandomIdeasSW"&gt;Cafe Press&lt;/a&gt; where you can buy iZen Garden T-Shirts with your favorite Daily Zen saying on it!  If yours isn&amp;#8217;t up there, &lt;a href="mailto:feedback@random-ideas.net"&gt;send us an email&lt;/a&gt; and tell us what saying you&amp;#8217;d like, and maybe we can accommodate you.&lt;/p&gt;</description>
      <guid>http://www.random-ideas.net/posts/10</guid>
    </item>
    <item>
      <title>I love emails like that!</title>
      <description>&lt;p&gt;I won&amp;#8217;t quote the email directly, because I haven&amp;#8217;t asked permission, but I just had to share this.&lt;/p&gt;
&lt;p&gt;I got an email tonight from a customer using Edibles telling me how he&amp;#8217;s using it to track the fat in his foods to help him lower his blood sugar and avoid diabetes.  He said his family has a history of diabetes, and as a result, he tracks his blood sugar levels.  He said that after just one day of using Edibles to track his food, and thus adjusting his diet, he&amp;#8217;s been able to lower his blood sugar by 20 points!&lt;sup class="footnote" id="fnr1"&gt;&lt;a href="#fn1"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;That&amp;#8217;s awesome!  That&amp;#8217;s what this is all about &amp;#8211; right there!  That&amp;#8217;s the dharma.  Enabling people to make positive changes in their lives either through improved diet, or meditation, or whatever.&lt;/p&gt;
&lt;p&gt;As a side, related note.  It felt &lt;span class="caps"&gt;GREAT&lt;/span&gt; making out our charity checks this quarter.  Thanks to strong app store sales, we were really able to contribute significantly back to the community.  Thank you to our customers for making this all possible.&lt;/p&gt;
&lt;p&gt;.. &lt;sup class="footnote" id="fnr1"&gt;&lt;a href="#fn1"&gt;1&lt;/a&gt;&lt;/sup&gt; Disclaimer: Don&amp;#8217;t know if I have to say this or not.  Clearly, he lowered his blood sugar level by changing his diet.  Edibles enabled him to track his food in conjunction with changing his diet.  Users should consult a physician before beginning a diet plan, in particular when diabetes is involved.&lt;/p&gt;</description>
      <guid>http://www.random-ideas.net/posts/11</guid>
    </item>
    <item>
      <title>What's Goin Down!?!</title>
      <description>&lt;p&gt;Hey there!  I&amp;#8217;m excited to announce we&amp;#8217;ve released another new iPhone app!  This one is called &lt;a href="http://www.random-ideas.net/Software/GoinDown"&gt;What&amp;#8217;s Goin Down&lt;/a&gt; and it&amp;#8217;s a pocket network monitor for network administrators.&lt;/p&gt;
&lt;p&gt;Years ago, I made my living writing network apps, and worked for a network bandwidth company called Opnix.  It was the dot-com days, and we had an awesome datacenter that hosted our customer&amp;#8217;s servers.  Anyway, as part of that, I got to know a lot about networking, and spent a lot of time with network admins.  When I saw the iPhone, I thought &amp;#8220;Wow, what a perfect little portable network monitoring platform!&amp;#8221;  So I put together &amp;#8220;What&amp;#8217;s Goin Down&amp;#8221;.&lt;/p&gt;
&lt;p&gt;The premise is simple, you configure your &lt;span class="caps"&gt;TCP&lt;/span&gt; based servers in What&amp;#8217;s Goin Down, then, whenever you want to check the status of your servers, you fire up the app, and it goes out and connects to each of them.  If it&amp;#8217;s successful, it shows a green checkmark; if not, it shows a red exclamation mark. You can configure your web server, your mail server, your ssh server etc.&lt;/p&gt;
&lt;p&gt;Sure, there&amp;#8217;s things like Nagios and so forth, which will happily send you email alerts and things.  Think of &amp;#8220;What&amp;#8217;s Goin Down&amp;#8221; as just another tool in the network admin&amp;#8217;s arsenal.&lt;/p&gt;</description>
      <guid>http://www.random-ideas.net/posts/13</guid>
    </item>
    <item>
      <title>Mac Developer Roundtable</title>
      <description>&lt;p&gt;Just a heads up&amp;#8230; this past week I had the great honor of participating in the &lt;a href="http://www.mac-developer-network.com/podcasts/macdeveloperroundtable/index.html"&gt;Mac Developer Roundtable&lt;/a&gt; podcast hosted over at the Mac Developer Network.  The topic was developer groups and the discussion was excellent!  Go download it and check it out!  It&amp;#8217;s filled with a whole bunch of tips and information about participating in, and starting user/developer groups.&lt;/p&gt;</description>
      <guid>http://www.random-ideas.net/posts/12</guid>
    </item>
    <item>
      <title>MacSB on Privacy</title>
      <description>&lt;p&gt;Just a heads up &amp;#8211; I had the great privilege of being invited to contribute to the &lt;a href="http://www.mac-developer-network.com/podcasts/macsb/episode9/index.html"&gt;Mac SB Podcast&lt;/a&gt; this month on Privacy.  It was great fun, and now it&amp;#8217;s been posted.  So, if you care to hear my horrible radio voice talk about customer privacy and things&amp;#8230; go check it out.&lt;/p&gt;</description>
      <guid>http://www.random-ideas.net/posts/14</guid>
    </item>
    <item>
      <title>So so soooo busy...</title>
      <description>&lt;p&gt;Wow, it&amp;#8217;s been a tremendous month, almost 2, since the App store opened.  In that time we released another app &lt;a href="http://www.random-ideas.net/Software/Edibles"&gt;Edibles&lt;/a&gt; !  And we released a new version of &lt;a href="http://www.random-ideas.net/Software/iZenGarden"&gt;iZen Garden&lt;/a&gt; .&lt;/p&gt;
&lt;p&gt;The new iZen Garden has been a tremendous success! With excellent reviews all around.  The most popular new feature seems to be the relaxation sound tracks.  We&amp;#8217;re really glad we kept that feature in.  It &lt;span class="caps"&gt;ALMOST&lt;/span&gt; went on the cutting room floor.  But we pushed a little harder and got it in there.&lt;/p&gt;
&lt;p&gt;Edibles has been received very well as well!  &lt;span class="caps"&gt;TUAW&lt;/span&gt; &lt;a href="http://www.tuaw.com/2008/08/16/first-look-edibles/"&gt;gave us an excellent review&lt;/a&gt; and it was even picked up on &lt;a href="http://www.macworld.com/article/135066/2008/08/edibles.html"&gt;MacWorld.com&lt;/a&gt; .  Exciting times!  Oh! And our charity for Edibles will be &lt;a href="http://www.feedthechildren.org"&gt;Feed The Children&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We&amp;#8217;ve got even more in the queue so keep watching us!  We have new updates coming for our existing apps that I know you guys will be thrilled about, and more new apps being built too!  So thank you to all our customers for your support and feedback!&lt;/p&gt;</description>
      <guid>http://www.random-ideas.net/posts/15</guid>
    </item>
    <item>
      <title>iZen Garden, Tiles, App Store FUN!</title>
      <description>&lt;p&gt;In case you&amp;#8217;ve been living under a rock&amp;#8230; Apple released the iPhone 3g last week.  My wife and I stood outside the San Tan Village Apple store for a good 4 hours last friday to buy her one.  Thankfully, the weather cooperated and it was a nice pleasant morning.&lt;/p&gt;
&lt;p&gt;As part of all this, we released two apps for the iPhone &amp;#8211; &lt;a href="http://www.random-ideas.net/Software/iZenGarden"&gt;iZen Garden&lt;/a&gt; , and &lt;a href="http://www.random-ideas.net/Software/Tiles"&gt;Tiles&lt;/a&gt; .&lt;/p&gt;
&lt;p&gt;Both apps are awesome fun, and you should definitely check them out!&lt;/p&gt;
&lt;p&gt;Tiles is a sliding tile (15 puzzle) I developed on a spur of the moment. I had been thinking about how nicely the touch screen on the iPhone would lend itself to sliding things around in a grid.  During research on the project, I discovered that there&amp;#8217;s actually quite a bit of history behind &lt;a href="http://en.wikipedia.org/wiki/N-puzzle"&gt;the 15 puzzle&lt;/a&gt; .  I had no idea it had been invented in the 1800s!&lt;/p&gt;
&lt;p&gt;Anyway, Tiles let&amp;#8217;s you do more than just a 4&amp;#215;4 grid, you can do a 3&amp;#215;3 if you&amp;#8217;re a wimp, or if you&amp;#8217;re a real manly man, you can attempt a 6&amp;#215;6 puzzle.  I&amp;#8217;d argue that these are every bit as hard as a Rubik&amp;#8217;s cube to solve&amp;#8230; at least for my meager puzzle solving abilities.&lt;/p&gt;
&lt;p&gt;iZen Garden is a portable Zen Garden in your iPhone.  If you don&amp;#8217;t know what a Zen Garden is, look it up over at &lt;a href="http://en.wikipedia.org/wiki/Zen_garden"&gt;wikipedia&lt;/a&gt; .  It was the first app I really thought seriously about developing on the iPhone.  It seemed like a logical way to &amp;#8220;do the dharma&amp;#8221; in iPhone development.&lt;/p&gt;
&lt;p&gt;We were thrilled that iZen Garden was chosen as a Staff Favorite!  That made us very proud!  And also was picked up at &lt;a href="http://apple20.blogs.fortune.cnn.com/2008/07/10/a-first-peek-inside-the-iphone-app-store/"&gt;CNNMoney&lt;/a&gt; and &lt;a href="http://www.siliconrepublic.com/news/article/10997/digital-life/apple-itunes-app-store-now-open"&gt;Silicon Republic&lt;/a&gt;  And on Monday, Erica Sadun was kind enough to give us a pretty positive review over at &lt;a href="http://www.tuaw.com/2008/07/15/first-look-izen-garden/"&gt;&lt;span class="caps"&gt;TUAW&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We also decided we would take 5% of our profits from iZen Garden and donate it to a Tibetan charity, so we&amp;#8217;re spreading the dharma in two ways!&lt;/p&gt;
&lt;p&gt;We plan to do the same with Tiles, but have not yet settled on a charity for it.&lt;/p&gt;
&lt;p&gt;All that said, we are really excited for the potential that the App store opens up, and really looking forward to making more apps for it.  It seems like every time I finish an app, I come up with 4 more ideas!&lt;/p&gt;
&lt;p&gt;So go check out the apps! And watch this space for more in the future!&lt;/p&gt;</description>
      <guid>http://www.random-ideas.net/posts/16</guid>
    </item>
    <item>
      <title>Cool Graph Framework for Cocoa</title>
      <description>&lt;p&gt;Just a little note to send kudos to Snowmint Creative Solutions for their &lt;a href="http://developer.snowmintcs.com/frameworks/sm2dgraphview/"&gt;SM2DGraph Framework&lt;/a&gt; , which is an excellent open source graphing solution.&lt;/p&gt;</description>
      <guid>http://www.random-ideas.net/posts/18</guid>
    </item>
    <item>
      <title>C99 Considered Harmful</title>
      <description>&lt;p&gt;Posting this just so if someone else runs into the problem they&amp;#8217;ll hopefully find this and find the solution.&lt;/p&gt;
&lt;p&gt;I like to use OCUnit:http://developer.apple.com/documentation/DeveloperTools/Conceptual/UnitTesting/Articles/CreatingTests.html for unit testing my Objective-C code. PowerCard has unit tests using this, and I was starting a new project, and set it up, and wrote some unit tests.  I started to see the following error:&lt;/p&gt;
syntax error before &amp;#8216;typeof&amp;#8217;
&lt;p&gt;This persisted even with the simplest of test cases like:&lt;/p&gt;
-(void)testSomething;
{
STAssertEqualObjects(@&amp;quot;foo&amp;quot;, @&amp;quot;bar&amp;quot;, nil);
}
&lt;p&gt;Seemed to have something to do with the STAssertEqualObjects macro.&lt;/p&gt;
&lt;p&gt;Anyway, after much digging and trying to figure out what the problem was.  I discovered it was because I had enabled the &amp;#8220;C99&amp;#8221;  setting in the C Language Dialect setting of my target instead of using &amp;#8220;GNU99&amp;#8221;.  I have wondered for a long time what the difference was.  I guess now I know I should just use GNU99 for everything.&lt;/p&gt;</description>
      <guid>http://www.random-ideas.net/posts/17</guid>
    </item>
    <item>
      <title>Movies and the Software Industry</title>
      <description>&lt;p&gt;One of the weblogs that I read relatively regularly belongs to &lt;a href="http://www.toolshed.com/blog/"&gt;Andy Hunt&lt;/a&gt; of &lt;a href="http://www.pragmaticprogrammer.com/ppbook/index.shtml"&gt;Pragmatic Programmers&lt;/a&gt;&lt;br /&gt;
 fame. &lt;sup class="footnote" id="fnr1"&gt;&lt;a href="#fn1"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.toolshed.com/blog/SoftwareDevelopment/CmmMovies.html,v"&gt;Last week he had an article about how writing software is similar to making hit&lt;/a&gt; movies. I have actually thought this myself on several occasions.  It occurred to me originally while watching a documentary on how a particular movie was made (I think it might have been one of the Lord Of The Rings trilogy).  While watching this documentary, I was struck by how all of these people with different specific talents were able to come together to produce a single unified work that was every bit as complex as some major software projects, yes was cohesive and seemless.&lt;/p&gt;
&lt;p&gt;Now Andy makes the point that it is just as impossible to create a machine to consistently crank out hit movies as it is impossible to create a machine to consistently crank out perfect, on time, projects. I agree with him up to a point, but it forces me to ask the question: &amp;#8220;If this is true, then why does it seem that directors like Steven Spielberg, are able to crank out outstanding movies year after year with very little deviation in quality?&amp;#8221;&lt;/p&gt;
&lt;p&gt;The reality is that they do manage to create hit movies relatively consistently. It does not appear that there is a specific formula that they use, but it does appear to be the result of an extremely talented but small pool of people (specific directors, writers, and actors).&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m not sure that I&amp;#8217;m saying that what Andy said here is wrong. I agree with him that if you remove specific resources from the project or movie it will go downhill fast. But I guess that I&amp;#8217;m asking the question, what can we in the software development field learn from the movie industry? Do we all need a Steven Speilberg on our projects? Or is it even as simple as organizational structures such as having directors, story boarders, etc. who are extremely good at what they do and limit their work to their specific area of expertise, and having these overseen by a director with the ability to unify these diverse parts into something cohesive?&lt;/p&gt;
&lt;p&gt;.. &lt;sup class="footnote" id="fnr1"&gt;&lt;a href="#fn1"&gt;1&lt;/a&gt;&lt;/sup&gt; Coincidentally, if you ever get a chance, &amp;#8220;The Pragmatic Programmer&amp;#8221; is an outstanding book, and I recommend it to every one I know. Additionally, for any developers that work for me, the first thing that I do on their first day, is issue them a copy of this book.&lt;/p&gt;</description>
      <guid>http://www.random-ideas.net/posts/5</guid>
    </item>
    <item>
      <title>The Fallacy of 'Feature Complete'</title>
      <description>&lt;p&gt;Or, Why freezing is good for popscicles, but not code.&lt;/p&gt;
&lt;p&gt;Someone tell me, what does &amp;#8220;Feature complete&amp;#8221; mean anyway?  Furthermore, define &amp;#8220;Code Freeze&amp;#8221; for me too.&lt;/p&gt;
&lt;p&gt;Project managers use these terms like a warm fuzzy blanket to give them security when those cold hard release deadlines are rearing their ugly heads. But my question is, until you actually have a fully releasable product, how can you possibly even pretend to say your product is &amp;#8220;Feature complete&amp;#8221; or in a &amp;#8220;Code Freeze&amp;#8221;?  Typically, they like to apply these terms as the application is going into a QA code-n-fix stage.&lt;/p&gt;
&lt;p&gt;Isn&amp;#8217;t the definition of releaseable software, software which has been 100% tested and verified as working?&lt;/p&gt;
&lt;p&gt;Can you, as a developer, honestly say that any part of your app is &amp;#8220;complete&amp;#8221; before it is 100% tested and verified as working? And if you &lt;strong&gt;can&lt;/strong&gt; say your feature is &amp;#8220;complete&amp;#8221; before it&amp;#8217;s 100% tested and verified as working, I for one sure as heck don&amp;#8217;t want you working on any of my products or even on anything I&amp;#8217;m going to spend my hard earned cash on!&lt;/p&gt;
&lt;p&gt;This is simply nonsense! Anyone who uses such terms should be exposed as the software charlatan that they are! If they refuse to relent, they must be beaten. If physical violence is frowned upon in your organization, the fool must be fired. If upper management is goofy enough to use such terms themselves, then run away! This is a company that wants you to lie to them. Be prepared for them to lie to you too.&lt;/p&gt;
&lt;p&gt;&amp;#8220;But we need some kind of milestone before release to know if we&amp;#8217;re going to hit it or not!&amp;#8221; I hear you say. Ok, I can accept that. But the problem is that these particular measurements don&amp;#8217;t really mean anything. Any number of serious bugs could still be lurking in that code. And any of them could be enough to blow you past your release.&lt;/p&gt;
&lt;p&gt;All that said, I would just be blowing a lot of hot air if I didn&amp;#8217;t make some sort of recommendation for a better way to do it.&lt;/p&gt;
&lt;p&gt;I think the Xp guys are onto something when they measure their software via automated acceptance tests. I believe that software completeness, and ultimately software quality can &lt;strong&gt;only&lt;/strong&gt; be measured as a boolean condition. It either works or it doesn&amp;#8217;t. One or Zero. And if it works, then it can be released. Any state other than 100% confirmed working is &amp;#8220;not working&amp;#8221;-not 99% or 75% &amp;#8211; 0%. If you need more granularity than that, you need to ask for less. That means &amp;#8220;small releases.&amp;#8221;&lt;/p&gt;
&lt;p&gt;This is the only way to deliver predictably.&lt;/p&gt;</description>
      <guid>http://www.random-ideas.net/posts/3</guid>
    </item>
    <item>
      <title>iCal.py</title>
      <description>&lt;p&gt;Apple doesn&amp;#8217;t document the &lt;span class="caps"&gt;API&lt;/span&gt; for interfacing with iCal, but it &lt;br /&gt;
does save it&amp;#8217;s files as &lt;a href="http://www.ietf.org/rfc/rfc2445.txt"&gt;industry standard iCalendar &lt;br /&gt;
files&lt;/a&gt; .  &lt;br /&gt;
I went looking recently for a python module to interface with iCal, &lt;br /&gt;
and couldn&amp;#8217;t find one.  But I &lt;span class="caps"&gt;DID&lt;/span&gt; find &lt;a href="http://www.macdevcenter.com/pub/a/mac/2003/09/03/rubycocoa.html"&gt;Rod Schmidt&amp;#8217;s excellent article&lt;br /&gt;
for doing the same thing with Ruby.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So, naturally, I ported his solution to Python!  It seems to even work!&lt;/p&gt;
&lt;p&gt;Anyway, &lt;span class="caps"&gt;YMMV&lt;/span&gt;, no warranty implied.  Do with it as you see fit.&lt;/p&gt;
&lt;p&gt;&lt;a href="/Software/iCal_Module"&gt;Download&lt;/a&gt;&lt;/p&gt;</description>
      <guid>http://www.random-ideas.net/posts/2</guid>
    </item>
    <item>
      <title>iLife '04</title>
      <description>&lt;p&gt;I bought &lt;a href="http://www.apple.com/ilife/"&gt;iLife &amp;#8217; 04&lt;/a&gt; this weekend.  I was excited to get the new features for iPhoto such as photo sharing, ratings, and smart groups.  I was also excited to try out garage band.  The truth is I have no idea how to play any instruments, and I have no musical talent whatsoever.    I had heard that a garage band made it really easy to create music.  So I thought it would be fun to experiment with it.  Generally speaking, I&amp;#8217;ve been very pleased with what I&amp;#8217;ve got.&lt;/p&gt;
&lt;p&gt;I am amazed at how it simple software tool enables me and my family to be so much more creative than we might be without it.  With iLife, we&amp;#8217;re able to pursue many interests that would normally be outside of our reach.  Things like digital photography, music, movie making, etc..  I&amp;#8217;ll write more about this in another article after I had an opportunity to contemplate the impact that this is having on of lives.  For now, I just wanted to point out an interesting thought that I had while I was standing in line at the Apple Store.&lt;/p&gt;
&lt;p&gt;After I paid my money for the software, the checker at the counter read off my rights as a user.  The gist of which were, that once I&amp;#8217;d opened the package I could no longer return the software.  So in other words if, once I opened the package I determined that the software was so buggy or so horrible that it was completely unusable, I would have no opportunity to take the software back and get my money back.  For a simple $50 piece of software, this isn&amp;#8217;t that big a deal.  But really the same policies apply whether I&amp;#8217;m purchasing iLife for $50, or Photoshop for $500.&lt;/p&gt;
&lt;p&gt;So it occurred to me, why on earth do people buy software under those kinds of conditions?&lt;/p&gt;
&lt;p&gt;Now I know that part of the reason that the software companies do this is to cut down on the impact of piracy.  A user could purchase the software, get the serial number, make a copy of the CD, and then return it, and continue to use the software using the copied CD and the serial number.  A user could just as easily do this with DeVoeSquared Software. And I imagine, there are some people who have done that.  However, I would like to think there are more honest people out there than there are dishonest people.  The ability to return software that you decide you don&amp;#8217;t want should reduce the barrier to purchasing that software.&lt;/p&gt;
&lt;p&gt;What&amp;#8217;s the conclusion here?  I don&amp;#8217;t know.  Still noodling on this one.&lt;/p&gt;</description>
      <guid>http://www.random-ideas.net/posts/1</guid>
    </item>
  </channel>
</rss>
