<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
   <channel>
      <title>Jonathan Saggau&apos;s Blog</title>
      <link>http://www.jonathansaggau.com/blog/</link>
      <description>This Vehicle Powered by 100% Pure Clean-Burning Caffeine</description>
      <language>en</language>
      <copyright>Copyright 2010</copyright>
      <lastBuildDate>Wed, 04 Aug 2010 17:29:40 -0500</lastBuildDate>
      <generator>http://www.sixapart.com/movabletype/?v=3.2</generator>
      <docs>http://blogs.law.harvard.edu/tech/rss</docs> 

            <item>
         <title>I&apos;m giving four (!) classes at iPad/iPhone DevCon</title>
         <description><![CDATA[<a href="http://www.iphonedevcon.com"><img src="http://www.jonathansaggau.com/blog/images/saggau_speakerbadge.png" alt="saggau_speakerbadge.png" border="0" width="123" height="257" hspace="16" align="right" /></a>
<p>The <a href="http://www.iphonedevcon.com">iPad/iPhone DevCon</a> will be held in San Diego from September 27 through 29 and I've been invited to give four classes!  If you put my last name, SAGGAU, in when you register, you will automatically save a hundred bucks ($ 100.00) -- and it's combinable with their other promotional discounts, like Early Bird Specials and so-on.</p>
<p>The conference program at iPhone/iPad DevCon includes more than 40 full-day workshops, half-day workshops and <a href="http://www.iphonedevcon.com/classes.html#2">technical classes</a> over three days &#8211; in addition to keynotes by <a href="http://twitter.com/bmf">Mike Lee</a> and <a href="http://twitter.com/aaronhillegass">Aaron Hillegass</a>.</p>
<h2>CLASS DATES AND TIMES</h2>
My courses are currently scheduled as follows:
<br />
<strong>103  Optimizing Data Caching for iPhone App Responsiveness</strong>
<br />
Tuesday, Sept. 28, 8:30 &mdash; 9:45 am
<br /><br />
<strong>203  Is It Real or Is It Virtual? Augmented Reality on the iPhone</strong> with Jonathan Blocksom (most recently of Google)
<br />
Tuesday, Sept. 28, 11:15 am &mdash; 12:30 pm
<br /><br />
<strong> 
303  TANSTAAFL: Using Open Source iPhone UI Code</strong>
<br />
Tuesday, Sept. 28, 2:00 &mdash; 3:15 pm
<br /><br />
<strong>403 Connecting Apple's iPhone to Google's Cloud</strong> with Noah Gift (of AT&T Interactive)
<br />
Tuesday, Sept. 28, 3:45 &mdash; 5:00 pm

]]></description>
         <link>http://www.jonathansaggau.com/blog/2010/08/im_giving_four_classes_at_ipad.html</link>
         <guid>http://www.jonathansaggau.com/blog/2010/08/im_giving_four_classes_at_ipad.html</guid>
         <category>Troublesome Noise</category>
         <pubDate>Wed, 04 Aug 2010 17:29:40 -0500</pubDate>
      </item>
            <item>
         <title>Another iPhone dev looks at the Android</title>
         <description><![CDATA[About a year ago, I used a G1 dev phone as my primary phone for a few weeks.  It was okay, had a lot of potential, but didn't do it for me like the iPhone did at the time.  I remain curious how the other half lives, so I will soon receive a Nexus One from a good friend of mine via UPS today.  Thanks, dude!  You know who you are.
<br /><br />
I have to mention that I'm apprehensive.  Playing with my neighbor's new Sprint Evo briefly was rather disappointing; Sprint bloatware aside, from a usability and UI standpoint the version of Android on the Evo (2.1, I believe) needs serious detail work to pull even with iOS 2.0.
<br /><br />
I find myself flummoxed as to how anyone manages to use email on the thing.  One can't forward just selected parts of an email (no kidding, all or nothing) and responding to an email inline is not supported.   In both of the two (!) email apps that come on the phone (one for Gmail and one for, um, other email), once received, email text is not malleable.  I love to read the comparisons of Android and iPhone, am glad that Apple has a solid competitor, and am excited to use Android again (and possibly develop software for it) on fast hardware with their latest OS, but right now I'm thinking "make email work, then we'll talk" or, as my neighbor puts it, "This is 2010, right?  Doesn't Google know how to do email?"
<br /><br />
Stay tuned for more Android / iOS comparisons in the coming weeks.  I'm excited to dig in.]]></description>
         <link>http://www.jonathansaggau.com/blog/2010/08/another_iphone_dev_looks_at_th.html</link>
         <guid>http://www.jonathansaggau.com/blog/2010/08/another_iphone_dev_looks_at_th.html</guid>
         <category>Technology Hate</category>
         <pubDate>Wed, 04 Aug 2010 16:58:56 -0500</pubDate>
      </item>
            <item>
         <title>DIY iPhone 4 microsim adapter</title>
         <description><![CDATA[When you brought your sexy new iPhone 4 home, you might have also noticed that one of these adorable little microsim doodads came along for the ride.  The cute little guy won't so much fit into your old phone.
<br><br>
<img src="http://www.jonathansaggau.com/blog/images/microsim1.jpg" alt="microsim1.jpg" border="0" width="323" height="206" />
<br><br>
Luckily, the array of contacts on the microsim are the same as those on the old school sim, they just live inside a smaller slab of plastic.  You could buy a microsim adaptor online for about 10 bucks shipped, but in a pinch you can make your own adapter with  heavy card stock, a razor blade and some patience.  

First, cut a piece of card stock to the shape of the old school sim.  You can test fit it in the carrier of your old phone.  It can move around a little, but should fit at least as well as your old sim card.
<br><br>
<img src="http://www.jonathansaggau.com/blog/images/microsim2.jpg" alt="microsim2.jpg" border="0" width="407" height="356" />
<br><br>
Then place your microsim on the card stock equidistant from the three sides that don't have that little notch.  The line drawing below shows the proper location.
<br><br>
<img src="http://www.jonathansaggau.com/blog/images/microsim3.jpg" alt="microsim3.jpg" border="0" width="534" height="563" />
<br><br>
<img src="http://www.jonathansaggau.com/blog/images/microsim4.jpg" alt="microsim4.jpg" border="0" width="737" height="711" />
<br><br>
Cut around the microsim.  Work slowly so you get a nice snug fit.
<br><br>
<img src="http://www.jonathansaggau.com/blog/images/microsim5.jpg" alt="microsim5.jpg" border="0" width="410" height="507" />
<br><br>
When you're finished, the sim adaptor should sit in the old carrier sort of like this.  Make sure all of the little bits of card stock have been trimmed away so you don't gum up the works inside of your old phone.
<br><br>
<img src="http://www.jonathansaggau.com/blog/images/microsim6.jpg" alt="microsim6.jpg" border="0" width="323" height="407" />
<br><br>
Slide it into your old phone.
<br><br>
<img src="http://www.jonathansaggau.com/blog/images/microsim7.jpg" alt="microsim7.jpg" border="0" width="678" height="490" />
<br><br>
...and Robert is your father's brother.  It doesn't have to be perfect.  As you can see from the size of the six contacts on both the sim and the microsim pictures, there is plenty of room for error.
<br><br>
<img src="http://www.jonathansaggau.com/blog/images/microsim8.jpg" alt="microsim8.jpg" border="0" width="678" height="796" />
]]></description>
         <link>http://www.jonathansaggau.com/blog/2010/06/diy_iphone_4_microsim_adapter.html</link>
         <guid>http://www.jonathansaggau.com/blog/2010/06/diy_iphone_4_microsim_adapter.html</guid>
         <category></category>
         <pubDate>Sat, 26 Jun 2010 00:30:42 -0500</pubDate>
      </item>
            <item>
         <title>Fightin&apos; off them pirates #protip</title>
         <description><![CDATA[Protip: set up a Google alert for the name of your app and, if your app is particularly popular, the name of your app + "crack" and you'll occasionally find a site with a cracked version of your app for download, often under the guise of some form of public service to promote "try before you buy."  
<br><br>
Each and every time I've caught someone pirating any application I've been involved with, something similar to the following has been sent to their domain registrar and to whatever contact is available on their whois record as well as through any contact means that they choose to put on their site.]]></description>
         <link>http://www.jonathansaggau.com/blog/2010/06/fightin_off_them_pirates_proti.html</link>
         <guid>http://www.jonathansaggau.com/blog/2010/06/fightin_off_them_pirates_proti.html</guid>
         <category></category>
         <pubDate>Tue, 22 Jun 2010 14:39:50 -0500</pubDate>
      </item>
            <item>
         <title>360idev v3.0</title>
         <description><![CDATA[I'm giving two talks this time!  One on using open source UI that closely resembles those of Apple's private API and another on Augmented Reality with Jonathan Blocksom.  This will make it three in a row for me speaking at this conference and it's gonna be awesome again.  Clear your calendar for April 11-14 and head on over to <a href="http://www.360idev.com/">360idev.com</a> and register.
<br /><br />

o There are fewer than 20 early (Cheap) tickets left for 360|iDev. Register now, save $100 and get the same awesome content for a little less coin. Act fast, these last tickets won't last. When they're gone, the regular price of $599 kicks in.
<br /><br />
o We've got some awesome keynoters lined up (Mike Lee and David Whatley to name two), they'll be worth the price of admission alone!
<br /><br />
o Don't miss sessions from community leaders like Marcus Zarra, Brent Simmons, Joe Pezzillo, and Henry Balanon to name a few. You're not going to find this many awesome speakers under one roof anywhere!
<br /><br />
o Don't miss the parties! Get your room at the Marriott San Jose (bit.ly/360idevhotel) before they're gone! The parties WILL be there after we leave Ebay! 
<br /><br />
o Check out the Schedule, subscribe in iCal to stay up to date!!  http://360idev.com/schedule]]></description>
         <link>http://www.jonathansaggau.com/blog/2010/01/360idev_v30.html</link>
         <guid>http://www.jonathansaggau.com/blog/2010/01/360idev_v30.html</guid>
         <category></category>
         <pubDate>Tue, 12 Jan 2010 16:35:18 -0500</pubDate>
      </item>
            <item>
         <title>They tell me the book is out</title>
         <description><![CDATA[I have never walked into a book store and been able to pick up a book with my name on it.  Pretty soon, though...  There is lots of awesomeness in this book and 1/12 of it is from me.  

<br />
<br />

<iframe src="http://rcm.amazon.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=jonathansagga-20&o=1&p=8&l=as1&m=amazon&f=ifr&md=10FE9736YVPPT7A0FBG2&asins=1430224037" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>


]]></description>
         <link>http://www.jonathansaggau.com/blog/2009/11/they_tell_me_the_book_is_out.html</link>
         <guid>http://www.jonathansaggau.com/blog/2009/11/they_tell_me_the_book_is_out.html</guid>
         <category></category>
         <pubDate>Thu, 12 Nov 2009 18:55:49 -0500</pubDate>
      </item>
            <item>
         <title>My Deck for 360idev</title>
         <description><![CDATA[Thanks to all who attended my talk at <a href="http://www.360idev.com/">360idev</a>.  I think it went rather well and I am grateful to all who attended; the audience makes the talk.  <a href="http://jonathansaggau.com/Saggau360Presentation.zip">Here</a> are the slides and the sample code as promised.  Please read the readme file.
<br />
<br />
I'll also take some time on the plane home tomorrow night to make versions of this sample code without blocks for those who like to kick it old school.  I'll post those here as soon as I can.
<br />
<br />
UPDATE: I've changed the last example to remove the blocks requirement for those who wish to avoid them.  Same download location <a href="http://jonathansaggau.com/Saggau360Presentation.zip">here</a> as before.
<br />
<br />
Note: Be aware that the slides are on a pretty slow internet connection.
<br />
]]></description>
         <link>http://www.jonathansaggau.com/blog/2009/09/my_deck_for_360idev.html</link>
         <guid>http://www.jonathansaggau.com/blog/2009/09/my_deck_for_360idev.html</guid>
         <category>Technology Love</category>
         <pubDate>Wed, 30 Sep 2009 00:20:54 -0500</pubDate>
      </item>
            <item>
         <title>360iDev v. 2.0</title>
         <description><![CDATA[
I am speaking at <a href="http://www.360idev.com/">360iDev</a> again!  Last time in San Diego was a blast.  These guys are really good at putting on a conference where everybody talks to everybody else.  It's all about the after parties, man.  Rock Band, which I'm terrible at despite (because of?) music degrees, is great for bringing peeps together.  
<br />
<br />
I'll be talking about making your iPhone application seem fast even when it's maybe kind of not so fast under the covers.  But wait, there's more (Ron Popeil is my hero).  Besides the expected boatload of awesome speakers and lots of iPhone nerds being in attendance at the actual conference, Mobile Orchard and Noel Llopis are doing a 2 day OpenGL ES class just before the conference.  If you're not going to C4 (two conferences back - to back!) like I am, you should totally get the combo discount and go to the class and then the conference.  <a href="http://360idev-blogpost.eventbrite.com/">Register here</a>.  The price goes up by a hundred clams tomorrow night!
<br />
<br />
<a href='#eventvue' onclick='EV.show()'><img src='http://widgets.eventvue.com/discover/badges/attending_360idevdenver_large.png' border='0' /></a><script type='text/javascript' src='http://widgets.eventvue.com/discover/discover.js?event_id=121&role=attending&size=large' id='eventvue_src'></script><noscript>
<br />
<br />
Powered by <a href='http://www.eventvue.com'>EventVue</a></noscript>
]]></description>
         <link>http://www.jonathansaggau.com/blog/2009/08/360idev_v_20.html</link>
         <guid>http://www.jonathansaggau.com/blog/2009/08/360idev_v_20.html</guid>
         <category></category>
         <pubDate>Sat, 29 Aug 2009 14:33:07 -0500</pubDate>
      </item>
            <item>
         <title>iPhone code signing and multiple clients</title>
         <description>If you have to make a certificate request for a new client or &quot;Team,&quot; avoid making your name the same as your current certificate.  If you have more than one &quot;iPhone Developer: Jonathan Saggau&quot; on your keychain, Xcode doesn&apos;t know which to use for code signing.  I used to swap certs in the keychain when switching between clients, but that proved confusing.  Better to use &quot;Jonathan Saggau (BigCO inc)&quot; or some such when making your cert request.  What you&apos;ll see when you do that is a pseudo-random string appendage to your name that allows certificates from different companies or &quot;Teams&quot; to coexist.  While I&apos;m not sure if this is just a change on Apple&apos;s part (maybe they always add the pseudo-random string now; I dunno) or if the (BigCO inc) string brings the magic.  What I do know is that I no longer have to rejigger my keychain every time I want to build an app for client X after working on the app for client Y.  </description>
         <link>http://www.jonathansaggau.com/blog/2009/08/iphone_code_signing_and_multip.html</link>
         <guid>http://www.jonathansaggau.com/blog/2009/08/iphone_code_signing_and_multip.html</guid>
         <category></category>
         <pubDate>Fri, 28 Aug 2009 19:29:17 -0500</pubDate>
      </item>
            <item>
         <title>Stars, man.  Stars.</title>
         <description><![CDATA[<a href="http://videolicious.tv/2009/06/creation-from-destruction/">This</a> reminds me of my favorite final exam question from University. Paraphrased: Trace the calcium in your teeth from the big bang to the end of the universe.  I took some cool classes.  ]]></description>
         <link>http://www.jonathansaggau.com/blog/2009/06/stars_man_stars.html</link>
         <guid>http://www.jonathansaggau.com/blog/2009/06/stars_man_stars.html</guid>
         <category></category>
         <pubDate>Wed, 24 Jun 2009 16:17:24 -0500</pubDate>
      </item>
            <item>
         <title>He&apos;s baaaaaack</title>
         <description><![CDATA[Daniel Lyons appears to have resurrected fake Steve.  Perhaps it's the new liver, maybe it's the new book.  Either way...

<a href="http://fakesteve.blogspot.com/">He's back, bitches</a>.]]></description>
         <link>http://www.jonathansaggau.com/blog/2009/06/hes_baaaaaack.html</link>
         <guid>http://www.jonathansaggau.com/blog/2009/06/hes_baaaaaack.html</guid>
         <category></category>
         <pubDate>Tue, 23 Jun 2009 12:07:09 -0500</pubDate>
      </item>
            <item>
         <title>Useful bash foo with subversion</title>
         <description><![CDATA[<p>I've been a command-line user of <a href="http://subversion.tigris.org/">subversion</a> (svn) for some time and have long enjoyed these little bits of bash foo.  </p>

<h1>Stripping .svn directories</h1>
I often start one-off little test projects in my private slush svn repository and then move them into their own repository for further development as (or if) they grow up.  Sometimes you'll want to get rid of svn's footprints in a working directory.  
<pre>
rm -rfv `find . -name *\.svn`
</pre>
The <em>find . -name *\.svn</em> finds all of the <em>.svn</em> folders that svn uses to track the repository and with the help of those handy back-tics, <em>rm -rv</em> does the recursive removal of svn tracking directories.

<h1>Adding new files</h1>
During that early "making lots of new stuff" phase,  I often generate quite a number of files that need to be added to svn at once.  This is one of those times where having (say) class files in their own subdirectory is nice.  Running this command will <em>svn add</em> every file that isn't currently being tracked by svn in the current directory.
<pre>
svn add `svn stat |grep \? |awk '{print $2}'`
</pre>
Grep finds every <em>svn stat</em> output line that includes a question mark (meaning the item is not currently under version control) and pipes it through <em>awk '{print $2}'</em>, which shows only the text (the filename) from the second column of the svn stat output.  The back-tics and svn add finish the magic.

<h1>Using a Mulligan</h1>
I'll use something similar to the above along with svn revert to rollback a working copy "all the way."  Say you're experimenting in your working directory; you've added a few files, hit a dead end, and want to revert the whole tree as well as delete anything you've added.  In other words, you're looking for a full-on "do over."  Using <em>svn revert --recursive</em> will revert any files that svn is tracking, but will leave anything svn is not tracking alone, so we have to also remove those files.
<pre>
svn revert --recursive && rm -rf `svn stat |grep \? |awk '{print $2}'`
</pre>

<p>As with any other nerd foo, make sure that you really want to do what you're asking for when you use these commands.  These make my life with svn just a little easier.<br />
</p>]]></description>
         <link>http://www.jonathansaggau.com/blog/2009/02/useful_bash_foo_with_subversio.html</link>
         <guid>http://www.jonathansaggau.com/blog/2009/02/useful_bash_foo_with_subversio.html</guid>
         <category>Notes to self</category>
         <pubDate>Tue, 24 Feb 2009 16:31:56 -0500</pubDate>
      </item>
            <item>
         <title>Brain clarity through body hacking and distractions</title>
         <description><![CDATA[<p>or... how I make my brain work more gooder*.  </p>

<p>I've been known to fight foggy brain from time to time.  You know what I mean?  That decidedly uncool feeling of "can't do crap, too tired and dumb" that only seems to creep in when the to do list is longer than my ... um ... arm.  Lately, though that feeling has struck me less and less often and I think I know why.  I've lately zeroed - in on the right set of habits for me.  Every now and again, I'll pick one of the topics below and write a short post expanding the topic.  For now, though, just a list of things that work for me.<br />
</p>]]></description>
         <link>http://www.jonathansaggau.com/blog/2009/02/brain_clarity_through_body_hac.html</link>
         <guid>http://www.jonathansaggau.com/blog/2009/02/brain_clarity_through_body_hac.html</guid>
         <category>Introspection</category>
         <pubDate>Thu, 19 Feb 2009 18:49:52 -0500</pubDate>
      </item>
            <item>
         <title>iPhone responsiveness and memory usage</title>
         <description><![CDATA[I recently answered a question on a private mailing list about how to make a network - based (XML parsing and such) iPhone application more responsive.  I've been encouraged to post it here by a few folks (Thanks, guys!  You know who you are.).  So, I figure "why not?"  Here you go.  (Slightly modified)
<br /><br />
The original question (paraphrased):  I have an iPhone application that downloads XML data from the web, parses it, and loads it all into memory.  I notice that my app is a little sluggish and that it crashes as odd times, probably due to having too much information in memory.  There are other apps that do this kind of thing on the app store and I notice that many of them are more responsive than mine.  How does one make one's "network cloud-based" app more responsive?
<br /><br />
My Answer
<br /><br />
You're running into a few of the more common problems with embedded
programming.  Here are a few little tricks that have helped me in
general (done a little embedded Linux programming, too) and on the
iPhone.
<br /><br />
<h1>Regarding bandwith / data size / responsiveness as a result of downloading data</h1>
You'll be surprised that the actual downloading of anything but pretty
large amounts of data is pretty fast by itself.  The part that is slow
is the stuff that happens before the download even starts.  Edge / 3G
latency sucks and even DNS lookup is really really really (really?)
slow on the iPhone in almost all circumstances AFAICT.  I've found
that strategies that download more data at a time while discarding
unneeded data that you're getting on the fly, rather than making
multiple requests for specific small chunks of data has been a
performance win.  That's a little counter intuitive.
<br /><br />
<h1>Regarding memory</h1>
There is a reason the NSXMLDocument doesn't exist on the iPhone.  You
can get away with throwing a smallish XML tree into memory and go
ahead and do it if it simplifies your life for small data sets, but
the combination of larger XML trees in memory and whatever else
(including UI) you have cached in memory can cause you to hit the
memory ceiling at weird times; that's probably what's happening when
your app crashes.  The app will get terminated if you don't release
memory when you get these memory warnings.  Take a look at apples
"Books" SQLite example.  They're not doing exactly what you're looking
for there (no network code), but the handling of memory works as
they're doing it.  They load data from a SQLite database lazily, but
keep that data in memory until the application closes, until the
owning object is deallocated, or when memory gets scarce.  When the
app gets those fun memory warnings, they save any changed data and
release everything that they can get back out of the database later.
This is similar in theory to the lazy loading of views we've all grown
accustomed to (and that is partly handled for you).  When a view
controller gets a memory warning, its views are released by default if
they don't have a superview, which is why you have to figure out if
the view is still there every time you (re)load it.  Doing something
similar with your XML data by saving it somewhere when you get a
memory warning and releasing the associated data structure, reloading
it piecemeal from disk as needed (be it an SQLite database or
what-have-you) works pretty well and appears to be the recommended
approach.  Ultimately, figuring out how much and which data to put on
"disk" and/or in memory (and when) is the biggest PITA in embedded
programming, but it's also the place where you're going to get the
responsiveness you're looking for.
<a href="http://furbo.org/2008/08/27/dealing-with-memory-loss-the-cleanup/">http://furbo.org/2008/08/27/dealing-with-memory-loss-the-cleanup/</a>
<br /><br />
<h1>Regarding UI responsiveness</h1>
Don't use a lot of subviews and avoid opacity.  Instead draw the views
yourself...  Draw once, if possible.  (
<a href="http://blog.atebits.com/2008/12/fast-scrolling-in-tweetie-with-uitableview/">http://blog.atebits.com/2008/12/fast-scrolling-in-tweetie-with-uitableview/</a>
)
<br /><br />
<h1>Other tricks</h1>
Use Instruments and Shark with the code running ON THE DEVICE to see
how much memory you're using, how much disk access you're doing, and
what is actually going on timing-wise.  Optimize those specific areas
profiling the simulator (faster edit, compile, test cycle).  Rinse (on
the device) and repeat.
<br /><br />
Put breakpoints in memory warning methods and figure out when (and
why) it's happening (again, on the device).  Is it when you download
data, load view A, then view B?  Can you release view A's data when it
goes off the screen to keep the memory footprint from growing?  Do you
need the whole tree for view B?  Can you download it all, dump to
disk, and load lazily?  Blah blah blah.  This stuff can get tricky,
but try the obvious things first.  Find out what is causing the memory
ceiling problem and you're well on your way.  :)
<br /><br />
Using the <a href="http://clang.llvm.org/StaticAnalysis.html">LLVM/Clang static analyzer</a> has saved me a lot of headaches as
well.  It's easy to forget that you have a web view somewhere with a
bunch of cached data floating off screen causing the device to go bork
bork...
<br /><br />
Cache yesterday's data, load, and display it before going out to the
network for today's data.  Use a progress indicator and some other UI
indicator to let the user know that you're updating from the network
and that they're looking at what may be old data.  Do this
asynchronously.  When it comes to displaying data from the network,
sometimes you have to fake it 'til you make it.  You don't have to
rewrite Google gears or anything, just throw everything you need from
the server onto disk and reload it when the app launches.
<br /><br />
<a href="http://gusmueller.com/blog/archives/2008/03/fmdb_for_iPhone.html">Gus Mueller's FMDB rocks</a> for SQLite work.  I have a version with
embedded Dtrace probes if anybody wants it.  (This will have to be the subject of a later article after I find some time to update my version to Gus' latest version and to send it to him to look at / integrate if he wishes first...)]]></description>
         <link>http://www.jonathansaggau.com/blog/2009/01/iphone_responsiveness_and_memo.html</link>
         <guid>http://www.jonathansaggau.com/blog/2009/01/iphone_responsiveness_and_memo.html</guid>
         <category>Cocoa</category>
         <pubDate>Sat, 03 Jan 2009 15:30:42 -0500</pubDate>
      </item>
            <item>
         <title>Enumerating and visualizing all fonts on iPhone</title>
         <description><![CDATA[When you're designing custom views or otherwise theming your iPhone application, it's nice to be able to see all of the available fonts.  I couldn't find anything online that showed them, so I made my own little application.  You can get it at <a href="http://jonathansaggau.com/FontListViz.tgz">FontListViz.tgz</a>.
<br /><br /><br /><br />
<img src="http://www.jonathansaggau.com/blog/images/Screenshot 2008.12.04 01.27.59.jpg" alt="Screenshot 2008.12.04 01.27.59.jpg" border="0" width="320" height="480" />
<br /><br /><br /><br />
It's pretty well dirt simple.  Get all font family names, then get all of the font names in each family and store them in an array, then put each font name's text in a table view cell and set the table view cell's font using <em>-[UIFont fontWithName:size:]</em> and, well, Bob's your uncle -- instant very simple font viewer.  
<pre>

- (void)viewDidLoad 
{
    [super viewDidLoad];
    self.fontNames = [NSMutableArray array];
    NSArray *fontFamilyNames = [UIFont familyNames];
    for (NSString *familyName in fontFamilyNames) {
        NSLog(@"familyName = %@", familyName);
        NSArray *names = [UIFont fontNamesForFamilyName:familyName];
        NSLog(@"FontNames = %@", fontNames);
        [self.fontNames addObjectsFromArray:names];
    }
}
.
.
.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    
    static NSString *CellIdentifier = @"Cell";
    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
    }
    
    NSString *name = [self.fontNames objectAtIndex:indexPath.row];
    cell.text = name;
    cell.font = [UIFont fontWithName:name size:14];
    return cell;
}

</pre>

]]></description>
         <link>http://www.jonathansaggau.com/blog/2008/12/enumerating_and_visualizing_al.html</link>
         <guid>http://www.jonathansaggau.com/blog/2008/12/enumerating_and_visualizing_al.html</guid>
         <category>Cocoa</category>
         <pubDate>Thu, 04 Dec 2008 01:37:00 -0500</pubDate>
      </item>
      
   </channel>
</rss>
