<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0"><title>6Tringle Blog</title><link href="http://6Tringle.com/blog" /><author><name>6Tringle</name><uri>http://6Tringle.com/</uri></author><updated>2009-07-18T06:00:00Z</updated><id>http://6Tringle.com/blog/</id><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/6TringleBlog" /><feedburner:info uri="6tringleblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry><title>Renascence of 6Tringle et al.</title><author><name>Kailoa Kadano</name><uri>http://6Tringle.com/about/kailoa/</uri></author><link href="http://feedproxy.google.com/~r/6TringleBlog/~3/WKov0EvJa8M/renascence-of-6tringle.html" /><updated>2009-02-02T00:00:00Z</updated><published>2009-02-02T00:00:00Z</published><id>http://6Tringle.com/blog/2009/renascence-of-6tringle.html</id><content type="html">
       
&lt;p&gt;Alternative title: You disappear for 2 years and you expect me to take you&amp;nbsp;back?&lt;/p&gt;
&lt;p&gt;Sorry for not writing sooner, we've been busy.  We can explain.  Let's just start over, shall&amp;nbsp;we?&lt;/p&gt;
&lt;h3&gt;PhotoClay&lt;/h3&gt;
&lt;p&gt;6Tringle is happy to announce the imminent availability of PhotoClay on the iPhone.  It's like turning Photos into Clay, you can push and mold them to your will.  We've made it fun and easy to render silly visages of your&amp;nbsp;friends!&lt;/p&gt;
&lt;p&gt;The cauldron is still bubbling however, and there are a couple of other projects being slow roasted to perfection.  We'll let you know more when we&amp;nbsp;can.&lt;/p&gt;

   &lt;img src="http://feeds.feedburner.com/~r/6TringleBlog/~4/WKov0EvJa8M" height="1" width="1"/&gt;</content><feedburner:origLink>http://6Tringle.com/blog/2009/renascence-of-6tringle.html</feedburner:origLink></entry><entry><title>_gasp_ Marketing!?</title><author><name>Kailoa Kadano</name><uri>http://6Tringle.com/about/kailoa/</uri></author><link href="http://feedproxy.google.com/~r/6TringleBlog/~3/ktPL_3qdaqw/3PointsFromSteveDemeter.html" /><updated>2009-03-30T00:00:00Z</updated><published>2009-03-30T00:00:00Z</published><id>http://6Tringle.com/blog/2009/3PointsFromSteveDemeter.html</id><content type="html">
       
