<?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>Craftymind &#187; Cocoa</title>
	<atom:link href="http://www.craftymind.com/category/cocoa/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.craftymind.com</link>
	<description>Hacking away at UI development</description>
	<lastBuildDate>Mon, 13 Jun 2011 16:59:14 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Launching Space Gremlin to the Mac App store</title>
		<link>http://www.craftymind.com/2011/02/07/launching-space-gremlin-to-the-mac-app-store/</link>
		<comments>http://www.craftymind.com/2011/02/07/launching-space-gremlin-to-the-mac-app-store/#comments</comments>
		<pubDate>Mon, 07 Feb 2011 15:04:10 +0000</pubDate>
		<dc:creator>Sean Christmann</dc:creator>
				<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[apps]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[osx]]></category>

		<guid isPermaLink="false">http://www.craftymind.com/?p=215</guid>
		<description><![CDATA[Lately I&#8217;ve been on a kick&#8230;instead of wishing for software to work the way I want, I&#8217;m just gonna build it the way I want instead.
Today one of those ideas has come to fruition and I&#8217;m happy to announce it&#8217;s launch in the new Mac App Store. Space Gremlin is an app I wrote over [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;">Lately I&#8217;ve been on a kick&#8230;instead of wishing for software to work the way I want, I&#8217;m just gonna build it the way I want instead.</p>
<p style="text-align: left;">Today one of those ideas has come to fruition and I&#8217;m happy to announce it&#8217;s launch in the new Mac App Store. <a title="Space Gremlin" href="http://www.spacegremlinapp.com">Space Gremlin</a> is an app I wrote over the course of Christmas to visualize disk usage on a hard drive to help find and delete &#8220;gremlins&#8221; taking up too much space. It features a top down view of a disks folder structure and the relational sizes between other objects. It&#8217;s easy to drill in to folders or slice up the view to focus on important areas. While there are other apps out there on the Mac platform that address this concept, I&#8217;ve never found those other visualizations very usable or readable.</p>
<p style="text-align: center;"><img title="Space Gremlin Sample" src="http://www.spacegremlinapp.com/intro.png" alt="" width="578" height="433" /></p>
<p>I&#8217;m hoping other people out there find Space Gremlin as usable as I do, so I&#8217;ve added it to the new Mac App Store to handle the distribution end. Since this is the launch and I&#8217;m still new to the whole Mac App ecosystem, I&#8217;m setting a launch price of only $3.99 but it will probably settle at a higher price soon after. I&#8217;ve also decided to go exclusive to the Mac App Store to avoid setting up my own purchasing and validation system.</p>
<p>Give it a try and let me know what you think. Big thanks to all the fellow developers and designers at <a href="http://www.effectiveui.com">EffectiveUI </a>who helped me test this app. If you&#8217;re interested there is also a free demo available on the website <a href="http://www.spacegremlinapp.com">http://www.spacegremlinapp.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.craftymind.com/2011/02/07/launching-space-gremlin-to-the-mac-app-store/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Mac app store hacked, how developers can better protect themselves</title>
		<link>http://www.craftymind.com/2011/01/06/mac-app-store-hacked-how-developers-can-better-protect-themselves/</link>
		<comments>http://www.craftymind.com/2011/01/06/mac-app-store-hacked-how-developers-can-better-protect-themselves/#comments</comments>
		<pubDate>Fri, 07 Jan 2011 01:13:34 +0000</pubDate>
		<dc:creator>Sean Christmann</dc:creator>
				<category><![CDATA[Cocoa]]></category>

		<guid isPermaLink="false">http://www.craftymind.com/?p=203</guid>
		<description><![CDATA[Crude instructions have started showing up online with ways to circumvent Apples Mac App store receipt validation. By simply copying receipt and info.plist data from a free app and pasting it into a paid app, you can run apps copied from friends computers or bittorrent. I myself have a copy of a paid app (not [...]]]></description>
			<content:encoded><![CDATA[<p>Crude instructions have started showing up online with ways to circumvent Apples Mac App store receipt validation. By simply copying receipt and info.plist data from a free app and pasting it into a paid app, you can run apps copied from friends computers or bittorrent. I myself have a copy of a paid app (not angry birds, but one with stronger protection) running on my system that was purchased by a friend. This is a massive failure in the implementation of Apples receipt system.</p>
<p>So why are all of the app store developers in this position? Apples current documentation on how to validate receipts is fairly complex, but the sample code and Apple own instructions ask developers to validate against data that is entirely external to the binary itself. Worse yet, it instructs developers to validate against plain text data easily editable with any text editor.</p>
<p>If you are an app store developer and you are using apples default security logic, you need to review these validation steps in your code</p>
<ul>
<li>Verify that the receipt bundle identifier matches the value for CFBundleIdentifier in the Info.plist file. If they do not match, verification fails.</li>
<li>Verify that the version identifier string in the receipt matches the value for CFBundleShortVersionString in the Info.plist file. If they do not match, verification fails.</li>
</ul>
<p>And change them to be more in line with this</p>
<ul>
<li>Verify that the receipt bundle identifier matches the value for  CFBundleIdentifier that you <strong>hard code</strong> into your application.</li>
<li>Verify that the version identifier string in the receipt matches  the value for CFBundleShortVersionString <strong>hard coded</strong> into your application. If they  do not match, verification fails.</li>
</ul>
<p>At the end of the day, if your app is popular enough it&#8217;s going to end up on a pirated site, but for the time being, by following the instructions above, you can avoid having your app easily cracked with TextEdit. For those interested, Angry Birds only implemented 2 of Apples suggested validation steps, so the pastebin instructions will only work for Angry Birds, you need to do a little bit more for apps that handle all 5 validation steps.</p>
<p>Update, if you are using <a href="https://github.com/roddi/ValidateStoreReceipt/blob/master/validatereceipt.m">roddi&#8217;s receipt checking code</a> from github, here are the offending lines you need to change.</p>
<pre>BOOL validateReceiptAtPath(NSString * path)
{
	...
	bundleVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"];
	bundleIdentifer = [[NSBundle mainBundle] bundleIdentifier];
	...
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.craftymind.com/2011/01/06/mac-app-store-hacked-how-developers-can-better-protect-themselves/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>PNG compression on iPhone/iPad</title>
		<link>http://www.craftymind.com/2010/09/01/png-compression-on-iphoneipad/</link>
		<comments>http://www.craftymind.com/2010/09/01/png-compression-on-iphoneipad/#comments</comments>
		<pubDate>Wed, 01 Sep 2010 23:59:17 +0000</pubDate>
		<dc:creator>Sean Christmann</dc:creator>
				<category><![CDATA[Cocoa]]></category>

		<guid isPermaLink="false">http://www.craftymind.com/?p=195</guid>
		<description><![CDATA[I was having a discussion with a coworker about png compression for the iphone and wanted to resolve the issue of whether we should bundle Fireworks source assets in xcode for quick editing and recompiling, or if we should export compressed versions to use for the bundling phase. I know the iPhone does it&#8217;s own [...]]]></description>
			<content:encoded><![CDATA[<p>I was having a discussion with a coworker about png compression for the iphone and wanted to resolve the issue of whether we should bundle Fireworks source assets in xcode for quick editing and recompiling, or if we should export compressed versions to use for the bundling phase. I know the<a href="http://discussions.apple.com/thread.jspa?threadID=1751896&amp;tstart=1"> iPhone does it&#8217;s own compression and byte reordering on pngs</a>, but I wasn&#8217;t sure how much compression was done, so here&#8217;s the answer.</p>
<p>I made a relatively complex png file for testing, the source file is a 230 kb Fireworks file, which is pretty close to some of the assets we have in our projects. A quick 24bit png export from fireworks produces a 6 kb png file with no visual fidelity loss. When the project is compiled to the device, the source image is compressed by xcode down to 19 kb, while the exported version actually increases in size to 7 kb. So far this supports the theory that manual compression can be up to 3 times better then letting xcode handle it for you.</p>
<p style="text-align: center;">Original Files in Xcode Project</p>
<p style="text-align: center;"><a href="http://www.craftymind.com/wp-content/uploads/2010/09/Screen-shot-2010-09-01-at-5.49.02-PM.png"><img class="aligncenter size-medium wp-image-196" title="Screen shot 2010-09-01 at 5.49.02 PM" src="http://www.craftymind.com/wp-content/uploads/2010/09/Screen-shot-2010-09-01-at-5.49.02-PM-288x300.png" alt="" width="288" height="300" /></a></p>
<p style="text-align: center;">Files compressed for iOS device build.</p>
<p style="text-align: center;"><a href="http://www.craftymind.com/wp-content/uploads/2010/09/Screen-shot-2010-09-01-at-5.50.03-PM.png"><img class="aligncenter size-medium wp-image-197" title="Screen shot 2010-09-01 at 5.50.03 PM" src="http://www.craftymind.com/wp-content/uploads/2010/09/Screen-shot-2010-09-01-at-5.50.03-PM-300x189.png" alt="" width="300" height="189" /></a></p>
<p>Additionally it seems that I suffered no visual loss by letting xcode recompress these png files, and decompression times for both pngs on the device took roughly 20 milliseconds each.</p>
<p>Honestly I think you could read these results either way, lazy developers may choose to just use source files in xcode and suffer a 3x penalty on images compression, for those that like to control the compression exactly on their files, you&#8217;ll be better off.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.craftymind.com/2010/09/01/png-compression-on-iphoneipad/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>360iDev session materials on Quartz 2D</title>
		<link>http://www.craftymind.com/2009/03/04/360idev-session-materials-on-quartz-2d/</link>
		<comments>http://www.craftymind.com/2009/03/04/360idev-session-materials-on-quartz-2d/#comments</comments>
		<pubDate>Wed, 04 Mar 2009 16:51:45 +0000</pubDate>
		<dc:creator>Sean Christmann</dc:creator>
				<category><![CDATA[Cocoa]]></category>

		<guid isPermaLink="false">http://www.craftymind.com/2009/03/04/360idev-session-materials-on-quartz-2d/</guid>
		<description><![CDATA[360iDev San Jose has been awesome so far and it&#8217;s not over yet, still a whole day of sessions to go. I&#8217;m putting my session materials up now during the keynote so I don&#8217;t forget after I&#8217;ve presented. Get the zip file here.
Update: I forgot to mention during my presentation, but the samples within the [...]]]></description>
			<content:encoded><![CDATA[<p>360iDev San Jose has been awesome so far and it&#8217;s not over yet, still a whole day of sessions to go. I&#8217;m putting my session materials up now during the keynote so I don&#8217;t forget after I&#8217;ve presented. Get the zip file <a href="http://www.craftymind.com/wp-content/uploads/2009/360iDev%20session%20materials.zip" title="360 iDev session materials">here</a>.</p>
<p>Update: I forgot to mention during my presentation, but the samples within the zip archive may contain memory leaks for the sake of code brevity. If you copy and paste the code samples into your own projects, you might need to make sure you add cleanup code to the end of it.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.craftymind.com/2009/03/04/360idev-session-materials-on-quartz-2d/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Creating the &#8216;loupe&#8217; or magnifying glass effect on the iphone.</title>
		<link>http://www.craftymind.com/2009/02/10/creating-the-loupe-or-magnifying-glass-effect-on-the-iphone/</link>
		<comments>http://www.craftymind.com/2009/02/10/creating-the-loupe-or-magnifying-glass-effect-on-the-iphone/#comments</comments>
		<pubDate>Tue, 10 Feb 2009 18:06:57 +0000</pubDate>
		<dc:creator>Sean Christmann</dc:creator>
				<category><![CDATA[Cocoa]]></category>

		<guid isPermaLink="false">http://www.craftymind.com/2009/02/10/creating-the-loupe-or-magnifying-glass-effect-on-the-iphone/</guid>
		<description><![CDATA[One of my recent projects tasked me with figuring out how to recreate the magnifying glass effect that Apple uses inside textfields on the iPhone, but in a more generic way so anything on the screen could be magnified. Getting this effect is pretty simple in any visual framework once you figure out how masking [...]]]></description>
			<content:encoded><![CDATA[<p>One of my recent projects tasked me with figuring out how to recreate the magnifying glass effect that Apple uses inside textfields on the iPhone, but in a more generic way so anything on the screen could be magnified. Getting this effect is pretty simple in any visual framework once you figure out how masking works and which api will let you draw a bitmap of a given graphics layer. While the logic was simple enough, finding the right combination of apis was the painful part but I finally figured it out and wanted to share the code with everyone else trying to accomplish this task.</p>
<p>First up an example of what we&#8217;re able to accomplish with this effect.</p>
<p style="text-align: center"><img src="http://www.craftymind.com/wp-content/uploads/2009/02/loupeexample.png" alt="Magnifying effect on iPhone" /></p>
<p>You can magnify any UIView as well as the children of that view, images, text and 2d vectors are captured and magnified appropriately. There are couple critical pieces of this code to pay attention to.</p>
<p>First up, when a touch has been recorded long enough to kick off the magnifier effect, we create a new magnifier view that is the exact size of the view we want to magnify. This is important due to the way we&#8217;re going to be copying a bitmap of the original view. Once we know the view exists we call setNeedsDisplay on it which triggers drawRect inside of it.</p>
<pre>if(loop == nil){
	loop = [[MagnifierView alloc] initWithFrame:self.bounds];
	loop.viewref = self;
	[self addSubview:loop];
}
UITouch *touch = [touches anyObject];
loop.touchPoint = [touch locationInView:self];
[loop setNeedsDisplay];</pre>
<p>Next, when drawRect gets called inside the magnifier view we want to make a copy of the original view first. The reason the magnifier view is teh same size as the original view is because we are rendering the full context of the original view into our new context before grabbing a bitmap of it. If the magnifying view were smaller, the rendered bitmap would also be smaller. We want to cache the final bitmap so we&#8217;re not redrawing the original view every time the user moves their finger around the view. We&#8217;ll destroy that cached view and the magnifying glass when the user lets up off the screen.</p>
<pre>- (void)drawRect:(CGRect)rect {
	if(cachedImage == nil){
		UIGraphicsBeginImageContext(self.bounds.size);
		[self.viewref.layer renderInContext:UIGraphicsGetCurrentContext()];
		cachedImage = [UIGraphicsGetImageFromCurrentImageContext() retain];
		UIGraphicsEndImageContext();
	}</pre>
<p>Following that we need to generate a masked view for the magnified view to sit in, since the loop is a circle we have to mask out the corners and antialias the outer perimeter. This is accomplished using 2 images, the magnifying glass itself and a mask image with appropriate grayscale levels for masking.</p>
<pre>CGImageRef imageRef = [cachedImage CGImage];
CGImageRef maskRef = [[UIImage imageNamed:@"loopmask.png"] CGImage];
CGImageRef overlay = [[UIImage imageNamed:@"loop.png"] CGImage];
CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
					CGImageGetHeight(maskRef),
					CGImageGetBitsPerComponent(maskRef),
					CGImageGetBitsPerPixel(maskRef),
                                        CGImageGetBytesPerRow(maskRef),
					CGImageGetDataProvider(maskRef),
					NULL,
					true);
//Create Mask
CGImageRef subImage = CGImageCreateWithImageInRect(imageRef, CGRectMake(touchPoint.x-18, touchPoint.y-18, 36, 36));
CGImageRef xMaskedImage = CGImageCreateWithMask(subImage, mask);</pre>
<p>Lastly, we&#8217;ll draw the magnifying glass and magnfied bitmap copy of our orginal view underneath the mask and we&#8217;re done. Since the iPhone uses a different coordinate system then other languages, we have to remember to flip the view upside down before drawing it.</p>
<pre>CGContextRef context = UIGraphicsGetCurrentContext();
CGAffineTransform xform = CGAffineTransformMake(
					1.0,  0.0,
					0.0, -1.0,
					0.0,  0.0);
CGContextConcatCTM(context, xform);
CGRect area = CGRectMake(touchPoint.x-42, -touchPoint.y, 85, 85);
CGRect area2 = CGRectMake(touchPoint.x-40, -touchPoint.y+2, 80, 80);
CGContextDrawImage(context, area2, xMaskedImage);
CGContextDrawImage(context, area, overlay);</pre>
<p>And that&#8217;s it, now we have a modular magnifying glass that can plug in to any UIView with minimal effort. If you&#8217;re looking for a way to add interactivity underneath the magnifying glass, like moving the cursor within a textfield, that&#8217;s gonna require a bit more custom code on the control you&#8217;re dealing with, and this example doesn&#8217;t really address that.</p>
<p>Download example: <a href="http://www.craftymind.com/wp-content/uploads/2009/02/masktest.zip" title="XCode magnifier example for iPhone">XCode magnifier example for iPhone</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.craftymind.com/2009/02/10/creating-the-loupe-or-magnifying-glass-effect-on-the-iphone/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>From AS3 to Objective-C: Flex vs iPhone development</title>
		<link>http://www.craftymind.com/2008/04/30/from-as3-to-objective-c-flex-vs-iphone-development/</link>
		<comments>http://www.craftymind.com/2008/04/30/from-as3-to-objective-c-flex-vs-iphone-development/#comments</comments>
		<pubDate>Wed, 30 Apr 2008 16:44:54 +0000</pubDate>
		<dc:creator>Sean Christmann</dc:creator>
				<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false">http://www.craftymind.com/2008/04/30/from-as3-to-objective-c-flex-vs-iphone-development/</guid>
		<description><![CDATA[Recently I&#8217;ve been given the opportunity to work full time on commercial iPhone development at EffectiveUI. The most intriguing thing about the platform for me is having access to non traditional user input mechanisms. When I was playing around with Wii remote integration on the desktop, the potential was exciting, but the ubiquity was limiting. [...]]]></description>
			<content:encoded><![CDATA[<p>Recently I&#8217;ve been given the opportunity to work full time on commercial iPhone development at <a href="http://effectiveui.com">EffectiveUI</a>. The most intriguing thing about the platform for me is having access to non traditional user input mechanisms. When I was playing around with Wii remote integration on the desktop, the potential was exciting, but the ubiquity was limiting. In the same way that pc game companies develop for the keyboard and mouse first and then provide hooks for joysticks after the fact, I knew that serious Wii remote integration in a desktop app was limited. Knowing that I can write software for the iPhone that always has access to multitouch and accelerometer data from the outset really allows for unique gestures as a first class citizen within an app.</p>
<p>After working with some code and spending time with the SDK itself, I couldn&#8217;t help but naturally compare UI development on the iPhone with GUI frameworks like Flex or Swing, heres the things that stand out so far.</p>
<ol>
<li>I&#8217;m really spoiled by higher level languages. A good high level language like ECMAScript, Ruby, or Java rides the fine line of &#8220;Making things as simple as possible, but no simpler&#8221;. I&#8217;ve never felt constrained by the language features in these technologies, only by the apis exposed. Stepping *back* into Objective-C certainly provides more power and flexibility in the language, but there&#8217;s a loss in productivity for me that I just can&#8217;t shake. Some of this loss comes from Objective-C&#8217;s design itself, and some of it just comes from XCodes introspection ability. For instance, I&#8217;m not sure if I&#8217;ll ever get to the point where I can read these lines of Objective-C as effeciently as their ActionScript counterparts would probably look.
<pre>NSString *aString = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"];
UIView *contentView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];</pre>
</li>
<li>Closed source UI frameworks suck. Most of what I learned about custom UI development in Flex I learned by inspecting the source code for the bundled controls. Ripping open Containers to see how layout rules are determined, or Lists to see how delegates are passed around, or the Image control to see how different display types are handled provides invaluable gems about implementing Flash apis. It has also helped me optimize the interactions of an app knowing the intentions of the developer who created the UI controls. With the iPhone SDK, you&#8217;re given documentation for the visual components, but no source to help determine how they work.</li>
<li>Core graphics and animation is really strong. Between Quartz and the OpenGL layer there&#8217;s alot of potential for getting easy access to some of the more complex visual hacks. Although I think 3D user interfaces are prone to usability issues, the iPhone is a much better device to explore them on then a standard keyboard and mouse interface.</li>
<li>Data binding, event listeners, and mxml. The Flash Player and Flex model provide features on top of the ActionScript language that arguably optimize UI needs and keep development more declarative. Cocoa development could really benefit from a &#8216;gui compiler&#8217; that takes Objective-C to a higher level and bakes in features that support common ui design patterns.</li>
<li>Garbage Collection. Objective-C 2.0 provides a unique system that lets you create objects that will be automatically garbage collected, or you can continue to manually manage object allocation/deallocation yourself. The concept sounds cool, but I can imagine allowing both systems to be mixed within the same project is just begging for trouble.</li>
</ol>
<p>So far I think that Objective-C has alot of power and some really awesome features that outclass GUI features in Flash, but compared to Flex development as a whole, I&#8217;d have to say that XCode and the included visual frameworks are not as sophisticated.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.craftymind.com/2008/04/30/from-as3-to-objective-c-flex-vs-iphone-development/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
	</channel>
</rss>

