<?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>Blue Lotus Blog &#187; Programming</title>
	<atom:link href="http://www.aorensoftware.com/blog/category/Programming/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.aorensoftware.com/blog</link>
	<description>Articles and thoughts from a techmonkey...</description>
	<lastBuildDate>Wed, 12 Jun 2013 19:39:52 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Present.app</title>
		<link>http://www.aorensoftware.com/blog/2012/12/30/present-app/</link>
		<comments>http://www.aorensoftware.com/blog/2012/12/30/present-app/#comments</comments>
		<pubDate>Mon, 31 Dec 2012 00:11:38 +0000</pubDate>
		<dc:creator>snielsen</dc:creator>
				<category><![CDATA[App Store]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Humor]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Psychology]]></category>
		<category><![CDATA[Security/Cryptography]]></category>

		<guid isPermaLink="false">http://www.aorensoftware.com/blog/?p=1622</guid>
		<description><![CDATA[Both my own siblings and my wife&#8217;s siblings have had a Christmas present exchange for the past couple of years and although the gifts are never extravagant, we always try to make them thoughtful. This year we thought it might be fun to give our siblings a choice of which present they wanted. We thought [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.aorensoftware.com/blog/wp-content/uploads/2012/12/IMG_0011.jpg"><img src="http://www.aorensoftware.com/blog/wp-content/uploads/2012/12/IMG_0011-225x300.jpg" alt="" title="IMG_0011" width="225" height="300" class="alignleft size-medium wp-image-1628" style='margin-right: 20px;' /></a></p>
<p>Both my own siblings and my wife&#8217;s siblings have had a Christmas present exchange for the past couple of years and although the gifts are never extravagant, we always try to make them <strong>thoughtful</strong>. This year we thought it might be fun to give our siblings a choice of which present they wanted. We thought of making a card with the various options printed on it but then I came up with the idea of making a custom app that could serve the same purpose. </p>
<p>But I didn&#8217;t want it to simply be a card analog. It would have to take advantage of some of the unique features of iOS and do things that a normal card could not. Maybe we could somehow <strong>sneak</strong> it on to their iPads without them even knowing and surprise them with it! I was really excited about the idea and so I immediately sat down and started cranking it out. Thus, Present.app was born. <span id="more-1622"></span></p>
<h2>The User Experience</h2>
<p><center><iframe width="750" height="422" src="http://www.youtube.com/embed/zj6v7eucVRY?rel=0" frameborder="0" allowfullscreen></iframe></center></p>
<p>We decided to call the app simply &#8220;Present&#8221;. After toying around with various ideas for what the app experience should be like, we settled on this:</p>
<ul>
<li>A local notification goes off at <em>9:00AM PST December 25th, 2012</em>. The message comes up as &#8220;<strong>Present. To: (sibling + spouse names)</strong>&#8220;.</li>
<li>Opening the notification launches the app and the recipient is presented with an image of a present and a message that reads &#8220;<strong>Shake to Open</strong>&#8220;.</li>
<li>As they shake the iPad they hear noises of something rustling around inside like a real box. Curiously though, <em>nothing else happens</em>.</li>
<li>They continue to shake the iPad and after a little while they hear a <strong>crashing sound</strong> and glass shattering. Further shaking produces sounds of broken glass jostling around.</li>
<li>The message &#8220;<strong>Oops&#8230; I meant &#8216;Touch to Open&#8217;</strong>&#8221; is displayed and they are then allowed to proceed to the present choice screen.</li>
<li>The recipiant is allowed to pick one of the four displayed presents. They can come back to this screen and examine any of the four choices anytime they want.</li>
<li>Touching one of the choices brings them to a screen with a funny internet video related to the present they selected and a little quip from us.</li>
</ul>
<h2>Development</h2>
<p><img src="http://www.aorensoftware.com/blog/wp-content/uploads/2012/12/Xcode4.png" alt="" title="Xcode4" width="200" height="200" class="alignleft size-full wp-image-1646" style='float: right; margin-left: 20px;' /></p>
<p>Development of Present.app was very <strong>quick and dirty</strong>. Almost everything hard-coded, nothing modular, no error handling and we only authored it for iPads. The app would only run on <strong>iOS 6</strong> devices and also was developed with <strong>ARC</strong> turned on. To get things done I basically picked the technologies that minimized development time. I used <code>Audio Services</code> to play the sounds, <code>MPMoviePlayer</code> to play the videos and looked for the <code>UIEventSubtypeMotionShake</code> event to detect shaking (which isn&#8217;t a very reliable event by the way, but it was good enough). I was able to reuse the app and give it to both to a sibling and sibling-in-law by just changing the name of who the present was for in two places. All told, I spent about 8 hours developing the app (most of which was creating the art and rummaging through Soundtrack Pro looking for sound effects). One of these days it might be neat to productize this idea somehow and publish it in the App Store but that will have to wait for the time being. </p>
<h2>Deployment</h2>
<p><img src="http://www.aorensoftware.com/blog/wp-content/uploads/2012/12/Spy-vs-spy.png" alt="" title="Spy-vs-spy" width="200" height="200" class="alignleft size-full wp-image-1643" style='float: right; margin-left: 20px;' /></p>
<p>Making the app itself was enjoyable, but getting it installed on the target iPads <strong>without the recipients knowing</strong> and making sure it <strong>remained undiscovered</strong> was probably the most fun. This specific app is never going to see a public release and so using the App Store as a distribution method is out of the question. Apple is notorious for making it really difficult to get apps onto iOS devices without using the App Store (and for security reasons, rightly so). I was going to have to get some alone time with the iPads hooked up to my laptop, mark them for &#8216;<strong>Development Use</strong>&#8216;, add their <strong>UUIDs</strong> to my provisioning profile and build/sign/run the app on their device. This would get it to install on their device and upon first launch, the Christmas morning local notification would register. I then needed to kill the app, disconnect the iPad from my laptop, <strong>hide the app</strong> somewhere in their Springboard where they wouldn&#8217;t notice and get it returned to them none the wiser. </p>
<p>I enlisted my dad and my father-in-law to help with the <strong>social engineering</strong> required to get a hold of the devices and was able to nonchalantly install the app right in front of them without tipping anybody off as to what I was doing. After prepping my development environment, the actual technical process of getting the app installed only took about 2 minutes. What took <em>significant</em> time was waiting for the right moment to go for it. People&#8217;s attention needed to be in just the right places at just the right times. </p>
<h2>Execution</h2>
<p><img src="http://www.aorensoftware.com/blog/wp-content/uploads/2012/12/tree.jpg" alt="" title="tree" width="200" height="327" class="alignleft size-full wp-image-1648" style='float: right; margin-left: 20px;' /></p>
<p>I knew from the beginning that in all likelihood the recipients would not be near their iPads at the exact moment that the notification went off. I still thought it would be a fun experience to try for it though. I was able to get one sibling to actually use their iPad when it went off but they weren&#8217;t watching at the moment and it got lost with all the other messages in notification center. We eventually just told them to check notification center and then they discovered it and were able to enjoy the gift. </p>
<p>I actually think the most fun was earlier in the morning when we told them that their present was going to &#8220;<em>go off</em>&#8221; at 9:00AM. That produced all kinds of fun guesses and searches around the house for the mystery present. Both the recipients loved it and both of them ended up picking the iTunes credit option. It was a lot of fun to come up with the idea for Present.app and execute it. I had better start brainstorming now what I can do to <strong>one-up</strong> it next year <img src='http://www.aorensoftware.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.aorensoftware.com/blog/2012/12/30/present-app/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iOS 6 Predictions</title>
		<link>http://www.aorensoftware.com/blog/2012/03/06/ios-6-predictions/</link>
		<comments>http://www.aorensoftware.com/blog/2012/03/06/ios-6-predictions/#comments</comments>
		<pubDate>Wed, 07 Mar 2012 05:48:31 +0000</pubDate>
		<dc:creator>snielsen</dc:creator>
				<category><![CDATA[60beat]]></category>
		<category><![CDATA[AirPlay]]></category>
		<category><![CDATA[App Store]]></category>
		<category><![CDATA[Apple TV]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[Game Center]]></category>
		<category><![CDATA[GamePad]]></category>
		<category><![CDATA[Games]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Hacking]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[Marketing]]></category>
		<category><![CDATA[Networking]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Security/Cryptography]]></category>
		<category><![CDATA[Startup Grind]]></category>
		<category><![CDATA[Systems]]></category>
		<category><![CDATA[Video]]></category>
		<category><![CDATA[Video Games]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.aorensoftware.com/blog/?p=1393</guid>
		<description><![CDATA[It is always fun to try and guess what Apple is going to do next. You can guarantee that there will always be surprises and sure bets, letdowns and magical moments. The Apple rumor sites do a decent job of soliciting leaks, reading between the lines and making educated conjecture. As a developer, I often [...]]]></description>
				<content:encoded><![CDATA[<p><img src="http://www.aorensoftware.com/blog/wp-content/uploads/2012/03/crystal_ball.jpg" alt="" title="crystal_ball" width="200" height="242" style="float: right; margin-left: 20px; margin-top: 5px;" /></p>
<p>It is always fun to try and guess what Apple is going to do next. You can guarantee that there will always be surprises and sure bets, letdowns and <strong>magical moments</strong>. The Apple rumor sites do a decent job of soliciting leaks, reading between the lines and making educated conjecture. As a developer, I often like to take a good look at where Apple&#8217;s technology is right now and make <strong>logical extrapolations</strong> as to where things are headed. Oftentimes, when Apple announces some new feature or technology it seems obvious in retrospect if we had only connected the dots. Based on 2011&#8242;s release schedule, it is a fair bet to say that Apple is going to announce iOS 6 at WWDC sometime this summer and distribute a developer beta. That means that in the coming months little trickles of information are going to get doled out to the rumor sites about what kind of changes and additions we can expect. Just for fun, I wanted to get my own predictions out in the open before any of that started. Here is my very <strong>developer-oriented</strong> prediction list of what we might be expecting in iOS 6.</p>
<hr/>
<p><strong>UPDATE:</strong> WWDC and the iOS 6 beta have come and gone. Some of my predictions now have conclusions. You will notice however that most of the predictions have not yet been updated. That is because there is the potential for Apple to be keeping a few more surprises up their sleeve for the fall when iOS 6 goes GM. Inline below are the results so far.</p>
<hr/>
<p><strong>UPDATE2:</strong> iOS 6 GM is here which means that the NDA has lifted! Check down below to see how well I did.<span id="more-1393"></span></p>
<p><span style="font-size: 1.6em; float: right; margin-top: 15px;">(Miss) <img src="http://www.aorensoftware.com/blog/wp-content/uploads/2011/04/Check-Mark.jpg" /><b>&nbsp;90%</b></span></p>
<h2>Notification Center API</h2>
<p><img src="http://www.aorensoftware.com/blog/wp-content/uploads/2012/03/notificationsMed.jpg" alt="" title="notificationsMed" width="200" height="297" style="float: left; margin-right: 20px; margin-bottom: 10px; margin-top: 10px;" /></p>
<p>It seems often that Apple will introduce a new feature or technology, keep it fairly closed off from developer access for a cycle and then release an API for it after they learn a little more about how people really use it and work out many of the initial kinks in the system. Notification Center seems <strong>very ripe</strong> for this kind of API access. Apple has had a full release cycle to gather user reactions and think about how to design a really clean API for developers to hook into. Of course 3rd party apps can already get their notifications listed in Notification Center simply by using the same old Notification API that has been around since iOS 3. However, there is currently no way to further customize the display and do anything <strong>fancy</strong> like the weather or stock widgets. There are already a lot of nice additions and hacks for Notification Center in the jailbreak world (which also it seems is a good indicator of what frameworks and APIs Apple is likely to open up next). This seems like a nice, low-risk, natural progression of a fairly straightforward technology that has already had some time to grow up a bit by itself in the wild. </p>
<hr/>
<p><strong>UPDATE:</strong> Hmm, the absence of this is somewhat troubling. A year should be enough time to get a public API for a shipping technology in order. To me this seemed like a no-brainer. I can only assume that for scheduling or other reasons this got bumped to NMOS which means that I am holding on to this prediction for next year when iOS 7 comes out.</p>
<p><span style="font-size: 1.6em; float: right; margin-top: 15px;">(Miss) <img src="http://www.aorensoftware.com/blog/wp-content/uploads/2011/04/Check-Mark.jpg" /><b>&nbsp;80%</b></span></p>
<h2>Siri API</h2>
<p><img src="http://www.aorensoftware.com/blog/wp-content/uploads/2012/03/siriMed.jpg" alt="" title="siriMed" width="200" height="200" style="float: left; margin-right: 20px; margin-top: 5px;" /></p>
<p>Siri was the hot new feature of iOS 5 exclusive to the iPhone 4S. For 2 weeks everybody swooned over it and would use it to impress their friends with interesting natural language queries like &#8220;<em>Where&#8217;s my wife?</em>&#8221; or &#8220;<em>What&#8217;s the volume of 63 grams of barium?</em>&#8220;. Then we all hit the limits of what Siri could do and she became <strong>just another feature</strong>. Like Notification Center, Siri has had a full release cycle for Apple to study user response and nail down the user experience. It is time now to unleash the real potential that Siri promised us and allow developers to hook into it.</p>
<p>If generalized into two broad categories, Siri can accomplish two different kinds of tasks. <strong>First</strong>, she can answer questions by querying a web service like Yelp, Wolfram Alpha, etc&#8230; <strong>Secondly</strong>, she can perform simple device-local application tasks like create reminders, create calendar items, call phone numbers and send messages. It seems like Apple would want to vet any sort of web service that <strong>all</strong> Siri users could potentially smash with traffic and so the more likely route of opening up Siri would probably lie in attaching APIs to performing <strong>simple actions </strong>or <strong>application local queries</strong>. Imagine if you could ask your turn-by-turn direction app for directions with your voice instead of typing addresses or if you could tell your stock trading program to perform certain actions by voice (that could lead to some hilarious headlines, just be sure to always listen to Siri&#8217;s confirmation first). This kind of an API seems like it would be fairly <strong>difficult to design correctly</strong> and would probably <strong>require more of the developer</strong> than something like Notification Center. I expect that at a minimum, Apple will initially have a few cookie cutter commands where developers can plug in their own simple verbs and nouns. &#8220;<em>Siri, compose tweet: &#8216;had cereal for breakfast today&#8217;</em>&#8220;. &#8220;<em>Siri, how many (insert virtual game currency here) do I have?</em>&#8220;. Developers can instantly leverage Apple&#8217;s voice recognition tech and give their users access to all the information and tasks that their applications offer. This seems like the natural progression for where Siri has to go next if she is going to keep distinguishing herself from competing assistant programs. Much like the advent of the App Store itself, it seems like Apple is poised to spark another app revolution which will cement its platform by harnessing the power of it&#8217;s developers once again. </p>
<hr/>
<p><strong>UPDATE:</strong> Likewise I feel that the omission of a Siri API is quite puzzling. There was a ton of welcome improvement to Siri over the course of the year. However, I feel like there is a gold mine of untapped developer value just waiting for Apple to harvest it with a Siri API. Again, this advancement is too powerful and too obvious to not be coming sometime and so I am also going to hold on to this prediction for iOS 7 as well. </p>
<p><span style="font-size: 1.6em; float: right; margin-top: 15px;">(Miss) <img src="http://www.aorensoftware.com/blog/wp-content/uploads/2011/04/Check-Mark.jpg" /><b>&nbsp;65%</b></span></p>
<h2>Full Bluetooth/30-pin API</h2>
<p><img src="http://www.aorensoftware.com/blog/wp-content/uploads/2012/03/bluetoothMed.png" alt="" title="bluetoothMed" width="200" height="200" style="float: left; margin-right: 20px;" /></p>
<p>Both users and developers alike have been clamoring for a public API to the 30-pin connector and Bluetooth stack for years. Apple does have an official MFi program that hardware developers can sign up for, but they have to purchase <strong>high-priced decryption chips</strong> from Apple for every peripheral they build and pay <strong>significant licensing fees</strong>. For years it seemed like it was in Apple&#8217;s best interest to keep a very tight quality control over the kinds of peripherals 3rd parties could produce for iOS hardware, but with devices like the 60beat GamePad (and to a minor extent the Square Card Reader) which <strong>side-step Apple&#8217;s lockout</strong> by going through the microphone input in the headphone jack, it is clear that the bar for developing hardware peripherals needs to be lowered. Incidentally, I have a friend who is currently developing an iOS peripheral using audio input over Bluetooth and software signal processing to avoid paying the licensing fees and integrating the decryption chip.</p>
<p>After taking a closer look at iOS 5, it appears that Apple is slowly heading in a more <strong>open direction</strong> in this regard with the addition of the CoreBluetooth.framework. It is currently limited to interfacing only with BTLE (Bluetooth Low Energy) devices though. Now that iOS devices are unarguably mainstream and the iOS peripheral market has had a fair amount of time to mature and settle, it might be time for Apple to open up these ports for <strong>general license-free use</strong> by any developer. There is a huge demand for iOS compatible game controllers right now as evidenced by the 60beat GamePad, iCade, iControlPad and Atari Arcade. It would be really interesting to see what kinds of great controller options would come out of the woodwork if it were more economically attractive to develop iOS hardware peripherals. This kind of freedom for the communications ports would be extremely convenient in conjunction with my next prediction&#8230;</p>
<hr/>
<p><strong>UPDATE:</strong> For a while there during the iOS 6 beta it looked as though this one might actually come to pass. With iOS 6 came the integration of the <strong>External Accessory Framework</strong> into the iOS SDK. This is the framework that participants in the expensive &#8220;Made For iPod&#8221; (MFi) program would use to interact with their 30-pin or Bluetooth devices. The fact that it was being pulled into the mainline SDK was an indicator to many (myself included) that Apple was finally going to ditch the need for encryption and open their hardware interfaces up to the masses (the fact that BTLE and the CoreBluetooth.framework had no such requirement was further evidence in support of this assertion). Alas, on further investigation it appears that this was not the case. By all accounts you still need to sign up for the MFi program, pay a large licensing fee and buy expensive encryption chips if you want to use < Bluetooth 4.0, the 30-pin port or the new Lightning connector. Fortunately as time marches onward Bluetooth 4.0 will become move prevalent and the BTLE chips will lower in price thus further lessening Apple's need to opening up these 'legacy' ports. </p>
<p><span style="font-size: 1.6em; float: right; margin-top: 15px;">(Miss) <img src="http://www.aorensoftware.com/blog/wp-content/uploads/2011/04/Check-Mark.jpg" /><b>&nbsp;75%</b></span></p>
<h2>Apple TV SDK</h2>
<p><img src="http://www.aorensoftware.com/blog/wp-content/uploads/2012/03/appletvMed.jpg" alt="" title="appletvMed" width="200" height="97" style="float: left; margin-right: 20px; margin-bottom: 40px; margin-top: 35px;" /></p>
<p>Apple pretty much fell into the Gaming industry by <strong>complete accident</strong>. Nobody, not even Apple themselves could have foreseen the kind of massive takeover of iOS devices in the portable market, especially because they weren&#8217;t even trying to attack that market in the first place. The Apple TV has long been publicly declared as a &#8220;hobby&#8221; for Apple and long been looked at suspiciously as a Trojan Horse by analysts and pundits for&#8230;something&#8230;. The reason it currently exists is to get the iTunes Music and Movie Stores into your living room. Why not the App Store as well?</p>
<p>Granted, there are significant development challenges for developers in porting apps to the Apple TV, such as dealing with <strong>one more UI idiom</strong> in addition to the phone and pad ones they have to target right now. Developers would obviously have to live without multi-touch, accelerometer and microphone input (if targeting the Apple TV 2, rumors suggest that the Apple TV 3 may headline Siri as a feature). They would also need to deal with potentially small storage space (8GB for the Apple TV 2). The iOS developer community has proven itself to be a very quick responder to new hardware and has great feature adoption rates, as evidenced by the second app gold rush sparked by the original iPad. <strong>Obvious applications</strong> would include games (duh), more applications that blur the line between books and movies, home automation/security app ports and data visualization software hooked up to analytics services and the like (it seems like every other startup office I visit these days has a computer in a public place hooked up to some data visualization of sales or hits or something). The sheer <strong>financial incentives</strong> that accompany a high position in the App Store sales charts all but guarantee massive developer adoption of any potential future Apple TV SDK. One can speculate as to whether Apple will maintain a separate iOS branch just for the Apple TV as it currently does and later unify it (much like it did with the iPad), or if it is going to be merged in with iOS 6 right out of the gate. Again, I don&#8217;t think Apple is going to initially position the Apple TV as a gaming console (it can&#8217;t compete with the horsepower of the entrenched players at the moment), but one shouldn&#8217;t underestimate the power of <strong>yearly hardware upgrades</strong> and a <strong>voracious and resourceful developer community</strong>. Should the Xbox, Playstation and Wii start getting worried?</p>
<hr/>
<p><strong>UPDATE:</strong> I guess that iOS 6 was not necessarily the right place for an Apple TV SDK to debut. After all, the iPad and iPhone versions of iOS were disjoint for almost a year before they merged. It does make a measure of sense for Apple to simplify and just concentrate on mainline iOS and then afterward work on pushing out a refined Apple TV SDK during a normally dry spell for Apple releases in the coming year. Once again, this is just money on the table for Apple. Thousands of iOS developers are clamoring to port their games and other apps over to the Apple TV. I still believe this is coming but I am now less certain on the timeframe. </p>
<p><span style="font-size: 1.6em; float: right; margin-top: 15px;">(Miss) <img src="http://www.aorensoftware.com/blog/wp-content/uploads/2011/04/Check-Mark.jpg" /><b>&nbsp;70%</b></span></p>
<h2>AirPlay Mirroring Plus</h2>
<p><img src="http://www.aorensoftware.com/blog/wp-content/uploads/2012/03/airview_logo_Med.jpg" alt="" title="airview_logo_Med" width="200" height="200" style="float: left; margin-right: 20px; margin-bottom: 10px; margin-top: 5px;" /></p>
<p>The collection of technologies and protocols now dubbed &#8220;AirPlay&#8221; has had quite an interesting technical history. First there was AirTunes, with which you could send encrypted audio to authorized devices like the AirPort Express from iTunes. Then came a separate technology called AirPlay Video, which allows iTunes and iOS devices to send unencrypted video/audio to the Apple TV 2. Then last summer we got AirPlay Mirroring, which is yet another additional, separate technology that sends encrypted video/audio of whatever is on iOS device to the Apple TV 2.</p>
<p>AirPlay Mirroring has had a huge impact on presentation technology (I use it at an event I founded called the Startup Grind). It has even <strong>more unlocked potential</strong> as clearly evidenced by existence of Reflection and AirParrot and by the recently revealed AirPlay Mirroring capability in OS X Mountain Lion. I predict that at some point Apple will add iOS-iOS device mirroring capabilities as well. The idea of sharing your device screen with somebody else near you doesn&#8217;t seem extremely interesting until you add something like <strong>multicasting</strong> into the mix. Imagine a conference talk or a board meeting where the speaker uses their iPad to show the audience slides or some other sort of demonstration, and instead of cranking your neck over to get a glimpse of a poorly lit, off angle projection screen, you simply follow along on your own iPad. This seems like a no-brainer considering all Apple has to do is port the AirPlay mirroring receiver app over over to mainline iOS from the Apple TV 2 and add multicasting support. Now that the AirPlay Mirroring private key has been extracted and the protocol reverse engineered, if Apple doesn&#8217;t do it, some other enterprising developer will. </p>
<hr/>
<p><strong>UPDATE:</strong> This did not happen. In fact, no AirPlay Mirroring enhancements came at all! If Apple hasn&#8217;t foreseen the possibilities for more flexible mirroring or hasn&#8217;t seen fit to give mirroring any enhancements of any kind then I am not so sure that it is going to arrive in the future either. I am not going to hold my breath for this one now but hope to eventually be pleasantly surprised. </p>
<p><span style="font-size: 1.6em; float: right; margin-top: 15px;">(Split) <img src="http://www.aorensoftware.com/blog/wp-content/uploads/2011/04/Check-Mark.jpg" /><b>&nbsp;70%</b></span></p>
<h2>Mobile Payments</h2>
<p><img src="http://www.aorensoftware.com/blog/wp-content/uploads/2012/03/Google-WalletMed.jpg" alt="" title="Google-WalletMed" width="200" height="212" style="float: left; margin-right: 20px; margin-top: 5px;" /></p>
<p>The NFC rumor got a lot of play last year when people threw around iPhone 5 predictions, but we haven&#8217;t really heard much from it lately. NFC/RFID reading hardware in phones has had somewhat of a <strong>hard time gaining adoption</strong> despite a lot of press and attention put on its potential uses. In the United States there are only a handful of Android phones currently sporting NFC/RFID hardware at the moment, which is somewhat surprising considering that Android handset makers are constantly looking for ways to distinguish themselves. Google seems to be making a fairly large play for the use of the technology in payments although adoption doesn&#8217;t appear to be significant right now.</p>
<p>It appears that Apple is going to throw their weight behind BTLE for the kinds of things that NFC is typically used for. They are already shipping BTLE hardware in the iPhone 4S and, as mentioned above, they have already provided the CoreBluetooth API for it in iOS 5. Apple could potentially &#8220;just walk in&#8221; to the payments ball game with two gigantic assets already in place. <strong>First</strong>, they have a huge guaranteed, uniform hardware install base to entice developers and partners and <strong>secondly</strong>, there are hundreds of millions of credit card accounts in iTunes already hooked up and primed to go. The payments-in-real-life arena seems <strong>ripe for disruption</strong> as evidenced by the success of such players as Square and the seemingly uncompetitive entrenchment of the few large credit card companies in the US. It only remains to be seen if Apple is even interested in this space at all. Time and time again they have proven that they aren&#8217;t going to just jump into the latest buzzword market simply because it is the hot thing right now. That said, mobile payments married to iTunes/iOS seem to make a lot of sense to me, and enough time has passed for Apple to be able to calmly evaluate the arena with a <strong>cool head</strong> and develop a <strong>consistent plan</strong>. </p>
<hr/>
<p><strong>UPDATE:</strong> Depending on how you interpret the verbiage you could call my prediction either a hit or a miss. I am going to take half credit for this one. Passbook is clearly Apple&#8217;s alternative to making a physical swipe or moving your device so that it is proximate to a sensor in order to get something accomplished. It is being used for tickets, coupons, boarding passes and all sorts of other things that people envisioned NFC to be suited for. Clearly Passbook is much less secure than having an end-to-end cryptographically-based system but it also has much less friction to adoption and much better hardware support. With that in mind, in regards to functionality I am going to call my prediction a &#8216;<strong>hit</strong>&#8216;. However, because you can&#8217;t use it to actually perform a financial transaction and my prediction was much more closely tied with the particulars of the hardware implementation I am going to have to also call my prediction a &#8216;<strong>miss</strong>&#8216;.</p>
<h1>What Won&#8217;t be Coming:</h1>
<p>Here are some things I think would be great if they made it into iOS 6 but I wouldn&#8217;t put any money on it:</p>
<p><span style="font-size: 1.6em; float: right; margin-top: 15px;"><b>(Hit)</b></span></p>
<h2>Game Center 3rd Party Authentication</h2>
<p><img src="http://www.aorensoftware.com/blog/wp-content/uploads/2012/03/gamecenterSmall.png" alt="" title="gamecenterSmall" width="200" height="200" style="float: left; margin-right: 20px; margin-bottom: 10px;" /></p>
<p>This is something I had hoped Apple would include in their gaming social network from the get-go (a year ago I wrote about how this is the number one problem holding back Game Center adoption). For games that require accounts or some sort of establishment of identity, being able to develop a game that authenticates against Game Center user accounts would be a godsend. Unless you are a large development house that has already created secure user account management systems, it is a <strong>huge pain</strong> to manage users, and an even bigger pain for your customers when you ask them to do <strong>yet another song and dance</strong> through a signup process. Apple could very easily integrate a 3rd party authentication system into Game Center, but I have heard through the grapevine that there is <strong>no internal interest</strong> in doing so. Instead they have provided us with Apple-hosted turn-based gaming functionality, which alleviates some of the problems developers have had, but it has some severe limitations and doesn&#8217;t address entire swaths of game genres like realtime action games. </p>
<hr/>
<p><strong>UPDATE:</strong> As I predicted, Game Center continues to go nowhere fast. Apple likes to tout Game Center&#8217;s account statistics during keynotes but it is all for naught if it is nothing more than an achievements system (Game Center leaderboards are meaningless because of complete lack of security). I would really love to see the day when Apple makes Game Center so attractive that game developers cannot resist developing for it. But the fact that rival services have continued to grow and prosper even after Game Center hit the scene is evidence enough that it doesn&#8217;t really offer anything special. Also Apple, get rid of the poker table aesthetic. Nobody likes it.</p>
<p><span style="font-size: 1.6em; float: right; margin-top: 15px;"><b>(Miss)</b></span></p>
<h2>Deep Facebook Integration</h2>
<p><img src="http://www.aorensoftware.com/blog/wp-content/uploads/2012/03/facebook-logoSmall.png" alt="" title="facebook-logoSmall" width="200" height="200" style="float: left; margin-right: 20px; margin-bottom: 10px; margin-top: 5px;" /></p>
<p>By all accounts (from the rumor sites) this one almost happened. Technically there is nothing stopping it. iOS 5 already brought us deep Twitter integration and from what it looks like from the outside, most of the work was already done (see Ping etc&#8230;). Instead things got bogged down on the <strong>business side</strong> of things as they often do, and after some heavy Jobs vs. Zuckerberg meetings it appears like it was no longer meant to be. That is not to say that it can&#8217;t happen in the future, which is why some people have high hopes that it will arrive in iOS 6. I however feel that as time as passed, <strong>distances have grown</strong> instead of shrunk. These days Facebook seems to be the girl everybody wants to dance with, and it seems every day they and Microsoft continue to get cozier with each other. I wouldn&#8217;t preclude this from happening sometime in the future, but iOS 6? Too soon.</p>
<p><strong>UPDATE:</strong> Well, looks like I just got this one wrong. Facebook integration at a similar level to iOS 5 Twitter integration was announced at the WWDC Keynote. By all accounts the technical work had already been completed over a year ago and it was just a matter of people on one, the other or both sides swallowing their pride and flipping the switch.</p>
<hr/>
<h2>Your Predictions</h2>
<p>What do you think? Do I have it right? Any iOS 6 predictions of your own? Let me know in the comments.</p>
<p><strong>UPDATE WRAPUP:</strong> Well, it looks like my prediction hit rate (1.5/8) was pretty dismal. This isn&#8217;t going to stop me from prognosticating about future editions of iOS though. On the upside, I feel like I have just given Apple their tent-pole feature list to start working on for iOS 7. You&#8217;re welcome <img src='http://www.aorensoftware.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.aorensoftware.com/blog/2012/03/06/ios-6-predictions/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>iOS Caster Now Has 60beat GamePad Support</title>
		<link>http://www.aorensoftware.com/blog/2012/01/06/ios-caster-now-has-60beat-gamepad-support/</link>
		<comments>http://www.aorensoftware.com/blog/2012/01/06/ios-caster-now-has-60beat-gamepad-support/#comments</comments>
		<pubDate>Fri, 06 Jan 2012 08:51:24 +0000</pubDate>
		<dc:creator>snielsen</dc:creator>
				<category><![CDATA[60beat]]></category>
		<category><![CDATA[Caster]]></category>
		<category><![CDATA[Computer Games]]></category>
		<category><![CDATA[GamePad]]></category>
		<category><![CDATA[Games]]></category>
		<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Indie]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Marketing]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Video Games]]></category>

		<guid isPermaLink="false">http://www.aorensoftware.com/blog/?p=1222</guid>
		<description><![CDATA[Here&#8217;s demo of the new 60beat GamePad with my friend Mike&#8216;s game Caster HD. I added support to both Caster/Caster HD and the update has been submitted to the App Store for approval. It shouldn&#8217;t be too long before the update actually hits the App Store. (UPDATE: Both updates are now live on the App [...]]]></description>
				<content:encoded><![CDATA[<p><center><iframe width="824" height="419" src="http://www.youtube.com/embed/Cvygl3Op92E?rel=0" frameborder="0" allowfullscreen></iframe></center></p>
<p>Here&#8217;s demo of the new <a href="http://www.60beat.com/?Click=207">60beat GamePad</a> with my friend <a href="http://elecorn.com/blog/">Mike</a>&#8216;s game <a href="http://bit.ly/casterhdapp">Caster HD</a>. I added support to both <a href="http://bit.ly/casterapp">Caster</a>/<a href="http://bit.ly/casterhdapp">Caster HD</a> and the update has <strong>been submitted</strong> to the App Store for approval. It shouldn&#8217;t be too long before the update actually hits the App Store. (<strong>UPDATE</strong>: Both updates are now live on the App Store!)</p>
<p>In the video I demo the controls starting with the cursor. The <a href="http://bit.ly/castermac">Mac</a>/<a href="http://bit.ly/castersteam">Win</a>/<a href="http://bit.ly/casterlinux32">Linux</a> version of Caster has game pad support for the in-game cursor and so it was easiest to just hook into that. You don&#8217;t need to worry about switching between touch and game pad controls. Caster has no on-screen control overlays and both control styles will work <strong>concurrently</strong> so you just plug in and go! No setting switch required. </p>
<p>After getting into the game I demonstrate the settings for the <strong>camera movement</strong> which is controlled by the right analog stick. The start button will <strong>pause</strong> the game and give you access to the options menu. There you can tweak the camera sensitivity and invert the axis if you want. </p>
<p>A lot of the other controls are doubled up so you can use whichever you prefer. The left analog stick or the directional pad control <strong>walking movement</strong>. Button 3 or R2 will <strong>jump</strong>. Button 4 or the R1 will <strong>fire</strong>. Buttons 1, 2 and L2 will rotate through the <strong>different weapons</strong>. By holding down L1 you initiate a <strong>dash</strong> when moving.</p>
<p>(While I&#8217;ve got you here, be sure to check out my new 3D physics shooter <a href="http://www.invaderzurp.com">Invader Zurp</a> if you haven&#8217;t already. It is a ton of fun and there is nothing else like in on the <a href="http://bit.ly/invaderzurp">App Store</a>. <img src='http://www.aorensoftware.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  )</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aorensoftware.com/blog/2012/01/06/ios-caster-now-has-60beat-gamepad-support/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Death to .DS_Store</title>
		<link>http://www.aorensoftware.com/blog/2011/12/24/death-to-ds_store/</link>
		<comments>http://www.aorensoftware.com/blog/2011/12/24/death-to-ds_store/#comments</comments>
		<pubDate>Sun, 25 Dec 2011 05:18:33 +0000</pubDate>
		<dc:creator>snielsen</dc:creator>
				<category><![CDATA[.DS_Store]]></category>
		<category><![CDATA[Bugs]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[mach_star]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Systems]]></category>

		<guid isPermaLink="false">http://www.aorensoftware.com/blog/?p=1159</guid>
		<description><![CDATA[The &#8220;.DS_Store&#8221; file is an abomination and must be stopped. You know what I&#8217;m talking about. I regularly rant about how this annoying file gets in your way, dirties things up and just screws with your stuff in general. Today I decided to do something about it. Before we get to that, lets quickly review [...]]]></description>
				<content:encoded><![CDATA[<p>The &#8220;.DS_Store&#8221; file is an <strong>abomination</strong> and must be stopped. You know what I&#8217;m talking about. I regularly rant about how this annoying file <strong>gets in your way</strong>, <strong>dirties things up</strong> and just <strong>screws with your stuff</strong> in general. Today I decided to do something about it. Before we get to that, lets quickly review what it is and why it sucks. </p>
<h2>What Is It?</h2>
<p><img style="float: left; margin-right: 20px; margin-top: -10px;" src="http://www.aorensoftware.com/blog/wp-content/uploads/2011/12/dsstore3.png" alt="" title="dsstore" width="318" height="347" class="aligncenter size-full wp-image-1161" /></p>
<p>The .DS_Store is a Finder metadata file created primarily by Mac OS X&#8217;s Finder.app. Because of the dot (&#8220;.&#8221;) prefix it is typically not visible in many file browsers and most Mac OS X users are probably not aware of it. It is regularly created when the Finder accesses filesystem directories. It contains directory information about icon locations, view options, silkscreen configuration and the like. The functionality that it provides is moderately useful, but becoming less and less relevant over time. In any case, a long time ago the <strong>horrible</strong> decision was made to store that Finder metadata in an actual file (.DS_Store) in the filesystem within the relevant directory. We have been paying for it ever since. Over time more and more metadata relating to files and the filesystem has been added to Mac OS X, but thankfully those have been stored in saner places (extended attributes, etc). For the time being though .DS_Store is still here with us and still causing trouble. What&#8217;s so harmful about the file you might ask?</p>
<p><span id="more-1159"></span></p>
<h3>Cross-OS Cleanliness</h3>
<p>The .DS_Store file is only useful if you are accessing the filesystem with the Finder. What if you aren&#8217;t using the Finder though? What if you aren&#8217;t even using Mac OS X at all? <strong>At best</strong> the files then become wasted space that is ignored. <strong>At worst</strong> they are horrible clutter that dirties up your file browsing experience. It doesn&#8217;t take much online searching to find <strong>countless</strong> forum posts from Windows users asking what these files are or the <strong>innumerable</strong> removal scripts that Linux users have authored to clean them from their directories. On Mac OS X, if you insert a USB flash drive, mount a network volume or zip up a directory to give to a friend, more likely than not, .DS_Store files have hopped on for the ride. Whoever has to interact with those directories next that doesn&#8217;t use a Mac is going to have to deal with those in some way even if it just having to consciously ignore them. Eventually a power-user facing flag was added that would disable .DS_Store file creation on network volumes (&#8220;<code>defaults write com.apple.desktopservices DSDontWriteNetworkStores true</code>&#8220;) which was a good move. There are still however, plenty of reasons why Mac OS X users hate having them on their own systems.</p>
<h3>Source Control Gunk</h3>
<p>All the programmers in the room, <strong>raise your hand</strong> if you have ever added &#8220;.DS_Store&#8221; to your <code>.gitignore</code> file or equivalent source control ignore configuration? What&#8217;s that? That guy in the back who didn&#8217;t raise his hand? Oh, he was sleeping&#8230;<em>there&#8217;s his hand</em>. The contents of the .DS_Store file are always changing and so even if you did happen to check the .DS_Store files into your repository (furthering it&#8217;s unholy propagation) it is always going to be showing up as a changed file and gunking up your commits with changes and data that have <strong>absolutely nothing at all to do with your code</strong>. I have to wonder how many global man hours have been wasted in configuring source repos to ignore these files or cleaning them out of the repos after someone YET AGAIN added them in their latest commit. </p>
<h3>Permissions Playtime</h3>
<p>Because the .DS_Store file is so inconspicuous and usually innocuous, a lot of the time we simply forget it is there. Unfortunately when doing things like mass permission changes and the like, the .DS_Store file will unintentionally come along for the ride. Suppose you tighten up the permissions on a directory that has a .DS_Store in it. After a while you decide to go through an manually clean it or lower the permission levels on the contents again. You had better remember that you also raised the permissions on the .DS_Store file as well or you might be puzzled why you don&#8217;t have permission to delete the directory or why the Finder isn&#8217;t saving your directory options. It is no show stopper. Any competent command line monkey can figure it out and fix it. But again, the few minutes it takes to fix it should never have been necessary. <strong>Technology is supposed to save time, not destroy it.</strong></p>
<p><img style="float: right; margin-left: 20px; margin-top: 10px;" src="http://www.aorensoftware.com/blog/wp-content/uploads/2011/12/Patriot-Games.jpg" alt="" title="Patriot Games" width="200" height="300" class="aligncenter size-full wp-image-1162" /></p>
<h2>So What Do We Do About It?</h2>
<p>Those were just three examples that I thought of off the top of my head. Leave your own .DS_Store horror/annoyance stories in the comments and I will add any more that don&#8217;t generally fall under one of those three examples. So they are a time consuming annoyance, <strong>easy enough to whine about</strong>. But what to <strong>DO</strong> about it? The other day I again <a href="http://twitter.com/#!/snielsen42/status/150314800403070976">ranted on twitter</a> about them and it <a href="http://twitter.com/#!/paulschreiber/status/150381129906651136">was suggested</a> that maybe someone could write a daemon that would listen to fsevents and nuke them on creation. I kept thinking that the evil should really be stopped at the source. The Finder. I <a href="http://twitter.com/#!/snielsen42/status/150384779806773248">wondered aloud</a> what it would take to patch the Finder so that it wouldn&#8217;t even create them anymore at all. I decided that the creation of .DS_Store files needed to be stopped. Like Jack Ryan in <a href="http://www.imdb.com/title/tt0105112/">Patriot Games</a> I decided that &#8220;I will make it my mission in life&#8221;. For an afternoon at least. So in the interest of <strong>cleanliness</strong> I came up with a <strong>dirty hack</strong>. I call it <a href="https://github.com/snielsen/DeathToDSStore">DeathToDSStore</a>. I have documented my investigation and development process below.</p>
<h2>Who&#8217;s Behind This!? I Want A Name!</h2>
<p><center><img src="http://www.aorensoftware.com/blog/wp-content/uploads/2011/12/strings3.png" alt="" title="strings2" width="650" height="138" class="aligncenter size-full wp-image-1164" /></center></p>
<p>I initially suspected that it was solely the Finder.app that was responsible for .DS_Store creation. After a little investigation it appeared like that was pretty much true but there <em>might</em> be other things out there that also create them. My first lead was the <code>DSDontWriteNetworkStores</code> setting that causes the Finder to not create the files on network mounts. I needed to find out where the code that interacted with that setting lives. Examining <code>/System/Library/CoreServices/Finder.app</code> with <code>strings</code> came up empty. It must be in a framework somewhere. Poking around <code>/System/Library/PrivateFrameworks</code> revealed the culprit: <code>DesktopServicesPriv.framework</code>. Ok so, .DS_Store authoring functionality is very likely in this framework. Clients of this framework in <code>/System/Library/CoreServices</code> include Dock.app, FileSyncAgent.app, TimeMachine.menu, backupd and <strong>the Finder.app</strong>. For the time being I was just going to concentrate on the main offender.</p>
<h3>AKA Property Stores</h3>
<p><center><img src="http://www.aorensoftware.com/blog/wp-content/uploads/2011/12/networkproperties3.png" alt="" title="networkproperties" width="650" height="384" class="aligncenter size-full wp-image-1165" /></center></p>
<p>I started perusing <code>DesktopServicesPriv.framework</code>&#8216;s symbols using <code>nm</code> (piped into <code>c++filt</code>) to see what kind of things I had to work with. Hmm, <code>FSVolumeInfo::ShouldWriteNetworkPropertyStores()</code>? That sounds like it could be directly connected to <code>DSDontWriteNetworkStores</code>. Perusing around a little more it appears like .DS_Store files are called &#8220;<strong>Property Stores</strong>&#8221; internally. There is even a C++ <code>HFSPlusPropertyStore</code> class present. I had just found what I was looking for. Time to start poking at things.</p>
<h3>I Wanna Be A mach_star</h3>
<p><center><img src="http://www.aorensoftware.com/blog/wp-content/uploads/2011/12/nm3.png" alt="" title="nm" width="650" height="384" class="aligncenter size-full wp-image-1166" /></center></p>
<p>I pulled out <a href="http://twitter.com/#!/rentzsch">rentzsch</a>&#8216;s awesome <a href="https://github.com/rentzsch/mach_star">mach_star</a> injection/overriding code and started overriding various routines in that class. For some reason I wasn&#8217;t able to use <code>dlsym()</code> to get the address of any C++ member functions. I tried all sorts of permutations of the mangled name that <code>nm</code> was giving me for stuff but nothing seemed to work. &#8220;<em>Well, I guess I could always just plug the raw address in.</em>&#8221; I thought. So I used <code>vmmap Finder</code> to get the base address of where the <code>DesktopServicesPriv.framework</code>&#8216;s <code>__TEXT</code> section was residing in memory. If <a href="http://en.wikipedia.org/wiki/Address_space_layout_randomization">ASLR</a> (Address Space Layout Randomization) is in play then this value can be different every launch. (<strong>EDIT UPDATE</strong>: <a href="http://www.twitter.com/comex">comex</a> reminded me about the _dyld family of routines and so this is now obtained manually at runtime instead.)</p>
<p><code>nm</code> gave me the offsets of the functions I was targeting and so it was simple enough to just add them together to get the location of the functions I needed to override. It would obviously be a lot cleaner to be able to determine the address from within the binary at runtime but I couldn&#8217;t convince <code>dlsym</code> to give me anything and this was working (unfortunately it adds an external dependencies on Apple&#8217;s Developer Tools (<code>nm</code>) and BSD.pkg(<code>c++filt</code>)).</p>
<h3>Gotcha!</h3>
<p><center><img src="http://www.aorensoftware.com/blog/wp-content/uploads/2011/12/flush3.png" alt="" title="flush" width="650" height="384" class="aligncenter size-full wp-image-1169" /></center></p>
<p>After a bit of trial and error I found that overriding <code>HFSPlusPropertyStore::FlushChanges()</code> with a function that simply did nothing, successfully prevented the creation of .DS_Store files on both Snow Leopard and Lion. On first inspection it doesn&#8217;t appear that overriding this function has any unintended behaviors and appears to accomplish the objective of halting .DS_Store creation quite nicely! Or about as nicely as you can when you are doing something like live patching the Finder.</p>
<p>(<em>Side note:</em> I noticed that I am not the only one using mach_star to live patch the Finder. The <a href="http://www.dropbox.com">Dropbox</a> daemon is doing it as well every time the Finder launches)</p>
<h2>There&#8217;s An App For That</h2>
<p>So I packaged my work up into an <a href="http://www.aorensoftware.com/Downloads/Files/DeathToDSStore.zip">app</a> (you can also run it through the command line under sudo with the &#8220;<code>-silent</code>&#8221; option) and published <a href="https://github.com/snielsen/DeathToDSStore">the source</a> on github. In the near future I am going to add a <code>launchd</code> option so that it will run every time the user logs in or any time the Finder is run (<strong>EDIT UPDATE</strong>: The option to install a Launch Agent has now been added). Now that I have a solution I am going to put my <strong>money where my mouth is</strong> and start running without .DS_Store file creation full time. Hopefully I wont run into any major issues (I will report them here if I do) and I am pretty sure that I wont miss their functionality (At least by having new ones created. Existing disk images and CDs with custom layouts will still be read just fine). So far the result is pretty positive! Is this <em>safe</em>? Eh&#8230;. The safety/cleanliness/forward compatibility of patching OS components has been discussed and debated ad nauseum. You probably already understand the risks involved. Things look pretty stable but I make <strong>no promises</strong>. Go ahead and try out the <a href="http://www.aorensoftware.com/Downloads/Files/DeathToDSStore.zip">DeathToDSStore.app</a> or build your own from <a href="https://github.com/snielsen/DeathToDSStore">source</a> if you want and let me know how it works out for you. Remember that you need to have the Developer Tools installed, BSD.pkg installed and admin authorization. <strong>Death to .DS_Store!</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.aorensoftware.com/blog/2011/12/24/death-to-ds_store/feed/</wfw:commentRss>
		<slash:comments>31</slash:comments>
		</item>
		<item>
		<title>Zurp 1.0 Postmortem</title>
		<link>http://www.aorensoftware.com/blog/2011/12/15/zurp-1-0-postmortem/</link>
		<comments>http://www.aorensoftware.com/blog/2011/12/15/zurp-1-0-postmortem/#comments</comments>
		<pubDate>Fri, 16 Dec 2011 03:47:31 +0000</pubDate>
		<dc:creator>snielsen</dc:creator>
				<category><![CDATA[Achievements]]></category>
		<category><![CDATA[App Store]]></category>
		<category><![CDATA[Bullet3d]]></category>
		<category><![CDATA[Cannonade]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[Game Center]]></category>
		<category><![CDATA[Games]]></category>
		<category><![CDATA[Graphics]]></category>
		<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Humor]]></category>
		<category><![CDATA[Indie]]></category>
		<category><![CDATA[Invader Zurp]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Marketing]]></category>
		<category><![CDATA[OpenGL]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Postmortems]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Psychology]]></category>
		<category><![CDATA[Startups]]></category>
		<category><![CDATA[Video Games]]></category>
		<category><![CDATA[Weaponry]]></category>

		<guid isPermaLink="false">http://www.aorensoftware.com/blog/?p=1128</guid>
		<description><![CDATA[Last September I wrote a blog post introducing Invader Zurp which revealed a little of the back story on how I came upon this new game idea after it&#8217;s first 2 months in development. Fast forward to 3 months later and Invader Zurp had just hit the App Store! I thought it would be useful [...]]]></description>
				<content:encoded><![CDATA[<p>Last September I wrote a blog post <a href="http://www.aorensoftware.com/blog/2011/09/12/invader-zurp/">introducing Invader Zurp</a> which revealed a little of the back story on how I came upon this new game idea after it&#8217;s first 2 months in development. Fast forward to 3 months later and Invader Zurp had just <a href="http://bitly.com/invaderzurp">hit the App Store</a>! I thought it would be useful to sit down and review the last 5 months of development, kind of plan out where I want to go from here and go over the <strong>events</strong> and <strong>insights</strong> that I thought were most influential during development.</p>
<h3>The Story So Far&#8230;</h3>
<p><img style="float: left; margin-right: 20px; margin-top: 7px; margin-bottom: 3px;" src="http://www.aorensoftware.com/blog/wp-content/uploads/2011/12/zurpsketch.jpg" alt="" title="zurpsketch" width="220" height="300" class="aligncenter size-full wp-image-1153" /></p>
<p>So to recap the original <a href="http://www.aorensoftware.com/blog/2011/09/12/invader-zurp/">blog post</a> a bit, it was the middle of the summer (2011) and I had been working my brains out on <a href="http://www.aorensoftware.com/blog/2011/04/02/introduction-to-cannonade/">Cannonade</a> for the previous 6 months. I was a little discouraged at that point because progress wasn&#8217;t coming quite as quickly as I had hoped. Reception from my testers (just friends and family at that point) hadn&#8217;t been as positive as I had wanted either. I still had a very clear vision of what I wanted Cannonade to be and still believed that there is a <em>ton of untapped potential for multiplayer-only games on iOS</em>. But there was only so much I that could do as a <strong>one-man team</strong> and testing a multiplayer game can be quite time consuming. I took the family on vacation in early July and was able to step away from things for a while. It was then that I got an idea for a single player experience that distilled the core gameplay mechanic of Cannonade down to it&#8217;s essence. Thus Invader Zurp was born. Within two weeks I had modularized the Cannonade game engine, re-written the graphics sub-system in OpenGL ES 2.0 and had a working prototype. And it was <strong>fun</strong>! I found myself on very long &#8220;testing&#8221; sessions playing even after I had verified my fixes. I seeded the first alpha version in early September and wrote the introductory blog post. Then began the journey of finishing the game and kicking the darn thing out the door. <span id="more-1128"></span></p>
<h3>Feedback Lesson 1: Make Written Feedback Easy</h3>
<p><img style="float: right; margin-left: 20px; margin-top: 7px; margin-bottom: 3px;" src="http://www.aorensoftware.com/blog/wp-content/uploads/2011/12/feedback.png" alt="" title="feedback" width="300" height="102" class="aligncenter size-full wp-image-1141" /></p>
<p>I got a lot of really <strong>great</strong> feedback from my testers all along the way. I learned two very valuable things about feedback through my experiences with Invader Zurp. The first was that you really need to make it dumb easy for people to give you <strong>WRITTEN</strong> feedback. A lot of my friends would give me awesome feedback when I saw them in person but for the life of me I wouldn&#8217;t be able to remember it even the next day. I got on the beta list for the <a href="https://testflightapp.com/sdk/">TestFlight SDK</a> and start integrating various features into Invader Zurp. One of the most important functionality that I saw in the SDK was a <strong>one-line</strong> (of code) feedback dialog. I added an obnoxious red &#8220;Feedback&#8221; button into the app and made it pervasive except when the user was actively playing the game. This button brought up the TestFlight feedback dialog where they could write to their hearts content. <strong>The floodgates opened</strong>. I started getting a lot of feedback. Most of it was pretty short, just stuff people had noticed in the moment. But it was those little things that people would not have remembered to tell me later that really helped raise the polish level in a lot of places. </p>
<h3>Feedback Lesson 2: Take Individual Opinions As Part Of A Whole</h3>
<p><img style="float: right; margin-left: 20px; margin-top: 7px; margin-bottom: 3px;;" src="http://www.aorensoftware.com/blog/wp-content/uploads/2011/12/opinion.jpg" alt="" title="opinion" width="250" height="258" class="aligncenter size-full wp-image-1142" /></p>
<p>The second important thing I learned about feedback was that any individual person&#8217;s opinion needs to be treated as a part of a larger set of feedback. I had friends tell me very confidently that things needed to be this way or that way. My friends are really smart and know what they are talking about and so I would start to worry that maybe I was on the wrong track and I really should change course (sometimes <em>drastically</em>). However, once I took that individual nugget of feedback and put it up against all the other feedback I was getting I was able to remove my more emotional reactions to it and look things more objectively. This meant that even if my friends were right and I was wrong, I could deal with it in a better way by understanding how it fit in to the entire picture of collective user reaction. I could see <strong>patterns</strong> emerge across multiple testers that indicated that a particular piece was either very wrong or very right. I wasn&#8217;t doing game design by committee though. I still took minority advice sometimes when I felt it was the right thing to do and ultimately I had to veto some majority feedback when I truly felt that it didn&#8217;t mesh with the overlying game vision. I was willing to try anything though and I did in fact implement a lot of crazy feedback that my testers gave me just so that I could see what it felt like in action. An idea on paper and the same idea in implementation are often <strong>completely different things</strong>. I mean, just look at the &#8220;<em>it&#8217;s just a big iPod Touch</em>&#8221; iPad. </p>
<h3>Building A Game For Me</h3>
<p><img style="float: left; margin-right: 20px; margin-top: 7px; margin-bottom: 3px;" src="http://www.aorensoftware.com/blog/wp-content/uploads/2011/12/ikaruga.jpg" alt="" title="ikaruga" width="300" height="255" class="aligncenter size-full wp-image-1143" /></p>
<p>The overall gameplay concept of Invader Zurp was originally inspired a lot by <a href="http://en.wikipedia.org/wiki/Ikaruga">Ikaruga</a>. Ikaruga is a game that you can completely play through in <strong>25 minutes</strong>. But the REAL game is not simply completing the levels from start to finish, but rather it&#8217;s mastering the intricate chaining system and racking up huge scores. I thought that this was a really deep gameplay mechanic. One that really wouldn&#8217;t be appreciated unless the player invested some time into it. However, this deeper gameplay and Ikaruga as a whole is not regarded as being a very casual friendly game (casual gaming being what the iOS App Store seems to reward a lot). <a href="http://en.wikipedia.org/wiki/Treasure_(company)">Treasure</a> (the developer) is well known for catering towards the more &#8220;hardcore&#8221; elements in gaming. I initially designed Invader Zurp in a similar manner to Ikaruga in that you could easily burn through all 100 waves of structures in about 20 minutes. The REAL game and the mechanic that would add substantive depth would exist in a system that rewards you for making tricky <strong>mid-air</strong> block hits. Anyone could shoot the blocks and destroy the towers but it took real skill to hit things in such a way that the blocks would pop up into the air and you needed to be lighting fast in order to target them before they hit the ground. Doing so would reward the player with a lot of points. Coupled with this is an automatic upgrading system that directly ties to your score, the maximum number of missiles that you have to shoot, how fast the missiles regenerate after being shot, how fast your shields regenerate and how powerful your missiles are. The idea was to have a nice smooth power ramp up. You start out with only a few, slowly regenerating missiles and as you get more points, you gradually upgrade to become an uber powerful, unstoppable destruction machine. The thing is that you need to make sure you are scoring a lot of points so that your <strong>upgrade curve</strong> stays ahead of the <strong>difficulty curve</strong>. The waves coming at you steadily increase in turret number and rate of fire and so if you don&#8217;t make sure to rack up tons of points along the way you will eventually not be able to keep up with the onslaught. Learning the point-heavy, mid-air shot skill is really important because it <strong>compounds</strong> on itself very quickly. The more points you get, the more upgrades. The more upgrades you get, the higher potential for you to be able to milk points and stay in the game. At this point in development the player always started the game with the same upgrade levels every time. Because of this you could very clearly observe your own skill increase by seeing how far you got before death or how high a score you were able to rack up before finishing the game. It was a very <strong>pure</strong> game concept that I enjoyed quite thoroughly. </p>
<h3>Building A Game For The Masses</h3>
<p><img style="float: left; margin-right: 20px; margin-top: 7px; margin-bottom: 3px;" src="http://www.aorensoftware.com/blog/wp-content/uploads/2011/12/angrybird.png" alt="" title="angrybird" width="256" height="256" class="aligncenter size-full wp-image-1144" /></p>
<p>However, like Ikaruga, this mechanic&#8217;s hardcore simplicity didn&#8217;t appeal to everyone. Many people thought it was too simple and they said they didn&#8217;t feel like they had a reason to play it again once they got a little taste of it. They kept wanting me to put in more stuff and add more to complexity to the gameplay. I didn&#8217;t want to complicate things up though. I wanted to keep things &#8220;<a href="http://click.linksynergy.com/fs-bin/stat?id=7hgDb73EIMc&#038;offerid=146261&#038;type=3&#038;subid=0&#038;tmpid=1826&#038;RD_PARM1=http%253A%252F%252Fitunes.apple.com%252Fus%252Fapp%252Ffruit-ninja%252Fid362949845%253Fmt%253D8%2526uo%253D4%2526partnerId%253D30" target="itunes_store">Fruit Ninja</a>&#8221; simple and I felt that every added gameplay intricacy would need to be baked in for a long time to see if it really worked in the game (idea vs implementation). I had a long talk with my friend <a href="http://twitter.com/reedolsen">Reed Olsen</a> about it one day. We talked a lot about what kind of games are successful right now on the App Store and what kinds of <strong>psychology</strong> they were tapping into to breed their success. I didn&#8217;t want to simply follow a pattern and become a &#8220;<strong>me-too</strong>&#8221; game, but there were many clear examples of gaming hooks that were extremely effective in getting people to play and continue playing that I couldn&#8217;t ignore. I thought long and hard about these and tried to find a way to integrate some without losing the gameplay essence I had already refined. After a long period of agonizing I decided to test out an in-game currency system. This added a very valuable psychological hook of giving the player the feeling of <strong>progress</strong> every time they played the game. Regardless of whether they did poorly or totally rocked it, their total accrued money would still go up. They would be farther than they were last time. They would feel accomplishment. I was wary of adding this element to the game mainly because I didn&#8217;t want grinding to ultimately overcome skill and I was also keenly aware that in-game currency systems (especially the ways in which they are implemented in freemium games) are distasteful to many in the gaming community right now. But I decided that I was going to be <strong>willing to give anything a try</strong>. I allowed the player to purchase upgrades outside of the gameplay that would increase the base level that their in-game upgrade levels started at. This meant that I had to adjust the difficulty curve up so that the player would need to save currency up and purchase upgrades to (<em>realistically</em>) be able to finish the game. No longer would a very skilled player be able to just waltz in and finish the game with just the initial upgrade levels. They would need to put in some time and work to get accomplish that goal. In practice I found that this worked fairly well at providing a hook for the less &#8220;hardcore&#8221; players and didn&#8217;t detract as much from the pure gameplay mechanic as I thought it would. I eventually had to bump down the maximum missile regeneration level because once the player had max&#8217;d out all their upgrade levels they basically became an unstoppable block-killing machine. Skill kind of got thrown out the window for the high end players at that point. After making some small adjustments to the max upgrade levels I found a nice <strong>sweet spot</strong> that made the player feel like through their efforts they had grown into a powerful, planet ravaging machine but still left room for the high end players to compete against each other with their pure skill. </p>
<h3>Further Motivation</h3>
<p><img style="float: right; margin-left: 20px; margin-top: 7px; margin-bottom: 3px;" src="http://www.aorensoftware.com/blog/wp-content/uploads/2011/12/starcoin.png" alt="" title="starcoin" width="250" height="243" class="aligncenter size-full wp-image-1145" /></p>
<p>Another gameplay addition I developed grew out of a conversation with my friend <a href="http://twitter.com/elecorn">Mike Smith</a>. Again, he wanted some additional gameplay element to increase the complexity and I was resistant. But in the course of our chat we came up with an idea that I thought meshed really well with the existing mechanic and wasn&#8217;t confusing or overwhelming. The idea was suggested that I hide three special blocks in every wave and tie some sort of bonus to hitting all of them. This was really appealing to me because it was super easy to implement and addressed a <strong>major complaint</strong> that a lot of people had up to that point which was that they always felt like they were out of missiles. I decided to put three shiny gold blocks into every wave and give the player a full missile reload if they were able to hit all three. This meant that now there was now an opportunity for a full missile reload at pretty much every moment. The player now had to <strong>balance</strong> whether they were going to take the risk of spending ammo to go after the gold blocks or write them off. It was a great improvement on the gameplay and also allowed for another progress-based psychological hook. I could keep track of how many blocks the player got in each wave and record those in a running stats menu outside of gameplay. That way the player can see the progress they are making towards getting all the gold blocks in every wave. This kind of optional &#8220;collect&#8221; mechanic is used to great effect in tons of games these days (in my mind most notably in the <a href="http://en.wikipedia.org/wiki/Mario">Mario</a> franchise). I then layered on an additional mechanic of keeping track of how long the player can maintain getting all three blocks in the waves in a row and giving a bonus missile damage multiplier as their <strong>streak</strong> increases. This seemed like a very easy element to simply layer on that would add depth without adding complexity and confusion. I then did a similar thing with enemy turret destruction streaks and started keeping track of those stats as well. The feeling of having your accomplishments recorded can be pretty powerful and very motivating to people with <strong>completionist</strong> mindsets which brings me to the next element I layered on.</p>
<h3>Achievement Unlocked: Make 50 Achievements, Ship Game</h3>
<p><img style="float: right; margin-left: 20px; margin-top: 7px; margin-bottom: 3px;" src="http://www.aorensoftware.com/blog/wp-content/uploads/2011/06/achievement-unlocked-04-300x224.png" alt="" title="achievement-unlocked-04" width="300" height="224" class="aligncenter size-medium wp-image-700" /></p>
<p>Achievements are a no-brainer. They are super easy to implement and you get a lot of psychological mileage out of them. I found that coming up with crazy achievements and writing their humorous descriptions was some of the <strong>most fun</strong> I had during the development of Cannonade and Invader Zurp. It is well documented that having a lot of easy early game achievements can do a lot to keep people invested in your game and motivate them to keep playing. Coming up with a nice curve of achievements for the beginners, intermediate, advanced and <em>insane</em> was pretty fun and actually not that hard. I didn&#8217;t need to worry about giving any skill level too many. I could just make whatever achievement popped into my head. I loved coming up with really random ones that players would accidentally run into during the course of the game. &#8220;<em>Huh? What was that achievement? Eh whatever, cool!</em>&#8220;. I was really proud of a lot of the locked/unlocked achievement descriptions that I came up with. Unfortunately <a href="http://www.apple.com/game-center/">Game Center</a> has visually small spaces in their app to display those descriptions and so anything more than just a basic description gets truncated. So when perusing achievements, be sure to do it in the in-game menu where you can view the &#8220;<strong>Director&#8217;s Cut</strong>&#8221; achievement descriptions. </p>
<h3>Future Plans</h3>
<p>I had a lot of other cool ideas that I wanted to implement in Invader Zurp but I knew that I needed to pare things down and determine my exact 1.0 feature set or else I would never get around to shipping (&#8220;<em>Sometimes you just need to shoot the engineers and ship the darn thing</em>&#8220;). I had a lot of ideas like:</p>
<ul>
<li>In-App purchase to allow people to buy in-app currency (kind of a given these days on the App Store).</li>
<li>I also wanted to rip out and incorporate the Cannonade level editor (what I used to make all the levels) into Invader Zurp so that the players could design and ulpoad their own building designs and have them trickle down into the game. It would be really cool to see a different set of towers every day, each with a little &#8220;Designed by GamerX&#8221; credit under their announcement title.</li>
<li>I want to have alternate missile effect sets like psychedelic rocket contrails or themed missile explosions like a burst of hearts when missiles explode for Valentine&#8217;s day.</li>
<li>I wanted to have a lot of analytics hooks and an App Store release &#8220;Feedback&#8221; button that the players could use to interact with me.</li>
<li>I also wanted more Zurp character art, iCloud save game support, Game Center avatars, Twitter integration and a lot of other little things.</li>
</ul>
<p>Many of these will find their way into a future update. Just need to prioritize them correctly.</p>
<h3>Submission Deathmarch</h3>
<p>About a month before release I was talking to my friend <a href="http://twitter.com/mason3dtech">Mason Sheffield</a> about what I felt I needed for a 1.0 release and how far off I thought I was. He challenged me to get 1.0 on to the App Store by Christmas (2011 <img src='http://www.aorensoftware.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ). I thought was a really unrealistic target. I looked at what still needed to be done and saw an unsurmountable mountain. But <strong>December 25/26th</strong> is the biggest day of the year for the App Store and it was also ahead of my own in-head release target. I decided that this challenge was just the kind of motivation I needed and it put a fire under me. The App Store review team was going to be shutting down on December 22nd and I thought that during this season there would be a lot of other developers also trying to make the deadline in order to get on to the App Store before Christmas. I conservatively estimated that a review would take two weeks and so that put my submission deadline at December 8th. So for the last month of 1.0 development I <strong>worked like crazy</strong> and started aggressively cutting things right and left. About two weeks before the deadline I hit a moment when I realized &#8220;Hey, this thing is actually coming together! I might actually make it!&#8221;. I was quickly heading toward the light at the end of the tunnel. I was seeding every two or three days (much faster than my usual goal of once a week) and felt like I was running a marathon. Soon enough though the day of truth arrived. I actually decided then to give myself two extra days to finalize a couple of things and squash as many bugs as I could before submission. On December 10th I finally submitted Invader Zurp version 1.0 to the App Store. It was amazing how many truly egregious bugs I found on the day of submission and was thankfully able to squash them right before submission. I figured that I would probably get approved (fingers crossed) just in time for December 25th and that would give me enough time to make a website, gameplay trailer and find reviewers to give promo codes to. To my surprise, <strong>only four days later</strong> the iTunes Connect app on my phone buzzes to tell me that Invader Zurp is &#8220;In Review&#8221; and only 40 minutes later it changed to &#8220;Ready For Sale&#8221;. This was a nice surprise and actually caught me a little off guard! So now that the game is <a href="http://bitly.com/invaderzurp">finally for sale</a> the time has come to start promoting it and preparing for the first update. I definitely want to be in the league of other great games that have quality content/features in every update. I want my users know that when they get an update from me it&#8217;s going to be something new and good to explore. Aright, enough writing, back to work!</p>
<p>(Interesting side note: I found out during app validation that you can&#8217;t submit an app with an unresolvable symlink in it. I was doing this intentionally though. Email me if you want to know why.)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aorensoftware.com/blog/2011/12/15/zurp-1-0-postmortem/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Invader Zurp is on the App Store!</title>
		<link>http://www.aorensoftware.com/blog/2011/12/15/invader-zurp-is-on-the-app-store/</link>
		<comments>http://www.aorensoftware.com/blog/2011/12/15/invader-zurp-is-on-the-app-store/#comments</comments>
		<pubDate>Thu, 15 Dec 2011 22:20:36 +0000</pubDate>
		<dc:creator>snielsen</dc:creator>
				<category><![CDATA[Achievements]]></category>
		<category><![CDATA[App Store]]></category>
		<category><![CDATA[Bullet3d]]></category>
		<category><![CDATA[Game Center]]></category>
		<category><![CDATA[Games]]></category>
		<category><![CDATA[Indie]]></category>
		<category><![CDATA[Invader Zurp]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[OpenGL]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Psychology]]></category>
		<category><![CDATA[Startups]]></category>

		<guid isPermaLink="false">http://www.aorensoftware.com/blog/?p=1134</guid>
		<description><![CDATA[Aright it&#8217;s here! Invader Zurp, the project I have worked so hard on for the last 5 months is now for sale on the App Store! I want to thank all my wonderful testers for all their time they put into playing it and even more for the thoughtful and productive feedback that they so [...]]]></description>
				<content:encoded><![CDATA[<p><center><a href="http://bitly.com/invaderzurp"><img src="http://www.aorensoftware.com/blog/wp-content/uploads/2011/12/titleIZ.png" alt="" title="titleIZ" width="500" height="247" class="aligncenter size-full wp-image-1135" /></a></center></p>
<p>Aright it&#8217;s here! <a href="http://www.invaderzurp.com">Invader Zurp</a>, the project I have worked so hard on for the last 5 months is now for sale on the App Store! I want to thank all my wonderful testers for all their time they put into playing it and even more for the thoughtful and productive feedback that they so lavishly furnished on me. I couldn&#8217;t have done it without you! </p>
<p>Check out the gameplay trailer here:</p>
<p><center><iframe width="824" height="419" src="http://www.youtube.com/embed/X3JtlDrIFnE?rel=0" frameborder="0" allowfullscreen></iframe></center></p>
<p><center><big><big><big>Now <a href="http://bitly.com/invaderzurp">Go Get It!</a></big></big></big></center></p>
]]></content:encoded>
			<wfw:commentRss>http://www.aorensoftware.com/blog/2011/12/15/invader-zurp-is-on-the-app-store/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Application-Specific Bullet Physics Optimization</title>
		<link>http://www.aorensoftware.com/blog/2011/12/13/application-specific-bullet-physics-optimization/</link>
		<comments>http://www.aorensoftware.com/blog/2011/12/13/application-specific-bullet-physics-optimization/#comments</comments>
		<pubDate>Wed, 14 Dec 2011 06:29:30 +0000</pubDate>
		<dc:creator>snielsen</dc:creator>
				<category><![CDATA[Bullet3d]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[Games]]></category>
		<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Indie]]></category>
		<category><![CDATA[Invader Zurp]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Psychology]]></category>
		<category><![CDATA[Video Games]]></category>

		<guid isPermaLink="false">http://www.aorensoftware.com/blog/?p=1107</guid>
		<description><![CDATA[In developing Cannonade and Invader Zurp I have invested a fair amount of time becoming familiar with the Bullet Physics Library and trying to milk every bit of performance out of it as I can. Realistic physics simulation plays a crucial part in both games and is also the performance bottleneck in the majority of [...]]]></description>
				<content:encoded><![CDATA[<p>In developing <a href="http://http://www.aorensoftware.com/blog/2011/04/02/introduction-to-cannonade/">Cannonade</a> and <a href="http://www.invaderzurp.com">Invader Zurp</a> I have invested a fair amount of time becoming familiar with the <a href="http://www.bulletphysics.com">Bullet Physics Library</a> and trying to milk every bit of performance out of it as I can. Realistic physics simulation plays a crucial part in both games and is also the <strong>performance bottleneck</strong> in the majority of gameplay scenarios with both. When trying to optimize for performance I generally see myself using two kinds of approaches. One is a higher level algorithmic approach that tries to see ways to create less work or avoid work in order to keep things going fast. Once I have nailed down as best I can, the minimum set of work that I really cannot avoid doing, then comes the work of getting down and dirty and speeding up the routines that actually do that work. When I initially approached the problem of speeding up Bullet, I first simply treated it as a black box (work that I wouldn&#8217;t be able to avoid) and <a href="http://www.aorensoftware.com/blog/2011/03/31/bullet-physics-optimization-for-ios/">explored what kinds of compiler configurations</a> I could leverage to create the fastest possible execution of the physics simulation work. Later, after I had nailed down the gameplay mechanic for Invader Zurp I was able to start specifically attacking the set of physics simulation work needed for the game and whittled it down to a much smaller amount using some simplifications, accuracy compromises and psychology. </p>
<p><span id="more-1107"></span></p>
<h3>Work, work&#8230; More work?</h3>
<p><center><a href="http://www.invaderzurp.com"><img src="http://www.aorensoftware.com/blog/wp-content/uploads/2011/12/IZ.png" alt="Invader Zurp" title="IZ" width="600" height="450" class="aligncenter size-full wp-image-1113" /></a></center></p>
<p>So a basic description of the gameplay in Invader Zurp is that you, the player are flying in 1st person over a planet&#8217;s surface towards structures made up of variously shaped and sized blocks. The player taps the screen to fire missiles at the structures which then explode. This explosion destroys some blocks and sends other blocks flying through the air. There are also some special blocks (called turrets) that shoot missiles back at the player which must be intercepted or else the player takes damage. In the next couple of sections I am going to step through the procedures that I go through in order to make sure that my physics simulation work is as small as possible while still giving the player a good gameplay experience. </p>
<h3>Less Stuff, Less Work</h3>
<p>First things first. The player is constantly moving forward and &#8220;blocky&#8221; structures are being brought into the simulation at the horizon regularly as the player plays the game. Obviously more blocks means more work and so minimizing the amount of blocks in the simulation is imperative. Because the direction the player is moving never changes, it only seems natural that once a block has moved behind the player&#8217;s viewpoint that it should be removed from the simulation. In this game a block behind the player can no longer be interacted with (<em>usually</em>) and so it is simple enough to just remove them from the simulation. I also thought about removing blocks once they have left the player&#8217;s view frustum but I decided that I should still keep those blocks in play in case a missile has already targeted it and is currently homing in on it. The player might be really disappointed to have successfully targeted a special bonus block only to have it lifted from their grasp as it leaves their view. In addition to removing blocks behind the player viewpoint I also remove blocks that have been pushed too far into the background. </p>
<h3>Shh&#8230; Don&#8217;t move. It&#8217;s CPU Load&#8217;s Based On Movement</h3>
<p><img style="float: right; margin-left: 20px; margin-top: 7px; margin-bottom: 3px;" src="http://www.aorensoftware.com/blog/wp-content/uploads/2011/12/trex.jpg" alt="" title="Tyrannosaurus Rex in scene from film &#039;Jurassic Park&#039;." width="200" height="142" class="aligncenter size-full wp-image-1120" /></p>
<p>Another very basic performance concept in physics simulation is that if objects are not moving (or are moving so slowly as to not be perceived as moving) we can <strong>skip</strong> over a large part of the simulation for them. You can set a movement threshold that causes blocks to become inactive from a lot of the simulation once their velocity falls below it. This functionality is built in to Bullet (<code>btRigidBody::setSleepingThresholds()</code>) and most other physics engines. In Invader Zurp I chose to bump up that threshold higher than normal so that blocks would become inactive sooner. I also set the friction coefficients of the blocks and the ground such that blocks would slide around less and fall under the inactivity threshold quicker (<code>btRigidBody::setFriction()</code>). Because the player is constantly moving there is not a lot of perceived difference to the player between a block that is sliding around a little bit and one that is stationary. Thus, aggressively changing these values didn&#8217;t result in a very different experience for the player. Also, when new block structures are added to the simulation, every block is always initially flagged as inactive (<code>btRigidBody::setActivationState(ISLAND_SLEEPING)</code>). This is because in Invader Zurp it is assumed that the structures are all initially standing still. This does have the interesting side effect of allowing for structurally unsound buildings to appear to be holding up. Blocks can be suspended in air and blocks can also occupy the same space at the same time indefinitely. Of course the instant a moving block collides with it the entire thing falls apart but I decided that the charm of having interesting (but structurally insufficient or conflicting) building designs outweighed the realistic depiction of the structure. </p>
<h3>Accuracy Is In The Eye Of The Beholder</h3>
<p><img style="float: right; margin-left: 20px; margin-top: 7px; margin-bottom: 3px;" src="http://www.aorensoftware.com/blog/wp-content/uploads/2011/12/eyeofbeholder.jpg" alt="" title="eyeofbeholder" width="200" height="138" class="aligncenter size-full wp-image-1119" /></p>
<p>There is an interesting problem in traditional realtime physics simulation called &#8220;<strong>tunneling</strong>&#8221; which I describe in depth in <a href="http://www.aorensoftware.com/blog/2011/06/01/when-bullets-move-too-fast/">another blog post</a>. In that post I describe some techniques to deal with the problem of relatively small objects tunneling through others and different ways of dealing with it. In Invader Zurp the fastest moving objects are (<em>usually</em>) the missiles that the player shoots at the oncoming structures and incoming enemy missiles. The missiles travel quite quickly (especially when they are completely leveled up) and at a normal simulation granularity they can easily tunnel through the blocks. I considered special-casing them and simulating their movement and collision myself but I eventually decided to have them remain as Bullet simulation objects and keep (most) collision detection for them inside the physics engine. Taking some cues from the solution I came up with for Cannonade (&#8220;<em>Convex Sweep Collision Based Time Slicing</em>&#8220;, discussed in the tunneling blog post) I decided to start from there. To ensure that the missiles do not tunnel through blocks even at their high rate of speed I decided to increase the granularity of the simulation high enough so that they could not completely tunnel through an individual block. Because doing so increases the needed computational power substantially, I had to make sure that I only did it when <strong>absolutely necessary</strong>. So every frame I would spend some CPU cycles performing convex sweep collision queries (<code>btCollisionWorld::convexSweepTest</code>) for the fast moving missiles to see if they are likely to hit a block within the next simulation frame. If it seems like a collision is likely then I see what the fastest velocity is of any of the missiles that will likely hit a block during that frame. I use that velocity to determine just how much more accuracy (and in turn granularity) my simulation needs to ensure that the fastest moving missile will not tunnel. The cost of performing convex sweep collision queries is expensive but in the long run they save much more time by making sure that the simulation runs at lower accuracy level when missiles aren&#8217;t going to tunnel. Those convex sweep queries can still get quit expensive though. I started looking at ways to avoid performing it. I looked very closely at the specifics of the missile&#8217;s role and player perception in my game and got <strong>an insight</strong>. When you tap on the screen an algorithm determines which block or enemy missile you most likely intend to hit with your missile. Your missile is entered into the simulation and undergoes forces that cause it to home into it&#8217;s target until either it or it&#8217;s target is destroyed. Because of that strong homing force, I noticed that <strong>9X%</strong> of the time the only collision that a missile would ever experience in it&#8217;s lifetime is one with it&#8217;s target. I figured that if I only performed the convex sweep query for a missile when it was getting close to it&#8217;s target that I could forego performing a ton of queries when the missiles are not close to their targets or much less when they aren&#8217;t even close to any block at all. It is substantially less expensive to simply calculate the straight-line distance between a missile and it&#8217;s target and then check if that distance is within a certain threshold. If it was within the threshold only then would I actually perform a convex sweep query to determine if I really did need to increase the simulation granularity. A side effect of this is that occasionally missiles will tunnel through blocks that they are not targeting. In practice though I have only actually noticed this happening two or three times. The computation savings was <strong>well worth the compromise</strong> in this specific application. I took this optimization one step further and also decided to sort the missiles per frame in order of how close they were to their targets. This meant that the missiles which were more likely to come up with a positive collision as a result of the convex sweep query were examined first. This then meant that a contender for the fastest moving collision during the frame was calculated earlier and thus increased the likelihood of being able to forego convex sweep queries on missiles that had less of a chance (due to their increased distance from their targets) of coming back with a positive collision because they were perhaps moving slower than the missile that we already had determined had collided. All of these optimizations led to a <strong>significant performance boost</strong> without sacrificing significant user perceived accuracy. Occasionally when there is a lot going on you can see individual frames take longer as the simulation granularity gets spiked but it is usually only for a few individual frames. For the most part, the player taps, sees a missile shoot out towards the structure and then watches it blow up, all with a fairly regular frame rate. </p>
<h3>They Are So Small Anyway&#8230;</h3>
<p><img style="float: right; margin-top: 7px; margin-bottom: 3px;" src="http://www.aorensoftware.com/blog/wp-content/uploads/2011/12/upgradeMissile.png" alt="" title="upgradeMissile" width="200" height="200" class="aligncenter size-full wp-image-1123" /></p>
<p>In that same strain of missile collision performance, I devised another slight performance win but it was instead born out of player experience rather than an egregious slowdown. In addition to targeting structural blocks, your missiles can also target the enemy&#8217;s defense missiles which are constantly homing in on you. Unfortunately, because of the missile&#8217;s speeds relative to their sizes, what would usually happen is that the player&#8217;s missile would speed towards the enemy missile very quickly and then violently hover around it for a while before finally colliding with it and exploding them both. This was not a very fun player experience and was also perceived as being a very <strong>erratic result</strong>. So I decided to pull missile to enemy-missile collision into my own code instead of using the physics engine. So I instead calculate the straight-line distance between the two and when the distance falls below a certain threshold the missile explodes and takes the enemy missile with it. This makes for a much more <strong>satisfying player experience</strong>. The player sees their missile heading toward it&#8217;s target and then both exploding when they appear to intersect. In addition to being a better game experience it saves on collision computation as well. In fact, we can probably say that we don&#8217;t need to even compute collision between a player missile and an enemy missile in the physics engine at all! Using collision flags (<code>btBroadphaseProxy::m_collisionFilterMask</code>, <code>btBroadphaseProxy::m_collisionFilterGroup</code>) I separated the missiles into specific groups that would only collide with the ground and blocks. The likelihood that two missiles would collide with each other when out in play area away from the ship was somewhat small (much less have a user even notice that it should have happened but didn&#8217;t) and so pulling those objects out of collision computation with each other was significant win. I also found that this was necessary because when the player got to higher levels of the game and started to fire missiles much more rapidly, their own missiles actually WOULD collide with each other (fairly often actually) and explode themselves very quickly after being fired because of the missile density around the area they were being fired out of the ship from. This was also a bad player experience that was fortunately also simply solved by taking the missiles out of collision tests with other missiles. </p>
<h3>Modifying Bullet</h3>
<p><img style="float: right; margin-left: 20px; margin-top: 7px; margin-bottom: 3px;" src="http://www.aorensoftware.com/blog/wp-content/uploads/2011/12/bullet_logo.png" alt="" title="bullet_logo" width="200" height="81" class="aligncenter size-full wp-image-1118" /></p>
<p>At one point I experimented with extending Bullet itself to allow for more specialized control over it&#8217;s execution. I added some flags to collision bodies that allowed me to selectively control which bodies were fully put through collision detection and contact resolution system. My aim was to lower the hit of increasing the simulation granularity by keeping most of the simulation progressing forward at the rate of one full frame and instead only allowing the speedy missiles that were likely to tunnel undergo multiple sub-frame physics passes. That way the only increased performance hit would be involving the additional physics calculations associated with objects that I had determined were likely to tunnel. This would of course also sacrifice some accuracy because not all of the objects involved in a high granularity collision will be progressing forward like they normally would but the potential performance gain was <strong>too high to ignore</strong>. I took about a day to investigate this avenue and got things up and running but they didn&#8217;t quite work correctly. There were clearly many peripheral effects to my modifications that I did not yet fully understand and so I decided to instead keep Bullet an unmodified black box for Invader Zurp version 1.0 and planned on re-visiting that idea again when I had more time to dig into Bullet&#8217;s internals. </p>
<h3>Other</h3>
<p>Other small things I did to try to milk more performance was to keep my landscape geometry as simple as possible (in the case of Invader Zurp it is just one simple plane). I also read that adding the <code>SOLVER_ENABLE_FRICTION_DIRECTION_CACHING</code> flag to <code>m_solverMode</code> of <code>btContactSolverInfo</code> and lowering the <code>m_numIterations</code> in <code>btContactSolverInfo</code> (I lowered mine down to 2 down from the default 10) you could possibly gain some performance at the cost of simulation accuracy. Because of the quick gameplay pace and constant movement of Invader Zurp I felt that it was fairly tolerable of accuracy loss and so I added those settings in to my configuration. I didn&#8217;t do any formal or extensive testing to see if this had any effect but to the naked eye I couldn&#8217;t discern any significant performance gain (or loss, or accuracy loss for that matter) and so I decided to leave them in. </p>
<h3>Conclusion</h3>
<p>Well, that is about all the ones I could remember. I am sure that as time goes on I will be able to figure out more ways to squeeze the most out of Bullet. The grand takeaway is that in your application (especially games) it helps to look at your own specific situation and perform very narrow situation-specific optimizations. Are any of these optimizations applicable in your game/application? Any other ideas on getting more physics bang for your buck? Let me know in the comments. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.aorensoftware.com/blog/2011/12/13/application-specific-bullet-physics-optimization/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Think Tank: Never let a good idea get away again!</title>
		<link>http://www.aorensoftware.com/blog/2011/11/28/think-tank-never-let-a-good-idea-get-away-again/</link>
		<comments>http://www.aorensoftware.com/blog/2011/11/28/think-tank-never-let-a-good-idea-get-away-again/#comments</comments>
		<pubDate>Tue, 29 Nov 2011 03:59:20 +0000</pubDate>
		<dc:creator>snielsen</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Indie]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Psychology]]></category>
		<category><![CDATA[Think Tank]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.aorensoftware.com/blog/?p=1083</guid>
		<description><![CDATA[So I have these thoughts&#8230;a lot. No not that kind! I get these fun ideas for neat projects or crazy inventions as I am driving in the car, singing in the shower, lying in bed or even in the midst of coding. Really creative ideas that may or may not be realistically viable but worthy [...]]]></description>
				<content:encoded><![CDATA[<p>So I have these thoughts&#8230;a lot. No not that kind! <img src='http://www.aorensoftware.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  I get these fun ideas for <strong>neat projects</strong> or <strong>crazy inventions</strong> as I am driving in the car, singing in the shower, lying in bed or even in the midst of coding. Really creative ideas that may or may not be realistically viable but worthy of entertaining nonetheless. I get really excited and start working it over in my mind. It feels like inspiration. <em>Then something happens&#8230;</em> Life resumes and I need to deal with the actual task at hand. No worry, it was such a compelling idea that I will surely remember it later when I have cycles to devote to it. <strong>And then I never think about it again</strong>. Or even worse, the next day rolls around and I all of the sudden remember that I did think of a cool idea the day before, but I can&#8217;t quite bring the memory into focus. Does any part of this sound familiar to you? </p>
<div style="float: right; margin-left: 20px;"><img src="http://www.aorensoftware.com/blog/wp-content/uploads/2011/11/oldthinktank.png" alt="" title="oldthinktank" width="300" height="286" class="aligncenter size-full wp-image-1087" /></div>
<h3>Write It Down</h3>
<p>&#8220;No more!&#8221; I declared. Nothing gets remembered unless it is written down. Hmm, idea notebook? TextEdit file on the computer? I did the text file thing for a while but I kept forgetting that it was there or didn&#8217;t have access to it at the time. No worries&#8230; Evolution of the computer to the rescue! Transferred things to Notes.app on the iPhone. <em>Not good.</em> Too jumbled, un-organized, too much information presented in-general. I knew of the million and a half &#8220;getting things done&#8221;, task management, mind-mapping and brain organization apps/ecosystems out there. But I found most were too general for what I wanted and too heavy. <em>Well, if you want something done&#8230;</em></p>
<p><span id="more-1083"></span></p>
<h3>Version 1.0</h3>
<p>I decided that I was going to create a web page where I could dump all my ideas instead. It would sort and organize the ideas so that I could easily review them when I was looking for an idea. I am not a web programmer and so it was kind of fun to learn about the latest in AJAX-ish web technology and poke around a bit with it. I got something up and running within an evening and it actually worked pretty well. No longer was I going to lose those awesome little nuggets of inspiration. I called it &#8220;<strong>Think Tank</strong>&#8220;.</p>
<h3>Gone Native</h3>
<div style="float: right; margin-left: 20px;"><a href="http://click.linksynergy.com/fs-bin/stat?id=7hgDb73EIMc&#038;offerid=146261&#038;type=3&#038;subid=0&#038;tmpid=1826&#038;RD_PARM1=http%253A%252F%252Fitunes.apple.com%252Fus%252Fapp%252Fthink-tank!%252Fid480471896%253Fmt%253D8%2526uo%253D4%2526partnerId%253D30" target="itunes_store"><img src="http://www.aorensoftware.com/blog/wp-content/uploads/2011/11/tt2.png" alt="" title="tt2" width="256" height="256" class="aligncenter size-full wp-image-1088" /></a></div>
<p>Some time passed and I was thinking about how one of these days I should really re-write the Think Tank web page cleanly using modern web standards and methodologies. But then it dawned on me: &#8220;<em>You&#8217;re a native iOS programmer. Why don&#8217;t you do what you do best and implement Think Tank as a native iOS app?</em>&#8221; Yea! Then the interface would be nice and fast and I could take advantage of all sorts of iOS goodness as well. What&#8217;s more, I could then put it on App Store for others to take advantage of. I set to work and quickly got it up and running. I have been using it myself for about 3 weeks and it just what I wanted. <strong>Simple</strong>, <strong>straightforward</strong> and <strong>fast</strong>. Now when I get an idea I just whip out Think Tank, jot down what is in my head and get back to what I am doing. And now that Think Tank has just been released on the <a href="http://click.linksynergy.com/fs-bin/stat?id=7hgDb73EIMc&#038;offerid=146261&#038;type=3&#038;subid=0&#038;tmpid=1826&#038;RD_PARM1=http%253A%252F%252Fitunes.apple.com%252Fus%252Fapp%252Fthink-tank!%252Fid480471896%253Fmt%253D8%2526uo%253D4%2526partnerId%253D30" target="itunes_store">App Store for $0.99</a> anybody else can take advantage of it now as well. </p>
<p><center><big><big><strong>Think Tank: Never let a good idea get away again!</strong><br /><a href="http://click.linksynergy.com/fs-bin/stat?id=7hgDb73EIMc&#038;offerid=146261&#038;type=3&#038;subid=0&#038;tmpid=1826&#038;RD_PARM1=http%253A%252F%252Fitunes.apple.com%252Fus%252Fapp%252Fthink-tank!%252Fid480471896%253Fmt%253D8%2526uo%253D4%2526partnerId%253D30" target="itunes_store">Get Think Tank from the App Store</a></big></big></center></p>
]]></content:encoded>
			<wfw:commentRss>http://www.aorensoftware.com/blog/2011/11/28/think-tank-never-let-a-good-idea-get-away-again/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Invader Zurp Progress</title>
		<link>http://www.aorensoftware.com/blog/2011/10/27/invader-zurp-progress/</link>
		<comments>http://www.aorensoftware.com/blog/2011/10/27/invader-zurp-progress/#comments</comments>
		<pubDate>Fri, 28 Oct 2011 03:56:47 +0000</pubDate>
		<dc:creator>snielsen</dc:creator>
				<category><![CDATA[Achievements]]></category>
		<category><![CDATA[Bullet3d]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[Games]]></category>
		<category><![CDATA[Graphics]]></category>
		<category><![CDATA[Indie]]></category>
		<category><![CDATA[Invader Zurp]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[OpenGL]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Video Games]]></category>

		<guid isPermaLink="false">http://www.aorensoftware.com/blog/?p=1073</guid>
		<description><![CDATA[Above is some footage from the current Invader Zurp alpha (apologies for the bad exposure). As you can see, things have come quite a ways since I released the first video! There are a lot more visual effects, 5 music tracks from Monte &#8216;Trance&#8217; Emerson, a new gameplay mechanic, an in-game currency system and tons [...]]]></description>
				<content:encoded><![CDATA[<p><center><iframe width="824" height="419" src="http://www.youtube.com/embed/O8PBuLQcH-s?rel=0" frameborder="0" allowfullscreen></iframe></center></p>
<p>Above is some footage from the current Invader Zurp alpha (apologies for the bad exposure). As you can see, things have come quite a ways since I released <a href="http://www.aorensoftware.com/blog/2011/09/12/invader-zurp/">the first video</a>! There are a lot <strong>more visual effects</strong>, <strong>5 music tracks</strong> from <a href="http://www.cdbaby.com/cd/tranceemerson">Monte &#8216;Trance&#8217; Emerson</a>, a <strong>new gameplay mechanic</strong>, an <strong>in-game currency</strong> system and tons of other little advancements. I must say that I feel like things are progressing quite nicely! I still have a ways to go though and so I am going to continue cranking away with my head down until it is finished.</p>
<p>What are your thoughts on how development is going? Let me know in the comments. Also, a huge thank you to all of my testers who have given me invaluable feedback on all the builds thus far. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.aorensoftware.com/blog/2011/10/27/invader-zurp-progress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Startup Grind.app 1.3 (October Update)</title>
		<link>http://www.aorensoftware.com/blog/2011/10/18/startup-grind-1-3-october-update/</link>
		<comments>http://www.aorensoftware.com/blog/2011/10/18/startup-grind-1-3-october-update/#comments</comments>
		<pubDate>Wed, 19 Oct 2011 02:43:04 +0000</pubDate>
		<dc:creator>snielsen</dc:creator>
				<category><![CDATA[Indie]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Marketing]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Startup Grind]]></category>
		<category><![CDATA[Startups]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.aorensoftware.com/blog/?p=1059</guid>
		<description><![CDATA[The Startup Grind is expanding! You may or may not have heard that we have recently opened up a Los Angeles chapter of the Startup Grind and to coincide with that we have added multiple chapter support to the Startup Grind.app! Now if you are a member of the Startup Grind LA your upcoming and [...]]]></description>
				<content:encoded><![CDATA[<p>The <a href="http://www.startupgrind.com">Startup Grind</a> is expanding! You may or may not have heard that we have recently opened up a Los Angeles chapter of the Startup Grind and to coincide with that we have added multiple chapter support to the Startup Grind.app! Now if you are a member of the <a href="http://www.meetup.com/Startup-Grind-LA/">Startup Grind LA</a> your upcoming and past events should be visible when you log into the Startup Grind.app with your Meetup account. If you are a member of multiple chapters then you will be presented with a top level pane allowing you to switch between them at will.</p>
<p><center></p>
<table>
<tr>
<td><img src="http://www.aorensoftware.com/blog/wp-content/uploads/2011/10/Screenshot-2011.10.14-19.56.56.png" alt="" title="Screenshot 2011.10.14 19.56.56" width="300" height="450" class="aligncenter size-full wp-image-1060" /></td>
<td><img src="http://www.aorensoftware.com/blog/wp-content/uploads/2011/10/Screenshot-2011.10.14-19.57.02.png" alt="" title="Screenshot 2011.10.14 19.57.02" width="300" height="450" class="aligncenter size-full wp-image-1061" /></td>
</tr>
</table>
<p></center></p>
<p>As we open up more chapters of the Startup Grind you will be able to access all the information and interactive elements for the events for every new meetup that we get going. More awesome features are in the works so stay tuned!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aorensoftware.com/blog/2011/10/18/startup-grind-1-3-october-update/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