&lt;p&gt;Given that the iTunes App Store population is rising, developers who launched on a prayer aren't always &lt;a href="http://www.streamingcolour.com/blog/2009/03/09/the-numbers-post-aka-brutal-honesty/"&gt;raking in the millions&lt;/a&gt;.  News posts about 9 year old iPhone developers earning their college tuition overnight seems to have pushed expectations beyond the ceiling of reality.  Even the smartest developers are only relying on luck if they don't, &lt;em&gt;gasp&lt;/em&gt;, do&amp;nbsp;marketing.&lt;/p&gt;
&lt;h2&gt;Three points from Steve&amp;nbsp;Demeter&lt;/h2&gt;
&lt;p&gt;I had the good fortune to &lt;a href="http://www.meetup.com/sviphone/"&gt;Meetup&lt;/a&gt; with &lt;a href="http://demiforce.blogspot.com/"&gt;Steve Demeter&lt;/a&gt; of &lt;a href="http://www.demiforce.com/"&gt;Demiforce&lt;/a&gt; recently.  Over the course of about 30 seconds I was able to swindle vital&amp;nbsp;information.&lt;/p&gt;
&lt;p&gt;It's important for many late-comers to the App Store to remember the early success stories basically don't apply anymore.  Apps that were put up early had an extraordinary advantage in terms of visibility.  Steve mentioned that new apps need to influence their own visibility and provided a handful of examples how recent apps&amp;nbsp;have.&lt;/p&gt;
&lt;h3&gt;Create Demand Before you&amp;nbsp;release&lt;/h3&gt;
&lt;p&gt;Steve talked about the importance of creating demand before release through the use of blogs, YouTube, etc.  His example here was Zen Bound. Through the use of &lt;a href="http://www.youtube.com/watch?v=l7obli6Vx-A"&gt;YouTube&lt;/a&gt; and some good press, the developer had customers "salivating" to buy the&amp;nbsp;app. &lt;/p&gt;
&lt;p&gt;&lt;a href="http://click.linksynergy.com/fs-bin/stat?id=FU9TTuAveps&amp;offerid=146261&amp;type=3&amp;subid=0&amp;tmpid=1826&amp;RD_PARM1=http%253A%252F%252Fitunes.apple.com%252FWebObjects%252FMZStore.woa%252Fwa%252FviewSoftware%253Fid%253D305199856%2526mt%253D8%2526partnerId%253D30"&gt;Zen Bound&lt;/a&gt; &lt;a href="http://click.linksynergy.com/fs-bin/stat?id=FU9TTuAveps&amp;offerid=146261&amp;type=3&amp;subid=0&amp;tmpid=1826&amp;RD_PARM1=http%253A%252F%252Fitunes.apple.com%252FWebObjects%252FMZStore.woa%252Fwa%252FviewSoftware%253Fid%253D305199856%2526mt%253D8%2526partnerId%253D30"&gt;&lt;img height="15" width="61" alt="Buy app through iTunes" src="http://ax.phobos.apple.com.edgesuite.net/images/badgeitunes61x15dark.gif" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Get Good Reviews on Day&amp;nbsp;One&lt;/h3&gt;
&lt;p&gt;If you app starts off with bad reviews, customers won't wait for your patches and updates to turn it around.  You want to start off strong.  Good reviews are infectious.  If your beta testers love your app, have them positively review it the day it comes out.  Resist the urge to cheat.  &lt;a href="http://arstechnica.com/apple/news/2008/11/iphone-app-dev-seemingly-caught-paying-for-positive-reviews.ars"&gt;You'll get caught&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Use Review&amp;nbsp;sites&lt;/h3&gt;
&lt;p&gt;Unless your app is terrible, review sites almost always help you.  Steve's key insight is to allow review sites early access to the final version of your app before it's available in the store.  You want the reviews to be release as near as possible to the review date such that you can move up on the hot lists.  Most review sites have a large backlog and thus would need access to the app a couple of weeks ahead of time.&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;Here's a short list.  Needless to say, stay away from sites that condone pirated apps, and be wary of those that support jailbreaking.  &lt;a href="http://daringfireball.net/2009/02/anti_bootlegging_app_store"&gt;Gruber&lt;/a&gt;: "Not all jailbreakers are bootleggers, but all bootleggers are&amp;nbsp;jailbreakers."&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://theapppodcast.com/"&gt;http://theapppodcast.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.slidetoplay.com/"&gt;http://www.slidetoplay.com/&lt;/a&gt; (games&amp;nbsp;only)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.iphoneappreviews.net/"&gt;http://www.iphoneappreviews.net/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.whatsoniphone.com/"&gt;http://www.whatsoniphone.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.appvee.com/"&gt;http://www.appvee.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.frapstr.com/"&gt;http://www.frapstr.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It's not a review site, but &lt;a href="http://iphone.iusethis.com/"&gt;http://iphone.iusethis.com/&lt;/a&gt; is a nifty site as well.  If you testers or customers like your app, kindly suggest they give your app a&amp;nbsp;vote.&lt;/p&gt;
&lt;h3&gt;If you need more&amp;nbsp;help&lt;/h3&gt;
&lt;p&gt;In addition to being very tall, Steve's company, &lt;a href="http://www.demiforce.com/"&gt;Demiforce&lt;/a&gt;, is a consulting company specializing in iPhone app and game development as well as promotion and marketing.  Steve's a good guy and I'm sure he can help you look&amp;nbsp;good.&lt;/p&gt;
&lt;p&gt;Disclaimer:  6Tringle is not affiliated with Steve or his company.  We have not contracted him to work for us, nor was this post or recommendation solicited by Demiforce or&amp;nbsp;Steve.&lt;/p&gt;

   &lt;img src="http://feeds.feedburner.com/~r/6TringleBlog/~4/ktPL_3qdaqw" height="1" width="1"/&gt;</content><feedburner:origLink>http://6Tringle.com/blog/2009/3PointsFromSteveDemeter.html</feedburner:origLink></entry><entry><title>iPhone Unit Testing with OCUnit</title><author><name>Kailoa Kadano</name><uri>http://6Tringle.com/about/kailoa/</uri></author><link href="http://feedproxy.google.com/~r/6TringleBlog/~3/bA5gwzkz_JQ/iPhoneUnitTesting.html" /><updated>2009-04-06T00:00:00Z</updated><published>2009-04-06T00:00:00Z</published><id>http://6Tringle.com/blog/2009/iPhoneUnitTesting.html</id><content type="html">
       
