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

<channel>
	<title>Opetopic</title>
	<atom:link href="http://opetopic.com/news/feed/" rel="self" type="application/rss+xml" />
	<link>http://opetopic.com/news</link>
	<description>ō · pə · tōp · ḵ</description>
	<lastBuildDate>Fri, 05 Aug 2011 00:59:50 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Cloud Assassin Launching Soon</title>
		<link>http://opetopic.com/news/2011/08/05/cloud-assassin-launching-soon/</link>
		<comments>http://opetopic.com/news/2011/08/05/cloud-assassin-launching-soon/#comments</comments>
		<pubDate>Fri, 05 Aug 2011 00:59:50 +0000</pubDate>
		<dc:creator>Brandon Williams</dc:creator>
				<category><![CDATA[CloudAssass.in]]></category>

		<guid isPermaLink="false">http://opetopic.com/news/?p=910</guid>
		<description><![CDATA[Our newest game, CloudAssass.in has just gone into review by Apple and will be launching early next week. We started this game at the Techcrunch Disrupt Hackathon back in May, so we have been looking forward to this for awhile. Instead of explaining the game to you, check out my demo with TUAW:]]></description>
			<content:encoded><![CDATA[<p>Our newest game, <a href="http://www.cloudassass.in">CloudAssass.in</a> has just gone into review by Apple and will be launching early next week. We started this game at the Techcrunch Disrupt Hackathon back in May, so we have been looking forward to this for awhile.</p>
<p>Instead of explaining the game to you, check out my demo with <a href="http://www.tuaw.com/2011/06/24/video-app-demo-cloud-assass-in/">TUAW</a>:</p>
<p><a href="http://www.tuaw.com/2011/06/24/video-app-demo-cloud-assass-in/"><img src="http://opetopic.com/news/files/Screen-Shot-2011-08-04-at-8.50.04-PM.png" alt="" title="Cloud Assassin Video" width="455" height="271" class="aligncenter size-full wp-image-912" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://opetopic.com/news/2011/08/05/cloud-assassin-launching-soon/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Japan Donation Summary</title>
		<link>http://opetopic.com/news/2011/04/18/japan-donation-summary/</link>
		<comments>http://opetopic.com/news/2011/04/18/japan-donation-summary/#comments</comments>
		<pubDate>Mon, 18 Apr 2011 01:56:34 +0000</pubDate>
		<dc:creator>Brandon Williams</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://opetopic.com/news/?p=889</guid>
		<description><![CDATA[This is my first post back on the #idevblogaday roll (thanks again to Miguel for managing this!), and coincidentally today is the end of my month long pledge to donate Opetopic&#8217;s proceeds to Japan relief-related organizations. Summary For those who didn&#8217;t catch the beginning, back in March I came back from a SxSW excursion to [...]]]></description>
			<content:encoded><![CDATA[<p>This is my first post back on the <a href="http://idevblogaday.com/">#idevblogaday</a> roll (thanks again to <a href="http://www.twitter.com/mysterycoconut">Miguel</a> for managing this!), and coincidentally today is the end of my month long pledge to <a href="http://opetopic.com/news/2011/03/20/opetopic-app-proceeds-going-to-japan-relief-with-matching/">donate</a> Opetopic&#8217;s proceeds to Japan relief-related organizations. </p>
<h4>Summary</h4>
<p>For those who didn&#8217;t catch the beginning, back in March I came back from a SxSW excursion to the unsettling news of what was going on in Japan. I read that many indie developers were donating their proceeds for a day, or sometimes a week, to various organizations to help with the relief. I wanted to do something similar, but was in the fortunate position to go big. See, just a few months ago I decided to take a <a href="http://opetopic.com/news/2010/11/30/best-thing-ive-done-since-going-indie/">break</a> from the indie life and get a real job (at a small tech startup, but real nonetheless). Each month my deposit from Apple is just a nice little bonus, and was a luxury I could do without.</p>
<p>I decided to donate all of Opetopic&#8217;s app proceeds for a full four weeks, and split the donations among three different organizations: Doctors Without Borders (50%), UNICEF (25%) and the International Red Cross (25%). Further, I made sure that the donations were never earmarked for only the Japan relief, which forces the funds to be used in the country of Japan, even though the operations may extend to other countries. And as one final move to bolster the effort, I agreed to match all donations out of my own pocket.</p>
<h4>Renewed Interest</h4>
<p>Four weeks is a long time to keep my interest concentrated on one thing. A <em>really</em> long time for me. But each day brought more news of the developments in Japan and surrounding areas. Weeks after the events we still get new videos showing the destruction of the tsunami surge, and we still do not know the long term effects of the Fukushima fallout. It kind of feels like I should just keep this going&#8230;</p>
<h4>The Numbers</h4>
<p>I didn&#8217;t have time to post a weekly summary last week, so this time I have two weeks worth of numbers:</p>
<p><a href="http://opetopic.com/news/files/week4.png"><img src="http://opetopic.com/news/files/week4.png" alt="" title="Opetopic Donation Week 3 &amp; 4 Summary" width="525" class="aligncenter size-full wp-image-899" /></a></p>
<p>Unfortunately these numbers were a little lower than our first two weeks, but $850 is nothing to sneeze at. With my matching the following donations were made:</p>
<ul>
<li>Doctors Without Borders (50%): $850</li>
<li>UNICEF (25%): $425</li>
<li>International Red Cross (25%): $425</li>
</ul>
<p>And combining the previous two weeks of donations (<a href="http://opetopic.com/news/2011/03/29/opetopic-donation-week-1-summary/">week 1</a>, <a href="http://opetopic.com/news/2011/04/05/opetopic-donation-week-2-summary/">week 2</a>) we have the following breakdown of donations:</p>
<ul>
<li>Doctors Without Borders (50%): $1888</li>
<li>UNICEF (25%): $944</li>
<li>International Red Cross (25%): $944</li>
<li><strong>Total:</strong> $3776
</ul>
<p>Thanks to everyone who helped and retweeted my obsessive self-retweets.</p>
<h4>For the Indie Devs</h4>
<p>As a side note to the indie devs reading, this series of posts could technically serve as a &#8220;numbers post&#8221; that is so popular in the indie community. Honestly I am not a big fan of those types of discussions, but for a little more context you should know that the distribution of sales across all of my apps falls somewhere around 2:1 for <a href="http://bit.ly/isocardsapp">IsoCards</a>:<a href="http://bit.ly/isowords">IsoWords</a> (all languages of IsoWords).</p>
]]></content:encoded>
			<wfw:commentRss>http://opetopic.com/news/2011/04/18/japan-donation-summary/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Opetopic Donation Week 2 Summary</title>
		<link>http://opetopic.com/news/2011/04/05/opetopic-donation-week-2-summary/</link>
		<comments>http://opetopic.com/news/2011/04/05/opetopic-donation-week-2-summary/#comments</comments>
		<pubDate>Tue, 05 Apr 2011 18:59:42 +0000</pubDate>
		<dc:creator>Brandon Williams</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://opetopic.com/news/?p=870</guid>
		<description><![CDATA[The 2nd week has concluded for my month long pledge to donate Opetopic&#8217;s app proceeds to Japan-related relief organizations. The numbers are very consistent with last week&#8217;s results, although slightly lower due to the fact that I accidentally counted 8 days in the first week (Sunday to Sunday). So, we made $490, and with my [...]]]></description>
			<content:encoded><![CDATA[<p>The 2nd week has concluded for my <a href="http://opetopic.com/news/2011/03/20/opetopic-app-proceeds-going-to-japan-relief-with-matching/">month long pledge</a> to donate Opetopic&#8217;s app proceeds to Japan-related relief organizations. The numbers are very consistent with <a href="http://opetopic.com/news/2011/03/29/opetopic-donation-week-1-summary/">last week&#8217;s</a> results, although slightly lower due to the fact that I accidentally counted 8 days in the first week (Sunday to Sunday).</p>
<p><a href="http://opetopic.com/news/files/week21.png"><img src="http://opetopic.com/news/files/week21.png" alt="" title="Week 2 Donation Summary" width="525" class="aligncenter size-full wp-image-876" /></a></p>
<p>So, we made $490, and with my matching we will be donating $980! The breakdown for my chosen organizations:</p>
<ul>
<li>Doctors Without Borders (50%): $490</li>
<li>UNICEF (25%): $245</li>
<li>International Red Cross (25%): $245</li>
</ul>
<p>In total we have donated $2076!</p>
<p>We have two more weeks of this, and I will be pushing a lot harder (prepare to be annoyed if you follow me on <a href="http://www.twitter.com/mbrandonw">Twitter</a>). Also, tell anyone and everyone about this &#8212; they get a kickass game for two bucks, and some awesome organizations get a donation.</p>
<ul>
<li><a href="http://bit.ly/isowords">IsoWords</a></li>
<li><a href="http://bit.ly/IsoWordsES">IsoWords Español</a></li>
<li><a href="http://bit.ly/IsoWordsFR">IsoWords Français</a></li>
<li><a href="http://bit.ly/IsoWordsDE">IsoWords Deutsche</a></li>
<li><a href="http://bit.ly/isocardsapp">IsoCards</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://opetopic.com/news/2011/04/05/opetopic-donation-week-2-summary/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Opetopic Donation Week 1 Summary</title>
		<link>http://opetopic.com/news/2011/03/29/opetopic-donation-week-1-summary/</link>
		<comments>http://opetopic.com/news/2011/03/29/opetopic-donation-week-1-summary/#comments</comments>
		<pubDate>Tue, 29 Mar 2011 03:43:55 +0000</pubDate>
		<dc:creator>Brandon Williams</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://opetopic.com/news/?p=849</guid>
		<description><![CDATA[Yesterday, March 27th 2011, marked the end of the first week of my 4 week pledge to donate Opetopic&#8217;s proceeds to disaster related relief funds. Thanks to everyone that told a friend and/or retweeted my rampant self-retweets. The outcome was actually pretty good, and I will continue pushing to make all 4 weeks as good [...]]]></description>
			<content:encoded><![CDATA[<p>Yesterday, March 27th 2011, marked the end of the first week of my <a href="http://opetopic.com/news/2011/03/20/opetopic-app-proceeds-going-to-japan-relief-with-matching/">4 week pledge</a> to donate Opetopic&#8217;s proceeds to disaster related relief funds. Thanks to everyone that told a friend and/or retweeted my rampant self-retweets. The outcome was actually pretty good, and I will continue pushing to make all 4 weeks as good as this one. Below you will find a chart for the combined sales of my apps for March 20th to the 27th.</p>
<p><a href="http://opetopic.com/news/files/week1.png"><img src="http://opetopic.com/news/files/week1.png" alt="" title="Week 1 Sales Summary" width="500" class="aligncenter size-full wp-image-850" /></a></p>
<p>Note that this is <em>after</em> Apple&#8217;s 30% cut, so all-in-all we netted $548! And as I promised in my previous post, I have matched this to make a total donation of <strong>$1096</strong>. The final split among my 3 chosen organizations is (along with links to the donation confirmations):</p>
<ul>
<li><a href="http://opetopic.com/news/files/week-1-doctors-without-borders-donation.png">Doctors Without Borders</a> (50%) : $548</li>
<li><a href="http://opetopic.com/news/files/Week-1-UNICEF-Donation.png">UNICEF</a> (25%) : $274</li>
<li>International Red Cross (25%) : $274</li>
</ul>
<p>I don&#8217;t have a confirmation for IRC yet because my bank actually locked my account for suspected fraudulent activity! I&#8217;m sure it will be sorted out soon enough though.</p>
<p>Thanks again to everyone who supported this, and spread the word&#8230; we have 3 more weeks!</p>
]]></content:encoded>
			<wfw:commentRss>http://opetopic.com/news/2011/03/29/opetopic-donation-week-1-summary/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Opetopic app proceeds going to Japan relief with matching</title>
		<link>http://opetopic.com/news/2011/03/20/opetopic-app-proceeds-going-to-japan-relief-with-matching/</link>
		<comments>http://opetopic.com/news/2011/03/20/opetopic-app-proceeds-going-to-japan-relief-with-matching/#comments</comments>
		<pubDate>Sun, 20 Mar 2011 20:01:26 +0000</pubDate>
		<dc:creator>Brandon Williams</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[featured]]></category>

		<guid isPermaLink="false">http://opetopic.com/news/?p=822</guid>
		<description><![CDATA[Update #1: First week&#8217;s numbers have been posted! Update #2: Second week&#8217;s numbers have been posted! Update #3: 3rd and 4th week&#8217;s numbers have been posted! I just got back from a week and a half long trip to Austin for the SxSW Interactive+Music festivals. I had a mind blowing good time, but could really [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Update #1</strong>: First week&#8217;s numbers have been <a href="http://opetopic.com/news/2011/03/29/opetopic-donation-week-1-summary/">posted</a>!<br />
<strong>Update #2</strong>: Second week&#8217;s numbers have been <a href="http://opetopic.com/news/2011/04/05/opetopic-donation-week-2-summary/">posted</a>!<br />
<strong>Update #3</strong>: 3rd and 4th week&#8217;s numbers have been <a href="http://opetopic.com/news/2011/04/18/japan-donation-summary/">posted</a>!</p>
<p>I just got back from a week and a half long trip to Austin for the SxSW Interactive+Music festivals. I had a mind blowing good time, but could really feel the bubble surrounding me when it came to news about the tsunami in Japan. It&#8217;s understandable, we have been working ourselves to the point of breakdown leading up to this festival and we were all there to do something great.</p>
<p>Now that I am back in New York I have caught up on the news and the gravity of the situation set in. I&#8217;ve already made my donations to a few organizations, as you probably have too. Remember, donate to <em>organizations</em>, not just the disaster relief which unfortunately earmarks money for only Japan instead of the entire relief operation, which will spread across many parts of the world for many years to come.</p>
<p>As I wrote in the <a href="http://opetopic.com/news/2010/11/30/best-thing-ive-done-since-going-indie/">postmortem</a> of my indie game development career, the revenue of my apps have transitioned from being a very meager living (pre real job) to just a nice little bonus I get each month (post real job). Well, this bonus is a luxury I can certainly live without.</p>
<p>So, for the next month I will be donating all proceeds of my apps to relief related organizations. I will also match the proceeds from my own pocket to further bolster the effort. Since I only started a real <a href="http://www.hashable.com">job</a> a few months ago I probably have to cap my matching to something, but let&#8217;s just see how things go.</p>
<p>I will also be splitting up the proceeds in 3 ways:</p>
<ul>
<li>50% to Doctors Without Borders i.e. Médecins Sans Frontières i.e. MSF</li>
<li>25% to UNICEF</li>
<li>25% to the International Red Cross</li>
</ul>
<p>This breakdown is influenced by the fact that Japan is a very wealthy country with a modern infrastructure. They will get back on their feet very soon. But MSF fills a need that even rich nations need when something this scale hits.</p>
<p>If you found this page from a friend, then hopefully they can vouch for me that I&#8217;m a good guy. I just want to help anyway I can. Each week I will post a summary of my sales and make a donation (even though Apple pays me roughly once a month).</p>
<p>So, if you would like to help Japan by just buying a couple of kick ass games, check mine out:</p>
<ul>
<li><a href="http://bit.ly/isowords">IsoWords</a></li>
<li><a href="http://bit.ly/IsoWordsES">IsoWords Español</a></li>
<li><a href="http://bit.ly/IsoWordsFR">IsoWords Français</a></li>
<li><a href="http://bit.ly/IsoWordsDE">IsoWords Deutsche</a></li>
<li><a href="http://bit.ly/isocardsapp">IsoCards</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://opetopic.com/news/2011/03/20/opetopic-app-proceeds-going-to-japan-relief-with-matching/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Attention to detail: iPod and AirPlay</title>
		<link>http://opetopic.com/news/2011/02/12/attention-to-detail-ipod-and-airplay/</link>
		<comments>http://opetopic.com/news/2011/02/12/attention-to-detail-ipod-and-airplay/#comments</comments>
		<pubDate>Sat, 12 Feb 2011 22:48:16 +0000</pubDate>
		<dc:creator>Brandon Williams</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://opetopic.com/news/?p=799</guid>
		<description><![CDATA[Every iPod owner knows that as soon as you unplug your headphones the music stops playing. It&#8217;s a nice little detail since it gives you quick access to stopping your music, but it is a pretty obvious thing for the iPod designers to do. I was just jamming out to my buddy&#8217;s music wearing my [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://ethankennedy.bandcamp.com/album/raucous"><img class="aligncenter size-full wp-image-816" title="Raucous by Ethan Kennedy" src="http://opetopic.com/news/files/raucous_ethan_kennedy1.png" alt="Raucous by Ethan Kennedy" width="500" height="412" /></a></p>
<p>Every iPod owner knows that as soon as you unplug your headphones the music stops playing. It&#8217;s a nice little detail since it gives you quick access to stopping your music, but it is a pretty obvious thing for the iPod designers to do.</p>
<p>I was just jamming out to my <a href="http://ethankennedy.bandcamp.com/album/raucous">buddy&#8217;s</a> music wearing my headphones when I decided to switch over to streaming music to my speakers via AirPlay. When I unplugged my headphones the music continued playing.</p>
<p>An amazing attention to detail.</p>
]]></content:encoded>
			<wfw:commentRss>http://opetopic.com/news/2011/02/12/attention-to-detail-ipod-and-airplay/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Reusable Particles and cocos2d</title>
		<link>http://opetopic.com/news/2010/12/07/reusable-particles-and-cocos2d/</link>
		<comments>http://opetopic.com/news/2010/12/07/reusable-particles-and-cocos2d/#comments</comments>
		<pubDate>Tue, 07 Dec 2010 13:08:04 +0000</pubDate>
		<dc:creator>Brandon Williams</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://opetopic.com/news/?p=730</guid>
		<description><![CDATA[cocos2d for iPhone has a built in particle system that is flexible enough to take care of many effects needed in games, especially when the effect acts independently from the rest of the scene. This post will describe an optimization that can drastically speed up particles in your app. CCParticleSystem All of the core logic [...]]]></description>
			<content:encoded><![CDATA[<p>cocos2d for iPhone has a built in particle system that is flexible enough to take care of many effects needed in games, especially when the effect acts independently from the rest of the scene. This post will describe an optimization that can drastically speed up particles in your app.</p>
<h4><code>CCParticleSystem</code></h4>
<p>All of the core logic and computation of the particle systems takes place in the class <code>CCParticleSystem</code>, which inherits from <code>CCNode</code> (as does anything that gets drawn in cocos). However, there is no drawing code in this class. Instead, all of the drawing is done in either <code>CCParticleSystemQuad</code> or <code>CCParticleSystemPoint</code>, both of which inherit from <code>CCParticleSystem</code>. The former class draws a single particle using two a quad (4 vertices, 2 triangles) and the latter uses <code>GL_POINTS</code>. It turns out that quads are faster on armv7 architecture and points are faster on armv6, so there is a nice little macro defined in CCParticleExamples.h that allows you to target both architectures at the same time:</p>
<p><code>#if defined(__ARM_NEON__) || defined(__MAC_OS_X_VERSION_MAX_ALLOWED) || defined(TARGET_IPHONE_SIMULATOR)<br />
	#define ARCH_OPTIMAL_PARTICLE_SYSTEM CCParticleSystemQuad<br />
#elif __arm__<br />
	#define ARCH_OPTIMAL_PARTICLE_SYSTEM CCParticleSystemPoint<br />
#else<br />
	#error(unknown architecture)<br />
#endif</code></p>
<p>Rendering a particle system with <code>CCParticleSystem</code> is actually quite efficient because its internals are pretty much straight C. However, things can get very sluggish if you use many particle systems at once, and especially bad if you allocate them on the fly as you need them. Each particle system requires its own <code>glDrawElements</code> call, and each allocation results in a hefty <code>malloc</code>.</p>
<h4>Reusable Particles</h4>
<p>I will describe a few small changes I made to the particle system classes that allow one to allocate a large pool of particles just once and then reuse them for every particle effect in your game (even for effects with different parameters and textures). The idea for these changes came from a post on the cocos2d <a href="http://www.cocos2d-iphone.org/forum/topic/177">forum</a>, and in particular the work of &#8220;zombie&#8221;.</p>
<p>I won&#8217;t go over every single change I made as you can refer to the code for that, but I will describe the overarching idea. In order to be backwards compatible with the current system I added a boolean ivar, <code>reuseParticles_</code>, that determines if want to use this feature or not. When this boolean is set to <code>YES</code> we prevent particles from &#8220;extinguishing&#8221; in the <code>-update:</code> method, and instead moves them offscreen and marks them as inactive. A method was then added, named <code>-spawnParticles:(int)n</code>, that simply looks for <code>n</code> particles that are inactive and reactivates them. The point at which new particles are created is governed by the <code>centerOfGravity</code> ivar, so you should set this point just before calling <code>spawnParticles</code>.</p>
<p>Now all particles are drawn with a single <code>glDrawElements</code> call. The <code>-draw</code> method is also updated so that no elements are drawn if all particles are marked as inactive. This could possibly be made more efficient by using <code> glBufferSubData</code> to buffer only the particles that active, but I haven&#8217;t taken the time to implement it.</p>
<p>All of the parameters that define the particle system (gravity, color, size, etc.) are stored in each particle rather than globally as an ivar. This means that in between <code>spawnParticles</code> calls you can change the parameters in order to manage many different kinds of systems at once. I even added a method named <code>-setAttributesWithDictionary</code> that sets the system&#8217;s parameters from an NSDictionary, which would most likely be loaded from a plist and/or created by P<a href="http://particledesigner.71squared.com/">article Designer</a>. </p>
<h4>The code</h4>
<p>These changes to the particle system classes can be found in my <a href="https://github.com/mbrandonw/cocos2d-iphone">fork</a> of the cocos2d project on github. I haven&#8217;t pulled the latest from the main codebase in a while, but it doesn&#8217;t look like there have been too many major changes to the particle system classes. If you are working on your own custom copy if the cocos2d library you can simply download my repository and copy over the following files:</p>
<p><code>CCParticleSystem.h and .m<br />
CCParticleSystemQuad.m<br />
CCParticleSystemPoint.m</code></p>
<p>The changes in these files are 100% backwards compatible with the current particle system classes. I have set up another github repository that shows exactly how to use the added features. </p>
]]></content:encoded>
			<wfw:commentRss>http://opetopic.com/news/2010/12/07/reusable-particles-and-cocos2d/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Best thing I&#8217;ve done since going indie&#8230;</title>
		<link>http://opetopic.com/news/2010/11/30/best-thing-ive-done-since-going-indie/</link>
		<comments>http://opetopic.com/news/2010/11/30/best-thing-ive-done-since-going-indie/#comments</comments>
		<pubDate>Tue, 30 Nov 2010 13:07:19 +0000</pubDate>
		<dc:creator>Brandon Williams</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[idevblogaday]]></category>

		<guid isPermaLink="false">http://opetopic.com/news/?p=729</guid>
		<description><![CDATA[&#8230;was to go corporate. Ok, not really corporate. Let me explain. Lots of devs have written inspiring stories of quitting their day jobs to pursue the indie lifestyle. I love those stories. But, I kind of did it backwards. I got into this indie state of mind while in graduate school, so I&#8217;ve never really [...]]]></description>
			<content:encoded><![CDATA[<p>&#8230;was to go corporate. </p>
<p>Ok, not really corporate. Let me explain. </p>
<p>Lots of devs have written inspiring stories of quitting their day jobs to pursue the indie lifestyle. I love those stories. But, I kind of did it backwards. I got into this indie state of mind while in graduate school, so I&#8217;ve never really had a day job. I was a grad student at the <a href="http://math.sunysb.edu/~mbw">math department</a> of Stony Brook for 4 years. Working on a Ph.D. is very similar to being an independent developer. On the negative side is the frustration and self doubt knowing that your failures fall squarely on yourself. Fortunately, the positive side is a strong community of passionate people and the freedom to work on things that interest you.</p>
<p>It isn&#8217;t uncommon to take a break from research to explore different topics while in grad school. I spent most summers in small study groups with colleagues trying to understand areas of math and physics that were completely orthogonal to my own field. It is cathartic to work on something with no pressure tied to it, and most importantly for which you truly do not judge yourself and do not care if others judge you.</p>
<p>During one particularly dry period of research I decided to mess around with iPhone development. I&#8217;ve programmed for many years, so I was mostly interested in understanding the platform. A small device with GPS, accelerometer, touch screen and pressure sensitive microphone lends itself to lots of experimentation. This distraction decided to stick. The thought of working on my ideas, but this time actually making a living from it, really appealed to my academia pedigree. Eventually I decided to leave grad school and go into full time development.</p>
<p>Soon I realized that my indie undertaking had become exactly like my grad school undertaking. Days are filled with freedom and creativity, but also doubt and self loathing. To mix things up a little I took on some freelance iPhone work and found it to be incredibly lucrative&#8230; perhaps <em>bubble</em> lucrative. Mobile developers have a nice little window where the demand for developers (iPhone in particular) greatly surpasses the supply, and I took advantage of that. Shortly after my freelance work I came into contact with a small tech start up here in New York and began working full time.</p>
<p>It has been nice to work on products for which I only hold myself accountable up to the product itself and not its overall success. This is analogous to what I needed while in grad school, except now I&#8217;m making some money. I&#8217;ll be putting most of this money towards doing my own projects right; I will be hiring top notch artists and musicians from now on. I also now find myself more productive during the little bit of time I get to work on my own projects. My next game, <a href="http://opetopic.com/news/2010/07/31/battle-nation-is-coming/">Battle Nation</a>, is even making a little progress recently.</p>
<p>So, while I am not advocating iDevs take up a corporate job in lieu of going indie, I am suggesting that you might want to scoop up some of this bubble money floating around. Then you can properly fund your next project. </p>
<p>I&#8217;ll end with an anecdote. The day I learned that I would finally have an iDevBlogADay spot, after months of waiting, was the exact day I started my real job, and now two weeks later, the day of my 2nd post, I got my first pay check. So. Many. Conflicting feelings&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://opetopic.com/news/2010/11/30/best-thing-ive-done-since-going-indie/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>In-App App Store, also intro to git submodules</title>
		<link>http://opetopic.com/news/2010/11/24/in-app-app-store-also-intro-to-git-submodules/</link>
		<comments>http://opetopic.com/news/2010/11/24/in-app-app-store-also-intro-to-git-submodules/#comments</comments>
		<pubDate>Wed, 24 Nov 2010 00:06:00 +0000</pubDate>
		<dc:creator>Brandon Williams</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[idevblogaday]]></category>
		<category><![CDATA[marketing]]></category>

		<guid isPermaLink="false">http://opetopic.com/news/?p=510</guid>
		<description><![CDATA[This post is my first contribution to the iDevBlogADay movement. Thanks to Miguel for setting this whole thing up and letting me know I would be on Tuesdays. I wanted my first post to be of more philosophical value for iOS developers, but ultimately due to lack of time I settled on something far more [...]]]></description>
			<content:encoded><![CDATA[<p>This post is my first contribution to the <a href="http://www.idevblogaday.com">iDevBlogADay</a> movement. Thanks to <a href="http://mysterycoconut.com/">Miguel</a> for setting this whole thing up and letting me know I would be on Tuesdays. I wanted my first post to be of more philosophical value for iOS developers, but ultimately due to lack of time I settled on something far more practical.</p>
<h3>In-App App Store</h3>
<p>I am certainly not very good at the whole marketing thing for apps, but one thing obvious to me is the need to cross promote your apps. As soon as you have multiple apps in the store you should make it easy for users to purchase any app from within any other app. The idea to create your own little app store that you will embed in every one of your apps. This is what we are calling an &#8220;In-App App Store&#8221;, which we will abbreviate to IAAS from now on.</p>
<p>You place a button somewhere on your root view that gives a hint of a call to action, such as a little wiggle or pulsating animation. When the user taps this button one of two things happens: if the user is on an iPhone, display a full screen, 320&#215;480 modal view, and if the user is on an iPad show a 320&#215;480 popover pointing at the button. Inside this view you put whatever you want to help cross sell your other apps. I chose to write a very short blurb about Opetopic and then display the icons to my other apps. Here is what it looks like in IsoCards and my new game, Battle Nation:</p>
<p><a href="http://opetopic.com/news/files/BattleNation-OAS-example.png"><img src="http://opetopic.com/news/files/BattleNation-OAS-example-175x300.png" alt="Example of In-App App Store in Battle Nation" title="BattleNation-OAS-example" width="175" height="300" class="size-medium wp-image-536" /></a>     <a href="http://opetopic.com/news/files/IsoCards-OAS-example.png"><img src="http://opetopic.com/news/files/IsoCards-OAS-example-174x300.png" alt="Example of an In-App App Store in IsoCards" title="IsoCards In-App App Store" width="174" height="300" class="size-medium wp-image-531" /></a></p>
<p>Tapping any of the buttons in these popovers takes you straight to the app in the App Store (via my Linkshare affiliate link of course).</p>
<h3>Implementation Details</h3>
<p>Creating your own IAAS is certainly nothing new among iOS developers, but I&#8217;ve outlined a nice implementation below along with some sample code to make it easy to create your own. The content inside the popover/modal controller you see above is simply a fullscreen UIWebView with a simple html file fed in. The html page and assets are hosted on my website and bundled within the app itself. Initially the controller will try to load the page from the internet, and if that fails it will fall back on the local version.</p>
<p><a href="http://opetopic.com/news/files/OAS-project-files.png"><img src="http://opetopic.com/news/files/OAS-project-files-140x300.png" alt="Project files for my In-App App Store" title="OAS-project-files" width="140" height="300" class="alignleft size-medium wp-image-544" /></a>   So, let&#8217;s get down to the gritty details. I created an entirely separate Xcode project to develop this. The project consists of just a root view with a button on it so that I can test the popover, and the code and asset files for the IAAS. I wanted all the files for the IAAS to be as self contained as possible, so it simply consists of a view controller and a bundle folder for the html and asset files. See the pic on the left for the structure; OAS stands for &#8220;Opetopic App Store&#8221;, and this the prefix I use on the related files.</p>
<p>If you don&#8217;t already know, a &#8220;bundle&#8221; is simply a directory that has been given the *.bundle extension. When you do this Mac OS X will treat it as a single file, which makes it a little easier to just drag and drop into a project. You can think of it as exposing the interface and hiding the implementation, if you will.</p>
<p>The interface I settled on for my OASViewController is quite simple. It just has a delegate and a few methods:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@protocol</span> OASDelegate;
<span style="color: #a61390;">@interface</span> OASViewController <span style="color: #002200;">:</span> UIViewController &lt;UIWebViewDelegate&gt; <span style="color: #002200;">&#123;</span>
   id&lt;OASDelegate&gt; delegate;
   <span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>oasURLPath;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>nonatomic, assign<span style="color: #002200;">&#41;</span> id&lt;OASDelegate&gt; delegate;
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> initWithURLPath<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>path;
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> closeButtonPressed;
&nbsp;
<span style="color: #a61390;">@end</span>
&nbsp;
<span style="color: #a61390;">@protocol</span> OASDelegate
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> OASDidClose<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>OASViewController<span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>oas;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>So, you create an instance of the OAS by providing a URL to the &#8220;online&#8221; version of the app store. If you choose to set a delegate then you can also be notified when the close button is pressed (I only show the close button on iPhones since popovers can be dismissed by tapping outside the view).</p>
<p>In the implementation I create all the UI elements (a webview and a close button) in the <code>viewDidLoad</code> method and add them to the view hierarchy. The code to create the webview, load the &#8220;online&#8221; version of the OAS and attach it to the view might look something like:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;">UIWebView <span style="color: #002200;">*</span>web <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UIWebView alloc<span style="color: #002200;">&#93;</span> initWithFrame<span style="color: #002200;">:</span>CGRectMake<span style="color: #002200;">&#40;</span>0.0f, 0.0f, 320.0f, 480.0f<span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;
web.hidden <span style="color: #002200;">=</span> <span style="color: #a61390;">YES</span>;
web.delegate <span style="color: #002200;">=</span> self;
<span style="color: #002200;">&#91;</span>self.view addSubview<span style="color: #002200;">:</span>web<span style="color: #002200;">&#93;</span>;
<span style="color: #400080;">NSURLRequest</span> <span style="color: #002200;">*</span>r <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSURLRequest</span> requestWithURL<span style="color: #002200;">:</span>
                   <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSURL</span> URLWithString<span style="color: #002200;">:</span>oasURLPath<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>web loadRequest<span style="color: #002200;">:</span>r<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>web release<span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>Note that I hide the webview initially. This is to prevent the view from &#8220;flashing&#8221; as the content loads.</p>
<p>Next I create the close button. If you look at the project tree in the image above you will see I have a &#8220;close.png&#8221; image in there (hm&#8230; note to self: make a close@2x.png version). So I can create a button with this image and attach it to the top-left corner using the following:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;">UIImage <span style="color: #002200;">*</span>closeImage <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>UIImage imageNamed<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;OAS.bundle/close.png&quot;</span><span style="color: #002200;">&#93;</span>;
UIButton <span style="color: #002200;">*</span>closeButton <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UIButton alloc<span style="color: #002200;">&#93;</span> initWithFrame<span style="color: #002200;">:</span>CGRectMake<span style="color: #002200;">&#40;</span>2.0f, 2.0f, closeImage.size.width, closeImage.size.height<span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>closeButton setImage<span style="color: #002200;">:</span>closeImage forState<span style="color: #002200;">:</span>UIControlStateNormal<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>closeButton addTarget<span style="color: #002200;">:</span>self 
                action<span style="color: #002200;">:</span><span style="color: #a61390;">@selector</span><span style="color: #002200;">&#40;</span>closeButtonPressed<span style="color: #002200;">&#41;</span> 
      forControlEvents<span style="color: #002200;">:</span>UIControlEventTouchUpInside<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>self.view addSubview<span style="color: #002200;">:</span>closeButton<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>closeButton release<span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>Then I can use the UIWebView delegate method to detect when the UIWebView successfully loads, and unhide it:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> webViewDidFinishLoad<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIWebView <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>webView <span style="color: #002200;">&#123;</span>
   webView.hidden <span style="color: #002200;">=</span> <span style="color: #a61390;">NO</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>In order to allow users to follow links in the HTML page you need to implement one more UIWebView delegate method:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">BOOL</span><span style="color: #002200;">&#41;</span> webView<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIWebView <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>webView 
   shouldStartLoadWithRequest<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSURLRequest</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>request 
   navigationType<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIWebViewNavigationType<span style="color: #002200;">&#41;</span>navigationType <span style="color: #002200;">&#123;</span>
&nbsp;
   <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>navigationType <span style="color: #002200;">==</span> UIWebViewNavigationTypeLinkClicked<span style="color: #002200;">&#41;</span>
      <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UIApplication sharedApplication<span style="color: #002200;">&#93;</span> openURL<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>request URL<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
   <span style="color: #a61390;">return</span> <span style="color: #a61390;">YES</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>We are nearly done at this point, and in fact some may wish to even stop here. Right now you can create an instance of this view controller, attach it to a popover or modally present it, and it will display your online IAAS. But, what if the user doesn&#8217;t have an internet connection at this moment? Should we just show a blank screen? A much better alternative would be to show a local version of the IAAS so that the user could at least see your app collection, even if they cannot buy anything right now.</p>
<p>To do this we need to catch when the UIWebView fails to load the online IAAS, and then try loading the local version. We can potentially enter an infinite loop of failing requests if the local version fails to load for some reason. So we need to make sure that we only try to load the local version once. We could do this by creating another ivar, but webviews have a &#8220;tag&#8221; property that can use instead. Here is the code:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> webView<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIWebView <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>webView 
   didFailLoadWithError<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSError</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>error <span style="color: #002200;">&#123;</span>
&nbsp;
   webView.tag<span style="color: #002200;">++</span>;
   <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>webView.tag <span style="color: #002200;">==</span> <span style="color: #2400d9;">1</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
      <span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>html <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> stringWithContentsOfFile<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSBundle</span> mainBundle<span style="color: #002200;">&#93;</span> pathForResource<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;OAS&quot;</span> ofType<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;bundle&quot;</span><span style="color: #002200;">&#93;</span> stringByAppendingPathComponent<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;index.html&quot;</span><span style="color: #002200;">&#93;</span> encoding<span style="color: #002200;">:</span>NSUTF8StringEncoding error<span style="color: #002200;">:</span><span style="color: #a61390;">NULL</span><span style="color: #002200;">&#93;</span>;
      <span style="color: #400080;">NSURL</span> <span style="color: #002200;">*</span>base <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSURL</span> fileURLWithPath<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSBundle</span> mainBundle<span style="color: #002200;">&#93;</span> pathForResource<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;OAS&quot;</span> ofType<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;bundle&quot;</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
      <span style="color: #002200;">&#91;</span>webView loadHTMLString<span style="color: #002200;">:</span>html baseURL<span style="color: #002200;">:</span>base<span style="color: #002200;">&#93;</span>;
   <span style="color: #002200;">&#125;</span>
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>Good god Objective-C is verbose! I tried adding some whitespace to make this more readable, but it&#8217;s futile. Just know that I first load the content of the file OAS.bundle/index.html into a string, and then load that string into the webview, <strong>but</strong> with the base URL pointing to the OAS.bundle directory. This allows all the relative references to CSS and images inside index.html to continue to work.</p>
<p>We now have sleek, flexible in-app app store component that we can drop into projects. An added benefit to having an &#8220;online&#8221; version of the IAAS is that we can update it at anytime and it will be instantly propagated to all users (who access it via the internet at least). So you can add new apps to your repertoire without updating all your other apps at the same time.</p>
<p>I put together a full sample of everything discussed above on my GitHub account, so <a href="http://github.com/mbrandonw/In-App-App-Store">take a look</a>.</p>
<h3>Git Submodule Fanciness</h3>
<p>Once you are ready to add your IAAS to some of your apps, what are you going to do? Maybe copy/paste the view controller and bundle files into all your projects. Well, that is utterly ridiculous. You are just setting yourself up for a world of hurt. What are you going to do when you need to make an update or bug fix to your IAAS? Copy it again to all of your projects?</p>
<p>I&#8217;m going to assume that every piece of code you write is under version control. If not, you gotta do this ASAP. My first VC experience was with Subversion, but now I get the chills whenever I think about it. I&#8217;ve fully converted to Git now, and would never go back. It doesn&#8217;t have as much to do with Git as it has to do with a version control system that has branching and merging as first class citizens (see also: Mercurial, Bazaar). The things I will be discussing now are going to be in the Git vernacular, but I imagine it can all be translated quite easily to other systems (e.g. see svn:externals for Subversion).</p>
<p>A Git submodule is like having a repository inside a repository. For example, right now I have a repository devoted to the Opetopic App Store (OAS), and a repository devoted to my new game <a href="http://opetopic.com/news/2010/07/31/battle-nation-is-coming/">Battle Nation</a>. I would like to be able to add the files from OAS to Battle Nation, but in such a way that I can push and pull changes from the OAS repository. That way the OAS files will always be in sync across all projects.</p>
<p>This is quite easy to set up. First I add the OAS repository to my Battle Nation repository via:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">git submodule add <span style="color: #000000; font-weight: bold;">/</span>path<span style="color: #000000; font-weight: bold;">/</span>to<span style="color: #000000; font-weight: bold;">/</span>OAS OAS</pre></div></div>

<p>This will create an OAS directory inside my working directory (which will have its own .git structure), and it will create a .submodules file in my root path that lists all of my submodules.  At this point none of these files are committed, so I need to commit:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">git commit <span style="color: #660033;">-m</span> <span style="color: #ff0000;">&quot;Added the OAS submodule&quot;</span></pre></div></div>

<p>At any time I can pull the most recent changes to my submodule via the git-submodule update command:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">git submodule update</pre></div></div>

<p>And now I can keep everything in sync very easily. So, next time I release an app I can update the HTML in my OAS project, push to my Git server, pull to all of my other apps, and submit updates to those apps publicizing my newly released app. In fact, I&#8217;ve got one more fancy trick up my sleeve. I also have a post commit hook set up in Git so that every time I push to the OAS repository, all of the HTML files are automatically uploaded to my FTP server, and now even those files are always in sync.</p>
]]></content:encoded>
			<wfw:commentRss>http://opetopic.com/news/2010/11/24/in-app-app-store-also-intro-to-git-submodules/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Traveling with the iPad</title>
		<link>http://opetopic.com/news/2010/10/19/traveling-with-the-ipad/</link>
		<comments>http://opetopic.com/news/2010/10/19/traveling-with-the-ipad/#comments</comments>
		<pubDate>Tue, 19 Oct 2010 15:02:49 +0000</pubDate>
		<dc:creator>Brandon Williams</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[featured]]></category>

		<guid isPermaLink="false">http://opetopic.com/news/?p=642</guid>
		<description><![CDATA[I just got back from a 2 week vacation in Egypt with my girlfriend Sindy. This was the first time I have extensively traveled with the iPad and for the most part it was a great experience. The Trip (condensed form) First you need the context of our trip as it traversed the full spectrum [...]]]></description>
			<content:encoded><![CDATA[<p>I just got back from a 2 week vacation in Egypt with my girlfriend Sindy. This was the first time I have extensively traveled with the iPad and for the most part it was a great experience.</p>
<h4>The Trip (condensed form)</h4>
<p>First you need the context of our trip as it traversed the full spectrum of travel, from comfortable and predictable to digging a hole in the ground for a toilet and &#8220;oh my god were we just kidnapped?&#8221;. We spent only two days in Cairo to see the most popular sights, the pyramids, the museum, and the bazaars. Although Cairo is an amazing city, it is just another urban sprawl, and we were itching to get into an adventure.</p>
<div id="attachment_684" class="wp-caption aligncenter" style="width: 310px"><a href="http://opetopic.com/news/files/Screen-shot-2010-10-15-at-6.00.44-PM.png"><img class="size-medium wp-image-684" title="Egypt 2010 Route" src="http://opetopic.com/news/files/Screen-shot-2010-10-15-at-6.00.44-PM-300x300.png" alt="" width="300" height="300" /></a><p class="wp-caption-text">The Route</p></div>
<p>From Cairo we took an overnight train to Aswan and stayed two nights. In Aswan we visited the great Abu Simbel temples, had dinner in a Nubian village and relaxed. We departed from Aswan on a felucca, a traditional Egyptian sail boat capable of carrying about 12 people with no internal areas. We slept on the felucca on the shore of the Nile, and in the morning finished our ride in Luxor.<br />
<div id="attachment_688" class="wp-caption aligncenter" style="width: 310px"><a href="http://opetopic.com/news/files/DSC_5076.jpg"><img class="size-medium wp-image-688" title="Nile Felucca" src="http://opetopic.com/news/files/DSC_5076-300x201.jpg" alt="" width="300" height="201" /></a><p class="wp-caption-text">Felucca-ing down the Nile</p></div></p>
<p>Luxor is filled with ancient sites such as the Karnak Temple and the Valley of the Kings. After two days in Luxor we started the arduous journey to the desert. The journey is far too long to do in one sitting so it consists of many stops in small towns.</p>
<p>The first leg was a 9 hour drive to the Dakhla Oasis, a basic town in the middle of the desert. After only one night it was back on the road for 5 hours until we reached the small town of Farafra. The only reason we stopped in this nondescript town was to wait out the sun, for the next leg of the trip consisted of swapping our bus for a 4WD Jeep and heading straight into the desert.</p>
<div id="attachment_655" class="wp-caption aligncenter" style="width: 310px"><a href="http://opetopic.com/news/files/sahara_4wd.jpg"><img class="size-medium wp-image-655" title="sahara_4wd" src="http://opetopic.com/news/files/sahara_4wd-300x200.jpg" alt="" width="300" height="200" /></a><p class="wp-caption-text">Barreling through the Sahara on one of these is crazy fun.</p></div>
<p>After another 4-5 hours of driving and sight seeing we were setting up camp in the White Desert just in time for the sun to set. In this case camping means just throwing our sleeping bags on the sand; no need for tents here, but watch out for foxes and giant beetles. After smoking shisha and singing around a fire all night we slept under a million vibrant stars and counted shooting stars until we fell asleep. We were up first thing in the morning and on the road heading to Bawiti, a necessary stop on our way to Siwa.</p>
<p>An 8 hour drive brought us to the Siwa Oasis near the Libyan border. Due to its proximity to Libya everything going into and out of Siwa is highly controlled, which means one must pass through many checkpoints along the way. Siwa was by far the most conservative city we visited in Egypt with most women donning a burqa. At the same time there was a bit of a hippy feel to the city, including a little cafe that played tons of Bob Dylan and Rolling Stones.</p>
<div id="attachment_699" class="wp-caption aligncenter" style="width: 310px"><a href="http://opetopic.com/news/files/DSC_5852.jpg"><img class="size-medium wp-image-699" title="Sunrise in the White Desert" src="http://opetopic.com/news/files/DSC_5852-300x201.jpg" alt="" width="300" height="201" /></a><p class="wp-caption-text">Sunrise from our desert camp</p></div>
<p>After two days in Siwa we were on the road again heading to Alexandria on the Mediterranean. Alexandria is a beautiful modern city with tons of sites and culture to explore. True story: we were nearly kidnapped our last night here (I&#8217;ll tell you about it later). I wish I had more time to spend here, but after two days we had to take a train back to Cairo, and then it was a flight back to New York.</p>
<h4>The Hardware</h4>
<p>Each of us brought our own iPad: my 16GB WiFi iPad and Sindy&#8217;s 32GB 3G. The only other electronics we packed were our iPhones (both 3Gs), my Nikon D80 camera with two lenses, and the camera connection kit.</p>
<p>WiFi was ubiquitous throughout Egypt. Most hotels had wifi in the lobby for a small fee (5-10 Egyptian pounds, ~1-2 USD), and many museums, libraries and attractions had free wifi.</p>
<h4>Ruggedness</h4>
<p>The iPad gets an unexpected win in the category of ruggedness. As you read, our trip was quite an adventure. An overnight felucca ride on the Nile, nearly 20 hours of 4 wheel drivin&#8217; through the desert, camping in the White Desert without tents, train rides, bus rides, camel rides, donkey rides, etc. Our iPads were with us the whole time protected only by a plastic ziplock bag in case of water damage.</p>
<p>Never once did I worry about the iPad&#8217;s safety. I would take it out for a moment, look something up and then throw it back in my bag. It&#8217;s slim profile made it easy to slip into any opening in my backpack or daypack. It&#8217;s solid one piece construction and lack of external buttons made me that much more comfortable throwing it around knowing that there was nothing that could break off or snag on something inside my backpack.</p>
<p>The iPad&#8217;s lack of edges and seams is also a huge plus. I would not have busted out a laptop or netbook in the middle of the desert because cleaning out sand from under the keys and crevices would have been a pain in the ass. But just a quick wipe down of my iPad and it looked brand new.</p>
<h4>Camera Connection Kit</h4>
<p>The camera connection kit is awesome. The RAW images in my Nikon D80 weigh in at around 10.5MB per image, and I survived the trip with only a 4GB SD card. Every night I would dump the entire memory card to Sindy&#8217;s 32GB iPad, which allowed me to take over 1,600 images in total. Looking over the day&#8217;s photos before going to sleep became a bit of a ritual.</p>
<p>I also carried my Flip HD recorder, and shot over an hour of video. There was still plenty of room on the recorder by the end of the trip, but there is nothing like being able to transfer the videos to the iPad and watch them at full resolution at the end of a long day (only iOS 4.2 will play videos imported from the camera kit).</p>
<p>My biggest complaint with the camera kit is speed. It takes on average 11 seconds to transfer one RAW image from the memory card, which means nearly 30 minutes for a full transfer on heavy shooting days. This could be because the iPad creates jpeg thumbnails of the images as it transfers, but I still want better performance. Luckily you can exit the photos app and do other things while the photos are transferring even without iOS 4.2 multitasking.</p>
<p>Another annoyance is the inability to view the full size images right off the memory card without importing them into the Photos app. The camera kit has the potential to be the greatest card reader in existence. At one point a fellow traveler wanted to show me some images from his trip, and it would have been great to pop in his card and browse the photos. Another use for this would be the ability to delete subpar photos directly from the memory card rather than importing and then deleting.</p>
<p>The camera kit desperately needs compatibility with the iPhone and iPod touch. Ideally I should be able to carry just my camera, iPhone and connection kit, and when I need to clear my memory card just whip out my phone and dump the images. I would never pull out my iPad and do a transfer in the middle of a shooting session. It&#8217;s just too bulky and I was shooting in some very sketchy areas.</p>
<p>For transferring the photos to your computer I suggest using Apple&#8217;s Image Capture application instead of iPhoto, which I found to be glitchy and slow.</p>
<h4>Mobile iWork</h4>
<p>Pages and Numbers for the iPad really impressed me on this trip. In fact, I wrote the majority of this blog post in Pages while flying back to New York. It could have just as easily been written in Notes.app, but seeing headers and pictures right in the document made it easier for me to structure the post. I also used Pages to keep a brief journal of some of the memorable stories that happened. Again this could have been done in Notes.app, but I could enhance the journal by adding pictures from the day.</p>
<p>During our layover in Rome Sindy remembered that she forgot to create and send an important report to her colleagues. It was amazing to watch the fluid back and forth switching between Mail.app, Numbers and Goodreader, pulling data from one app, entering it into another. Within an hour she had a moderately complicated spreadsheet put together, formulas and all, and thanks to the recent Numbers update she could mail off an Excel file before we boarded our flight to Cairo.</p>
<div id="attachment_693" class="wp-caption aligncenter" style="width: 310px"><a href="http://opetopic.com/news/files/DSC_4498.jpg"><img class="size-medium wp-image-693" title="Sindy using Numbers for iPad" src="http://opetopic.com/news/files/DSC_4498-300x240.jpg" alt="" width="300" height="240" /></a><p class="wp-caption-text">Sindy is a bit of a work-a-holic</p></div>
<h4>Reader</h4>
<p>I used the iPad quite a bit for reading, but unfortunately iBooks was useless to me. Most of the documents I wanted to read were in PDF format, and iBooks as a PDF reader is crap. It really needs to provide access to the PDF&#8217;s metadata (e.g. table of contents), as well as a better way to organize documents instead of the bookshelf metaphor. So, for my reading needs I turned to Goodreader. It&#8217;s user interface can be a challenge sometimes, but it&#8217;s organizational capabilities and PDF metadata access makes it indispensable for me.</p>
<p>Outside of the few non-fiction books and novels I am in the middle of (Rework, Being Geek and Cat&#8217;s Cradle), I also loaded a bunch of travel books into Goodreader (Lonely Planet guides, historical books, web clippings). Having multiple travel books on the iPad was very convenient and a better experience than the dead tree version. Searching and annotating the book is much easier, and flipping back and forth between different books was painless.</p>
<h4>IsoCards</h4>
<p>I already have a more detailed <a href="http://opetopic.com/news/2010/10/15/isocards-in-egypt-1-3-update-submitted/">blog post</a> on this topic, but I want it to be known that <a href="http://bit.ly/isocardsapp">IsoCards</a> is awesome for traveling. It doesn&#8217;t matter how bumpy the ride or how harsh the environment, I could always play a game of poker with friends.</p>
<h4>Most Used Apps</h4>
<p>Here is a list of the apps I used the most on the trip, and the ones that just really surprised me at how useful they are.</p>
<ul>
<li><strong><a href="http://itunes.apple.com/us/app/pages/id361309726?mt=8">Pages</a>:</strong> Great for writing this very blog post and keeping a journal of the unforgettable moments from the trip.</li>
<li><strong><a href="http://itunes.apple.com/us/app/goodreader-for-ipad/id363448914?mt=8">Goodreader</a>:</strong> An excellent e-book/PDF reader, if slightly cumbersome.</li>
<li><strong><a href="http://itunes.apple.com/us/app/ludo-board-game/id364079811?mt=8">Ludo</a>, <a href="http://bit.ly/isocardsapp">IsoCards</a>, any board game simulation:</strong> Nothing like being able to play card games and board games on a bumpy bus or train ride with a group of friends. Also see my more detailed <a href="http://opetopic.com/news/2010/10/15/isocards-in-egypt-1-3-update-submitted/">blog post</a> about using IsoCards while traveling.</li>
<li><strong><a href="http://itunes.apple.com/us/app/offmaps/id313854422?mt=8">OffMaps</a>:</strong> I used OffMaps to download street maps of all the cities I visited so that I could easily find my way around while exploring.</li>
<li><strong><a href="http://itunes.apple.com/us/app/numbers/id361304891?mt=8">Numbers</a>:</strong> Indispensable for Sindy so that she could get critical work done while away from her computer.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://opetopic.com/news/2010/10/19/traveling-with-the-ipad/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

