<?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>iDevBlogADay</title>
	<atom:link href="http://idevblogaday.com/feed" rel="self" type="application/rss+xml" />
	<link>http://idevblogaday.com</link>
	<description>iOS indie developers writing every day about their stuff.</description>
	<lastBuildDate>Wed, 16 May 2012 18:33:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Real-World App Testing: Using Trip Boss Travel Manager on Vacation [Justine Pratt]</title>
		<link>http://feedproxy.google.com/~r/MobileEvolution/~3/zEcfui5ZEtI/real-world-app-testing-using-trip-boss-travel-manager-vacation</link>
		<comments>http://idevblogaday.com/archives/1429#comments</comments>
		<pubDate>Wed, 16 May 2012 18:33:44 +0000</pubDate>
		<dc:creator>Justine Pratt</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://idevblogaday.com/archives/1429</guid>
		<description><![CDATA[Testing some productivity apps in a real-world situation is not always feasible. For example, we make a travel app, Trip Boss travel manager, for business and personal travel. Unless we plan a trip each time we test the app, testing will only be simulated travel. Day to day usage can be replicated, but actually using the app for travel can provide a new perspective on the app. True in-depth reviews are also rare, unless reviewers use the app to travel. Unfortunately, getting someone to review your app, let alone someone who just so happens to be traveling, is difficult to […]]]></description>
			<content:encoded><![CDATA[<p>Testing some productivity apps in a real-world situation is not always feasible.  For example, we make a travel app, Trip Boss travel manager, for business and personal travel.  Unless we plan a trip each time we test the app, testing will only be simulated travel. Day to day usage can be replicated, but actually using the app for travel can provide a new perspective on the app.  True in-depth reviews are also rare, unless reviewers use the app to travel. Unfortunately, getting someone to review your app, let alone someone who just so happens to be traveling, is difficult to coordinate. </p>
<div>
<div>Bookmark/Search this post with: </div>
<ul>
<li><a href="http://del.icio.us/post?url=http%3A%2F%2Fcreativealgorithms.com%2Fblog%2Fcontent%2Freal-world-app-testing-using-trip-boss-travel-manager-vacation&amp;title=Real-World+App+Testing%3A+Using+Trip+Boss+Travel+Manager+on+Vacation" title="Bookmark this post on del.icio.us." rel="nofollow"><img src="http://creativealgorithms.com/blog/modules/service_links/images/delicious.png" alt="Delicious" /></a></li>
<li><a href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fcreativealgorithms.com%2Fblog%2Fcontent%2Freal-world-app-testing-using-trip-boss-travel-manager-vacation&amp;title=Real-World+App+Testing%3A+Using+Trip+Boss+Travel+Manager+on+Vacation" title="Digg this post on digg.com." rel="nofollow"><img src="http://creativealgorithms.com/blog/modules/service_links/images/digg.png" alt="Digg" /></a></li>
<li><a href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fcreativealgorithms.com%2Fblog%2Fcontent%2Freal-world-app-testing-using-trip-boss-travel-manager-vacation&amp;title=Real-World+App+Testing%3A+Using+Trip+Boss+Travel+Manager+on+Vacation" title="Thumb this up at StumbleUpon." rel="nofollow"><img src="http://creativealgorithms.com/blog/modules/service_links/images/stumbleit.png" alt="StumbleUpon" /></a></li>
<li><a href="http://reddit.com/submit?url=http%3A%2F%2Fcreativealgorithms.com%2Fblog%2Fcontent%2Freal-world-app-testing-using-trip-boss-travel-manager-vacation&amp;title=Real-World+App+Testing%3A+Using+Trip+Boss+Travel+Manager+on+Vacation" title="Submit this post on reddit.com." rel="nofollow"><img src="http://creativealgorithms.com/blog/modules/service_links/images/reddit.png" alt="Reddit" /></a></li>
<li><a href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fcreativealgorithms.com%2Fblog%2Fcontent%2Freal-world-app-testing-using-trip-boss-travel-manager-vacation&amp;t=Real-World+App+Testing%3A+Using+Trip+Boss+Travel+Manager+on+Vacation" title="Share on Facebook." rel="nofollow"><img src="http://creativealgorithms.com/blog/modules/service_links/images/facebook.png" alt="Facebook" /></a></li>
<li><a href="http://www.google.com/bookmarks/mark?op=add&amp;bkmk=http%3A%2F%2Fcreativealgorithms.com%2Fblog%2Fcontent%2Freal-world-app-testing-using-trip-boss-travel-manager-vacation&amp;title=Real-World+App+Testing%3A+Using+Trip+Boss+Travel+Manager+on+Vacation" title="Bookmark this post on Google." rel="nofollow"><img src="http://creativealgorithms.com/blog/modules/service_links/images/google.png" alt="Google" /></a></li>
<li><a href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http%3A%2F%2Fcreativealgorithms.com%2Fblog%2Fcontent%2Freal-world-app-testing-using-trip-boss-travel-manager-vacation&amp;t=Real-World+App+Testing%3A+Using+Trip+Boss+Travel+Manager+on+Vacation" title="Bookmark this post on Yahoo." rel="nofollow"><img src="http://creativealgorithms.com/blog/modules/service_links/images/yahoo.png" alt="Yahoo" /></a></li>
<li><a href="http://technorati.com/cosmos/search.html?url=http%3A%2F%2Fcreativealgorithms.com%2Fblog%2Fcontent%2Freal-world-app-testing-using-trip-boss-travel-manager-vacation" title="Search Technorati for links to this post." rel="nofollow"><img src="http://creativealgorithms.com/blog/modules/service_links/images/technorati.png" alt="Technorati" /></a></li>
</ul>
</div>
<p><a href="http://creativealgorithms.com/blog/content/real-world-app-testing-using-trip-boss-travel-manager-vacation" target="_blank">read more</a></p>
<p><img src="http://feeds.feedburner.com/~r/MobileEvolution/~4/zEcfui5ZEtI" height="1" width="1" /></p>
]]></content:encoded>
			<wfw:commentRss>http://idevblogaday.com/archives/1429/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Perlin Noise on GPU in GPUImage [Jake Gundersen]</title>
		<link>http://feedproxy.google.com/~r/IndieAmbitions/~3/J_XwudnEIKk/</link>
		<comments>http://idevblogaday.com/archives/1428#comments</comments>
		<pubDate>Wed, 16 May 2012 07:12:51 +0000</pubDate>
		<dc:creator>Jake Gundersen</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://idevblogaday.com/archives/1428</guid>
		<description><![CDATA[Perlin noise has all kinds of applications, from realistic looking texutres to fire effects to flow fields. It&#8217;s a useful tool to have in the belt. If you&#8217;ve never heard of perlin noise here&#8217;s the wikipedia article and here&#8217;s a &#8230; Continue reading &#8594;]]></description>
			<content:encoded><![CDATA[<p>Perlin noise has all kinds of applications, from realistic looking texutres to fire effects to flow fields.  It&#8217;s a useful tool to have in the belt.  </p>
<p>If you&#8217;ve never heard of perlin noise here&#8217;s the <a href="http://en.wikipedia.org/wiki/Perlin_noise">wikipedia article</a> and here&#8217;s a <a href="http://devmag.org.za/2009/04/25/perlin-noise/">great explanation</a> of how it&#8217;s calculated.  Better than that, here are some examples of it&#8217;s use:</p>
<p>Natural Textures</p>
<p><a href="http://www.noisemachine.com/talk1/"><img alt="" src="http://www.noisemachine.com/talk1/imgs/vase2.gif" class="alignnone" width="303" height="492" /></a></p>
<p>Procedural Terrain Generation</p>
<p><img alt="" src="http://developer.nvidia.com/dev_content/cg/cg_effects_explained/Images/Cg_Eff3.jpg" class="alignnone" width="350" height="350" /></p>
<p>Flow Fields</p>
<p><a href="http://blog.soulwire.co.uk/laboratory/flash/perlin-noise-flow-field"><img alt="" src="http://blog.soulwire.co.uk/wp-content/uploads/2008/12/flow-field-710x352.jpg" class="alignnone" width="510" height="252" /></a></p>
<p>I wanted to have some perlin noise I could use to apply different effects to GPUImage filters.  I found a reference to a GPU implementation on <a href="http://stackoverflow.com/questions/4200224/random-noise-functions-for-glsl">stackoverflow.com</a>.  The implementation on github <a href="https://github.com/ashima/webgl-noise">here</a> is ready to go.  I used the classic 2D implementation provided there.  There are also 3D, 4D as well as simplex versions (the simplex noise performs better at higher dimensions).</p>
<p>Here&#8217;s that code used to create a filter that generates a texture using perlin noise.  The code is just copied from the github implementation:</p>
<p>Header:</p>
<pre>
#import &quot;GPUImageFilter.h&quot;

@interface GPUImagePerlinNoiseFilter : GPUImageFilter {
    GLint scaleUniform, colorStartUniform, colorFinishUniform;
}

@property (readwrite, nonatomic) GPUVector4 colorStart;
@property (readwrite, nonatomic) GPUVector4 colorFinish;
@property (readwrite, nonatomic) float scale;

@end
</pre>
<p>And implementation:</p>
<pre>
#import &quot;GPUImagePerlinNoiseFilter.h&quot;

NSString *const kGPUImagePerlinNoiseFragmentShaderString = SHADER_STRING
(
 precision highp float;
 varying highp vec2 textureCoordinate;
 uniform float scale;

 uniform vec4 colorStart;
 uniform vec4 colorFinish;

 //
 // Description : Array and textureless GLSL 2D/3D/4D simplex
 // noise functions.
 // Author : Ian McEwan, Ashima Arts.
 // Maintainer : ijm
 // Lastmod : 20110822 (ijm)
 // License : Copyright (C) 2011 Ashima Arts. All rights reserved.
 // Distributed under the MIT License. See LICENSE file.
 // https://github.com/ashima/webgl-noise
 //

 vec4 mod289(vec4 x)
{
    return x - floor(x * (1.0 / 289.0)) * 289.0;
}

 vec4 permute(vec4 x)
{
    return mod289(((x*34.0)+1.0)*x);
}

 vec4 taylorInvSqrt(vec4 r)
{
    return 1.79284291400159 - 0.85373472095314 * r;
}

 vec2 fade(vec2 t) {
     return t*t*t*(t*(t*6.0-15.0)+10.0);
 }

 // Classic Perlin noise
 float cnoise(vec2 P)
{
    vec4 Pi = floor(P.xyxy) + vec4(0.0, 0.0, 1.0, 1.0);
    vec4 Pf = fract(P.xyxy) - vec4(0.0, 0.0, 1.0, 1.0);
    Pi = mod289(Pi); // To avoid truncation effects in permutation
    vec4 ix = Pi.xzxz;
    vec4 iy = Pi.yyww;
    vec4 fx = Pf.xzxz;
    vec4 fy = Pf.yyww;

    vec4 i = permute(permute(ix) + iy);

    vec4 gx = fract(i * (1.0 / 41.0)) * 2.0 - 1.0 ;
    vec4 gy = abs(gx) - 0.5 ;
    vec4 tx = floor(gx + 0.5);
    gx = gx - tx;

    vec2 g00 = vec2(gx.x,gy.x);
    vec2 g10 = vec2(gx.y,gy.y);
    vec2 g01 = vec2(gx.z,gy.z);
    vec2 g11 = vec2(gx.w,gy.w);

    vec4 norm = taylorInvSqrt(vec4(dot(g00, g00), dot(g01, g01), dot(g10, g10), dot(g11, g11)));
    g00 *= norm.x;
    g01 *= norm.y;
    g10 *= norm.z;
    g11 *= norm.w;  

    float n00 = dot(g00, vec2(fx.x, fy.x));
    float n10 = dot(g10, vec2(fx.y, fy.y));
    float n01 = dot(g01, vec2(fx.z, fy.z));
    float n11 = dot(g11, vec2(fx.w, fy.w));

    vec2 fade_xy = fade(Pf.xy);
    vec2 n_x = mix(vec2(n00, n01), vec2(n10, n11), fade_xy.x);
    float n_xy = mix(n_x.x, n_x.y, fade_xy.y);
    return 2.3 * n_xy;
}

 void main()
 {

     float n1 = (cnoise(textureCoordinate * scale) + 1.0) / 2.0;

     vec4 colorDiff = colorFinish - colorStart;
     vec4 color = colorStart + colorDiff * n1;

     gl_FragColor = color;
 }
 );

@implementation GPUImagePerlinNoiseFilter

@synthesize scale = _scale, colorStart = _colorStart, colorFinish = _colorFinish;

- (id)init;
{
    if (!(self = [super initWithFragmentShaderFromString:kGPUImagePerlinNoiseFragmentShaderString]))
    {
		return nil;
    }

    scaleUniform = [filterProgram uniformIndex:@&quot;scale&quot;];

    colorStartUniform = [filterProgram uniformIndex:@&quot;colorStart&quot;];
    colorFinishUniform = [filterProgram uniformIndex:@&quot;colorFinish&quot;];

    [self setScale:8.0];

    [self setColorStart:(GPUVector4){0.0, 0.0, 0.0, 1.0}];
    [self setColorFinish:(GPUVector4){1.0, 1.0, 1.0, 1.0}];    

    return self;
}

-(void)setScale:(float)scale {
    _scale = scale;

    [GPUImageOpenGLESContext useImageProcessingContext];
    [filterProgram use];
    glUniform1f(scaleUniform, _scale);
}

-(void)setColorStart:(GPUVector4)colorStart {
    _colorStart = colorStart;

    [GPUImageOpenGLESContext useImageProcessingContext];
    [filterProgram use];
    glUniform4f(colorStartUniform, _colorStart.one, _colorStart.two, _colorStart.three, _colorStart.four);
}

-(void)setColorFinish:(GPUVector4)colorFinish {
    _colorFinish = colorFinish;

    [GPUImageOpenGLESContext useImageProcessingContext];
    [filterProgram use];
    glUniform4f(colorFinishUniform, _colorFinish.one, _colorFinish.two, _colorFinish.three, _colorFinish.four);
}

@end
</pre>
<p>If you read my previous tutorial on how to create a custom GPUImage filter there shouldn&#8217;t be any surprises here.  I&#8217;m not going to go over how the code creates the noise, because I haven&#8217;t fully investigated how it works myself.  I don&#8217;t really care how it works, I&#8217;m only really interested in how to use it.</p>
<p>The usage lies in the cnoise(vec2) function.  You give it an x and y coordinate, and it returns a number between -1 and 1.  In the filter, I&#8217;m scaling up the input coordinate (because textureCoordinate is between 0.0 and 1.0 so that won&#8217;t give us very interesting noise).  Then I&#8217;m adding 1 and dividing by 2 to convert from a -1 to 1 range into a 0 to 1 range (which is the range of our color values).  </p>
<p>Finally, I use the start and finish color values supplied to the uniforms to create a noise texture that ranges between those two values.  Here&#8217;s what the result looks like (I&#8217;m using white and black as start and finish color values, but you can set it to any two colors):</p>
<p><a href="http://indieambitions.com/wp-content/uploads/2012/05/photo-1.png"><img src="http://indieambitions.com/wp-content/uploads/2012/05/photo-1.png" alt="" width="426" height="640" class="aligncenter size-full wp-image-337" /></a></p>
<p>You can use this filter with a blend filter to create interesting texture.  You could, for example, combine it with a brightness filter, and then put a sepia filter on it.  This would create a natural faded look, something like this:</p>
<p><a href="http://indieambitions.com/wp-content/uploads/2012/05/photo-2.png"><img src="http://indieambitions.com/wp-content/uploads/2012/05/photo-2.png" alt="" width="426" height="640" class="aligncenter size-full wp-image-338" /></a></p>
<p>However, for me, the more interesting usage of this perlin noise function is to combine it with other functions.  You can use this function in any of your shader code to create interesting, natural randomness.  A modified Pixellate filter that doesn&#8217;t create square pixels, but uses perlin noise to determine the size of the pixel cutoff.  Here&#8217;s a video of the result:</p>
</p>
<p>The code is mostly the pixellate filter.  I&#8217;ve added a scale uniform and of course the perlin noise function to the shader code:</p>
<pre>
#import &quot;GPUImageFilter.h&quot;

@interface GPUImagePixellateCrazyFilter : GPUImageFilter

{
    GLint fractionalWidthOfAPixelUniform, scaleUniform;
}

// The fractional width of the image to use as a size for the pixels in the resulting image. Values below one pixel width in the source image are ignored.
@property(readwrite, nonatomic) CGFloat fractionalWidthOfAPixel;
@property(readwrite, nonatomic) CGFloat scale;

@end
</pre>
<p>Implementation:</p>
<pre>
#import &quot;GPUImagePixellateCrazyFilter.h&quot;

NSString *const kGPUImagePixellateCrazyFragmentShaderString = SHADER_STRING
(
 precision highp float;
 varying vec2 textureCoordinate;

 uniform sampler2D inputImageTexture;

 uniform float fractionalWidthOfPixel;
 uniform float scale;
 //
 // Description : Array and textureless GLSL 2D/3D/4D simplex
 // noise functions.
 // Author : Ian McEwan, Ashima Arts.
 // Maintainer : ijm
 // Lastmod : 20110822 (ijm)
 // License : Copyright (C) 2011 Ashima Arts. All rights reserved.
 // Distributed under the MIT License. See LICENSE file.
 // https://github.com/ashima/webgl-noise
 //

 vec4 mod289(vec4 x)
{
    return x - floor(x * (1.0 / 289.0)) * 289.0;
}

 vec4 permute(vec4 x)
{
    return mod289(((x*34.0)+1.0)*x);
}

 vec4 taylorInvSqrt(vec4 r)
{
    return 1.79284291400159 - 0.85373472095314 * r;
}

 vec2 fade(vec2 t) {
     return t*t*t*(t*(t*6.0-15.0)+10.0);
 }

 // Classic Perlin noise
 float cnoise(vec2 P)
{
    vec4 Pi = floor(P.xyxy) + vec4(0.0, 0.0, 1.0, 1.0);
    vec4 Pf = fract(P.xyxy) - vec4(0.0, 0.0, 1.0, 1.0);
    Pi = mod289(Pi); // To avoid truncation effects in permutation
    vec4 ix = Pi.xzxz;
    vec4 iy = Pi.yyww;
    vec4 fx = Pf.xzxz;
    vec4 fy = Pf.yyww;

    vec4 i = permute(permute(ix) + iy);

    vec4 gx = fract(i * (1.0 / 41.0)) * 2.0 - 1.0 ;
    vec4 gy = abs(gx) - 0.5 ;
    vec4 tx = floor(gx + 0.5);
    gx = gx - tx;

    vec2 g00 = vec2(gx.x,gy.x);
    vec2 g10 = vec2(gx.y,gy.y);
    vec2 g01 = vec2(gx.z,gy.z);
    vec2 g11 = vec2(gx.w,gy.w);

    vec4 norm = taylorInvSqrt(vec4(dot(g00, g00), dot(g01, g01), dot(g10, g10), dot(g11, g11)));
    g00 *= norm.x;
    g01 *= norm.y;
    g10 *= norm.z;
    g11 *= norm.w;  

    float n00 = dot(g00, vec2(fx.x, fy.x));
    float n10 = dot(g10, vec2(fx.y, fy.y));
    float n01 = dot(g01, vec2(fx.z, fy.z));
    float n11 = dot(g11, vec2(fx.w, fy.w));

    vec2 fade_xy = fade(Pf.xy);
    vec2 n_x = mix(vec2(n00, n01), vec2(n10, n11), fade_xy.x);
    float n_xy = mix(n_x.x, n_x.y, fade_xy.y);
    return 2.3 * n_xy;
}

 void main()
 {
     float n = cnoise(textureCoordinate * scale);
     vec2 sampleDivisor = vec2((((n + 1.0) / 2.0) + 0.5) * fractionalWidthOfPixel);

     vec2 samplePos = textureCoordinate - mod(textureCoordinate, sampleDivisor);
     gl_FragColor = texture2D(inputImageTexture, samplePos );
 }
 );

@implementation GPUImagePixellateCrazyFilter

@synthesize fractionalWidthOfAPixel = _fractionalWidthOfAPixel, scale = _scale;

#pragma mark -
#pragma mark Initialization and teardown

- (id)init;
{
    if (!(self = [super initWithFragmentShaderFromString:kGPUImagePixellateCrazyFragmentShaderString]))
    {
		return nil;
    }

    fractionalWidthOfAPixelUniform = [filterProgram uniformIndex:@&quot;fractionalWidthOfPixel&quot;];
    scaleUniform = [filterProgram uniformIndex:@&quot;scale&quot;];

    self.fractionalWidthOfAPixel = 0.05;
    self.scale = 4.0;

    return self;
}

#pragma mark -
#pragma mark Accessors

- (void)setFractionalWidthOfAPixel:(CGFloat)newValue;
{

    _fractionalWidthOfAPixel = newValue;

    [GPUImageOpenGLESContext useImageProcessingContext];
    [filterProgram use];
    glUniform1f(fractionalWidthOfAPixelUniform, _fractionalWidthOfAPixel);
}

-(void)setScale:(CGFloat)scale {
    _scale = scale;
    [GPUImageOpenGLESContext useImageProcessingContext];
    [filterProgram use];
    glUniform1f(scaleUniform, _scale);
}

@end
</pre>
<p>The applications of perlin noise are endless.  I just wanted to throw a couple things out there to spark some imagination.  Here is another great creative coding applications (by @inspirit) that uses perlin noise to guide a particle system to paint an image with &#8216;strings&#8217;, this stuff is awesome:</p>
<p><a href="http://blog.inspirit.ru/?p=191"><img alt="" src="http://blog.inspirit.ru/wp-content/uploads/strings_painter/strings_mac.jpg" class="alignnone" width="620" height="420" /></a></p>
<p>Click on the above to go to the site and play with the demo.</p>
<p><img src="http://feeds.feedburner.com/~r/IndieAmbitions/~4/J_XwudnEIKk" height="1" width="1" /></p>
]]></content:encoded>
			<wfw:commentRss>http://idevblogaday.com/archives/1428/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>An Interview with Beginning iOS Dev [Ben Williams]</title>
		<link>http://feedproxy.google.com/~r/AspyreApps/~3/Axvjf5FPsuQ/</link>
		<comments>http://idevblogaday.com/archives/1427#comments</comments>
		<pubDate>Wed, 16 May 2012 06:14:35 +0000</pubDate>
		<dc:creator>Ben Williams</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://idevblogaday.com/archives/1427</guid>
		<description><![CDATA[I was recently asked by Beginning iOS Development if I would like to take part in an interview, ...]]></description>
			<content:encoded><![CDATA[<p>I was recently asked by <a href="http://www.beginningiosdev.com/">Beginning iOS Development</a> if I would like to take part in an interview, which sounded like fun to me. We discussed a range of things, from marketing, designs, my background, and development life in general. I&#8217;m really happy with how it all turned out, so if this sounds like it might be of interest, wander on over and have a read: <a href="http://www.beginningiosdev.com/interviews/interview-with-ben-williams-of-aspyre-apps">http://www.beginningiosdev.com/interviews/interview-with-ben-williams-of-aspyre-apps</a></p>
<hr />
<em>Enjoyed this post? Think we&#8217;re clever? Subscribe via <a href="http://feeds.feedburner.com/AspyreApps">RSS</a> or follow us on <a href="http://twitter.com/AspyreApps">Twitter</a></em>.</p>
]]></content:encoded>
			<wfw:commentRss>http://idevblogaday.com/archives/1427/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Directions and Disintermediation [Chris Adamson]</title>
		<link>http://www.subfurther.com/blog/2012/05/15/directions-and-disintermediation/</link>
		<comments>http://idevblogaday.com/archives/1425#comments</comments>
		<pubDate>Tue, 15 May 2012 15:48:44 +0000</pubDate>
		<dc:creator>Chris Adamson</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://idevblogaday.com/archives/1425</guid>
		<description><![CDATA[Apologies for a double-post to iDevBlogADay, but I didn&#8217;t want to hit the wider audience with two straight anime/manga-related iOS blogs, and I was way behind on entries for the first few months of the year anyways. With WWDC and presumably iOS 6 approaching, John Gruber looks for obvious gaps in iOS to fill, and [...]]]></description>
			<content:encoded><![CDATA[<p>Apologies for a double-post to <a href="http://idevblogaday.com">iDevBlogADay</a>, but I didn&#8217;t want to hit the wider audience with two straight anime/manga-related iOS blogs, and I was way behind on entries for the first few months of the year anyways.</p>
<p>With WWDC and presumably iOS 6 approaching, John Gruber looks for obvious gaps in iOS to fill, and in <a href="http://daringfireball.net/2012/05/ios_low_hanging_fruit">Low-Hanging Fruit</a>, he doesn&#8217;t report many. Following on <a href="http://allthingsd.com/20120511/apples-coming-map-app-will-blow-your-head-off/">reports that Apple will switch from Google to an in-house Map provider</a>, he writes that while controlling such an essential functionality is crucial, the switch has to be flawless:</p>
<blockquote><p> This is a high-pressure switch for Apple. Regressions will not be acceptable. The purported whiz-bang 3D view stuff might be great, but users are going to have pitchforks and torches in hand if practical stuff like driving and walking directions are less accurate than they were with Google’s data. Keep in mind too, that Android phones ship with turn-by-turn navigation.</p>
</blockquote>
<p>This was an interesting graf to me, because Gruber usually gets the details right, and this time he&#8217;s pretty far off.</p>
<p>Start with &#8220;users are going to have pitchforks and torches in hand if practical stuff like driving and walking directions are less accurate than they were with Google’s data.&#8221; That&#8217;s a fundamental misunderstanding of what the iOS SDK provides. Neither <a href="https://developer.apple.com/library/ios/#documentation/MapKit/Reference/MapKit_Framework_Reference/_index.html">Map Kit</a>, nor any other part of the SDK, provides directions. Map Kit only provides map tile images, and a &#8220;reverse geocoder&#8221; that may be able to correlate a given location to a street address or at least a political region (city, state/province, country). There&#8217;s nothing in Map Kit that knows that a yellow line is a road, a blue polygon is a lake, a dashed line is a state or country border, etc. More details in <a href="http://www.subfurther.com/blog/2010/02/05/the-long-and-winding-road-tip/">my write-up of writing Road Tip</a> and my <a href="http://www.subfurther.com/blog/2010/04/29/what-you-missed-at-voices-that-matter-iphone-developers-conference/">Bringing Your Own Maps talk</a> from 2010, but the long-and-short is that any app that provides directions has to be getting its data from some source other than Map Kit, probably a web service hosted by Google, MapQuest, Bing, etc.</p>
<p>I also did a little research to see what the Android API for this stuff looks like, assuming it was easier, and was quite surprised to see that it&#8217;s not. A <code>DrivingDirections</code> class was <a href="http://stackoverflow.com/questions/1612533/android-drivingdirections-removed-since-api-1-0-how-to-do-it-in-1-5-1-6">apparently removed after Android 1.0</a>, presumably due to the fact that implementing it required third-party data (TeleAtlas, NAVTEQ) that Google wasn&#8217;t in a position to redistribute for free. The suggested workarounds I&#8217;ve seen are all to either license a third-party directions API (embedded or webservice), or to make a specific request to <code>maps.google.com</code> and scrape the result as JSON… in other words, to use Google as the directions webservice and not worry about the terms of service. I only spent about 15 minutes looking, but it didn&#8217;t appear to me that getting directions is any easier for Android developers than it is on iOS. So while Gruber notes that &#8220;Android phones ship with turn-by-turn navigation&#8221;, that seems to be a user feature, not a developer feature.</p>
<p>So, on the one hand, third-party apps probably won&#8217;t change right away, because they haven&#8217;t counted on iOS for their directions anyways. But maybe that&#8217;s an opportunity: if Apple controls its own data, maybe it could offer an easy-to-use directions API, consisting of easy Objective-C calls rather than JSON or XML parsing like webservice clients have to do now.</p>
<p>There might be a licensing snag too: using Map Kit today means that developers are implicitly accepting the Google Maps terms of service. If iOS 6 switches providers, the terms presumably change as well, and I wonder how that would be handled. Would creating a <code>MKMapView</code> magically default to the new Apple maps in iOS 6 (and thereby inherit new Apple terms of service), or would developers maybe have to resubmit or add a credential to their apps to get the new maps?</p>
<p>And taking maps in-house has other interesting side-effects. The other day when I was out with my kids, I searched for &#8220;Arby&#8217;s&#8221; in Jackson, MI and the result appeared on the map as a &#8220;Sponsored Link&#8221; (I can&#8217;t re-create it here at home… maybe it&#8217;s only an ad when you&#8217;re physically nearby?). The money for that ad presumably goes to Google, a revenue stream that will start to dry up if Apple provides its own business location data when searching maps. We&#8217;ve also heard that <a href="http://www.intomobile.com/2012/03/10/analyst-siri-hurt-googles-mobile-search/">Siri could hurt Google search</a> if people start performing speech-based searches rather than keying terms into <code>google.com</code> via the mobile browser.</p>
<p>And isn&#8217;t this exactly what Google was afraid of, and why they felt the need to create Android? With iOS, Apple is in a position to disintermediate Google. And with Apple&#8217;s wrath towards Android, the company may be more interested and willing to do so than it might otherwise have been. Smooth move, Andy.</p>
<p><img src="http://feeds.feedburner.com/~r/timecode/~4/OfjZvLafl8E" height="1" width="1" /></p>
]]></content:encoded>
			<wfw:commentRss>http://idevblogaday.com/archives/1425/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apple Should Get Out of the Manga Piracy Business [Chris Adamson]</title>
		<link>http://www.subfurther.com/blog/2012/05/15/apple-should-get-out-of-the-manga-piracy-business/</link>
		<comments>http://idevblogaday.com/archives/1426#comments</comments>
		<pubDate>Tue, 15 May 2012 15:47:19 +0000</pubDate>
		<dc:creator>Chris Adamson</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://idevblogaday.com/archives/1426</guid>
		<description><![CDATA[Sorry for another anime/manga-related post, but a thread on Twitter reminded me of some Apple misdeeds that need rectifying. It started with a pair of tweets, first from Zac Bertschy of Anime News Network: I&#8217;m sure this has been asked a million times, but why are there so many goddamn bootleg manga apps on the [...]]]></description>
			<content:encoded><![CDATA[<p>Sorry for <a href="http://www.subfurther.com/blog/2012/05/01/what-anime-central-taught-me-about-macios-media/">another</a> anime/manga-related post, but a thread on Twitter reminded me of some Apple misdeeds that need rectifying. It started with a pair of tweets, <a href="https://twitter.com/#!/ANNZac/status/202096701534765056">first</a> from Zac Bertschy of <a href="http://www.animenewsnetwork.com">Anime News Network</a>:</p>
<blockquote><p>I&#8217;m sure this has been asked a million times, but why are there so many goddamn bootleg manga apps on the iOS store?</p>
</blockquote>
<p>And then a <a href="https://twitter.com/#!/Yuricon/status/202097381645369344">follow-up</a> from social-media expert and publisher Erica Friedman of <a href="http://www.yuricon.com/">Yuricon</a>:</p>
<blockquote><p><a href="https://twitter.com/#!/ANNZac">@ANNZac</a> I&#8217;ve tried to write Apple/Google about the links to bootleg sites. Neither has a reasonable way for reasonable people to complain</p>
</blockquote>
<p>So let me back up a second… what we&#8217;re talking about are dedicated apps that read &#8220;scanlations&#8221;, which are comics (usually Japanese manga) that have been scanned, translated by fans into English, and posted for free to various websites or made available through channels like BitTorrent.</p>
<p>Zac righly calls this &#8220;bootlegging&#8221; because there is no question that copyright violation is involved. Entire works are being digitally redistributed with zero compensation to the original authors or publishers. What can make this a gray area is a question of whether or not any actual harm is done: if the work is unavailable in English, nor likely to ever be, then how can a scanlation eliminate a sale that could never be made? This is a fairly bogus defense because (as we&#8217;ll see), the untranslated works are just a minor part of the story. Moreover, we could apply the established tests of &#8220;Fair Use&#8221; under US copyright law, such as: </p>
<ul>
<li>Is the new work &#8220;transformative&#8221;? In other words, are we using the original to create a fundamentally different thing?</li>
<li>How much of the original is being used?</li>
<li>Does the copying impede future sale of the original work? Does it harm the creator?</li>
<li>etc.</li>
</ul>
<p>Guidelines like this permit use like, say, presenting few pages of a comic in the context of a critical review or an academic paper: fundamentally new work, small amount of copying, doesn&#8217;t replace the original (and might actually drive new interest and sales). And obviously, a scanlation fails every one of these tests: it&#8217;s a full-on copy that changes only the language, and fully replaces a translation the original publisher might provide. It&#8217;s also been pointed out that scanlations are <a href="http://www.teleread.com/copy-right/manga-scanlations-hold-up-digital-manga-licensing/">harming the development of a legal digital manga industry in the US</a>. Scanlations would have zero chance of surviving a legal challenge.</p>
<p>So why the hell is Apple in the business of distributing them on iOS?</p>
<p>Search for <code>manga</code> on the App Store and you&#8217;ll get dozens of hits. Most of them are apps for downloading and reading scanlations on your iPad or iPhone. For the purpose of this blog, I tried the free versions of:</p>
<ul>
<li><a href="http://itunes.apple.com/us/app/manga-storm-ultimate-manga/id417341160?mt=8">Manga Storm</a></li>
<li><a href="http://itunes.apple.com/us/app/manga-rock-ultimate-manga/id365344300?mt=8">Manga Rock</a></li>
<li><a href="http://itunes.apple.com/us/app/manga-rock-2-best-way-to-read/id519675128?mt=8">Manga Rock 2</a></li>
<li><a>&#8220;Manga Browser, Downloader, and Reader</a></li>
<li><a href="http://itunes.apple.com/us/app/mangax3-lite-read-download/id445809471?mt=8">MangaX3 Lite</a> &#8211; didn&#8217;t use, crashes when loading title database</li>
<li><a href="http://itunes.apple.com/us/app/emanga/id321584037?mt=8">eManga</a> &#8211; didn&#8217;t use, hangs on sync</li>
<li><a href="http://itunes.apple.com/us/app/komik-connect-read-any-manga/id449107962?mt=8">Komik Connect</a> &#8211; didn&#8217;t use, since it requires a login to do anything</li>
</ul>
<p><em>Note: these are not affiliate links. I wouldn&#8217;t want a cut of their sales, since I consider them illegal and illicit.</em></p>
<p>Most of these apps get their contents from three scanlation websites: <a href="http://mangafox.me/">MangaFox</a>, <a href="http://www.mangareader.net/">Mangareader.net</a>, and <a href="http://www.mangareader.net/">MangaEden</a>. Some of these sites play at supporting the source of their titles by slapping in pseudo-legal disclaimers and vague admonishments to somehow support artists as seen on this page of <i>The Rose of Versailles</i>:</p>
<p><a href="http://www.subfurther.com/blog/wp-content/uploads/2012/05/IMG_0176.png"><img src="http://www.subfurther.com/blog/wp-content/uploads/2012/05/IMG_0176-225x300.png" alt="Manga Storm page from Rose of Versailles, with disclaimer caption" width="225" height="300" class="alignnone size-medium wp-image-2416" /></a></p>
<blockquote><p>This image is hosted at mangafox.com. We take no credit for the creation or editing of this image. All rights belong tot he original publisher and mangaka. While we hosted this for free at mangafox.com, please don&#8217;t forget to support the mangaka in any way that you can once his/her work becomes available for retail sale in your region!</p>
</blockquote>
<p>Some of these sites also adhere to an ethic that they don&#8217;t host scanlations of titles that have been licensed in the US. In this screenshot, Manga BDR (which awkwardly makes you browse MangaFox rather than scraping its index) shows an notice that <i>Fullmetal Alchemist</i> is unavailable from MangaFox because it has been licensed in the US:</p>
<p><a href="http://www.subfurther.com/blog/wp-content/uploads/2012/05/IMG_0175.png"><img src="http://www.subfurther.com/blog/wp-content/uploads/2012/05/IMG_0175-225x300.png" alt="Manga BDR showing MangaFox notice that Fullmetal Alchemist is unavailable" width="225" height="300" class="alignnone size-medium wp-image-2419" /></a></p>
<p>Does this mean there&#8217;s honor among thieves? Hardly. The sites are still violating the original Japanese copyright of the titles they do offer. And they&#8217;re not living up to the implicit promise to make obscure titles available to a wider audience &#8212; the <i>Rose of Versailles</i> manga cited above has not been completely translated, despite being more than 30 years old. And wherever Manga Rock gets its data from, it has no compunction about offering up titles that have US publishers. Here&#8217;s Manga Rock 2 offering <i>Fullmetal Alchemist</i> in its entirety:</p>
<p><a href="http://www.subfurther.com/blog/wp-content/uploads/2012/05/IMG_0173.png"><img src="http://www.subfurther.com/blog/wp-content/uploads/2012/05/IMG_0173-225x300.png" alt="Fullmetal Alchemist manga on Manga Rock 2" width="225" height="300" class="alignnone size-medium wp-image-2420" /></a></p>
<p>Not only is this stuff illicit bootlegs, these apps are popular <strong>because</strong> they allow access to pirated manga. Every single one of these apps advertises itself on the App Store with screenshots of browsing popular titles that have US publishers: Manga Storm shows <i>Fairy Tail</i>, Manga Rock shows <i>Fairy Tail</i>, <i>Air Gear</i>, and <i>Negima!</i>, and Komik Connect shows <i>Bleach</i> and <i>Naruto</i>. And the users use these apps precisely because of their illegal nature: the one-star reviews on Manga Storm don&#8217;t complain about it ripping off artists, but because it lacks US-licensed titles (due to its dependence on MangaFox and friends), and because it&#8217;s a paid app.</p>
<p>And speaking of the paid versions…</p>
<p>Apple gets a 30% cut of every sale of the full versions of these apps. That makes Apple a direct beneficiary of copyright piracy. </p>
<p>Everyone who stood up to say Apple does more to support creators than Google and its cavalier attitude towards IP rights, you can sit down now. So long as these apps are available on the App Store, Apple is complicit in piracy.</p>
<p>It&#8217;s fair game to criticize Apple for these, when the company has such a stringent review process. When it&#8217;s so careful to consider what it will and won&#8217;t sell, approval of an app has to be considered an explicit endorsement, particularly considering Apple gets a cut of the sales.</p>
<p>And that&#8217;s what makes it all the more galling:</p>
<ul>
<li>Apple has <a href="http://www.subfurther.com/blog/2012/03/25/app-rejections-are-a-lousy-way-to-communicate-policy-changes/">started rejecting apps for largely hypothetical privacy concerns</a>, but is OK with pirating manga.</li>
<li>Apple <a href="http://mashable.com/2011/01/03/icontrolbits-iphone/">won&#8217;t allow BitTorrent clients</a>, despite significant non-infringing uses, but is OK with pirating manga.</li>
<li>Apple <a href="http://mangabookshelf.com/blog/2012/03/01/apple-censors-still-targeting-lgbtq-content/">won&#8217;t let third parties sell gay- or lesbian-themed comics</a>, but is OK with pirating manga.</li>
</ul>
<p>The last of these may be the most galling. Erica Friedman <a href="http://okazu.blogspot.com/2012/02/event-manganext-2012-review.html">again</a>:</p>
<blockquote><p>I went on a rant about why is it okay with the those of you who like shiny things that Apple just told DMP to take their BL off the iPad app? WHY?!? If the TV hardware manufacturers told you what TV stations you could receive, you&#8217;d be enraged. When your work blocks sites, you find ways around it. So why the hell is it okay will all you Apple fans that Apple censors content? I cannot understand why you are not screaming at all, much less loudly? APPLE CENSORS CONTENT. Especially LGBTQ content. Why are you still giving money to a company like that? People boycott BP and Chik-Fil-A and Target&#8230;but are absolute sheep about Apple&#8217;s censorship of content. ARGGGGGHHHH.</p>
</blockquote>
<p>It&#8217;s as if Apple is saying &#8220;we won&#8217;t let anyone sell you gay manga for your iPad, but we will sell you tools to help you steal the stuff.&#8221;</p>
<p>This has to stop.</p>
<p>If nothing else, these apps are in obvious violation of section 22.4 of the <a href="https://developer.apple.com/appstore/resources/approval/guidelines.html">iOS App Store Review Guidelines</a>:</p>
<blockquote><p>22.4    Apps that enable illegal file sharing will be rejected</p>
</blockquote>
<p>Apple apparently won&#8217;t listen to third-party criticism (people have been calling attention to these bootlegging apps since at least 2010: <a href="http://www.animenewsnetwork.com/news/2010-04-22/app-puts-unauthorized-manga-scans-on-iphone">1</a>, <a href="http://robot6.comicbookresources.com/2010/04/bootleg-manga-theres-an-app-for-that/">2</a>, <a href="http://pulllist.comixology.com/articles/368/How-To-Illegally-Read-Manga-Anywhere-The-iPhone-Manga-Wars-of-2010&quot;&quot;">3</a>), but there are channels that aggrieved parties can use. <a href="http://itunes.apple.com/us/app/viz-manga-for-ipad/id391613351?mt=8">Viz</a> and <a href="http://itunes.apple.com/us/app/yen-press/id393612422?mt=8">Yen Press</a> have legitimate iOS apps for their manga titles. Since Manga Rock 2 makes bootlegs of those titles available (I saw Viz&#8217;s <i>Fullmetal Alchemist</i> and Yen&#8217;s <i>High School of the Dead</i>), these companies could use Apple&#8217;s dispute policies to at least have Manga Rock 2 taken down.</p>
<p>Beyond this, it&#8217;s hard to see what will work. Via Twitter, Erica noted yesterday that most US manga publishers are too small and operating on margins too thin to follow up with DMCA takedowns, and Apple may be technically in the clear on DMCA because they&#8217;re not themselves hosting the offending content.</p>
<p>However, since Apple&#8217;s making money off the sale of the apps used to pirate this content &#8212; in clear and obvious violation of their own policy &#8212; another option is that the Japanese publishers might want to sue Apple directly. They would presumably have more legal resources to stick with a lawsuit, and with Apple deaf to criticism, maybe it would take a few subpoenas to call their attention to the fact that making money off piracy is an awfully dirty business for one of the world&#8217;s largest and most prestigious companies to be involved in.</p>
<p>For the sake of Apple and the creative community, these apps need to disappear forever.</p>
<p><img src="http://feeds.feedburner.com/~r/timecode/~4/E6hcEi07Jno" height="1" width="1" /></p>
]]></content:encoded>
			<wfw:commentRss>http://idevblogaday.com/archives/1426/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Help Others to Help Yourself [Ken Carpenter]</title>
		<link>http://www.mindjuice.net/2012/05/13/help-others-to-help-yourself/</link>
		<comments>http://idevblogaday.com/archives/1424#comments</comments>
		<pubDate>Sun, 13 May 2012 21:11:48 +0000</pubDate>
		<dc:creator>Ken Carpenter</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://idevblogaday.com/archives/1424</guid>
		<description><![CDATA[A couple of weeks ago, Whitaker Trebella&#8217;s fun puzzle game Polymer was launched on the App Store. I bought the game and played it quite a bit that week.  I decided that it was a game that people who enjoyed my game Charmed might also really like, so I asked Whit if he would like [...]]]></description>
			<content:encoded><![CDATA[<p>A couple of weeks ago, Whitaker Trebella&#8217;s fun puzzle game Polymer was launched on the App Store. I bought the game and played it quite a bit that week.  I decided that it was a game that people who enjoyed my game Charmed might also really like, so I asked Whit if he would like [...]</p>
]]></content:encoded>
			<wfw:commentRss>http://idevblogaday.com/archives/1424/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A Quick Gotcha About Blocks [Pat Zearfoss]</title>
		<link>http://zearfoss.wordpress.com/2012/05/11/a-quick-gotcha-about-blocks/</link>
		<comments>http://idevblogaday.com/archives/1423#comments</comments>
		<pubDate>Fri, 11 May 2012 14:28:39 +0000</pubDate>
		<dc:creator>Pat Zearfoss</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://idevblogaday.com/archives/1423</guid>
		<description><![CDATA[Blocks are a great addition to the iOS SDK and C standard, especially for predominantly event driven applications as we commonly see on the iPhone and iPad.  There&#8217;s a quick gotcha that a junior developer here at Mindgrub reminded me of the other day. While blocks are a powerful tool, if you&#8217;re not careful they [...]]]></description>
			<content:encoded><![CDATA[<p>Blocks are a great addition to the iOS SDK and C standard, especially for predominantly event driven applications as we commonly see on the iPhone and iPad.  There&#8217;s a quick gotcha that a junior developer here at Mindgrub reminded me of the other day.</p>
<p>While blocks are a powerful tool, if you&#8217;re not careful they can start to degrade the quality of your app by introducing retain cycles.  Retain cycles occur when two objects in your application keep strong references to one another.  Take the common table view for example.  Ordinarily, the view controller containing (owning) the table view acts as the datasource and delegate for table, providing the necessary information for displaying the number of rows and supplying cell objects.  If you look closely at the properties on UITableView for datasource and delegate, you&#8217;ll see that both properties are declared as &#8220;assign&#8221; or &#8220;weak&#8221; in ARC.  This is critical particularly in the case where the view controller is also the datasource/delegate.  If the properties were &#8220;strong&#8221; or &#8220;retain&#8221; you could easily wind up in a retain cycle where neither your UITableView nor your view controller would ever be destroyed, thereby leaking memory.</p>
<p>This can happen with blocks as well and it&#8217;s not always so obvious.  Let&#8217;s say we have a view for which we define a block to handle the user tapping it.  The code might look something like this:</p>
<pre>

#import &lt;UIKit/UIKit.h&gt;

typedef void(^TapBlock)(void);

@interface TapBlockView : UIView
{
   TapBlock tapBlock;
}

@property (nonatomic, copy) TapBlock tapBlock;
@end

@implementation TapBlockView
@synthesize tapBlock;
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
   tapBlock();
}

- (void)dealloc
{
   [tapBlock release];
   [super dealloc];
}

@end
</pre>
</p>
<p>This is a very convenient way of setting up delegate style behavior without having to litter your code with lots of protocol definitions.  Now an example of using the view in a view controller:</p>
<p>
<pre>
- (void)viewDidLoad
{
    [super viewDidLoad];
    tapBlockView = [[TapBlockView alloc] initWithFrame:CGRectZero];
    [tapBlockView setTapBlock:^(void) {
        self.someLabel.text = @&quot;You tapped it!&quot;;
    }];
}
</pre>
</p>
<p>Everything seems fine right?  Nice and convenient. </p>
<p>Not so fast. </p>
<p>Blocks automatically scope capture and retain any object types you use in the block.  In this case that variable is &#8220;self&#8221;.  Now we have a retain cycle since self owns the tap view which owns the block <strong>which now owns self.</strong></p>
<p>According to Mike Ash, the correct way to handle this is to use a weak pointer (assign) in the block like this:</p>
<p>
<pre>
- (void)viewDidLoad
{
    [super viewDidLoad];
    tapBlockView = [[TapBlockView alloc] initWithFrame:CGRectZero];
    __block typeof (self) weakself = self;
    [tapBlockView setTapBlock:^(void) {
        weakself.someLabel.text = @&quot;You tapped it!&quot;;
    }];
}
</pre>
</p>
<p>By using a weak, nonretained pointer along with the __block modifier we&#8217;ve broken the retain cycle.  For ARC code you should use __weak instead of __block.  </p>
<p>There&#8217;s two important lessons to be pulled from this.  The first is that you always have to be aware of the code you&#8217;re writing and look for subtle retain cycles like this one.  No amount of automatic reference counting magic can help you in some of these scenarios.  The second is that it&#8217;s always good to look at code written by others on your team because there&#8217;s nearly always something new to learn to refresh on, even if you&#8217;re one of the more seasoned developers and the code you&#8217;re reading is from a junior dev.  </p>
<p>For more information check out these two articles on <a href="http://www.mikeash.com/pyblog/">Mike Ash&#8217;s Friday Q&amp;A Site</a>:<br />
<a href="http://www.mikeash.com/pyblog/friday-qa-2011-09-30-automatic-reference-counting.html">9/30/2011 &#8211; Automatic Reference Counting</a><br />
<a href="http://www.mikeash.com/pyblog/friday-qa-2010-04-30-dealing-with-retain-cycles.html">4/30/2010 &#8211; Dealing With Retain Cycles</a></p>
<p>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/zearfoss.wordpress.com/370/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/zearfoss.wordpress.com/370/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/zearfoss.wordpress.com/370/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/zearfoss.wordpress.com/370/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/zearfoss.wordpress.com/370/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/zearfoss.wordpress.com/370/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/zearfoss.wordpress.com/370/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/zearfoss.wordpress.com/370/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/zearfoss.wordpress.com/370/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/zearfoss.wordpress.com/370/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/zearfoss.wordpress.com/370/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/zearfoss.wordpress.com/370/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/zearfoss.wordpress.com/370/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/zearfoss.wordpress.com/370/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=zearfoss.wordpress.com&amp;blog=20463411&amp;post=370&amp;subd=zearfoss&amp;ref=&amp;feed=1" width="1" height="1" /></p>
]]></content:encoded>
			<wfw:commentRss>http://idevblogaday.com/archives/1423/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Achievement Unlocked: Git Ninja [Mark Granoff]</title>
		<link>http://blog.hawkimedia.com/2012/05/achievement-unlocked-git-ninja/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=achievement-unlocked-git-ninja</link>
		<comments>http://idevblogaday.com/archives/1422#comments</comments>
		<pubDate>Fri, 11 May 2012 04:30:17 +0000</pubDate>
		<dc:creator>Mark Granoff</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://idevblogaday.com/archives/1422</guid>
		<description><![CDATA[The title of this article may be overstating my expertise with git slightly, but that&#8217;s how I feel having successfully tackled what is, I think, a fairly non-trivial task with git: managing changes across multiple branches and multiple remotes using a single working directory. Of course, git is perfectly suited for complexity! But I don&#8217;t &#8230; Continue reading &#8594;]]></description>
			<content:encoded><![CDATA[<p>The title of this article may be overstating my expertise with git slightly, but that&#8217;s how I feel having successfully tackled what is, I think, a fairly non-trivial task with git: managing changes across multiple branches and multiple remotes using a single working directory.<br />
<span></span><br />
Of course, git is perfectly suited for complexity! But I don&#8217;t think people realize it, necessarily.</p>
<p>I am relatively new to git, compared to the number of years I&#8217;ve been using source code control systems. That said, I&#8217;ve been using git now for about 18 months. And I&#8217;ll admit that it has taken some time to really &#8220;get&#8221; it. I find that I am learning new things about it all the time, still.</p>
<p>We all know how easy it is to get started with git:</p>
<pre>
% mkdir myproject
% cd myproject
% git init
% &lt;write fabulous code&gt;
% git add .
% git commit -m &quot;Fabulous code!&quot;
</pre>
<p>Presto! A local repository with all your code and commits and history. Easy peasy.</p>
<p>Getting this to a server requires adding something called a remote, which is simply the address of a server that is prepared to receive your commits. (I will not go into how to setup a git server. I use <a href="https://github.com/sitaramc/gitolite">gitolite</a>, which is easy to setup and easy to manage.)</p>
<pre>
% git remote add origin git@git.myserver.com:myproject.git
</pre>
<p>Now you can push your local repository to this remote, which here has been named &#8220;origin&#8221;, but you could name it anything meaningful to you (as we&#8217;ll see later).</p>
<pre>
% git push origin master
</pre>
<p>The reference to &#8220;master&#8221; here is the name of the branch, on the remote &#8220;origin&#8221;, to which you want your commits pushed.  You could use another name here too (e.g. trunk), but the convention generally is to have a remote named &#8220;origin&#8221; and a main branch named &#8220;master&#8221;.</p>
<p>Ok, great. Everyone knows this stuff, and there are any number of online tutorials about it. What is not necessarily &#8220;out there&#8221; already is how to scale this for yourself.</p>
<p>Did you know you could have any number of remotes defined for a single working directory (local repository)?</p>
<p>I first ran into this when I had changes I wanted to make to a Ruby gem I had found on github. We needed to use this gem in our project, but it also made sense to push the changes back to github on a branch of my own forked copy. So I forked the project, and cloned the repo:</p>
<pre>
% git clone git@github.com:granoff/apnd.git
</pre>
<p>This automatically gave me one remote:</p>
<pre>
% git remote -v
origin	git@github.com:granoff/apnd.git (fetch)
origin	git@github.com:granoff/apnd.git (push)
</pre>
<p>When I had completed my work, and pushed back to github, I also wanted to push the code to our internal gem server. I simply had to add another remote:</p>
<pre>
% git remote add scm git@scm.company.com/apnd.git
</pre>
<p>I named this second remote &#8220;scm&#8221; to distinguish it from &#8220;origin&#8221; (which I knew was github). Then all I had to do was push (again), but this time to &#8220;scm&#8221;:</p>
<pre>
% git push scm master
</pre>
<p>Pretty cool. And, all in one working directory.</p>
<h3>Ninja Challenge</h3>
<p>Now for the fun part. I recently became the primary developer on the Ruby on Rails portion of a project for which I am the primary iOS developer. <img src="http://blog.hawkimedia.com/wp-includes/images/smilies/icon_smile.gif" alt=":-)" class="wp-smiley" />  Luckily, the Rails project is in pretty good shape, and I have not had to wade too deeply into it. At least, until recently. A few issues have popped up and ultimately, I have had to face a challenge I knew was coming. But more on that in a bit.</p>
<p>When I took over the Rails project, I had the then primary developer push his git repo to a new repo I setup on my own server. That repo on my server is my origin for the project. Our Rails app is hosted on Heroku. But instead of just one instance, we have 3: production, beta, and test. Each of those is effectively a copy of our repo, but we only push to these repos when we want to deploy something. But they are all just git repos! That means locally, I can define them as remotes in my working directory!</p>
<pre>
% git remote add prod git@heroku.com:instance-three.git
% git remote add beta git@heroku.com:instance-one.git
% git remote add test git@heroku.com:instance-two.git
% git remote -v
beta	git@heroku.com:instance-one.git (push)
beta	git@heroku.com:instance-one.git (fetch)
origin	git@git.myserver.com:the-project.git (fetch)
origin	git@git.myserver.com:the-project.git (push)
prod	git@heroku.com:instance-two.git (push)
prod	git@heroku.com:instance-two.git (fetch)
test	git@heroku.com:instance-three.git (fetch)
test	git@heroku.com:instance-three.git (push)
</pre>
<p>The first challenge I had was to push what we had on beta, to production. (This also involved a Heroku stack change, which seemed daunting, but in the end was painless. Thanks Heroku!)</p>
<p>Now, I am pretty comfortable at the command line; there are just some things that are done more easily from a shell prompt than by using a GUI. And sometimes, what you want to do cannot be done easily with a GUI simply because the task is non-trivial. That being said, being able to visualize a git repository graphically is priceless. There are at least a couple good tools for this. One is GitX, the source code for which is on github, and has been forked numerous times. The one I had been using, <a href="https://github.com/laullon/gitx">GitX(L)</a>, seems to be the one in active development, and works pretty well. But semi-recently, Atlassian released a free tool, aptly named <a href="http://www.atlassian.com/software/sourcetree/overview">SourceTree</a>, that I have been using. It&#8217;s a little more full-featured than GitX, in my opinion.</p>
<p>Anyway, using a visual tool, I could see prod was tracking prod/master, and beta was tracking beta/master. My local repo was tracking origin/devo (an active development branch), and test was tracking test/master. (On Heroku, it is the master branch from which your app runs. If you had just one Heroku instance, it might make sense to have other branches that you work with locally, and then when it&#8217;s time to deploy, you push master.)</p>
<p>To push what I could see was actually on beta (beta/master) to prod, all I had to do was the following:</p>
<pre>
% git push prod beta:master
</pre>
<p>This command is effectively the same as</p>
<pre>
% git push prod beta/master:prod/master
</pre>
<p>What it is doing is pushing to prod what is locally in beta/master to the remote prod/master. Easy peasy, again!</p>
<p>But, it wasn&#8217;t before I spent a lot of time understanding this, with a colleague in tow, before I actually executed the command!</p>
<p>The point is that with commands like this you can push almost anything to anywhere. Very powerful.</p>
<p>The next challenge I had to face was applying a couple hot fixes, made locally on a development branch, to production.</p>
<p>My workflow included committing my specific fixes on my development branch, and then cherry picking those commits over to my (local) production master branch. For the cherry pick, I used SourceTree&#8217;s UI. Just easier, as that is a fairly common thing to do, and the UI handles it nicely. After testing locally, I pushed it easily:</p>
<pre>
&lt;I had prod checked out at this point&gt;
% git push prod prod:master
</pre>
<p>Specifying prod:master was probably redundant, but I wanted to be specific about what I wanted from git. The command &#8220;git push prod&#8221; would have been sufficient, I think.</p>
<h3>The Lesson</h3>
<p>Git is a tool for both novices and ninjas alike. For the beginner (with git) it is easy to get started, and the basic concepts are fairly easy to grasp. For the experienced, it is extremely powerful, if unleashed.</p>
<p>Unleash your git ninja today.</p>
]]></content:encoded>
			<wfw:commentRss>http://idevblogaday.com/archives/1422/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>UIStoryBoard Power Drill, Batteries Included [Jason Lust]</title>
		<link>http://jleeiii.blogspot.com/2012/05/uistoryboard-power-drill-batteries.html</link>
		<comments>http://idevblogaday.com/archives/1421#comments</comments>
		<pubDate>Thu, 10 May 2012 11:30:52 +0000</pubDate>
		<dc:creator>Jason Lust</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://idevblogaday.com/archives/1421</guid>
		<description><![CDATA[I got a lot of great response and questions about my post with the UIStoryBoard. This means people are interested in using it, and I'm not good with explaining things.I did combo this drill down with a sorta complex core data model and assumed this was setup before handing off objects to each subsequent class. I'm going to nix the core data in favor of a simple input, but we are going to keep music on the table!Lets start here :&#160;UIStoryBoardDrill.zipThis Xcode project will start you out with some plist data that is a nested list of music genre, artist, […]]]></description>
			<content:encoded><![CDATA[<p>I got a lot of great response and questions about my post with the UIStoryBoard. This means people are interested in using it, and I&#8217;m not good with explaining things.</p>
<p>I did combo this drill down with a sorta complex core data model and assumed this was setup before handing off objects to each subsequent class. I&#8217;m going to nix the core data in favor of a simple input, but we are going to keep music on the table!</p>
<p>Lets start here :&nbsp;<a href="http://www.stellaronline.com/downloads/UIStoryBoardDrill.zip">UIStoryBoardDrill.zip</a></p>
<p>This Xcode project will start you out with some plist data that is a nested list of music genre, artist, album, song. At the same time not to complicate the ViewControllers on how it handles these different tiers the data is only nested as a &#8220;NSString name&#8221; , &#8220;NSArray items&#8221; pair.&nbsp;This way we constrain straight on the loopback of the table segue.</p>
<div><a href="http://1.bp.blogspot.com/-fs2tcAraPZI/T6umlrigIDI/AAAAAAAAAZQ/TaCOF_tYJSA/s1600/Screen+Shot+2012-05-10+at+4.00.55+AM.png"><img border="0" height="176" src="http://1.bp.blogspot.com/-fs2tcAraPZI/T6umlrigIDI/AAAAAAAAAZQ/TaCOF_tYJSA/s320/Screen+Shot+2012-05-10+at+4.00.55+AM.png" width="320" /></a></div>
<p>First take a look at the &#8220;Auto&#8221; side of this app, this table view controller uses the cells prototype push outlet to auto loopback to the controller again. Because this dose not utilize the didSelectRowAtIndexPath: (or to be clear) this does call but, performs the segue regardless. This practice will make use of the sender value&nbsp;in the prepareForSegue: to identify which cell was clicked on. Realize we are not making a decision where to go next, thats already happening via the segue, we are only deciding what to take with us. We send some values to the next view controller that is another instance of this current one, but is not this exact one. And the view controller is then stacked in the navcontroller and is now only aware of the sub-array we handed down to it.<br />This auto drilling can be a little limited because of the way we always drill into the same view controller class type. But! if you want to explore here, I suggest you make another cell prototype with a different identifier and a different segue outlet, and use it at your desired tier.</p>
<div><a href="http://1.bp.blogspot.com/-pYUwvWqa1YU/T6umrURBkHI/AAAAAAAAAZY/Y4Nszcs72PY/s1600/Screen+Shot+2012-05-10+at+4.17.44+AM.png"><img border="0" height="129" src="http://1.bp.blogspot.com/-pYUwvWqa1YU/T6umrURBkHI/AAAAAAAAAZY/Y4Nszcs72PY/s320/Screen+Shot+2012-05-10+at+4.17.44+AM.png" width="320" /></a></div>
<p>The &#8220;Manual&#8221; side takes on calling segues from code and needs the fake UIBarButtonItem to create the loopback segue. This little trick will let you define segue identifiers and then let you decide with directing to take with the call to performSegueWithIdentifier: The other important thing is to know what object you want to send along here as the sender. The cell is no longer the sender that is triggering the segue, didSelectRowAtIndexPath is and we could likewise send the UITableViewCell or filter it down to the object we are after. This is the place I test for the data nesting and&nbsp;chose to end the drill down. Calling the different segue will push over to the details view, but the stack of drills downs is still managed by the navcontroller.</p>
<p>Good luck and happy storyboarding.
<div><img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/7468092757963724166-8838146567571212635?l=jleeiii.blogspot.com" alt="" /></div>
]]></content:encoded>
			<wfw:commentRss>http://idevblogaday.com/archives/1421/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Making a cross-platform game in two weeks [Toni Sala]</title>
		<link>http://indiedevstories.com/2012/05/09/making-a-cross-platform-game-in-two-weeks/</link>
		<comments>http://idevblogaday.com/archives/1420#comments</comments>
		<pubDate>Wed, 09 May 2012 10:23:10 +0000</pubDate>
		<dc:creator>Toni Sala</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://idevblogaday.com/archives/1420</guid>
		<description><![CDATA[In today&#8217;s post I would like to share with you my experience working on my first cross-platform game. Although it is intended to be available for Windows Phone, iOS and Android, currently I&#8217;m focused on the Windows Phone version. The game is &#8230; Continue reading &#8594;]]></description>
			<content:encoded><![CDATA[<p>In today&#8217;s post I would like to share with you my experience working on my first <strong>cross-platform game</strong>. Although it is intended to be available for <strong>Windows Phone</strong>, <strong>iOS</strong> and <strong>Android</strong>, currently I&#8217;m focused on the Windows Phone version.</p>
<p>The game is called <strong>Muster my Monsters</strong> (MmM). It is a<strong> two-player fighting monsters action game.</strong> It is a casual game, so game mechanics need to be simple and art appealing to most of people. Here you have a gameplay video.</p>
<p><span><a href="http://indiedevstories.com/2012/05/09/making-a-cross-platform-game-in-two-weeks/"><img src="http://img.youtube.com/vi/Z1A272SwF7I/2.jpg" alt="" /></a></span></p>
<p><span></span></p>
<h1>Problem statement</h1>
<p>The problem statement for MmM has some unusual restrictions due to unusual circumstances. First, I wanted to submit it to the <a title="CELL APP Awards" href="http://www.cellsdk.com/index.php/en/community/cellappawards" target="_blank">first CELL APP Awards</a>. As you can see at the official website, the deadline has been extended, but the original deadline was April 30. By the way, you can help Muster my Monsters win the contest by voting for it <a title="Vote for MmM" href="http://www.cellsdk.com/index.php/en/community/cellappawards/vote-now/item/mustermymonster" target="_blank">here</a> <img src="http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif" alt=":D" class="wp-smiley" /> </p>
<p>I also needed a game that could start simple enough to be ready in two weeks but with potential to grow naturally, in case I want to keep working on it after the contest.</p>
<p>So, the problem statement is:</p>
<blockquote><p>I need to design and develop a cross-platform game using CELL·SDK in two weeks. It needs to be simple but with potential to grow and appealing for casual audience. No level design involved.</p>
</blockquote>
<p>Why CELL·SDK? Well, because it is mandatory to participate to the contest <img src="http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" />  But also because it is a promising cross-platform development tool. In <a title="The mobile cross-platform development headache" href="http://indiedevstories.com/2012/03/14/the-mobile-cross-platform-development-headache/" target="_blank">this post</a> you have more details about my reasoning around cross-platform development on mobile devices.</p>
<p>Why only two weeks? Well, due to some personal and technical problems, I started to work on this game only two weeks before the contest&#8217;s deadline. That&#8217;s why I needed a simple game without level design involved. <a title="Game content creation – New Sokoban puzzles" href="http://indiedevstories.com/2011/03/26/game-content-creation-new-sokoban-puzzles/" target="_blank">Level design and balance</a> is very time consuming.</p>
<h1>Game Design</h1>
<p>The core gameplay of Muster my Monsters is rock-paper-scissors. Yes, it is essentially a rock-paper-scissors game with a nice dress <img src="http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" />  However, upon this extremely simple game mechanic you can build up a very solid video-game.</p>
<p>The available actions in Muster my Monsters are: Attack, Dodge and Mock.</p>
<ul>
<li>Attack wins Mock</li>
<li>Mock wins Dodge</li>
<li>Dodge wins Attack</li>
</ul>
<p>The current version of Muster my Monsters has two game modes:</p>
<ul>
<li><strong>Single Player</strong>. You play against the COM. Currently it is like a slot machine game because the COM selects the action randomly.</li>
<li><strong>Two Players</strong>. This is the fun part <img src="http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" />  Here I take advantage of the intrinsic gameplay richness of rock-paper-scissors. I have put my main effort on calibrating correctly the timings and phases of every round and match of the game to make the players feel the rock-paper-scissors tension.</li>
</ul>
<p>But MmM is also a fighting game, so I can naturally add game modes such as: tournament, arcade, survival, time attack&#8230;</p>
<p>MmM is also about monsters. Do you like collecting monsters? <img src="http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif" alt=":D" class="wp-smiley" />  Both casual and hardcore players love to collect things. But collecting monsters is the best! Moreover, this is an interesting feature for monetization.</p>
<p>Maybe I could break a little bit the rock-paper-scissors balance. What about a very strong monster that gets some advantage after winning a throw using the Attack action? Would that player use Attack at first round? Or would avoid it because it&#8217;s too obvious? Nice dilemma :)</p>
<p>So, as you can see, this little game may easily grow up.</p>
<h1>CELL·SDK</h1>
<p><a title="CELL·SDK" href="http://www.cellsdk.com" target="_blank">CELL·SDK</a> is a promising cross-platform development tool that supports iOS, Android and Windows Phone with the same code base. They are still working on it, but it already offers some very interesting features such as a modern physics engine, support for sprite based animations, key-frame based animations, integration of various advertising platforms, analytics&#8230;</p>
<p>The main drawback is the cost. CELL·SDK is built upon <a title="MonoTouch" href="http://xamarin.com/monotouch" target="_blank">MonoTouch</a> and <a title="Mono for Android" href="http://xamarin.com/monoforandroid" target="_blank">Mono for Android</a>, so you will need the corresponding licenses to publish games and apps for iOS and Android, apart from the CELL·SDK license.</p>
<h1>Art</h1>
<p>For all the art of Muster my Monsters I talked with <a title="Javi Sanz Twitter" href="https://twitter.com/#!/haviedr" target="_blank">Javi Sanz</a>, from <a title="Ravalmatic official webpage" href="http://www.ravalmatic.com/" target="_blank">Ravalmatic</a>. Menu screens, game HUD, character design, sprite animations, background&#8230; Everything.</p>
<p>It is amazing how he could manage to do everything taking into account that I first talked to him about the game two weeks before the deadline. Great work Javi!! Thanks!! <img src="http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif" alt=":D" class="wp-smiley" /> </p>
<h1>Music &amp; SFX</h1>
<p>The music and, specially, the SFX are very important for this game. The background music builds tension and the SFX help the player to understand the action and being aware of the current game state.</p>
<p>It is important that the payer can easily know how many rounds has win/loose so far and the number of matches played so far. But the most important thing is that the player could internalize the timings and phases of the game, as well as the history of actions delivered both by himself and the opponent. And for achieving this, the SFX are as important as the visuals. The sequences of sounds are easily retained unconsciously by players.</p>
<h1>Conclusion</h1>
<p>The most important conclusion I get from this stressful experience is that it is possible to create a playable and fun game within two weeks. It still needs some polish, but the main part is already developed.</p>
<p>It also has allowed me to introduce myself to the Windows Phone platform. Microsoft technologies are really great: C#, XNA, Silverlight, etc. All of them are modern and robust tools that make your life easier as a developer. In the future I will see if it happens to be the same with the Marketplace and the publication and distribution phase.</p>
<p>So, let me remember you again that you can help Muster my Monsters win the first CELL APP Awards voting for it <a title="Vote for Muster my Monsters - CELL APP Awards" href="http://www.cellsdk.com/index.php/en/community/cellappawards/vote-now/item/mustermymonster" target="_blank">here</a>. Wish me luck! Thanks! <img src="http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif" alt=":D" class="wp-smiley" /> </p>
<p><em>This post is part of <a href="http://idevblogaday.com/">iDevBlogADay</a>, a group of indie iOS development blogs. You can keep up with iDevBlogADay through the <a href="http://idevblogaday.com/">web site</a>, <a href="http://feeds.feedburner.com/idevblogaday">RSS feed</a>, or <a href="http://twitter.com/#search?q=%23idevblogaday">Twitter</a>.</em></p>
<p>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/indiedevstories.wordpress.com/1073/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/indiedevstories.wordpress.com/1073/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/indiedevstories.wordpress.com/1073/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/indiedevstories.wordpress.com/1073/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/indiedevstories.wordpress.com/1073/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/indiedevstories.wordpress.com/1073/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/indiedevstories.wordpress.com/1073/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/indiedevstories.wordpress.com/1073/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/indiedevstories.wordpress.com/1073/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/indiedevstories.wordpress.com/1073/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/indiedevstories.wordpress.com/1073/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/indiedevstories.wordpress.com/1073/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/indiedevstories.wordpress.com/1073/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/indiedevstories.wordpress.com/1073/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=indiedevstories.com&amp;blog=19540693&amp;post=1073&amp;subd=indiedevstories&amp;ref=&amp;feed=1" width="1" height="1" /></p>
]]></content:encoded>
			<wfw:commentRss>http://idevblogaday.com/archives/1420/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