&lt;p&gt;There are a scattering of iPhone based testing frameworks and&amp;nbsp;utilities: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.sente.ch/s/?p=535&amp;amp;lang=en"&gt;OCUnit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://code.google.com/p/google-toolbox-for-mac/wiki/iPhoneUnitTesting"&gt;Google Toolkit for&amp;nbsp;Mac&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://github.com/gabriel/gh-unit/tree/master"&gt;GHUnit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.mulle-kybernetik.com/software/OCMock/"&gt;OCMock&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Google's was one of the first.  They've apparently built a lot of infrastructure around their solution to fit within existing test systems.  With a recent Xcode update, Apple's brought back the original Objective-C test&amp;nbsp;solution.&lt;/p&gt;
&lt;h3&gt;OCUnit&lt;/h3&gt;
&lt;p&gt;If you're coming from GTM, then the biggest difference is that OCUnit is the integration into Xcode.  This means you get IDE errors instead of having to parse the console output (plus!).  It also means you have to go to the console to read your log messages, rather than having them display in the built-in console&amp;nbsp;(minus!).&lt;/p&gt;
&lt;p&gt;This one ships with Apple, but the only clear  &lt;a href="http://www.sente.ch/s/?p=535&amp;amp;lang=en"&gt;instructions&lt;/a&gt; come from Sente (the original author of OCUnit, back in&amp;nbsp;1998).&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.stanford.edu/class/cs193p/cgi-bin/index.php"&gt;Lecture 19 of the Stanford iPhone class&lt;/a&gt; had some slides and an example project.  Unfortunately, due to the nature of the Stanford website, it's unlikely the slides and sample files will reappear on the website until Lecture 19 is presented for the current semester.  Even when the links existed however, the Stanford way didn't give detailed instructions.  In the mean time, all I can say is that you trust me when I say that the Stanford way of linking is much easier to do.&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;The Sente method of having the test run every time you build is &lt;em&gt;far&lt;/em&gt; superior to the Stanford method (you have to manually change the target and run the tests).  If you aren't continually running your tests, they approach a moldy and lifeless&amp;nbsp;state.&lt;/p&gt;
&lt;p&gt;Here's a set of instructions that take the best of both&amp;nbsp;worlds&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Add a new Unit Test bundle target (Project -&amp;gt; New Target... -&amp;gt; Mac OS X -&amp;gt; Unit Test&amp;nbsp;Bundle)&lt;/p&gt;
&lt;p&gt;[&lt;img alt="ScreenShot of New unit test bundle" src="/media/thumbs/NewTargetUnitTestBundle.png" /&gt;]&amp;nbsp;(/media/images/NewTargetUnitTestBundle.png)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Modify the "Other Linker Flags" setting.&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;We need to change the &lt;code&gt;Cocoa&lt;/code&gt; value to &lt;code&gt;Foundation&lt;/code&gt;.  This will allow us to compile for the iPhone&amp;nbsp;Simlulator&lt;/p&gt;
&lt;p&gt;[&lt;img alt="ScreenShot of other linker flags" src="/media/thumbs/UnitTestBundleOtherLinkerFlags.png" /&gt;]&amp;nbsp;(/media/images/UnitTestBundleOtherLinkerFlags.png)&lt;/p&gt;
&lt;p&gt;[&lt;img alt="ScreenShot of other linker flags edit" src="/media/thumbs/UnitTestBundleOtherLinkerFlagsEdit.png" /&gt;]&amp;nbsp;(/media/images/UnitTestBundleOtherLinkerFlagsEdit.png)&lt;/p&gt;
&lt;p&gt;Lastly, search for any Cocoa.h references and delete&amp;nbsp;them:&lt;/p&gt;
&lt;p&gt;[&lt;img alt="Cocoa.h reference in build settings" src="/media/thumbs/UnitTestBundleSearchCocoah.png" /&gt;]&amp;nbsp;(/media/images/UnitTestBundleSearchCocoah.png)&lt;/p&gt;
&lt;p&gt;If you prematurely built and got the following &lt;code&gt;Cocoa.h&lt;/code&gt; errors:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/System /Library /Frameworks /Cocoa.framework /Headers /Cocoa.h:13:26: error: AppKit/AppKit.h: No such file or directory&lt;/code&gt;
&lt;code&gt;/System /Library /Frameworks /Cocoa.framework /Headers /Cocoa.h:14:30: error: CoreData/CoreData.h: No such file or directory&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;You may need to do a &lt;code&gt;Clean All Targets&lt;/code&gt; to clear them.  Somewhat counterintuitively, if your project does not contain any tests, it will register a test failure.&lt;br /&gt;
Another note about test&amp;nbsp;failures:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/Developer /Tools /RunPlatformUnitTests.include: 384: error: Failed tests for architecture 'i386' (GC OFF)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The description here about failure has nothing to do with the architecture or garbage collection.  It's just information for your reference about the environment in which the test failed.  The part you need to pay attention to is &lt;code&gt;Failed tests&lt;/code&gt;.  Similarly, there is nothing wrong with the &lt;code&gt;RunPlatformUnitTests.include&lt;/code&gt; script.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add a test file with a TestCase subclass in&amp;nbsp;it.&lt;/p&gt;
&lt;p&gt;Using the Mac OS X -&amp;gt; Cocoa -&amp;gt; Unit Test Case Class Template, create and add a new test case&amp;nbsp;file.&lt;/p&gt;
&lt;p&gt;Test Case files &lt;strong&gt;MUST&lt;/strong&gt; end in &lt;code&gt;TestCase&lt;/code&gt; (ie. MathTestCase or BackEndTestCase).  Similarly, all test methods should start with &lt;code&gt;test&lt;/code&gt;.  The underlying tech mechanism uses some very nifty runtime magic to determine which classes and methods to run by their&amp;nbsp;names.&lt;/p&gt;
&lt;p&gt;[&lt;img alt="" src="/media/thumbs/XcodeAddUnitTestCase.png" /&gt;]&amp;nbsp;(/media/images/XcodeAddUnitTestCase.png)&lt;/p&gt;
&lt;p&gt;Make sure you are only adding to the Unit Test Bundle and not to the main&amp;nbsp;Project&lt;/p&gt;
&lt;p&gt;[&lt;img alt="" src="/media/thumbs/XcodeAddUnitTestCaseAddToProject.png" /&gt;]&amp;nbsp;(/media/images/XcodeAddUnitTestCaseAddToProject.png)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add a&amp;nbsp;test&lt;/p&gt;
&lt;p&gt;Here's a easy one you can use to test the test framework itself. (How very&amp;nbsp;meta.)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;- (void)testTestFramework
{
    NSString *string1 = @"test";
    NSString *string2 = @"test";
    STAssertEquals(string1, 
                   string2, 
                   @"FAILURE");
    NSUInteger uint_1 = 4;
    NSUInteger uint_2 = 4;
    STAssertEquals(uint_1, 
                   uint_2, 
                   @"FAILURE");
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Build the test bundle, make sure tests&amp;nbsp;pass&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Build the test bundle, make sure tests&amp;nbsp;fail&lt;/p&gt;
&lt;p&gt;Again, just to exercise your test framework, temporarily change one of the strings to force a test&amp;nbsp;failure.&lt;/p&gt;
&lt;p&gt;[&lt;img alt="Force a failure" src="/media/thumbs/UnitTestForceAFailure.png" /&gt;]&amp;nbsp;(/media/images/UnitTestForceAFailure.png)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add the unit test bundle as a&amp;nbsp;dependent&lt;/p&gt;
&lt;p&gt;Now, we want the unit tests to run every time we build.  We can do this by setting a dependency on the Unit Test Bundle.  Switch back to the main project target (away from the unit test bundle) and Edit the Active Target.  Click the + button under to add and new &lt;code&gt;Direct Dependancy&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;[&lt;img alt="Add UnitTestBundle dependancy" src="/media/thumbs/XcodeAddUnitTestBundleDependancy.png" /&gt;]&amp;nbsp;(/media/images/XcodeAddUnitTestBundleDependancy.png)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Build the app, make sure test pass and&amp;nbsp;fail&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now you have an automated, up to date testing framework in place.  Every time you build, you will be immediately notified of any test regressions.  The rest is attitude.  Xcode will keep the tests running every build, but you have to keep writing tests when&amp;nbsp;appropriate.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://github.com/kailoa/6tringle-unittestsamplecode/tree/master"&gt;Sample project&lt;/a&gt; available at &lt;a href="http://github.com/kailoa/"&gt;6Tringle's github repository&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;An aesthetic note about header&amp;nbsp;files&lt;/h3&gt;
&lt;p&gt;Test Case files almost always have an nearly useless header file, so I usually get rid of them, creating single file test cases.  The resultant .m looks like&amp;nbsp;this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;//only run on the simulator
#include "TargetConditionals.h"
#if !TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR
#import &amp;lt;SenTestingKit/SenTestingKit.h&amp;gt;
@interface SampleTestCase : SenTestCase 
{
}
@end
@implementation SampleTestCase
- (void) setUp
{
    // Optional
}
- (void) tearDown
{
    // Optional
}
- (void)testTestFramework
{
    NSString *string1 = @"test";
    NSString *string2 = @"test";
    STAssertEqualObjects(string1, 
                         string2, 
                         @"FAILURE");

    NSUInteger uint_1 = 4;
    NSUInteger uint_2 = 4;
    STAssertEquals(uint_1, 
                   uint_2, 
                   @"FAILURE");
}
@end
#endif
&lt;/code&gt;&lt;/pre&gt;

   &lt;img src="http://feeds.feedburner.com/~r/6TringleBlog/~4/bA5gwzkz_JQ" height="1" width="1"/&gt;</content><feedburner:origLink>http://6Tringle.com/blog/2009/iPhoneUnitTesting.html</feedburner:origLink></entry><entry><title>iPhone Touch Sample Code</title><author><name>Kailoa Kadano</name><uri>http://6Tringle.com/about/kailoa/</uri></author><link href="http://feedproxy.google.com/~r/6TringleBlog/~3/MH-kWpdZGf8/TouchSampleCode.html" /><updated>2009-05-10T00:00:00Z</updated><published>2009-05-10T00:00:00Z</published><id>http://6Tringle.com/blog/2009/TouchSampleCode.html</id><content type="html">
       
&lt;p&gt;The iPhone SDK's UIKit allows extremely versatile touch event handling.  With only &lt;em&gt;four methods&lt;/em&gt;, Apple has exposed nearly limitless potential for programatic reaction.  The problem is that these four methods are essentially exposing the hardware.  To do anything interesting or useful, one must wrap meat around these bones.  Apple's &lt;a href="http://developer.apple.com/iphone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/EventHandling/EventHandling.html#//apple_ref/doc/uid/TP40007072-CH9-SW8"&gt;Event Handling documentation&lt;/a&gt; covers several simple cases of touch&amp;nbsp;handling:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="http://developer.apple.com/iphone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/EventHandling/EventHandling.html#//apple_ref/doc/uid/TP40007072-CH9-SW13"&gt;single, double, triple tap&amp;nbsp;etc.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.apple.com/iphone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/EventHandling/EventHandling.html#//apple_ref/doc/uid/TP40007072-CH9-SW14"&gt;swipes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.apple.com/iphone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/EventHandling/EventHandling.html#//apple_ref/doc/uid/TP40007072-CH9-SW16"&gt;location sensitive combo touches&lt;/a&gt;, simply described as a "Complex Multi-Touch Sequence", this is merely doing hit-testing on the&amp;nbsp;touches.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Curiously, clear examples for certain basic interactions such as tap-and-hold or pinch-to-zoom are&amp;nbsp;missing.&lt;/p&gt;
&lt;p&gt;I'd like to rectify that.  This recent inclination is compounded by my new-found passion for the &lt;em&gt;au courant&lt;/em&gt; open source repository &lt;a href="http:///github.com"&gt;Github&lt;/a&gt;.  This illicit dyad has produced the creatively named &lt;a href="http://github.com/kailoa/6tringle-touchsamplecode/tree/master"&gt;TouchSampleCode&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Currently, I've coded examples for the following cases (along with the implicit intention to add&amp;nbsp;more):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tap and&amp;nbsp;Hold&lt;/li&gt;
&lt;li&gt;Tap and Hold with&amp;nbsp;delay&lt;/li&gt;
&lt;li&gt;DoubleTap and&amp;nbsp;Hold&lt;/li&gt;
&lt;li&gt;Multi-touch (two fingers) with simple stretch and pinch for zoom and&amp;nbsp;unzoom&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The iPhones lack of a keyboard doesn't mean it's not a rich environment for human interaction.  The current limitation is not in the hardware, but in the creatively of the developers.  Future postings will explore some conjectures on creative uses of the&amp;nbsp;interface.&lt;/p&gt;
&lt;p&gt;Please consider leaving a tip if you find this useful.  These kinds of small tokens are great energizers and tend to encourage more content.
&lt;/br&gt;
&lt;p&gt;
&lt;script language="javascript" src="http://tipjoy.com/custombutton?targetUser=kailoa&amp;amount=0.99&amp;width=215&amp;" &gt;&lt;/script&gt;
&lt;/p&gt;&lt;/p&gt;

   &lt;img src="http://feeds.feedburner.com/~r/6TringleBlog/~4/MH-kWpdZGf8" height="1" width="1"/&gt;</content><feedburner:origLink>http://6Tringle.com/blog/2009/TouchSampleCode.html</feedburner:origLink></entry><entry><title>The Secret Life of _cmd</title><author><name>Kailoa Kadano</name><uri>http://6Tringle.com/about/kailoa/</uri></author><link href="http://feedproxy.google.com/~r/6TringleBlog/~3/YPuagfRNvvc/SecretLifeOf_cmd.html" /><updated>2009-05-29T00:00:00Z</updated><published>2009-05-29T00:00:00Z</published><id>http://6Tringle.com/blog/2009/SecretLifeOf_cmd.html</id><content type="html">
       
&lt;p&gt;An Objective-C class in Cocoa has one hidden object that every knows about.  The &lt;code&gt;self&lt;/code&gt; object is used extensive within a class to reference the object currently invoking a&amp;nbsp;method.&lt;/p&gt;
&lt;p&gt;There is another hidden variable that very few seem to know about: &lt;code&gt;_cmd&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;_cmd&lt;/code&gt; is the method that is currently being invoked.  So if &lt;code&gt;self&lt;/code&gt; is the subject, &lt;code&gt;_cmd&lt;/code&gt; is the&amp;nbsp;verb.&lt;/p&gt;
&lt;p&gt;The most obvious application of &lt;code&gt;_cmd&lt;/code&gt; is logging.  Here is one of my most used&amp;nbsp;macros:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#define METHOD_LOG (NSLog(@"%@ %s\n%@", \
                    NSStringFromSelector(_cmd), \
                    __FILE__, self))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You would typically use it in a method like&amp;nbsp;follows:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;- (void)viewDidLoad
{
    METHOD_LOG;

    //do stuff...
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This logs a message to the console telling, what method, from what file, invoked with what&amp;nbsp;object.&lt;/p&gt;
&lt;p&gt;Tremendously useful.  Here's a second version that adds thread&amp;nbsp;information:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#define METHOD_LOG_THREAD (NSLog(@"%@ %@ %s\n%@", \
                        NSStringFromSelector(_cmd), \
                        [NSThread currentThread], \
                        __FILE__, self))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;_cmd&lt;/code&gt; is not only for logging.  We can play neat tricks with it as&amp;nbsp;well.&lt;/p&gt;
&lt;p&gt;This method returns an object in a dictionary where the key is the method&amp;nbsp;name,&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;- (id)color;
{
    //SomeDictionary defined elsewhere in class
    return [SomeDictionary 
            objectForKey:NSStringFromSelector(_cmd)];
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You could combine this with a property to get easy access inside a&amp;nbsp;dictionary.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;@property (readonly) id color;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you wanted a read-write property, you could implement it this&amp;nbsp;way:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;- (id)color;
{
    //SomeDictionary defined elsewhere in class
    return [SomeDictionary objectForKey:
                [NSStringFromSelector(_cmd) capitalize]];
}
- (void)setColor:(id)someObject;
{
    //3 means we start from the C in Color
    NSString *partial_string;
    partial_string = [NSStringFromSelector(_cmd) 
                        substringFromIndex:3];

    //SomeDictionary defined elsewhere in class
    [SomeDictionary setObject:someObject 
                       forKey:partial_string]; 
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now, we have a color property, without ever creating a color instance variable in the class.  This has some advantages in that you don't have worry as much about memory management.  The object is retained when it's added to SomeDictionary and released when SomeDictionary is released or when the object is&amp;nbsp;replaced.&lt;/p&gt;
&lt;p&gt;The Objective-C runtime is full of neat little tricks and &lt;code&gt;_cmd&lt;/code&gt; is just one of&amp;nbsp;them.&lt;/p&gt;
&lt;p&gt;More advanced techniques can be used to implement some advanced functionality such as higher-order-messaging and even mimic methods as &lt;em&gt;nearly&lt;/em&gt; first class&amp;nbsp;objects.&lt;/p&gt;
&lt;p&gt;Functional programming aficionados can check out &lt;a href="http://www.cocoadev.com/index.pl?HigherOrderMessaging"&gt;http://www.cocoadev.com/index.pl?HigherOrderMessaging&lt;/a&gt; for some discussion on&amp;nbsp;this.&lt;/p&gt;

   &lt;img src="http://feeds.feedburner.com/~r/6TringleBlog/~4/YPuagfRNvvc" height="1" width="1"/&gt;</content><feedburner:origLink>http://6Tringle.com/blog/2009/SecretLifeOf_cmd.html</feedburner:origLink></entry><entry><title>App Store Reviewers Are _Only_ Paid to Review Apps</title><author><name>Kailoa Kadano</name><uri>http://6Tringle.com/about/kailoa/</uri></author><link href="http://feedproxy.google.com/~r/6TringleBlog/~3/AYlQjF6tvko/AppStoreReviewers.html" /><updated>2009-05-30T00:00:00Z</updated><published>2009-05-30T00:00:00Z</published><id>http://6Tringle.com/blog/2009/AppStoreReviewers.html</id><content type="html">
       
&lt;blockquote&gt;
&lt;p&gt;&lt;span class="dquo"&gt;"&lt;/span&gt;Never ascribe to malice, that which can be explained by&amp;nbsp;incompetence."&lt;/p&gt;
&lt;p&gt;--Napoleon&amp;nbsp;Bonaparte&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="http://daringfireball.net"&gt;Daring Fireball's&lt;/a&gt; John Gruber recently did another bit on &lt;a href="http://daringfireball.net/2009/05/diary_of_an_app_store_reviewer"&gt;the app store review process&lt;/a&gt;.  While I usually enjoy his satire (&lt;a href="http://daringfireball.net/2005/09/anthropomorphized"&gt;brushed&lt;/a&gt; &lt;a href="http://daringfireball.net/2006/01/brushed_metal"&gt;metal&lt;/a&gt; &lt;a href="http://daringfireball.net/2007/06/brushed_metal_leopard"&gt;anyone&lt;/a&gt;?), this one didn't seem quite right.  The piece is funny enough, but I hate to think that they are being intentionally cruel or evil.  Despite the above quote, I'm not even sure that incompetence is involved at the level of the individual reviewers.&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;I have my own theory on why there are so many rejections and why many highly publicized rejections seem so&amp;nbsp;silly:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The large pool of reviewers are likely judged on how many apps they handle over a period of time.&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By handle, I mean download, install, evaluate, approve/reject and feedback.  If this is the case, then the apparent problems result from the fact that &lt;strong&gt;rejections&lt;/strong&gt; can be done quickly (by finding/exaggerating/creating a violation) and that &lt;strong&gt;approval&lt;/strong&gt; takes time (the entire app must be checked against the iPhone SDK Agreement Section 3.3 and its &lt;em&gt;fifteen&lt;/em&gt;&amp;nbsp;subsections).&lt;/p&gt;
&lt;p&gt;In the case of &lt;a href="http://click.linksynergy.com/fs-bin/stat?id=FU9TTuAveps&amp;offerid=146261&amp;type=3&amp;subid=0&amp;tmpid=1826&amp;RD_PARM1=http%253A%252F%252Fitunes.apple.com%252FWebObjects%252FMZStore.woa%252Fwa%252FviewSoftware%253Fid%253D312399929%2526mt%253D8%2526partnerId%253D30"&gt;Eucalyptus&lt;/a&gt;, The reviewer found it took almost no time at all to reject the app by searching for the Kama Sutra.  If the intention was to approve the app, then the reviewer would have had to confirm and checkoff every feature against the long list of guidelines.&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;By quickly rejecting the app, the reviewer can move on to the next item, increasing his number of "handled" apps. Meanwhile, the developer is left feeling bullied and angry.  It ultimately ends up a disservice to the millions of App Store users now denied the ability to purchase and benefit from&amp;nbsp;Eucalyptus.&lt;/p&gt;
&lt;p&gt;This, again, is just my own speculation but it could explain stories like the &lt;a href="http://arstechnica.com/apple/news/2009/03/iphone-app-tweetie-rejected-for-user-generated-content.ars"&gt;Tweetie&lt;/a&gt; rejection, the &lt;a href="http://forum.nin.com/bb/read.php?9,651569,651569#msg-651569"&gt;NIN&lt;/a&gt; rejection, and even the bizarre &lt;a href="http://www.reddit.com/r/iphone/comments/8luou/apple_is_smoking_good_stuff_apple_rejected_my/"&gt;green icon&lt;/a&gt; rejection.  It also explains why the feedback emails are often&amp;nbsp;short.&lt;/p&gt;
&lt;p&gt;There are many examples of mis-incentives across every industry.  The New York Times has a great &lt;a href="http://www.nytimes.com/2009/02/15/magazine/15Battier-t.html"&gt;piece on the NBA&lt;/a&gt; addressing how focusing on the wrong stats can cost you games.  In the early days of phone support, operators were graded on how many customers they handled in an hour.  This lead to the operator hanging up in the middle of difficult or long support calls, so they could fish for easier, shorter calls to boost their daily numbers.  Customers would become more upset and managers didn't understand why their internal metrics didn't match external surveys of customer&amp;nbsp;satisfaction.&lt;/p&gt;
&lt;p&gt;You have to incentivize the right metric and apps/hour is not it.  The iTunesConnect entity within Apple may or may not believe that the developers it serves are its customers.  However, if they don't evolve, refine and improves their service (like Apple evolves, refines and improves its iPods), developers will leave the ecosystem and writers will continue to make fun of&amp;nbsp;them.&lt;/p&gt;

   &lt;img src="http://feeds.feedburner.com/~r/6TringleBlog/~4/AYlQjF6tvko" height="1" width="1"/&gt;</content><feedburner:origLink>http://6Tringle.com/blog/2009/AppStoreReviewers.html</feedburner:origLink></entry></feed>
