<?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>Exact Magic Software</title>
	<atom:link href="http://www.exactmagic.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.exactmagic.com</link>
	<description>iOS Development and Consulting</description>
	<lastBuildDate>Sun, 03 Jun 2012 02:13:57 +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>Buckaroo is out!</title>
		<link>http://www.exactmagic.com/buckaroo-is-out/</link>
		<comments>http://www.exactmagic.com/buckaroo-is-out/#comments</comments>
		<pubDate>Mon, 30 Apr 2012 21:31:51 +0000</pubDate>
		<dc:creator>jeff</dc:creator>
				<category><![CDATA[Blog Post]]></category>

		<guid isPermaLink="false">http://www.exactmagic.com/?p=561</guid>
		<description><![CDATA[We are proud to present Buckaroo, our cashless allowance management app for modern parents. We put quite a bit of thought into keeping this as simple as possible &#8211; but not so much that it loses its value. I&#8217;d love to hear feedback and suggestions from busy parents trying to keep track of allowance! Also, ...]]></description>
				<content:encoded><![CDATA[<p>We are proud to present <a href="http://www.exactmagic.com/portfolio-view/buckaroo/" title="Buckaroo">Buckaroo</a>, our cashless allowance management app for modern parents.  We put quite a bit of thought into keeping this as simple as possible &#8211; but not so much that it loses its value.  I&#8217;d love to hear feedback and suggestions from busy parents trying to keep track of allowance!</p>
<p>Also, see our coverage in Modern Mom!<br />
<a href="http://www.modernmom.com/article/using-technology-to-teach-kids-about-money-management" title="Using Technology to  Teach Kids About Money Management"><img src="http://www.modernmom.com/sites/default/files/link_banners/1_modernmom-black_120x60.png" alt="Using Technology to  Teach Kids About Money Management" title="Using Technology to  Teach Kids About Money Management" /><br/>Using Technology to  Teach Kids About Money Management</a></p>
<p><a href="http://itunes.apple.com/us/app/buckaroo/id503611201?mt=8">Available in the App Store</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.exactmagic.com/buckaroo-is-out/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tilt Maze Updates</title>
		<link>http://www.exactmagic.com/tilt-maze-updates/</link>
		<comments>http://www.exactmagic.com/tilt-maze-updates/#comments</comments>
		<pubDate>Sat, 14 Apr 2012 19:06:37 +0000</pubDate>
		<dc:creator>jeff</dc:creator>
				<category><![CDATA[Blog Post]]></category>

		<guid isPermaLink="false">http://www.exactmagic.com/?p=549</guid>
		<description><![CDATA[We&#8217;ve been busy getting Buckaroo out the door, but did take time to push some much needed updates to our most popular game &#8211; Tilt Maze. If you haven&#8217;t tried it yet (go get it!), its a fun, easy to learn game where you tilt your phone around to move the ball through the mazes. ...]]></description>
				<content:encoded><![CDATA[<p>We&#8217;ve been busy getting <a href="http://www.exactmagic.com/portfolio-view/buckaroo/" title="Buckaroo">Buckaroo</a> out the door, but did take time to push some much needed updates to our most popular game &#8211; <a href="http://www.exactmagic.com/portfolio-view/tilt-maze/" title="Tilt Maze">Tilt Maze</a>.  If  you haven&#8217;t tried it yet (<a href="http://itunes.apple.com/us/app/tilt-maze/id306857648?ls=1&#038;mt=8" target="_blank">go get it!</a>), its a fun, easy to learn game where you tilt your phone around to move the ball through the mazes.  Its surprisingly addictive and well worth the 99 cents!  </p>
<p>We updated the app to include niceties like multitasking support with pause/resume, remembering which level you left off on, and improved graphics for the ball and exit to make it easier to see.  We also fully integrated <a href="http://www.apple.com/game-center/" target="_blank">Game Center</a>, with global leaderboards across the maze &#8220;worlds&#8221;.  A World is a group of 5 mazes &#8211; and the fastest time through all the mazes will get you on top of the leaderboard.</p>
<p>So far the Full version (complete with 20 mazes and no ads) has over 4,000 people in the leaderboards, with some pretty impressive scores.  The updated Free version is in the App Store review process and should be out soon.  Looking forward to seeing you on there!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.exactmagic.com/tilt-maze-updates/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mixing ARC and Non-ARC Code with Static Libraries</title>
		<link>http://www.exactmagic.com/mixing-arc-and-non-arc-code-with-static-libraries/</link>
		<comments>http://www.exactmagic.com/mixing-arc-and-non-arc-code-with-static-libraries/#comments</comments>
		<pubDate>Fri, 13 Jan 2012 18:13:16 +0000</pubDate>
		<dc:creator>duane</dc:creator>
				<category><![CDATA[Blog Post]]></category>
		<category><![CDATA[arc]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[static library]]></category>
		<category><![CDATA[xcode]]></category>

		<guid isPermaLink="false">http://www.seriousmonster.com/?p=393</guid>
		<description><![CDATA[One of the recent improvements introduced with Xcode 4&#8242;s new LLVM Compiler 3.0 is Automatic Reference Counting (ARC). ARC is a compiler feature that will automatically manage the traditional iOS retain/release memory management model. When you enable ARC for a project, you simply do not ever call retain or release &#8211; the compiler figures it ...]]></description>
				<content:encoded><![CDATA[<p>One of the recent improvements introduced with Xcode 4&#8242;s new LLVM Compiler 3.0 is Automatic Reference Counting (ARC). ARC is a compiler feature that will automatically manage the traditional iOS retain/release memory management model. When you enable ARC for a project, you simply do not ever call retain or release &#8211; the compiler figures it out for you. More to the point, when using ARC you are not allowed to use the retain/release calls at all, making older code incompatible with ARC compilation settings. There are already some <a href="http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1">great tutorials on ARC</a> out there, so I&#8217;m not going to go into the how&#8217;s and why&#8217;s of ARC itself.</p>
<h4>So What&#8217;s the Problem?</h4>
<p>Now ARC is quite the cat&#8217;s pajamas as they say, but it does have some limitations. Mainly, it&#8217;s not immediately obvious how you can make use of older code that was not written with ARC in mind. Say you create a shiny new ARC-enabled project, and then find out that a shared component you want to use, the Facebook SDK for example, isn&#8217;t yet ARC enabled and won&#8217;t compile. You have to tell the compiler which source files are ARC ready and which aren&#8217;t. There in lies the rub: you can convert your old code to use ARC for sure, as I&#8217;ll discuss below, but when you are using third party components this isn&#8217;t always practical or desirable, as you&#8217;ll have a much harder time taking updates to those libraries.</p>
<p>I&#8217;m a big fan of using third party modules from the open source community, mostly from github. I like to keep these in git submodules so that I can easily take and contribute updates to them. Forking the code and trying to convert it to ARC for my own personal usage breaks the update/contribute cycle.</p>
<p>What I&#8217;m going to explain in this post is how you can use non-ARC code libraries inside an ARC-based project with a minimum of fuss and bother by using a static library to separate your ARC and non-ARC code without you having to modify the older code in any way.</p>
<h3>Doing Things The Hard Way</h3>
<p>First, let me quickly cover some alternatives to the static library approach. In some circumstances, these approaches are reasonable and convenient. When dealing with larger code libraries however, the static library approach is a real time saver.</p>
<h4>Compiler Flags</h4>
<p>Compiler flags to the rescue! For each source file that is non ARC compliant, add the <em>&#8211;fno-objc-arc</em> compiler flag. Nothing more fun then managing compiler flags. This is the way I&#8217;ve seen most ARC documentation explain how to make use of non-ARC code in an ARC project, or vice-versa. These can be set on individual files by selecting the target in Xcode, going to the Build Phases screen, and double clicking on the source files row in the Compile Sources phase. Then, enter the magic compiler flag into the box. Repeat for all your  source files. Fun, eh?</p>
<h4>Using the ARC Migration Wizard</h4>
<p>If you have a larger batch of code to use, you can use the ARC migration wizard to convert all of the code in a specific target to ARC by selecting <em>Convert to Objective-C ARC</em> from the <em>Edit | Refactor</em> menu. You&#8217;ll still probably have to clean up a few things, but this is a convenient way to port your code to ARC. The problem is that if you are doing this with a third party library, such as an SDK of a public domain component then you are making changes to the actually code. This will make things tougher in the future if you want to upgrade the library. You are also making untested changes to the code base, opening the possibility for new bugs or unexpected behavior. Using the static library approach described below, however, you can leave this code unmodified.</p>
<h3>Creating a non-ARC Static Library</h3>
<p>The basic approach will be to add a second target to our project which is a static library.  This library  will hold all of our non-ARC code. The library will be built automatically with your main target and linked against it when you build, so you will not need to do anything special to build or distribute the application in this approach. A static library essentially lets you have two sets of compilation settings &#8211; one for your fancy new ARC code, and another set for all of your old code.</p>
<p>Note: The sample project I&#8217;m talking through here is available <a href="https://github.com/SeriousMonster/ArcLibraryExample">for download on github</a>.</p>
<h4>1. Create your Static Library Target</h4>
<p>Select your project file in Xcode, and click on the <em>Add Target</em> button at the bottom of the <em>Project Settings</em> screen. When prompted, select the <em>Cocoa Touch Static Library</em> template from the Framework and Library section and click <em>Next</em>.</p>
<p>For the project name, enter whatever you want your library to be called. In this case I&#8217;m going to call my library ArcFree, but it doesn&#8217;t really matter. Click <em>Finish</em>. Make sure that the &#8220;Use Automated Reference Counting&#8221; option is not selected. This will create a second target in your project that can be built right along side the first.</p>
<p><a href="http://exactmagic.com/wp/home/6-revision-19/" rel="attachment wp-att-407"><img class="aligncenter size-full wp-image-407" title="Xcode" src="http://www.seriousmonster.com/wp/wp-content/uploads/Xcode1.png" alt="" width="742" height="505" /></a></p>
<p>Delete the sample class the wizard created (ArcFree.m, ArcFree.h) as you won&#8217;t need them. You&#8217;ll notice it creates a precompiled header file as well. This can be useful, but if you don&#8217;t think you need it you can delete it &#8211; but you&#8217;ll have to modify the target&#8217;s build settings, which have been set to look for that file.</p>
<h4>2. Verify that the Static Library is Not Using ARC</h4>
<p>Now we have to fix what I suspect is a bug in Xcode 4.2. Go to your static library target&#8217;s <em>Build Settings</em> and search for &#8220;automatic&#8221; so that we can take a look at the <em>Objective-C Automatic Reference Counting</em> setting. Despite the fact that we told Xcode that we didn&#8217;t want ARC when we created the library, it doesn&#8217;t set an override on the target so this setting is inherited from the main project. Set this to &#8220;<em>No</em>&#8221; for your static library.</p>
<p><a href="http://exactmagic.com/wp/home/6-revision-20/" rel="attachment wp-att-408"><img class="aligncenter size-full wp-image-408" title="Xcode" src="http://www.seriousmonster.com/wp/wp-content/uploads/Xcode2.png" alt="" width="707" height="236" /></a></p>
<p>I believe what is happening is that the Xcode wizard asks about ARC so that it can setup the target&#8217;s project file correctly, but since we are adding a target to an existing project it doesn&#8217;t actually do anything. In any case, setting this flag to <em>No</em> means that any files compiled as part of this target will not use ARC &#8211; they will use the classic retain/release model. Verify that the flag is set correctly.</p>
<h4>3. Link with Your Static Library</h4>
<p>To use any of the classes in your static library you must link it to your main application target. This is just like adding system libraries and frameworks, just with your own static library instead of a dynamic one provided by the system.</p>
<p>Select your main application target, then click on <em>Build Phases</em> and expand the <em>Target Dependencies</em> section. Click on the plus(+) button and select your static library from the list. This tells the linker to build your static library&#8217;s classes into your main target after compiling them.</p>
<p><a href="http://exactmagic.com/wp/our-work/10-revision-19/" rel="attachment wp-att-406"><img class="aligncenter size-full wp-image-406" title="LittleSnapper" src="http://www.seriousmonster.com/wp/wp-content/uploads/LittleSnapper.png" alt="" width="394" height="452" /></a></p>
<h4>4. Add your Static Library as a Dependency</h4>
<p>Select your main application target, then click on <em>Build Phases</em> and expand the <em>Link Binaries</em> with <em>Libraries</em> section. Click on the plus(+) button and select your static library from the list. This tells Xcode that when you build your main project, it needs to build the static library first (if it&#8217;s had any changes).</p>
<p><img class="aligncenter size-full wp-image-405" title="Xcode" src="http://www.seriousmonster.com/wp/wp-content/uploads/Xcode.png" alt="" width="393" height="431" /></p>
<h3>Adding Code to the Static Library</h3>
<p>When you add code to the project, you will have the option of selecting which targets the code belongs to, as shown in the screen shot below. When you are using code that doesn&#8217;t support ARC, simply choose to place it into the static library, while ARC code can go into your main project. As an example, I&#8217;ll add the Facebook SDK to my example project.</p>
<p>First, I checkout the Facebook submodule in git.</p>
<p><code><br />
Duanes-iMac:ArcLibraryExample duane$ mkdir submodules<br />
Duanes-iMac:ArcLibraryExample duane$ git submodule add https://github.com/facebook/facebook-ios-sdk.git submodules/facebook-ios-sdk<br />
Cloning into 'submodules/facebook-ios-sdk'...<br />
remote: Counting objects: 964, done.<br />
remote: Compressing objects: 100% (500/500), done.<br />
remote: Total 964 (delta 525), reused 818 (delta 413)<br />
Receiving objects: 100% (964/964), 1.83 MiB | 928 KiB/s, done.<br />
Resolving deltas: 100% (525/525), done.<br />
</code><br />
Next, I create a &#8220;Facebook&#8221; group, under the ArcFreeLibrary project tree. This is optional since project folders don&#8217;t have any net effect, but I like to keep things organized. Then, we add  the required Facebook and JSON files to the project, and make sure that only the <em>ArcFree target is selected as a target</em>.</p>
<p><a href="http://exactmagic.com/wp/?attachment_id=409" rel="attachment wp-att-409"><img class="aligncenter size-full wp-image-409" title="Xcode" src="http://www.seriousmonster.com/wp/wp-content/uploads/Xcode3.png" alt="" width="835" height="714" /></a></p>
<h3>Build Your Project</h3>
<p>Build your project normally and you should be good. Because you&#8217;ve setup a dependency between your main application target and the static library, your library is automatically compiled when required. Since you have multiple targets, you can also change your build target to the static library if you just want to build it stand alone, which can be useful when you are debugging.</p>
<p>If you get errors such as &#8220;release&#8221; is unavailable or &#8220;ARC forbids explicit message&#8230;&#8221; then double check the Objective-C Automatic Reference Counting build setting. This means it&#8217;s trying to build your target with ARC enabled. Also, verify that the non ARC source files are ONLY in the ArcFree library target, and not the main target as well.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.exactmagic.com/mixing-arc-and-non-arc-code-with-static-libraries/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>The Complexity of Simple</title>
		<link>http://www.exactmagic.com/the-complexity-of-simple/</link>
		<comments>http://www.exactmagic.com/the-complexity-of-simple/#comments</comments>
		<pubDate>Thu, 12 Jan 2012 18:06:44 +0000</pubDate>
		<dc:creator>jeff</dc:creator>
				<category><![CDATA[Blog Post]]></category>

		<guid isPermaLink="false">http://www.seriousmonster.com/?p=396</guid>
		<description><![CDATA[Everyone knows a simple, elegant interface when they see one. Not everyone appreciates it &#8211; many complain they want feature X or the ability to configure Y. However, generally speaking, iPhone consumers have become accustomed to good UI&#8217;s and the bar has been set pretty high. In working through the design of our upcoming &#8220;Kid ...]]></description>
				<content:encoded><![CDATA[<p>Everyone knows a simple, elegant interface when they see one. Not everyone appreciates it &#8211; many complain they want feature X or the ability to configure Y. However, generally speaking, iPhone consumers have become accustomed to good UI&#8217;s and the bar has been set pretty high.</p>
<p>In working through the design of our upcoming &#8220;Kid Bank&#8221; virtual allowance manager, we&#8217;ve spent more time on these concepts than anything else. What are the minimum critical items the vast majority of users need? What are the items we deem necessary to differentiate our app from the rest? At what point can you just remove a feature rather than add an option to disable it? In short, &#8220;simple&#8221; is complex!</p>
<p><strong>Who is the real User</strong><br />
First and foremost, who is the primary user? Many apps in this allowance-management space are full of cartoony graphics and overly complex, non-standard interfaces. I think its easy to slip into &#8220;an app for kids will be used by kids&#8221;, rather than acknowledge that parents are the primary manager of allowances. Its absolutely necessary that a kid can understand the concepts, but in terms of setting up goals and performing transactions, the parent will be the guide. Once you accept that, then you need to focus on how and when the app will be used. Aside from automated allowance deposits, the bulk of transactions will come from kids earning money via chores, etc, or from purchases at a store. The key is to make the process of starting the app and entering these transactions as fast as possible with very little getting in the way.</p>
<p><strong>Account soup</strong><br />
Nearly every app or website in this space starts with 3 accounts (or jars, ahem): Spending, Savings and Giving. There are plenty of valid reasons for this. However, its entirely unnecessary for the 90% use case. Sure, you want to encourage Savings. Absolutely you want to get your kid used to the concept of &#8220;some money you earn goes towards things you want in the future&#8221;. However, there is also plenty of evidence to suggest that money automatically saved is money that never existed in the first place, as far as your kid is concerned.</p>
<p>When it comes down to it, your kid earns money and it goes into a pool of cash. A Savings Account can be almost entirely replace with Savings Goals &#8211; a specific thing your kid wants that costs more money than they currently have. Progress against this is determined by the money on hand. If you want to give to Charity (great!) then setup a goal. If you want 10% of allowance to go to Charity on a monthly basis, 20% go to Taxes, and 30% go to Savings then get Quicken and have at it. If you are busy and your kid&#8217;s eyes glass over when you use words like &#8220;percent&#8221; and &#8220;accounts&#8221; then we have the App for you!</p>
<p>To be clear, we aren&#8217;t avoiding <em>programmatic</em> complexity &#8211; in fact we built the app based on widely accepted design patterns for <a href="http://en.wikipedia.org/wiki/Double-entry_bookkeeping_system" target="_blank">double-entry accounting principles</a>. We aren&#8217;t saying you don&#8217;t need Savings, we just think Savings Goals is a cleaner, simpler experience when it comes to the concept of &#8220;not spending now lets money add up so you can get that big gift later.&#8221;</p>
<p><strong>It takes a village&#8230;</strong><br />
At the very least it takes a partnership. If you have an iPhone, and you want to use it to track your kid&#8217;s finances, there are pretty good odds that you have a partner in crime who also has an iPhone. We believe you should both be able to use the same account, and it should just work. Most apps in the space either don&#8217;t support any form of synchronizing between users and devices, or its a bolt-on afterthought.</p>
<p>Our basic assumption of how things will typically go with this type of app:</p>
<ol>
<li>The Gadget Guru half of the relationship installs the app and begins to use it.  There is no need to setup any accounts &#8211; just create you first kid(heh) and start tracking</li>
<li>You try it for a few days or weeks and fall in love.  This is (finally) the app for you!</li>
<li>You convince your partner to get the app so they can also participate in recording transactions and watching progress towards goals</li>
<li>You turn on Syncing in the Settings, enter an email address/password and then tell them this information so they can use the same &#8220;bank&#8221;.</li>
<li>You are now in sync! Entries from either device now update automatically to all devices.</li>
<li>As an added bonus, all your information is backed up on the fly so you can restore in case your phone goes haywire.</li>
</ol>
<p>That&#8217;s it. Syncing is a switch to &#8220;set it and forget it&#8221; (to borrow from <a href="https://www.ronco.com/aboutus.html" target="_blank">Ron Popeil</a>).  However, if you aren&#8217;t the sharing type, then you never have to deal with user accounts and passwords.</p>
<p>Speaking of passwords, another common theme for similar apps is to put in place some form of password protection on the app, ostensibly to prevent their kid from adding money to their account.  Our opinion is that you don&#8217;t need another barrier to using the app (entering a password), and if you see a transaction like &#8220;$5,000 for good behavior&#8221; I&#8217;m sure you will recognize this rogue entry and delete it.  Remember, its virtual bank &#8211; no money is changing hands until you say so.</p>
<p><strong>Core Principles</strong></p>
<p>When working on any App, its important to establish a set of guiding principles that inform decisions.  Throughout the development cycle there are hundreds of small decisions that add up to an overall experience.  Without guiding principles, what you end up creating won&#8217;t feel cohesive, buttoned-up and polished.  It may be hard to pinpoint, but the overall feeling won&#8217;t be positive.  It may be more of an art than science, but that doesn&#8217;t mean you can&#8217;t use some process to help keep things on track.</p>
<p>For Kid Bank, it boils down to a few ideas:</p>
<ol>
<li>Assume the user is busy, and more often than not has an impatient kid talking to them while they are using the App</li>
<li>Parenting is a team sport (except when it isn&#8217;t)</li>
<li>Entering a transaction should require as few &#8220;clicks&#8221; as possible, and should always work the same way regardless of the starting point or transaction type</li>
<li>Its not a real bank, so take liberties to account for real life even if it may offend your CPA</li>
<li>It has to make sense to a 6 year old and a 60 year old; and be fun and fulfilling to use</li>
</ol>
<p>I&#8217;m anxious to share more as we approach our beta.  As always, if you want to help or participate in any way use the Social Goodness links below to keep up with what&#8217;s going on at Serious Monster</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.exactmagic.com/the-complexity-of-simple/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

 Served from: www.exactmagic.com @ 2013-06-18 19:06:48 by W3 Total Cache -->