<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" 
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
    xmlns:admin="http://webns.net/mvcb/"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd">
	<channel>
<title>Gifter Blog</title><link>http://www.gifterapp.com/index.html</link><description>News From The Gifter Team</description><dc:language>en</dc:language><dc:creator>support@gifterapp.com</dc:creator><dc:rights>Copyright 2008 Gerbarg/Litwack</dc:rights><dc:date>2008-07-23T16:50:59-07:00</dc:date><admin:generatorAgent rdf:resource="http://www.realmacsoftware.com/" />
<admin:errorReportsTo rdf:resource="mailto:support@gifterapp.com" /><sy:updatePeriod>hourly</sy:updatePeriod>
<sy:updateFrequency>1</sy:updateFrequency>
<sy:updateBase>2000-01-01T12:00+00:00</sy:updateBase>
<lastBuildDate>Wed, 23 Jul 2008 17:19:18 -0700</lastBuildDate><item><title>The Napkin Sketches</title><dc:creator>support@gifterapp.com</dc:creator><dc:subject>Blog</dc:subject><dc:date>2008-07-23T16:50:59-07:00</dc:date><link>http://www.gifterapp.com/blog/files/the-napkin-sketches.html#unique-entry-id-4</link><guid isPermaLink="true">http://www.gifterapp.com/blog/files/the-napkin-sketches.html#unique-entry-id-4</guid><content:encoded><![CDATA[<strong>Posted by Geoff</strong><br /><br />For this post I thought it might be fun to show the first sketches I made for Gifter&rsquo;s interface. They&rsquo;re incredibly crude, but that&rsquo;s the point - I wanted to get the basic idea down and wing it to Louis as fast as possible. Needless to say, it&rsquo;s Louis who actually, you know, implemented everything.<br /><br />First sketch. What&rsquo;s with the rounded bottom? Looks like an <a href="http://www.vimeo.com/1366923" rel="external">OpenMoko</a>. (Gifter: probably <em>not</em> coming to OpenMoko.) So this<br /><img class="imageStyle" alt="gifterinterface1" src="http://www.gifterapp.com/blog/files/page3_blog_entry4_1.jpg" width="350" height="348"/><br /><br />became this, the address book sorted by birthday:<br /><img class="imageStyle" alt="addressbook" src="http://www.gifterapp.com/blog/files/page3_blog_entry4_2.png" width="319" height="461"/><br /><br />This is the first cut of our category screen.<br /><img class="imageStyle" alt="gifterinterface2" src="http://www.gifterapp.com/blog/files/page3_blog_entry4_3.jpg" width="245" height="336"/><br /><br />Here&rsquo;s what it looks like as of 1.0:<br /><img class="imageStyle" alt="categories" src="http://www.gifterapp.com/blog/files/page3_blog_entry4_4.png" width="318" height="407"/><br /><br />Icons. I just gave our artist descriptions of what we wanted instead of inflicting this hideousness on her. <br /><img class="imageStyle" alt="giftericons" src="http://www.gifterapp.com/blog/files/page3_blog_entry4_5.png" width="353" height="337"/><br /><br />If you&rsquo;re interested in interface design, why not check out <em><a href="http://www.amazon.com/Designing-Interactions-Bill-Moggridge/dp/0262134748" rel="external">Designing Interactions</a></em> by IDEO&rsquo;s Bill Moggridge? It&rsquo;s backwards-looking, but there&rsquo;s a lot to be gleaned from the past and I thought the interviews on the DVD were fascinating.]]></content:encoded></item><item><title>Make Go Fast NOW&#x21;</title><dc:creator>support@gifterapp.com</dc:creator><dc:subject>Blog</dc:subject><dc:date>2008-07-16T12:28:21-07:00</dc:date><link>http://www.gifterapp.com/blog/files/make-go-fast-now.html#unique-entry-id-3</link><guid isPermaLink="true">http://www.gifterapp.com/blog/files/make-go-fast-now.html#unique-entry-id-3</guid><content:encoded><![CDATA[<strong>Posted by Louis</strong><br /><br />Launching Gifter was really hectic for us. We had a lot of last minute issues with our providers, and some of our data pushes were not happening properly when the app launched. Because of that I spent most of the first weekend it was out in emergency mode. Now I am back to work on 1.1. It has a few bug fixes, quite a bit of performance work, a bit more UI polish, and one or two features we dropped from 1.0 at the last minute in order to make the App Store launch day submission deadline. I am really excited about our next release, but more on that another time.<br /><br />I figured I would actually make a post about writing a good iPhone app. Now the dev tools are still NDA, so I am not going to talk about anything intrinsic to the iPhone yet, but there are a number of topics that are important to the iPhone while not being specific to it.<br /><br />One of the most important things is for apps to be responsive. They need to scroll fast, they need to get data in front of the user quickly. The more often they stall, the more often the user notices the app getting in their way. That is especially true with the iPhone, where the user is not multitasking, they tend to be using the app in a quick focused way. I think Gifter does well at these things, and we are going to do better in the future.<br /><br />Let's look at a typical task. In Gifter, when you select a category it queries a server for an XML data file, parses the file, then displays a list of items. That is a pretty common model for iPhone apps. Now consider what happens when you do that. For this example lets assume we are using a 2G iPhone somewhere that gets around 40k/s (some places get better, some get worse). One of our typical data files is around 60K. Now according to my math 60K -> 480k -> 12 seconds. It takes 12 seconds to download a category, plus an additional 2-3 seconds to start up the download between host lookup, network latency, et cetera. That is a lot of time for a user to be staring at a blank screen. And in early betas that is what Gifter did, but we put some work into things, and we think we made it a lot better. Nothing we did was iPhone specific, all of this is equally valid on Mac OS X. In fact the controller and model for Gifter compile and build for Mac OS X (we use the code in some of category management tools). Here is what we did:<br /><br /><strong>1) Trim out all extraneous data</strong><br />Our data files included a lot of stuff we did not strictly need, or could recalculate on the phone. Part of the reason for that is that Gifter is capable of pulling data directly from vendors in some cases,<br />and we do not control what they send us. While having that ability is a big win in some cases, we found that by fetching the data on our server we were able to cache, filter, and in some cases compress the data. For instance, we rewrite a lot of URLs to be shorter by using mod_rewrite on our server. (This also allows us to work around some bugs in the iPhone.)<br /><br /><strong>2) Use SAX based parsers</strong><br />I am a huge fan of using DOM and XPath. It really is much easier to maintain, and it allows me to write code faster. But for DOM to work you need to have the whole document loaded. That means waiting for the download to finish before you start displaying anything. The larger your data is, the worse of a problem this, but it can be pretty bad even for small amounts of data when you are on EDGE. So I grudgingly used SAX* because it is a better experience for the user.<br /><br />* To be precise, I wrote a tool that builds SAX parsers from XPath triggers. That way I am using SAX parsers, but I do not need to actually write or maintain them.<br /><br /><strong>3) Have your SAX parser incrementally feed your display code</strong><br />So now you have written your SAX based parser. That does not buy you much &nbsp;if you hold on to the data until it is done loading before you display it. Make sure to set up your code so that the SAX parser can hand your apps controller one object at a time, which it can insert into the model and view as appropriate.<br /><br />Okay, so we did all of that, and the app should load faster, and when we test it we see that it does load a little faster. But all of the speed up we have seen is from step 1. It turns out the NSXMLParser requires that it has the whole document loaded before it starts sending events, which basically negates the value of steps 2 and 3. But we can fix that with:<br /><br /><strong>4) Replace NSXMLParser</strong><br />What I did was roll a mostly call compatible replacement for NSXMLParser, LGXMLParser. The big difference is that you can hand LGXMLParser data as you get it and it will pump the events. I am<br />opensourcing LGXMLParser today under an MIT style license, you can <a href="http://www.gifterapp.com/downloads/LGXMLParser.zip" rel="self">download it here</a>. Just drop two files into your project, and wherever you use NSXMLParser, then modify your  NSURLConnection code to feed it data as it receives. No need to change any of your SAX code. For now this is just a sort of throw over the wall release, but feel free to send comments and feedback. If you use it in your app I would love to know, and if you make improvements to it please consider <a href="mailto:louis@gifterapp.com" rel="self">sending me patches</a>.<br /><br /><strong>Conclusion</strong><br />It used to take us 14-15 seconds to load the data. Step 1 reduced our average file sizes by ~33%, so that got it down to 10-11. Step 2 made it so that we can start displaying data as soon as we have received enough to display anything, which means that while our total download time is still 10-11 seconds, we have the first few items loaded in 2-3 seconds. Once the user has loaded the first screen of stuff we have effectively hidden the other 8 seconds of load time. So while it still<br />takes ~10 seconds, it feels like ~3. That is a pretty big improvement from the 15 second pause we started with.<br /><br />Now I just described a lot of things, which are a lot of work. Even moreso for all of the developers new to the iPhone/Mac OS X development. While some of it is clearly code that is intrinsic to<br />Gifter, some bits of it is fairly generic. Because I want the apps that I use (not just the ones I write) to responsive, I am open-sourcing LGXMLParser. It is not a complete replacement for<br />NSXMLParser, I have added functionality to it as I have needed it, so if I did not need it, it is not implemented. I imagine I will add more as I go, but patches are always welcome. As I write these stories I may identify other bits of code to release, and build a library around them, but for now I am just releasing the two files. If you want to use them just drop them into your app!]]></content:encoded></item><item><title>How We Built an iPhone App for &#x24;4873.92</title><dc:creator>support@gifterapp.com</dc:creator><dc:subject>Blog</dc:subject><dc:date>2008-07-12T12:54:34-07:00</dc:date><link>http://www.gifterapp.com/blog/files/bedd9a6a1425818f49ef0645cc71044c-1.html#unique-entry-id-1</link><guid isPermaLink="true">http://www.gifterapp.com/blog/files/bedd9a6a1425818f49ef0645cc71044c-1.html#unique-entry-id-1</guid><content:encoded><![CDATA[<strong>Posted by Geoff</strong><br /><br />So last year I read Guy Kawasaki&rsquo;s <em><a href="http://www.amazon.com/Art-Start-Time-Tested-Battle-Hardened-Starting/dp/1591840562" rel="external">The Art of the Start</a></em>, inspiring, then I started reading his blog, and then he published &ldquo;<a href="http://blog.guykawasaki.com/2007/06/by_the_numbers_.html" rel="external">By the Numbers: How I built a Web 2.0, User-Generated Content, Citizen Journalism, Long-Tail, Social Media Site for $12,107.09</a>&rdquo; and I was like <em>whoa</em>, that is useful information. <br /><br />But it turns out that if you do your own development work, you can launch an iPhone app for even less. Here&rsquo;s what we spent:<br /><ul class="disc"></ul><strong>Development costs</strong><br /><ul class="disc"><li><strong>$99/year </strong>- The Apple iPhone Developer Program fee. I believe this is referred to as a &ldquo;bozo filter.&rdquo;</li><li><strong>$297.98</strong> - Emergency RAM. For a while we had to parse a 12gb XML file. Every day. Louis got 8 more gigs for his Mac Pro overnighted out.</li><li><strong>$3000</strong> (approximate) - Apple World Wide Developer Conference and travel: This is a biggie. It included airfare for Louis from the east coast to San Francisco and then from SF to LA, where I live - we took the opportunity to hang out for a week and work on the app hardcore.</li></ul> <br /><strong>Design assets</strong><br /><ul class="disc"><li><strong>$130</strong> - The app icon: we knew we&rsquo;d need a 57x57 pixel icon for the iPhone, but we also wanted a vector version as a general art asset. We posted a $65 assignment to <a href="http://pixish.com/" rel="external">Pixish</a> and ended up with five icons to choose from, one of which was a clear winner. We paid $65 again for refinements to the icon.</li><li><strong>$600</strong> - Category icons: We needed 28 custom icons to represent store categories. We looked at royalty-free ecommerce icon sets from <a href="http://stockicons.com/" rel="external">Stockicons.com</a> and others - the problem was, many of our shopping categories weren&rsquo;t represented, so custom was the way to go.</li></ul><strong>Deployment costs</strong><br /><ul class="disc"><li><strong>$340/year</strong> - <a href="http://joyent.com/connector" rel="external">Joyent Connector</a>: We prepaid for a year of service. Our server is extremely important to the app and Joyent is <em>solid</em>.</li><li><strong>$120/year</strong> - <a href="http://www.dreamhost.com/" rel="external">DreamHost</a>: We use DreamHost for a bunch of miscellaneous services, and this also included our domain name. </li></ul><strong><br />This website</strong><br /><ul class="disc"><li><strong>$59</strong> - <a href="http://www.realmacsoftware.com/" rel="external">RapidWeaver 4</a>: Because I&rsquo;m not a web designer I was looking for a tool with great theme support, and RapidWeaver is it. Awesome <a href="http://simplebits.com/" rel="external">web</a> <a href="http://www.happycog.com/" rel="external">design</a> is expensive (or, as they say, priceless), <a href="http://www.elance.com/p/landing/buyer.html" rel="external">mediocre web design is cheap</a>, but because I knew we&rsquo;d be updating the site on a regular basis I didn&rsquo;t want to be going back to a freelancer every five minutes with little changes, so I decided to handle it myself.</li><li><strong>$19.95</strong> - <a href="http://www.joshlockhart.com/silk/index.html" rel="external">Silk theme</a>: Silk is a beautiful theme for RapidWeaver, now nobody else use it! Seriously, with the tons of color controls, it was easy to make it look custom.</li></ul><ul class="disc"><li><strong>$99.99</strong> - <a href="http://www.varasoftware.com/products/screenflow/" rel="external">ScreenFlow</a>: Our screencast isn&rsquo;t actually done yet, but I&rsquo;ll be using ScreenFlow to make it. A great tool for a small niche.</li><li><strong>$108</strong> - <a href="http://www.bluemic.com/modules.php?op=modload&name=Products&file=index&prod_id=18" rel="self">Blue Snowball mic</a>: This was one of the times when the real world is awesome: I called up my local Guitar Center, they had a Snowball in stock, and I drove over there and picked it up. Seems like a great mic for the price - you can pay more, but why?</li></ul><strong>Grand total: $4873.92!</strong><br /><ul class="disc"></ul><strong>Things we didn&rsquo;t spend money on</strong><br /><ul class="disc"><li>Publicity: It seems like iPhone apps are getting noticed by virtue of eager users having fun with the App Store. We may actually do some advertising to get the word out in the near future, but not quite yet.</li><li>Offices: Louis lives on the east coast and I&rsquo;m on the west; we weren&rsquo;t sure if that was going to work, but it <u>totally does</u>. There are some costs for travel, but on the upside we both work from home and don&rsquo;t have to pay for office space, so it all balances out.</li></ul><strong>The main hidden cost</strong><br />...was of course our time. We&rsquo;ve been working on this for four months solid, which is a lot of hours. If those hours were billable, it would add up to a metric, uh, fun ton.<br /><br /><strong>A final detail</strong><br />We didn&rsquo;t spend frivolously, but we didn&rsquo;t <em>not</em> buy anything we needed, either. $4873.92 is a shoestring, but it&rsquo;s not like there was a better string out there for more money, you know? <br /><br />---<br /><br />A word on our commenting system - we had just put up comments via JS-Kit, and shortly thereafter their site crashed - we lost some of the comments that had already been posted. I&rsquo;m cutting and pasting the comments that got through below and I <strong>apologize profusely</strong> if you posted and your comment was lost - we&rsquo;re dying to hear what you have to say!<span style="font:11px &apos;Lucida Grande&apos;, LucidaGrande, Verdana, sans-serif; "><br /></span>]]></content:encoded></item><item><title>Gifter 1.0&#x21;</title><dc:creator>support@gifterapp.com</dc:creator><dc:subject>Blog</dc:subject><dc:date>2008-06-27T14:14:44-07:00</dc:date><link>http://www.gifterapp.com/blog/files/3d7eac6f9092a23a868ea394b4147bcb-0.html#unique-entry-id-0</link><guid isPermaLink="true">http://www.gifterapp.com/blog/files/3d7eac6f9092a23a868ea394b4147bcb-0.html#unique-entry-id-0</guid><content:encoded><![CDATA[<strong>Posted by Geoff</strong><br /><br />Welcome to the first release of Gifter! If you haven&rsquo;t downloaded it and bought delightful gifts for all of your loved ones, I suggest you click the link over there to your right and make it happen. It&rsquo;s free. Free. Click. Click. Do it now. Did you click? I&rsquo;m going to check our server logs later. Just kidding. Probably.<br /><br />ANYWAY, I&rsquo;m Geoff, the communications/web/treasurer/pirate guy; my partner, Louis, is the code/server/ninja guy, and you&rsquo;ll be hearing from both of us. Our plan with this blog is to skip the marketing and talk about real topics of interest to the iPhone community - how we got our little company off the ground, how we solved programming issues, the tools we use, our plans for future releases, our business model, things like that. We&rsquo;re small but ferocious. Not unlike our mascot Sir Jude the War Squirrel.<br /><br /><img class="imageStyle" alt="war_squirrel" src="http://www.gifterapp.com/blog/files/page3_blog_entry0_1.jpg" width="321" height="430"/>]]></content:encoded></item></channel>
</rss>