<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0' version='2.0'><channel><atom:id>tag:blogger.com,1999:blog-1581168319252833615</atom:id><lastBuildDate>Sun, 08 Apr 2012 13:41:03 +0000</lastBuildDate><category>cocoa</category><category>10.4</category><title>Matthew Tonkin - Cocoa Engineer</title><description>Cocoa / Objective-C, it’s exciting stuff. If...you know...that’s what float’s your boat. If it floats yours (or you think it might) then read on.</description><link>http://www.matthewtonkin.com/</link><managingEditor>noreply@blogger.com (Matthew Tonkin)</managingEditor><generator>Blogger</generator><openSearch:totalResults>23</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-1581168319252833615.post-5691528950499693842</guid><pubDate>Tue, 12 Jul 2011 12:57:00 +0000</pubDate><atom:updated>2011-07-12T06:03:27.453-07:00</atom:updated><title>Mobile Engineering Quality</title><description>Android vs iOS. &amp;nbsp;Plenty of debates about this topic and plenty of opinions. &amp;nbsp;So here's mine...&lt;br /&gt;&lt;br /&gt;I can't help but consider which platform has the most solid engineering. &amp;nbsp;Which platform is more refined for its purpose. &amp;nbsp;Good engineering is evident in attention to detail. &amp;nbsp;The virtues of consistently exceptional engineering are very difficult to instill and maintain in an organisation.&lt;br /&gt;&lt;br /&gt;I've been to WWDC (many times) and to Google I/O (&lt;a href="http://www.matthewtonkin.com/2010/06/yours-truly-speaking-at-google-io-2010.html"&gt;even spoke there&lt;/a&gt;) and my firm impression is that from an engineering perspective iOS is&amp;nbsp;&lt;i&gt;far&lt;/i&gt; more refined. &amp;nbsp;I've had conversations with very smart engineers in both camps. &amp;nbsp;I've attended and watched more WWDC and Google I/O video sessions than anyone should. &amp;nbsp;There are loads of small points I've picked up from these discussions and sessions that make iOS the platform I have the most faith in - the one I believe is better engineered. &amp;nbsp;I'm going to call out 2 of them...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1 - Battery life:&lt;/b&gt; It's like everyone at Apple who has ever written code for iOS has been brutally beaten with a "must preserve battery life" stick several times a day until they understood. &amp;nbsp;It's almost impossible to have a conversation with an Apple engineer without them bringing up battery performance as a reason for some design decision or coding practice in iOS. &amp;nbsp;It's like a nervous tick, but executed with confidence.&lt;br /&gt;&lt;br /&gt;I recall speaking to Apple engineers at WWDC in 2008 who went into some considerable detail on how managing retain / release / autorelease for objects could have a positive effect on battery life. &amp;nbsp;I recall the first WWDC session on how to use the accelerometer and the comparison of starting / stopping the accelerometer hardware compared to short and long term use. &amp;nbsp;I recall sessions on why you shouldn't override drawRect: in a UIView subclass because it had some nominal yet demonstrable drain on battery.&lt;br /&gt;&lt;br /&gt;It's really hard to instill this kind of attention to detail across an organisation - to get everyone thinking about the stuff that matters. &amp;nbsp;Battery life matters. &amp;nbsp;Android battery life sucks. &amp;nbsp;Apple engineering has an incredible attention to detail that makes things like battery life not suck. &amp;nbsp;Battery life is just an example of one area where Apple's superior engineering practices are evident to everyday users. &amp;nbsp;It's really easy to screw up, it's really easy to cut corners and make devices that &lt;a href="http://www.phonedog.com/2011/07/11/why-i-switched-from-my-thunderbolt-to-an-iphone-4/"&gt;only last 19 hours on the best day you've ever had&lt;/a&gt;. &amp;nbsp;Apple engineers don't screw up battery life and they work hard to make sure 3rd party engineers don't either.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2 - IDE:&lt;/b&gt;&amp;nbsp;Xcode wins.&lt;br /&gt;&lt;br /&gt;It's rare to be able to make such a forthright statement without need for justification, but I doubt anyone's going to argue. &amp;nbsp;Xcode wins. &amp;nbsp;From a third party developer perspective the richness of the system API's are pretty important, but it's not just what's in the technology stack and what API's one has available to them - it's how easily one can makes software that utilize them. &amp;nbsp;Xcode makes it easy to create software for iOS. &amp;nbsp;Documentation, static analysis, provisioning, instruments, etc. &amp;nbsp;Xcode wins. &amp;nbsp;It takes engineering discipline to make a product that rocks as well as Xcode.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Android and iOS both appear to be in "adding features mode". &amp;nbsp;There's a big difference between adding features and adding features well. &amp;nbsp;Adding features well requires an attention to detail for things like error handling, network latency and dealing with corner cases that few people ever considered.&lt;br /&gt;&lt;br /&gt;In my experience engineering quality is consistent across an organization (at least at the macro level). &amp;nbsp;It's rare to have a group of engineers turning out exceptional quality in the same organization as a group of engineers turning out crap. &amp;nbsp;They are mutually opposing forces and one will destroy the other. &amp;nbsp;So when I find a couple of areas where iOS has been engineered so well, I have considerable faith that all areas are developed almost as well or even better.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1581168319252833615-5691528950499693842?l=www.matthewtonkin.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.matthewtonkin.com/2011/07/mobile-engineering-quality.html</link><author>noreply@blogger.com (Matthew Tonkin)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-1581168319252833615.post-6744843388738106111</guid><pubDate>Sun, 27 Feb 2011 22:49:00 +0000</pubDate><atom:updated>2011-02-27T15:09:20.104-08:00</atom:updated><title>Tablet Bloodbath</title><description>&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;I bought an Android Tablet (the Motorola XOOM) on Friday.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;During the process at Best Buy it struck me the upcoming 'Tablet War' will bear an uncanny resemblance to the PC market. &amp;nbsp;Motorola won't compete with Apple in the Tablet market any more than Acer competes with Apple in the PC market.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;When consumers go to Best Buy to get a Tablet they'll ask themselves 2 questions:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Q1: "Do I want an iPad or an Android?"&lt;/blockquote&gt;&lt;blockquote&gt;Q2:&amp;nbsp;"If I want an Android then which one do I want? Motorola, Samsung, Asus, Dell...."&lt;/blockquote&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Motorola's biggest competition will be Samsung, Acer, Dell and anyone else who releases an Android tablet (&lt;a href="http://www.bgr.com/2011/01/24/over-100-tablets-were-unveiled-at-ces-2011-heres-a-list-of-all-of-them/"&gt;and boy there's a lot of them&lt;/a&gt;). Competition with Apple is a secondary problem for these guys at best.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;In theory&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;, it's Google vs Apple. &amp;nbsp;The tech tabloids and industry boffins are eating that stuff up because it's interesting for industry people to analyze, debate and pontificate over.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;In practice&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;, it's comes down to manufacturing, distribution and the showroom - where Google is a logo on a box at best. &amp;nbsp;You'll soon be able to see Apple standing tall in one corner of Best Buy and every other tablet manufacturer fighting a brutal battle against each other in another corner. &amp;nbsp;When it comes down to it - Motorola and Samsung will soon be busy one upping each other on hardware features and under cutting each other on price. &amp;nbsp;Apple will have the best seat in the house during the upcoming tablet bloodbath.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Sure, there might be cheeky ad campaigns that try to pitch Apple against Manufacturer X and plenty of industry analysts comparing Google vs Apple, but when it comes to the showroom floor it will be Motorola, Samsung, Acer and Dell sucker punching each other until the weak ones get out of the ring.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;I don't see Apple doing much other than continuing on their own merry way while the bevy of Android Tablet manufacturers beat each other up. &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;An uncanny resemblance to the PC market where&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Apple is extremely profitable and the 'competition' has either been eaten up (Compaq, DEC, IBM) or is surviving on ridiculously thin margins (Dell, HP, &amp;nbsp;Acer).&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;The technology might be new, but the story of Apple vs Android is neither new or even very interesting. &amp;nbsp;Apple vs HP on the other hand is behemoth vs underdog and one should never ignore an underdog.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1581168319252833615-6744843388738106111?l=www.matthewtonkin.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.matthewtonkin.com/2011/02/tablet-bloodbath.html</link><author>noreply@blogger.com (Matthew Tonkin)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-1581168319252833615.post-1856076654184664580</guid><pubDate>Thu, 03 Jun 2010 23:05:00 +0000</pubDate><atom:updated>2010-06-03T16:06:10.794-07:00</atom:updated><title>Yours truly speaking at Google I/O 2010</title><description>Skip ahead to 19:00 for the good bits (me)...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/events/io/2010/sessions/connecting-enterprise-apps-docs-sites.html"&gt;http://code.google.com/events/io/2010/sessions/connecting-enterprise-apps-docs-sites.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1581168319252833615-1856076654184664580?l=www.matthewtonkin.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.matthewtonkin.com/2010/06/yours-truly-speaking-at-google-io-2010.html</link><author>noreply@blogger.com (Matthew Tonkin)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-1581168319252833615.post-1562918823265181495</guid><pubDate>Fri, 30 Apr 2010 17:40:00 +0000</pubDate><atom:updated>2010-04-30T10:54:23.167-07:00</atom:updated><title>De-emphasizing Mac OS at WWDC?</title><description>&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;WWDC 2008:&lt;/b&gt; &amp;nbsp;Offered sessions on transitioning Mac developers to iPhone. &amp;nbsp;Makes sense. &amp;nbsp;iPhone OS was a new platform with few developers at the time - why not throw the Mac developer community at the iPhone.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;WWDC 2009:&lt;/b&gt; &amp;nbsp;Offered sessions on transitioning iPhone developers to Mac. &amp;nbsp;That was a surprise to most, but again makes sense because during the previous year the Cocoa Touch developer community exploded and why not throw a few of them back to the Mac.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;WWDC 2010:&lt;/b&gt; &amp;nbsp;Evidently it's about iPhone OS.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But is it? &amp;nbsp;Clearly &lt;a href="http://www.loopinsight.com/2010/04/29/steve-jobs-says-apple-is-not-de-emphasizing-mac-os-x/"&gt;not everyone is happy&lt;/a&gt; about Apple's strong iPhone OS emphasis at WWDC this year. &amp;nbsp;But maybe it isn't about iPhone OS maybe it's about Cocoa Touch?&lt;br /&gt;&lt;br /&gt;Cocoa is the development frameworks for Mac OS.&lt;br /&gt;Cocoa Touch is the development frameworks for iPhone OS.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Is there a difference between iPhone OS and Cocoa Touch? &amp;nbsp;Hell yeah there is. &amp;nbsp;There's no reason Cocoa Touch can't be part of Mac OS. &amp;nbsp;Cocoa Touch is a damn fine environment to develop software for devices with a multi-touch screen interface (by 'damn fine' I mean nothing else comes even close). &lt;br /&gt;&lt;br /&gt;Let's not assume that multi-touch screens are exclusively for this new 'mobile era'. &amp;nbsp;Sure that might be the driver of multi-touch screens, but I can't see them staying there. &amp;nbsp;If we get a multitouch screen on a Mac, then we should get Cocoa Touch too - and all those wonderful iPhone developers have a place on the Mac.&lt;br /&gt;&lt;br /&gt;Don't think a multi-touch screen has any business on a Mac? &amp;nbsp;&lt;a href="http://twitter.com/mattgemmell/status/12847150565"&gt;Matt Gemmell's dad seems to think it does&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Apple throwing the developer community behind iPhone OS might just be a front to transitioning us to developing in Cocoa Touch - for iPhone, iPad and Mac. &amp;nbsp;Glory glory hallelujah.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.matthewtonkin.com/2010/04/uikit-in-107.html"&gt;For a more in-depth analysis see my previous post on UIKit in 10.7&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1581168319252833615-1562918823265181495?l=www.matthewtonkin.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.matthewtonkin.com/2010/04/de-emphasizing-mac-os-at-wwdc.html</link><author>noreply@blogger.com (Matthew Tonkin)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-1581168319252833615.post-5262723628636230727</guid><pubDate>Sun, 18 Apr 2010 00:11:00 +0000</pubDate><atom:updated>2010-04-17T18:05:39.417-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>cocoa</category><title>UIKit in 10.7?</title><description>&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Helvetica, serif; font-size: 12px;"&gt;Disclaimer: The following is nothing but pure speculation...&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: Helvetica, serif; font-size: 12px; font-weight: bold;"&gt;&lt;div style="text-align: auto;"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;UIKit in 10.7 would mean an iPhone like environment on a touch screen Mac - even iPhone apps themselves. Seems nuts, but reserve judgement until the end.&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: auto;"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;First, a little background in Mac OS X / iPhone architecture...&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;Mac OS X and iPhone apps share a common underlying framework - Foundation.  However, each platform has it's own application layer.&lt;/div&gt;&lt;div style="font: normal normal normal 12px/normal Helvetica; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 14px; text-align: left;"&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, serif; font-size: 16px;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: normal normal normal 12px/normal Helvetica; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 14px; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: normal normal normal 12px/normal Helvetica; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 14px;"&gt;&lt;b&gt;iPhone OS has UIKit = CocoaTouch&lt;/b&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;The UIKit framework contains the Application layer for iPhone apps.  This includes the visual interface and user interactivity bits that makes the iPhone the iPhone.  This is where touches, views, images, gestures, tables, controls and that other fun iPhone stuff lives.&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5461267681580236546" src="http://3.bp.blogspot.com/_FxLcWB2XDzw/S8pSBXfpPwI/AAAAAAAAACU/GbfNnBKM3ZA/s400/iPhoneOS.png" style="cursor: hand; cursor: pointer; display: block; height: 154px; margin: 0px auto 10px; text-align: center; width: 270px;" /&gt;&lt;br /&gt;&lt;div&gt;&lt;div style="font: normal normal normal 12px/normal Helvetica; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, serif; font-size: 130%;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;b&gt;Mac OS 10.0 - 10.6 has AppKit = Cocoa&lt;/b&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;Mac OS X's equivalent is AppKit and has views, windows, images, open panels, tables, controls, mouse pointers, printing etc.&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5461265951564202194" src="http://2.bp.blogspot.com/_FxLcWB2XDzw/S8pQcqrrgNI/AAAAAAAAACE/Vs6AWz7AVlk/s400/Untitled.png" style="cursor: hand; cursor: pointer; display: block; height: 154px; margin: 0px auto 10px; text-align: center; width: 270px;" /&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;The key architectural difference between Mac OS and iPhone OS is that neither has the other's application layer framework.  There's no AppKit in iPhone and there's no UIKit in Mac OS X.  Seems logical - what would the iPhone OS need with a save panel - after all the user interactivity is entirely different between the 2 platforms.&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;Good logic - Until you put a touch screen on a Mac in which case things change.&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;b&gt;Could Mac OS 10.7 have both?&lt;/b&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5461268799007688978" src="http://1.bp.blogspot.com/_FxLcWB2XDzw/S8pTCaPHCRI/AAAAAAAAACc/wgvpl1boaQk/s400/10.7.png" style="cursor: hand; cursor: pointer; display: block; height: 154px; margin: 0px auto 10px; text-align: center; width: 270px;" /&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;Some may argue that a Touch Screen Mac doesn't make any sense ergonomically - but what's the difference between that and an iPad with a keyboard dock?&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;b&gt;The grab...&lt;/b&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;UIKit on Mac OS X is a very good choice if there ever is a touch screen Mac - and maybe even if there isn't.  Here's why:&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;b&gt;1. It's built for finger input&lt;/b&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;If the iPad is just a big iPod Touch, then an iMac with a touchscreen is just a big iPad.  If you had told me a few months ago that UIKit was a possibility in Mac OS - I'd have laughed at you (perhaps the way some of you are laughing at me now).  All of this changed with the iPad though - which has proven that UIKit (primarily the user interface) can scale up to much larger devices.  It's a much smaller step to take UIKit to the Mac than it was to take it to the iPad.  UIKit is the thing that makes touch input really really rock.  Why &lt;i&gt;wouldn't&lt;/i&gt; you use UIKit on a touchscreen Mac - I simply don't see what other choice there is.  Sure you could bring touch stuff to AppKit (and it already exists in a sense) but why bother?&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;b&gt;2. UIKit is more modern than AppKit&lt;/b&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;There's some brilliant design in UIKit (it's an evolution of AppKit after all)  for example UIViewController, everything visible being subclasses of UIView and lots and lots of small decisions that make UIKit a pleasure to code for.  More app for less code is always a good thing.&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;b&gt;3. Third party developers&lt;/b&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;There's over 180,000 apps for the iPhone.  I'm not sure how many apps are available on Mac OS, but I'm sure it's a LOT less than that.  There's a huge amount of code and big investment being made in iPhone code - investment that most often can be leveraged on the Mac too.  The availability of more apps on the Mac is a good thing - no matter what way you slice it.  Everyone wins - users, developers, Apple.&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;b&gt;4. The AppStore&lt;/b&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;Whatever you want to take away from the AppStore is irrelevant in the light of it working so damn well.  Users get apps, developers sell apps and it's all so darn easy.  Argument over.  Bringing the AppStore to the Mac would be very welcome.  Anything you throw at the AppStore is easily deflected by how well the model of having an AppStore on the platform works.  Would the iPhone or iPhone app developers be as successful without the AppStore?  I doubt it would come even close.  Would the iPhone be as compelling without the AppStore?  I doubt that too.  Will and AppStore with 200,000 apps be awesome on the Mac platform?  No doubts there.&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;b&gt;5. A lot of iPhone apps are already usable on standard Mac hardware today&lt;/b&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;How do I know that?  The simulator.  Apple launched the iPad with &lt;i&gt;thousands&lt;/i&gt; of applications, most of which had &lt;i&gt;never&lt;/i&gt; been used on the actual device.  Even using a mouse input instead of a touchscreen, the UIKit app environment is damn usable.  There are so many iPhone apps that I wish I could have in my iPhone simulator and just use as apps on an everyday basis.&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;They'd be even better with a touchscreen, but they already work well enough to be useful.&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;Let's be clear that I'm not suggesting UIKit will replace AppKit anytime soon (or ever) - that simply doesn't make sense.  I'm making the argument that having UIKit as an option on Mac OS makes an insane amount of sense - if you have a touch screen (and only slightly less sense if you don't).&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;b&gt;Some Q&amp;amp;A….&lt;/b&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;b&gt;Q.  Would developers need to invest much time to bring their iPhone app across?&lt;/b&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;A.  Probably just recompile.  Unless they did something stupid - like violated iPhone SDK 4 term 3.3.1 and used an intermediate library like Flash to iPhone.&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;b&gt;Q.  Well what would happen to my other applications in Mac OS X - can I print and use my mouse and stuff?&lt;/b&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;A.  Of course.  AppKit and the traditional application environment can still exist quite happily.  Maybe launching a UIKit app just goes modal - like FrontRow, which notably doesn't have a mouse either.&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;b&gt;Q.  Wouldn't that take a lot of work?&lt;/b&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;A.  No.  That's what the simulator does now.  It runs UIKit on the Mac.  Job done.&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;b&gt;Q.  But the iPhone / iPad runs on ARM and the Mac uses an x86 processor.  Doesn't that pose a problem?&lt;/b&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;A.  Evidently not for Apple and their Universal Binaries.  These were introduced back in the PPC to x86 switch, but are still very much in use today.  Todays apps that are compiled for 32 and 64 bit x86 processors are using a universal binary.  You can even do PPC / x86 and 32 / 64 bit apps - all 4 permutations of which exist in the same universal binary.  Right now apps that run in the simulator run as x86 apps whereas apps that run on the device rum as ARM apps - so the hard work is already done.  Creating a Universal Binary containing both x86 and ARM code would be a walk in the park for Apple's engineers.&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;b&gt;Q.  Wouldn't you need an accelerometer or rotation or something?&lt;/b&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;A.  Not necessarily.  Sure some apps need it, but many many don't.  Some apps need a camera, some need a GPS, some need a magnetic compass.  It won't mean all iPhone apps will be available for the Mac - the same way not all iPhone apps are available for the iPod Touch.&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;b&gt;Q.  What about the extra screen real estate?&lt;/b&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;A.  That became a non-issue with the iPad.  Building apps for dynamic screen sizes is now a given when creating apps for the iPhone OS.  Did you really think Apple were going to use 320x480 screens forever?&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1581168319252833615-5262723628636230727?l=www.matthewtonkin.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.matthewtonkin.com/2010/04/uikit-in-107.html</link><author>noreply@blogger.com (Matthew Tonkin)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_FxLcWB2XDzw/S8pSBXfpPwI/AAAAAAAAACU/GbfNnBKM3ZA/s72-c/iPhoneOS.png' height='72' width='72'/><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-1581168319252833615.post-6845255975797519184</guid><pubDate>Sat, 07 Nov 2009 21:47:00 +0000</pubDate><atom:updated>2009-11-07T13:52:36.917-08:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>cocoa</category><title>Xcode + iPhone SDK: The unsung hero of 100,000 apps</title><description>&lt;div&gt;March 6 2008, Apple covered their roadmap for the iPhone SDK: http://www.apple.com/quicktime/qtv/iphoneroadmap/&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That was JUST 20 months ago. Unbelievable.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Since then we've all gotten caught up in the AppStore hysteria, overnight millionaires (maybe), 100,000 apps and average Joes (or Janes) developing apps for the iPhone. This is a positively enormous change for mobile application developers, traditional Mac developers and mobile entrepreneurs.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Xcode and the iPhone SDK make all this possible. It's not just a toolkit to allow you to build apps for the iPhone, but an incredibly well crafted suite (lets not forget Instruments) that is designed to allow developers to do what they do best: develop something to meet their business problem.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Everything about Apples developer tools and Frameworks scream &lt;i&gt;"focus on what you're trying to achieve with your software, we'll take care of all the mundane stuff"&lt;/i&gt;. 1 button is all it takes to get your software compiled, installed on a device and running in debug. This doesn't come as a surprise to any of the 'old school' OS X developers, but sometimes we need to be reminded about how awesome this toolkit is and how much we take it for granted.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The economist in me continually nags that any time I waste messing around with development tools is time I'm not spending on making my software better. If Xcode and the iPhone SDK were pigs to work with, then we'd still have software, there just wouldn't be as much and it wouldn't be as good.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You could even go so far as to suggest that the iPhone SDK has created a significant competitive advantage and barrier to entry in the now hotly contested market of third party application development for mobiles. The iPhone SDK has a long and rich heritage rooted deeply in the NeXT era, it's not something you can just knock out in a few months.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Sure, there will be SDK's for those other devices, but will they be as good? I guess time will tell, but I wouldn't bet on it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1581168319252833615-6845255975797519184?l=www.matthewtonkin.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.matthewtonkin.com/2009/11/xcode-iphone-sdk-unsung-hero-of-100000.html</link><author>noreply@blogger.com (Matthew Tonkin)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-1581168319252833615.post-6900070122480571084</guid><pubDate>Wed, 23 Sep 2009 05:14:00 +0000</pubDate><atom:updated>2009-09-22T22:51:28.017-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>cocoa</category><category domain='http://www.blogger.com/atom/ns#'>10.4</category><title>OmniStats, Gruber and 10.4 Support</title><description>&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;John Gruber of &lt;a href="http://daringfireball.net/"&gt;Daring Fireball&lt;/a&gt; has a great discussion (as always) on Mac OS X major version use:&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;a href="http://daringfireball.net/2009/09/snow_leopard_adoption_rate"&gt;DF Stats&lt;/a&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;a href="http://daringfireball.net/linked/2009/09/22/omni-stats"&gt;Omni&lt;/a&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;a href="http://daringfireball.net/linked/2009/09/22/adium-stats"&gt;Adium&lt;/a&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;The 10.4 usage (36.4%) for Omni seems very high and developers might factor this into their decision to continue supporting 10.4.   However it can be argued that Omni stats are skewed due to the Apple bundling agreements that existed while 10.4 was being shipped (these agreements ended before or early in the 10.5 era).  All Mac hardware shipped with OmniGraffle during 10.4 (but not during 10.5) so the overall market share of 10.4 is probably lower.&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;If you're a developer (and according to &lt;a href="http://daringfireball.net/2009/09/snow_leopard_adoption_rate"&gt;Gruber 11.2% of his readers are&lt;/a&gt;) you might not be fortunate enough to be calling your own shots and have some &lt;i&gt;'platform agnostic'&lt;/i&gt; marketing guy or product manager telling you that you must support 10.4 because it's a significant portion of the market or your partners need it.&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;Supporting 10.4 is probably a bad move for most developers at this point (unless developing for education - &lt;i&gt;maybe&lt;/i&gt;).  Here's how to argue the case for 10.5+ against someone not fluent in the Mac platform.&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;b&gt;1. Your software won't be as good if you're developing for 10.4&lt;/b&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;The economic problem is always the same - limited resources and unlimited needs.   Whilst you &lt;i&gt;can&lt;/i&gt; work around 10.4 limitations, doing so means you've got less resources allocated to other things - like solving your business problem better.  There's some really cool tech in 10.5 - from the big stuff like Core Animation and NSOperation to the small stuff like gradients and bezier paths with rounded corners.  Your software will almost always be better from using these newer technologies.&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;It's not just the development effort either, you need to QA and support 10.4 too.  That &lt;i&gt;really&lt;/i&gt; sucks for the poor schmucks who have that job (probably one of whom is you).&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;Make the choice:  Do you want to make good software for 10.4+ users or great software for 10.5+ users?  If you're still thinking you can do both, then re-read the above until you realise by definition you can't.  Your software will always be better if you develop for 10.5+ because you'll have more resources to spend on solving your business problem better or making your software easier to use.&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;For many products, you'd get more users from better software than you would from legacy OS support, but that argument really hinges on how many users (particularly paid ones) you're likely to get from supporting an older OS, so market share stats might be important.&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;b&gt;2. Current market share&lt;/b&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;There's no definitive source of how much of the overall market is 10.4 or 10.5+.  Omni's stat (36.4%) are probably skewed towards 10.4 due to the old Apple OEM deal and Adium's stats (15.3%) are probably skewed towards an 'early adopter' crowd who stick with the latest OS.  So let's assume the overall 10.4 market share is between 20% and 30%.&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;b&gt;3. Future market share&lt;/b&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;By the generous Omni stats, 10.4 is showing a roughly linear decline from 50% on 1 Jan 2009, translating to a decline of 18% per annum.  In a year from now, 10.4 will be &lt;i&gt;really&lt;/i&gt; inconsequential.  You'll need to make back all of your extra costs from these users the next year*, or you're at a loss.  This isn't just the explicit costs like development, QA &amp;amp; support, it's the implicit costs too - like your software not being as good.  Add to that the future costs of updating to newer technologies in 10.6 like Grand Central that are automatic if you use NSOperation (which is included in 10.5).&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;*If you're at the stage of deciding whether to support 10.4 or not, then it's probably a few months before your software ships anyway so you need to take into account what the market will be when you launch the software.&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;b&gt;4. The OS market share argument is rubbish&lt;/b&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;Just like the Windows vs Mac market share rhetoric, the total market % isn't important anyway.  What's important is the market share of users in your target / addressable market.&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;Think about it… Any &lt;i&gt;consumer**&lt;/i&gt; using 10.4 is probably too frugal to buy &lt;i&gt;Apple's&lt;/i&gt; software, a late adopter or using an old system.  Do you really think they are going to install and (more importantly) buy your software?&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;**You'll notice the emphasis is on consumers.  There are still some big educational customers with 10.4.  If this is the case for you, then you should probably take the decline in market share into account and make an assessment based on that.  You might still be stuck with 10.4 for a while longer, but make an informed choice.&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;b&gt;But what if I already support 10.4?&lt;/b&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;This stuff is all still relevant.  If you're keeping your software up to date, then you'll probably realise a lot of this already.  &lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;As Wayne Gretzky said &lt;i&gt;"skate to where the puck is going to be"&lt;/i&gt;, this is still relevant to all of your current and future development efforts.&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;There are some 10.4 users and some of them might buy your software, but are there enough to regain the costs, time and headaches of developing for 10.4 worthwhile?&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;br /&gt;&lt;/p&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:Helvetica, serif;font-size:100%;"&gt;&lt;span class="Apple-style-span"  style="font-size:12px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1581168319252833615-6900070122480571084?l=www.matthewtonkin.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.matthewtonkin.com/2009/09/omnistats-gruber-and-104-support.html</link><author>noreply@blogger.com (Matthew Tonkin)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-1581168319252833615.post-4845376601217423106</guid><pubDate>Mon, 24 Aug 2009 03:55:00 +0000</pubDate><atom:updated>2009-09-13T10:43:59.022-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>cocoa</category><title>Coolest thing I learnt at WWDC 2009</title><description>Cocoa's support for KVO and Properties is awesome, but every now and then I find something I can't do.  I frequently use 'derived' properties, where a read only property is derived from a combination of instance variables.  For example, we might have an object with firstName and lastName, then want a KVO compliant fullName.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Cocoa did offer some support for this in your own classes by doing a willChangeValueForKey: and didChangeValueForKey:.  The real challenge comes when you want to have the derived accessor in a class category in the app layer where the base class is in a framework.  The framework base class has no knowledge of class extension in the app layer, so can't post the willChange/didChange, so your derived accessor is not KVO compliant.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Let's look at how things used to work with a basic example using firstName, lastName, fullName in our own object.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Header...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"&gt;&lt;span class="Apple-style-span"   style="font-family:Georgia, serif;font-size:130%;"&gt;&lt;span class="Apple-style-span"  style="font-size:16px;"&gt;&lt;span class="Apple-style-span"    style="font-family:Monaco, serif;font-size:85%;color:#C800A3;"&gt;&lt;span class="Apple-style-span"  style="font-size:10px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span class="Apple-style-span"   style="font-family:Georgia, serif;font-size:130%;"&gt;&lt;span class="Apple-style-span"    style="font-family:Monaco, serif;font-size:85%;color:#C800A3;"&gt;&lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color:#e00000;"&gt;&lt;span class="Apple-style-span"  style="color:#7E4623;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;span class="Apple-style-span"  style="color:#7E4623;"&gt;&lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color:#e00000;"&gt;&lt;span style="color:#7e4623;"&gt;#import &lt;/span&gt;&lt;cocoa/cocoa.h&gt;&lt;/cocoa/cocoa.h&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"&gt;&lt;span style="color:#c800a3;"&gt;@interface&lt;/span&gt; Person : NSObject {&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;span style="color:#7822ac;"&gt;NSString&lt;/span&gt; *firstName;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;span style="color:#7822ac;"&gt;NSString&lt;/span&gt; *lastName;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"&gt;}&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"&gt;- (&lt;span style="color:#c800a3;"&gt;void&lt;/span&gt;)setFirstName:(&lt;span style="color:#7822ac;"&gt;NSString&lt;/span&gt; *)value;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"&gt;- (&lt;span style="color:#7822ac;"&gt;NSString&lt;/span&gt; *)firstName;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"&gt;- (&lt;span style="color:#c800a3;"&gt;void&lt;/span&gt;)setLastName:(&lt;span style="color:#7822ac;"&gt;NSString&lt;/span&gt; *)value;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"&gt;- (&lt;span style="color:#7822ac;"&gt;NSString&lt;/span&gt; *)lastName;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"&gt;- (&lt;span style="color:#7822ac;"&gt;NSString&lt;/span&gt; *)fullName;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color:#c800a3;"&gt;@end&lt;/p&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#C800A3;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Implementation....&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color:#e00000;"&gt;&lt;span class="Apple-style-span"    style="font-family:Georgia, serif;font-size:130%;color:#000000;"&gt;&lt;span class="Apple-style-span"  style="font-size:16px;"&gt;&lt;span class="Apple-style-span"    style="font-family:Monaco, serif;font-size:85%;color:#7E4623;"&gt;&lt;span class="Apple-style-span"  style="font-size:10px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span class="Apple-style-span"    style="font-family:Georgia, serif;font-size:130%;color:#000000;"&gt;&lt;span class="Apple-style-span"    style="font-family:Monaco, serif;font-size:85%;color:#7E4623;"&gt;&lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color:#e00000;"&gt;&lt;span style="color:#7e4623;"&gt;#import &lt;/span&gt;"Person.h"&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color:#c800a3;"&gt;@implementation&lt;span style="color:#000000;"&gt; Person&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"&gt;- (&lt;span style="color:#c800a3;"&gt;void&lt;/span&gt;)dealloc{&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color:#418289;"&gt;&lt;span style="color:#000000;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;[&lt;/span&gt;firstName&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#430084;"&gt;release&lt;/span&gt;&lt;span style="color:#000000;"&gt;], &lt;/span&gt;firstName&lt;span style="color:#000000;"&gt; = &lt;/span&gt;&lt;span style="color:#c800a3;"&gt;nil&lt;/span&gt;&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color:#418289;"&gt;&lt;span style="color:#000000;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;[&lt;/span&gt;lastName&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#430084;"&gt;release&lt;/span&gt;&lt;span style="color:#000000;"&gt;], &lt;/span&gt;lastName&lt;span style="color:#000000;"&gt; = &lt;/span&gt;&lt;span style="color:#c800a3;"&gt;nil&lt;/span&gt;&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color:#430084;"&gt;&lt;span style="color:#000000;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;[&lt;/span&gt;&lt;span style="color:#c800a3;"&gt;super&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;dealloc&lt;span style="color:#000000;"&gt;];&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"&gt;}&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"&gt;- (&lt;span style="color:#c800a3;"&gt;void&lt;/span&gt;)setFirstName:(&lt;span style="color:#7822ac;"&gt;NSString&lt;/span&gt; *)value{&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;span style="color:#c800a3;"&gt;if&lt;/span&gt; ([&lt;span style="color:#418289;"&gt;firstName&lt;/span&gt; &lt;span style="color:#430084;"&gt;isEqualToString&lt;/span&gt;:value]) &lt;span style="color:#c800a3;"&gt;return&lt;/span&gt;;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; min-height: 14.0px"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color:#430084;"&gt;&lt;span style="color:#000000;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;[&lt;/span&gt;&lt;span style="color:#c800a3;"&gt;self&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;willChangeValueForKey&lt;span style="color:#000000;"&gt;:&lt;/span&gt;&lt;span style="color:#e00000;"&gt;@"fullName"&lt;/span&gt;&lt;span style="color:#000000;"&gt;];&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; min-height: 14.0px"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color:#418289;"&gt;&lt;span style="color:#000000;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;[&lt;/span&gt;firstName&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#430084;"&gt;release&lt;/span&gt;&lt;span style="color:#000000;"&gt;];&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;span style="color:#418289;"&gt;firstName&lt;/span&gt; = [value &lt;span style="color:#430084;"&gt;retain&lt;/span&gt;];&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; min-height: 14.0px"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color:#430084;"&gt;&lt;span style="color:#000000;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;[&lt;/span&gt;&lt;span style="color:#c800a3;"&gt;self&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;didChangeValueForKey&lt;span style="color:#000000;"&gt;:&lt;/span&gt;&lt;span style="color:#e00000;"&gt;@"fullName"&lt;/span&gt;&lt;span style="color:#000000;"&gt;];&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"&gt;}&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"&gt;- (&lt;span style="color:#7822ac;"&gt;NSString&lt;/span&gt; *)firstName{&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color:#430084;"&gt;&lt;span style="color:#000000;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color:#c800a3;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; [[&lt;/span&gt;&lt;span style="color:#418289;"&gt;firstName&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;retain&lt;span style="color:#000000;"&gt;] &lt;/span&gt;autorelease&lt;span style="color:#000000;"&gt;];&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"&gt;}&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"&gt;- (&lt;span style="color:#c800a3;"&gt;void&lt;/span&gt;)&lt;span style="color:#265a5f;"&gt;setLastName&lt;/span&gt;:(&lt;span style="color:#7822ac;"&gt;NSString&lt;/span&gt; *)value{&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;span style="color:#c800a3;"&gt;if&lt;/span&gt; ([&lt;span style="color:#418289;"&gt;lastName&lt;/span&gt; &lt;span style="color:#430084;"&gt;isEqualToString&lt;/span&gt;:value]) &lt;span style="color:#c800a3;"&gt;return&lt;/span&gt;;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; min-height: 14.0px"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color:#430084;"&gt;&lt;span style="color:#000000;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;[&lt;/span&gt;&lt;span style="color:#c800a3;"&gt;self&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;willChangeValueForKey&lt;span style="color:#000000;"&gt;:&lt;/span&gt;&lt;span style="color:#e00000;"&gt;@"fullName"&lt;/span&gt;&lt;span style="color:#000000;"&gt;];&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; min-height: 14.0px"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color:#418289;"&gt;&lt;span style="color:#000000;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;[&lt;/span&gt;lastName&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#430084;"&gt;release&lt;/span&gt;&lt;span style="color:#000000;"&gt;];&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;span style="color:#418289;"&gt;lastName&lt;/span&gt; = [value &lt;span style="color:#430084;"&gt;retain&lt;/span&gt;];&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; min-height: 14.0px"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color:#430084;"&gt;&lt;span style="color:#000000;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;[&lt;/span&gt;&lt;span style="color:#c800a3;"&gt;self&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;didChangeValueForKey&lt;span style="color:#000000;"&gt;:&lt;/span&gt;&lt;span style="color:#e00000;"&gt;@"fullName"&lt;/span&gt;&lt;span style="color:#000000;"&gt;];&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"&gt;}&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"&gt;- (&lt;span style="color:#7822ac;"&gt;NSString&lt;/span&gt; *)lastName{&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color:#430084;"&gt;&lt;span style="color:#000000;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color:#c800a3;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; [[&lt;/span&gt;&lt;span style="color:#418289;"&gt;lastName&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;retain&lt;span style="color:#000000;"&gt;] &lt;/span&gt;autorelease&lt;span style="color:#000000;"&gt;];&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"&gt;}&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"&gt;- (&lt;span style="color:#7822ac;"&gt;NSString&lt;/span&gt; *)fullName{&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color:#430084;"&gt;&lt;span style="color:#000000;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color:#c800a3;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; [&lt;/span&gt;&lt;span style="color:#7822ac;"&gt;NSString&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;stringWithFormat&lt;span style="color:#000000;"&gt;:&lt;/span&gt;&lt;span style="color:#e00000;"&gt;@"%@ %@"&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#c800a3;"&gt;self&lt;/span&gt;&lt;span style="color:#000000;"&gt;.&lt;/span&gt;&lt;span style="color:#418289;"&gt;firstName&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#c800a3;"&gt;self&lt;/span&gt;&lt;span style="color:#000000;"&gt;.&lt;/span&gt;&lt;span style="color:#265a5f;"&gt;lastName&lt;/span&gt;&lt;span style="color:#000000;"&gt;];&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"&gt;}&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p color="#c800a3" style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; "&gt;@end&lt;/p&gt;&lt;div&gt;&lt;span class="Apple-style-span"    style="font-family:Georgia, serif;font-size:130%;color:#000000;"&gt;&lt;span class="Apple-style-span"  style="font-size:16px;"&gt;&lt;span class="Apple-style-span"    style="font-family:Monaco, serif;font-size:85%;color:#C800A3;"&gt;&lt;span class="Apple-style-span"  style="font-size:10px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I presented this quandary to an Apple engineer at WWDC 09 and after a few minutes he found this in NSKeyValueObserving.h and became my new hero.  (I love WWDC for just this reason... the guy saved me an unbelievable amount of work).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color: #008b00"&gt;/* Return a set of key paths for properties whose values affect the value of the keyed property. When an observer for the key is registered with an instance of the receiving class, KVO itself automatically observes all of the key paths for the same instance, and sends change notifications for the key to the observer when the value for any of those key paths changes. The default implementation of this method searches the receiving class for a method whose name matches the pattern +keyPathsForValuesAffecting&lt;key&gt;, and returns the result of invoking that method if it is found. So, any such method must return an NSSet too. If no such method is found, an NSSet that is computed from information provided by previous invocations of the now-deprecated +setKeys:triggerChangeNotificationsForDependentKey: method is returned, for backward binary compatibility.&lt;/key&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color: #008b00; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color: #008b00"&gt;This method and KVO's automatic use of it comprise a dependency mechanism that you can use instead of sending -willChangeValueForKey:/-didChangeValueForKey: messages for dependent, computed, properties.&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color: #008b00; min-height: 14.0px"&gt; &lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color: #008b00"&gt;You can override this method when the getter method of one of your properties computes a value to return using the values of other properties, including those that are located by key paths. Your override should typically invoke super and return a set that includes any members in the set that result from doing that (so as not to interfere with overrides of this method in superclasses).&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color: #008b00; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color: #008b00"&gt;You can't really override this method when you add a computed property to an existing class using a category, because you're not supposed to override methods in categories. In that case, implement a matching +keyPathsForValuesAffecting&lt;key&gt; to take advantage of this mechanism.&lt;/key&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color: #008b00"&gt;*/&lt;/p&gt;&lt;div&gt;&lt;span class="Apple-style-span"    style="font-family:Monaco, serif;font-size:85%;color:#008B00;"&gt;&lt;span class="Apple-style-span"  style="font-size:10px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;In a nut shell, all you have to do is add a class method and return the key paths for the value that affect your derived accessor....&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"&gt;+ (&lt;span style="color:#7822ac;"&gt;NSSet&lt;/span&gt; *)keyPathsForValuesAffectingFullName{&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color:#e00000;"&gt;&lt;span style="color:#000000;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color:#c800a3;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; [&lt;/span&gt;&lt;span style="color:#7822ac;"&gt;NSSet&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#430084;"&gt;setWithObjects&lt;/span&gt;&lt;span style="color:#000000;"&gt;:&lt;/span&gt;@"firstName"&lt;span style="color:#000000;"&gt;,&lt;/span&gt;@"lastName"&lt;span style="color:#000000;"&gt;];&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"&gt;}&lt;/p&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:Monaco, serif;font-size:85%;"&gt;&lt;span class="Apple-style-span"  style="font-size:10px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So the implementation can be simplified to this...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color:#e00000;"&gt;&lt;span style="color:#7e4623;"&gt;#import &lt;/span&gt;"Person.h"&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p color="#c800a3" style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; "&gt;@implementation&lt;span style="color:#000000;"&gt; Person&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"&gt;&lt;span style="color:#c800a3;"&gt;@synthesize&lt;/span&gt; firstName, lastName;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"&gt;- (&lt;span style="color:#c800a3;"&gt;void&lt;/span&gt;)dealloc{&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color:#418289;"&gt;&lt;span style="color:#000000;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;[&lt;/span&gt;firstName&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#430084;"&gt;release&lt;/span&gt;&lt;span style="color:#000000;"&gt;], &lt;/span&gt;firstName&lt;span style="color:#000000;"&gt; = &lt;/span&gt;&lt;span style="color:#c800a3;"&gt;nil&lt;/span&gt;&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color:#418289;"&gt;&lt;span style="color:#000000;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;[&lt;/span&gt;lastName&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#430084;"&gt;release&lt;/span&gt;&lt;span style="color:#000000;"&gt;], &lt;/span&gt;lastName&lt;span style="color:#000000;"&gt; = &lt;/span&gt;&lt;span style="color:#c800a3;"&gt;nil&lt;/span&gt;&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color:#430084;"&gt;&lt;span style="color:#000000;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;[&lt;/span&gt;&lt;span style="color:#c800a3;"&gt;super&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;dealloc&lt;span style="color:#000000;"&gt;];&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"&gt;}&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"&gt;- (&lt;span style="color:#7822ac;"&gt;NSString&lt;/span&gt; *)fullName{&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color:#430084;"&gt;&lt;span style="color:#000000;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color:#c800a3;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; [&lt;/span&gt;&lt;span style="color:#7822ac;"&gt;NSString&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;stringWithFormat&lt;span style="color:#000000;"&gt;:&lt;/span&gt;&lt;span style="color:#e00000;"&gt;@"%@ %@"&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#c800a3;"&gt;self&lt;/span&gt;&lt;span style="color:#000000;"&gt;.&lt;/span&gt;&lt;span style="color:#418289;"&gt;firstName&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#c800a3;"&gt;self&lt;/span&gt;&lt;span style="color:#000000;"&gt;.&lt;/span&gt;&lt;span style="color:#265a5f;"&gt;lastName&lt;/span&gt;&lt;span style="color:#000000;"&gt;];&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"&gt;}&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"&gt;+ (&lt;span style="color:#7822ac;"&gt;NSSet&lt;/span&gt; *)keyPathsForValuesAffectingFullName{&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color:#e00000;"&gt;&lt;span style="color:#000000;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color:#c800a3;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; [&lt;/span&gt;&lt;span style="color:#7822ac;"&gt;NSSet&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#430084;"&gt;setWithObjects&lt;/span&gt;&lt;span style="color:#000000;"&gt;:&lt;/span&gt;@"firstName"&lt;span style="color:#000000;"&gt;,&lt;/span&gt;@"lastName"&lt;span style="color:#000000;"&gt;];&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"&gt;}&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p color="#c800a3" style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; "&gt;@end&lt;/p&gt;&lt;div&gt;&lt;span class="Apple-style-span"    style="font-family:Monaco, serif;font-size:85%;color:#C800A3;"&gt;&lt;span class="Apple-style-span"  style="font-size:10px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"    style="font-family:Monaco, serif;font-size:85%;color:#C800A3;"&gt;&lt;span class="Apple-style-span"  style="font-size:10px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;And the header this....&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color:#e00000;"&gt;&lt;span style="color:#7e4623;"&gt;#import &lt;/span&gt;&lt;cocoa/cocoa.h&gt;&lt;/cocoa/cocoa.h&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"&gt;&lt;span style="color:#c800a3;"&gt;@interface&lt;/span&gt; Person : NSObject {&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;span style="color:#7822ac;"&gt;NSString&lt;/span&gt; *firstName;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;span style="color:#7822ac;"&gt;NSString&lt;/span&gt; *lastName;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco"&gt;}&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color: #c800a3"&gt;@property&lt;span style="color:#000000;"&gt; (&lt;/span&gt;retain&lt;span style="color:#000000;"&gt;) &lt;/span&gt;&lt;span style="color:#7822ac;"&gt;NSString&lt;/span&gt;&lt;span style="color:#000000;"&gt; *&lt;/span&gt;&lt;span style="color:#418289;"&gt;firstName&lt;/span&gt;&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color: #c800a3"&gt;@property&lt;span style="color:#000000;"&gt; (&lt;/span&gt;retain&lt;span style="color:#000000;"&gt;) &lt;/span&gt;&lt;span style="color:#7822ac;"&gt;NSString&lt;/span&gt;&lt;span style="color:#000000;"&gt; *&lt;/span&gt;&lt;span style="color:#418289;"&gt;lastName&lt;/span&gt;&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color: #c800a3"&gt;@property&lt;span style="color:#000000;"&gt; (&lt;/span&gt;readonly&lt;span style="color:#000000;"&gt;) &lt;/span&gt;&lt;span style="color:#7822ac;"&gt;NSString&lt;/span&gt;&lt;span style="color:#000000;"&gt; *fullName;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color: #c800a3"&gt;@end&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;The moral:&lt;/div&gt;&lt;div&gt;- Much less code&lt;/div&gt;&lt;div&gt;- Can do it in a class category&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Only downside is 10.5+ only, but you shouldn't be worried about 10.4 by now right :-)&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1581168319252833615-4845376601217423106?l=www.matthewtonkin.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.matthewtonkin.com/2009/08/coolest-thing-i-learnt-at-wwdc-2009.html</link><author>noreply@blogger.com (Matthew Tonkin)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-1581168319252833615.post-2772187283079817831</guid><pubDate>Sat, 14 Mar 2009 04:44:00 +0000</pubDate><atom:updated>2009-03-13T21:50:20.238-07:00</atom:updated><title>Wheels for the Mind</title><description>Mathieu Tozer (from Plasq) and I were interviewed for &lt;a href="http://www.auc.edu.au/Wheels+for+the+Mind"&gt;Wheels for the Mind&lt;/a&gt; magazine about being Australian Mac developers.  Both of us received Scholarships from the AUC to attend WWDC in 2006.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Check it out here: &lt;a href="http://www.auc.edu.au/tiki-download_file.php?fileId=144"&gt;http://www.auc.edu.au/tiki-download_file.php?fileId=144&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1581168319252833615-2772187283079817831?l=www.matthewtonkin.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.matthewtonkin.com/2009/03/wheels-for-mind.html</link><author>noreply@blogger.com (Matthew Tonkin)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-1581168319252833615.post-494412517201209874</guid><pubDate>Tue, 03 Mar 2009 06:22:00 +0000</pubDate><atom:updated>2009-09-13T10:44:37.260-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>cocoa</category><title>Cheeky Cocoa</title><description>&lt;span class="Apple-style-span"   style="  ;font-family:Helvetica;font-size:12px;"&gt;&lt;div&gt;Pushed a nil error to [NSApp presentError:] and it resulted in this console fart:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:Courier;"&gt;"-[NSAlert alertWithError:] called with nil NSError. A generic error message will be displayed, but the user deserves better."&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Translation: "Don't be such a lazy prick.  I'll deal with it, but I'm not happy about it."&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1581168319252833615-494412517201209874?l=www.matthewtonkin.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.matthewtonkin.com/2009/03/cheeky-cocoa.html</link><author>noreply@blogger.com (Matthew Tonkin)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-1581168319252833615.post-2481087140009404449</guid><pubDate>Tue, 13 Jan 2009 20:00:00 +0000</pubDate><atom:updated>2009-01-20T23:14:42.598-08:00</atom:updated><title>Macworld Memeo Share Review</title><description>Rob Griffiths stopped by the Memeo Share booth at Macworld last week and very promptly posted a couple of reviews...&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- &lt;a href="http://www.macworld.com/article/138059/memeo.html"&gt;Macworld (text)&lt;/a&gt;&lt;/div&gt;&lt;div&gt;- &lt;a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?i=48666917&amp;amp;id=74223864"&gt;Macworld (podcast - iTunes)&lt;/a&gt; skip through to 12:10 if you're interested&lt;/div&gt;&lt;div&gt;- &lt;a href="http://www.pcworld.com/article/156714/memeo_puts_you_in_sharing_mood.html"&gt;PCWorld&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We did a number of interviews, but no one is quite as quick as Macworld!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1581168319252833615-2481087140009404449?l=www.matthewtonkin.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.matthewtonkin.com/2009/01/macworld-memeo-share-review.html</link><author>noreply@blogger.com (Matthew Tonkin)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-1581168319252833615.post-8991614599359514146</guid><pubDate>Sun, 21 Dec 2008 20:00:00 +0000</pubDate><atom:updated>2009-01-20T22:48:12.137-08:00</atom:updated><title>NovaMind Review</title><description>&lt;div&gt;&lt;a href="http://www.macworld.com/article/137517/2008/12/novamind.html"&gt;Macworld gave a great review of NovaMind&lt;/a&gt; (particularly the UI) last week.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The part that I found particularly interesting was this....&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color: rgb(65, 69, 73);   line-height: 20px; font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;"Tools for customizing your mind map are abundant and deep, yet they don’t overwhelm. The many palettes can be docked to the working window or dragged out to float independently. Individual palettes can be collapsed to just a title bar, or removed all together. Click a small button to see a palette’s advanced options and it flips over in a cool Quartz animation. The net result is an interface that is remarkably clean and easy to use despite the large feature set."&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We had a continuous problem at &lt;a href="http://www.novamind.com/"&gt;NovaMind&lt;/a&gt; - how do you add &lt;span class="Apple-style-span" style="font-weight: bold; "&gt;more features&lt;/span&gt; without &lt;span class="Apple-style-span" style="font-weight: bold; "&gt;increasing product complexity&lt;/span&gt;.  I don't think this is specific to NovaMind, in fact it's a common software engineering problem.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The big surprise is that (according to the article) we actually achieved what we set out to achieve.  Excuse my skepticism, but it's very rare in software engineering that you get to do this.  Usually you come out with something that's either almost there, or not even close but a way awesome bi-product.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyway, we did this with NovaMind by:&lt;/div&gt;&lt;div&gt;- Group like controls into separate groups in a separate space (a palette)&lt;/div&gt;&lt;div&gt;- Group those groups by changing the background color of the palette&lt;/div&gt;&lt;div&gt;- Only show palettes that are relevant to the selected item on screen&lt;/div&gt;&lt;div&gt;- Allow the user to customise it...&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;- User can collapse palettes to hide stuff they don't use&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;- User can reorder the palettes into the order they like&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;- User can have the palettes 'docked' in their document window or floating like an inspector&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- Making the interface reveal advanced or low used features show up only when you need them.  (We did this by 'flipping' the palette to show advanced features).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The resulting interface was this...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_FxLcWB2XDzw/SXbEjcrpHvI/AAAAAAAAABU/Fkmg7h3L0wI/s1600-h/Picture+2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 216px;" src="http://3.bp.blogspot.com/_FxLcWB2XDzw/SXbEjcrpHvI/AAAAAAAAABU/Fkmg7h3L0wI/s400/Picture+2.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5293634525294305010" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;BIIIIG thanks to &lt;a href="http://www.uiandus.com/"&gt;Keith Lang&lt;/a&gt; for his help (or rather complete and total input) in creating the quartz composition for the flip.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1581168319252833615-8991614599359514146?l=www.matthewtonkin.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.matthewtonkin.com/2008/12/novamind-review.html</link><author>noreply@blogger.com (Matthew Tonkin)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_FxLcWB2XDzw/SXbEjcrpHvI/AAAAAAAAABU/Fkmg7h3L0wI/s72-c/Picture+2.png' height='72' width='72'/><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-1581168319252833615.post-6999886713001987059</guid><pubDate>Mon, 15 Dec 2008 20:00:00 +0000</pubDate><atom:updated>2009-01-18T23:16:46.159-08:00</atom:updated><title>Business Graduation (after 6 years of pain)</title><description>&lt;div&gt;In 2003 I started studying for a Bachelor of Business in Management of Information Systems part time at the University of South Australia.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;6 years later (yesterday) I finally finished it.... phew.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Why did I do it?&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;I've worked for some really good people and I've worked for some really average ones too.&lt;/div&gt;&lt;div&gt;The &lt;span class="Apple-style-span" style="font-style: italic; "&gt;Peter Principal&lt;/span&gt; is that people are good at there job and get promoted until they are out of their depth and bad at their jobs.  Therefore if the system were left to stabilise, everyone would be bad at their jobs (theoretically).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I've worked for Engineers who made bad Business decisions.&lt;/div&gt;&lt;div&gt;I've worked for Businessmen who made bad Engineering decisions.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So rather than being the former, I decided a Business degree would be a good addition.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;What did I learn?&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Well it's hard to put my finger on because I've used so much of it.  No, really.  I actually used that stuff.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What made it effective was that I learnt whilst I working, so I actually got to implement a lot of it soon after the learning process, which makes it far more relevant and it actually sticks in your head.  Rather than studying accounting one year and needing it 5 years later, I studied it a few months before I applied it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So when I look back at the course list I see stuff I now use everyday and couldn't imagine being able to do my job correctly without that background.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- Contract Law&lt;/div&gt;&lt;div&gt;- Communication and Media&lt;/div&gt;&lt;div&gt;- Business Information Systems&lt;/div&gt;&lt;div&gt;- Work and Organisation&lt;/div&gt;&lt;div&gt;- Statistical Analysis in Business&lt;/div&gt;&lt;div&gt;- Business Application Programming (OK - I didn't learn much in that one)&lt;/div&gt;&lt;div&gt;- Database Design&lt;/div&gt;&lt;div&gt;- Accounting, Decisions and Accountability&lt;/div&gt;&lt;div&gt;- Marketing Principles: Trading and Exchange&lt;/div&gt;&lt;div&gt;- Economic Principles&lt;/div&gt;&lt;div&gt;- Systems Development Methods&lt;/div&gt;&lt;div&gt;- Fundamentals of Information Technology (Helped raise my GPA)&lt;/div&gt;&lt;div&gt;- World Wide Web Development&lt;/div&gt;&lt;div&gt;- Introduction to e-Business&lt;/div&gt;&lt;div&gt;- Information Systems Project Management&lt;/div&gt;&lt;div&gt;- Contemporary Issues in Information Systems&lt;/div&gt;&lt;div&gt;- Enterprise Resource Planning (ERP) using SAP&lt;/div&gt;&lt;div&gt;- Mobile Enterprise&lt;/div&gt;&lt;div&gt;- Information Technology Strategy and Management&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What's really cool is that I didn't have to wait until I graduated for my employers to appreciate the extra layer of skills.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1581168319252833615-6999886713001987059?l=www.matthewtonkin.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.matthewtonkin.com/2008/12/business-graduation-after-6-years-of.html</link><author>noreply@blogger.com (Matthew Tonkin)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-1581168319252833615.post-6793696776677628364</guid><pubDate>Wed, 05 Nov 2008 20:00:00 +0000</pubDate><atom:updated>2009-01-18T22:44:37.322-08:00</atom:updated><title>Beyond the Backyard - Radio Interview</title><description>Beyond the Backyard is ABC Adelaide's regular Tuesday Morning slot where they interview South Australian expats, working overseas.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This week it was yours truly.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Listen to it here: &lt;a href="http://blogs.abc.net.au/sa/2008/11/beyond-the-back.html"&gt;http://blogs.abc.net.au/sa/2008/11/beyond-the-back.html&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1581168319252833615-6793696776677628364?l=www.matthewtonkin.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.matthewtonkin.com/2008/11/beyond-backyard.html</link><author>noreply@blogger.com (Matthew Tonkin)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-1581168319252833615.post-154301426391584545</guid><pubDate>Wed, 23 Jul 2008 19:00:00 +0000</pubDate><atom:updated>2009-09-13T10:45:47.960-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>cocoa</category><title>Another UniSA chat about Mac development (7th August 08)</title><description>Fresh from my latest junket to WWDC (Apple's World Wide Developers Conference) in San Francisco (thanks to the &lt;a href="http://www.auc.edu.au/"&gt;Apple University Consortium&lt;/a&gt;), I'll be talking up the wondrous world of &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Mac Development&lt;/span&gt; at the U&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;niversity of South Australia&lt;/span&gt;, but this time at the Mawson Lakes campus.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It's open to all University of South Australia students and I'll be covering both development of &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Mac OS X&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt; and iPhone&lt;/span&gt; applications (truth be known they're extremely similar to develop for, but splitting them makes me sound multi-talented).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It'll be held at....&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;University of South Australia&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Thursday 7th August - 12:00pm to 1:00pm&lt;/div&gt;&lt;div&gt;GP Building, Room 12 (Mawson Lakes Campus)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_FxLcWB2XDzw/SXQfT6SJjAI/AAAAAAAAABA/2kUZaMi-AgI/s1600-h/Mawson.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 274px;" src="http://3.bp.blogspot.com/_FxLcWB2XDzw/SXQfT6SJjAI/AAAAAAAAABA/2kUZaMi-AgI/s400/Mawson.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5292889888990530562" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1581168319252833615-154301426391584545?l=www.matthewtonkin.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.matthewtonkin.com/2008/07/another-unisa-chat-about-mac.html</link><author>noreply@blogger.com (Matthew Tonkin)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_FxLcWB2XDzw/SXQfT6SJjAI/AAAAAAAAABA/2kUZaMi-AgI/s72-c/Mawson.png' height='72' width='72'/><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-1581168319252833615.post-5384082437460632857</guid><pubDate>Fri, 18 Jul 2008 19:00:00 +0000</pubDate><atom:updated>2009-01-18T22:04:31.383-08:00</atom:updated><title>Measuring a Software Engineer</title><description>&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Can you measure an software engineer by a code sample?&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;A crazy old chinese electrical engineer (picture Gizmo's original owner in Gremlins) told me once that:&lt;span class="Apple-style-span" style="font-style: italic;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;"An Engineer is a man who can do for 20 cents what other men can do for $20"&lt;/span&gt;&lt;/span&gt;.&lt;div&gt;&lt;div&gt;(You'll have to excuse the dominant male political incorrectness - it was the 80's).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Much of Software Engineering is the careful balance of resources (input) and code (output).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So you might have written the perfect class, but if you took a week to do it, then you've probably failed regardless.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt; So how do you measure a Software Engineer - in my opinion you weigh up a few variables...&lt;/div&gt;&lt;div&gt;- Code&lt;/div&gt;&lt;div&gt;- Time&lt;/div&gt;&lt;div&gt;- Additional resources consumed&lt;/div&gt;&lt;div&gt;- Stability&lt;/div&gt;&lt;div&gt;- Performance&lt;/div&gt;&lt;div&gt;- Abstraction, Modularity and Re-deployability&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1581168319252833615-5384082437460632857?l=www.matthewtonkin.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.matthewtonkin.com/2008/07/measuring-software-engineer.html</link><author>noreply@blogger.com (Matthew Tonkin)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-1581168319252833615.post-4796682302471048677</guid><pubDate>Mon, 12 May 2008 19:00:00 +0000</pubDate><atom:updated>2009-09-13T10:45:42.493-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>cocoa</category><title>Revelation in Open Source contributions</title><description>I have drawn on open source software a LOT, not just to avoid coding, but to learn about how other developers write their code, best practices and tricks other developers use.  In many respects code samples and open source classes are my mentors, because it's kinda tough to find a good Cocoa teacher (I asked Aaron Hillegass to move into the garage space below my house, but he said no - actually he said &lt;span class="Apple-style-span" style="font-style: italic;"&gt;"Stop doing that to my hat and get out of my apartment or I'm calling the police"&lt;/span&gt;, which was a wake-up call that I may have overstepped a boundary).&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Getting back to the point, I've drawn on &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Matt Gemmell&lt;/span&gt;'s &lt;a href="http://mattgemmell.com/"&gt;http://mattgemmell.com&lt;/a&gt; code on more than one occasion.  He has some really great stuff on his site that you can borrow, modify, worship....whatever.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;When you find a decent modification&lt;/span&gt; and add an enhancement to someone's existing open source code, then &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;it's y&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;our responsibility to share&lt;/span&gt; so that others can learn (or pilfer) from your stuff - just as you have done.  If you don't then you've failed all the other code kiddies that follow you and you can potentially cause irreparable damage to the space time continuum (OK, &lt;span class="Apple-style-span" style="font-style: italic;"&gt;maybe&lt;/span&gt; I'm overstating it somewhat).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;The Point...&lt;/span&gt;&lt;/div&gt;&lt;div&gt;How do you do this though?  How do you contribute your mediocre code to that awesome class some guy posted on his blog?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Well there's a simple solution that might seem antiquated in a time of Web 2.0 and SVN, but it actually works.  You place a light bulb above your head and &lt;span class="Apple-style-span" style="font-weight: bold; "&gt;email the guy your code&lt;/span&gt;.  If they like it enough they might even update their code accordingly.  Crazy.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;How did I discover this incredible revelation - I emailed Matt Gemmell with my code modifications to one of his classes and he updated his and reposted it.  Awesome.  See here: &lt;a href="http://mattgemmell.com/2008/05/12/imagecrop-updated"&gt;http://mattgemmell.com/2008/05/12/imagecrop-updated&lt;/a&gt;&lt;/div&gt;&lt;div&gt;for results.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1581168319252833615-4796682302471048677?l=www.matthewtonkin.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.matthewtonkin.com/2008/05/revelation-in-open-source-contributions.html</link><author>noreply@blogger.com (Matthew Tonkin)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-1581168319252833615.post-3963691132716429576</guid><pubDate>Fri, 04 Apr 2008 19:00:00 +0000</pubDate><atom:updated>2009-09-13T10:45:35.805-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>cocoa</category><title>Mac Development "Chat" at Adelaide University</title><description>I've been invited to speak words of wisdom about what it's like to develop software for the Mac at Adelaide University.  So as not to mislead anyone about what I'll be doing, please replace the words "speak words of wisdom" with "rant and rave".&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'll cover the good, bad and ugly sides of Mac development from both a technical and business perspective.  Naturally the good bit will take up about 90% of the time (otherwise I would have sought an alternative career as a fish monger, moved to Russia and changed my name to Mattski Tonkowski).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Apple's shiny new Systems Engineer, Patrick Tehvand will be in attendance, so you can ask him how your Leopard Server Xgrid Cluster can be better load balanced (or whatever other geeked out IT Systems questions float your boat).&lt;/div&gt;&lt;div&gt;As always Apple's not so new (but still shiny) BDM, Greg Egan will also be attending.&lt;br /&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Both Adelaide University and University of South Australia students are invited to attend.&lt;/div&gt;&lt;div&gt;If you fall into one of those categories and are interested in attending here are the details...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;University of Adelaide&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Friday 11th April 2008 - 12:10pm to 1:10pm&lt;/div&gt;&lt;div&gt;Room 2060 - Computer Science Building (North Terrace Adelaide)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_FxLcWB2XDzw/SXQMJkR7IBI/AAAAAAAAAA4/4SEBkjq3w6s/s1600-h/Adelaide+Uni.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 274px;" src="http://4.bp.blogspot.com/_FxLcWB2XDzw/SXQMJkR7IBI/AAAAAAAAAA4/4SEBkjq3w6s/s400/Adelaide+Uni.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5292868820564385810" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1581168319252833615-3963691132716429576?l=www.matthewtonkin.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.matthewtonkin.com/2008/04/mac-development-chat-at-adelaide.html</link><author>noreply@blogger.com (Matthew Tonkin)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_FxLcWB2XDzw/SXQMJkR7IBI/AAAAAAAAAA4/4SEBkjq3w6s/s72-c/Adelaide+Uni.png' height='72' width='72'/><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-1581168319252833615.post-3045663537052593908</guid><pubDate>Tue, 12 Feb 2008 20:00:00 +0000</pubDate><atom:updated>2009-01-18T20:43:52.256-08:00</atom:updated><title>MEGA</title><description>Mobile Enterprise Growth Alliance - &lt;a href="http://www.mega.org.au/"&gt;http://www.mega.org.au&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'm lucky enough to be participating in the MEGA program this year.  The opportunity came up through the course I'm studying externally at UniSA (Bachelor of Business, Management of Information Systems).  It only counts for 1 subject, and I'm fairly sure it'll be a lot more work than if I took the easy road and signed up for an elective in lawn mowing or something, but there are a few things about this course that grabbed my attention....&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Firstly,&lt;/span&gt; I'll get to learn about an emerging / growing industry (Mobile apps)...&lt;/div&gt;&lt;div&gt;I'm sure I can knock out a mobile app (I've cranked out a few iPhone / iPod touch apps already using the iPhone SDK).... but I think there's more to it than that - like the business and feasibility aspects of mobile applications.  It's not the desktop (an established industry), it's very new.  As per normal, I'm sure Apple will throw a spanner into the works of the incumbent mobile applications market, but it doesn't help to know from the experts what the existing challenges were before Apple stepped into the arena.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Secondly,&lt;/span&gt;  the program is taught by industry guru's not people who are haven't left university.  Not surprising I suppose - UniSA support it and often use industry types rather than career academics (that's why I like them).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Course Format&lt;/span&gt; - Incase you're interested in doing it too....&lt;div&gt;Team Building and Orientation 1 (Feb 19th)&lt;br /&gt;Team Building and Orientation 2   (Feb 26th)&lt;br /&gt;Workshop 1: Market Analysis 1 (March 5th)&lt;br /&gt;Workshop 2: Market Analysis 2 (March 12th)&lt;br /&gt;Workshop 3: Idea Generation 1 (March 18th)&lt;br /&gt;Workshop 4: Idea Generation 2 (March 19th)&lt;br /&gt;Workshop 5: Tech Test 1 (April 8th)&lt;br /&gt;Workshop 6: Tech Test 2 (April 9th)&lt;br /&gt;Workshop 7: Feasibility 1 (April 22nd)&lt;br /&gt;Workshop 8: Feasibility 2 (April 23rd)&lt;br /&gt;Workshop 9: Feasibility Panel (April 30th)&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1581168319252833615-3045663537052593908?l=www.matthewtonkin.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.matthewtonkin.com/2008/02/mega.html</link><author>noreply@blogger.com (Matthew Tonkin)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-1581168319252833615.post-5428635517899706193</guid><pubDate>Sun, 02 Sep 2007 19:00:00 +0000</pubDate><atom:updated>2009-09-13T10:45:26.849-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>cocoa</category><title>Categories are cool</title><description>Perhaps not cool in the Samuel L Jackson sense, but categories are damn cool in the ‘holy cow I can extend something without replacing the class’ sense....if that is indeed a sense.&lt;br /&gt;&lt;br /&gt;Class categories are a way of adding functionality to a an existing class where you don’t need additional instance variables.&lt;br /&gt;&lt;br /&gt;If your new functionality needs instance variables, then subclassing is the go, but there is no need to subclass unless you're adding instance variables or override existing methods.  Instead adding a class category will mean that you don’t have to worry about refactoring your existing code to use the new functionality.  This is really handy where the original class is not your own.&lt;br /&gt;&lt;br /&gt;Let’s have a look at a Cocoa Objective C example.  NSXMLElement represents and XML Node and currently has a the following method.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_FxLcWB2XDzw/SXP8DM0W4JI/AAAAAAAAAAY/WilVGv2ygDY/s1600-h/shapeimage_2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 180px;" src="http://4.bp.blogspot.com/_FxLcWB2XDzw/SXP8DM0W4JI/AAAAAAAAAAY/WilVGv2ygDY/s400/shapeimage_2.png" alt="" id="BLOGGER_PHOTO_ID_5292851119001100434" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The problem with this is that we have a lot of circumstances where we don’t want an array, just the first element with that name (if there is one). NSXMLElement doesn’t currently provide this functionality, so instead, each time we wanted the first element with that name we’d need to get an array using ‘elementsForName:’ then check to see that it has some elements, then get the first one. Rather than do all that, let’s just add a new method to NSXMLElement to give us this functionality without needing to do all this extra work each time we need it.&lt;br /&gt;&lt;br /&gt;First, we start with a header:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_FxLcWB2XDzw/SXP8QTOt0xI/AAAAAAAAAAg/gJ54Ggf-vjg/s1600-h/shapeimage_3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 141px;" src="http://4.bp.blogspot.com/_FxLcWB2XDzw/SXP8QTOt0xI/AAAAAAAAAAg/gJ54Ggf-vjg/s400/shapeimage_3.png" alt="" id="BLOGGER_PHOTO_ID_5292851344060568338" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Notice that there is no variables section.  If you add the {} then it won’t compile.&lt;br /&gt;&lt;br /&gt;Then we add the source:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_FxLcWB2XDzw/SXP8aYlgUCI/AAAAAAAAAAo/RSTEQT7sZs0/s1600-h/shapeimage_4.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 207px;" src="http://3.bp.blogspot.com/_FxLcWB2XDzw/SXP8aYlgUCI/AAAAAAAAAAo/RSTEQT7sZs0/s400/shapeimage_4.png" alt="" id="BLOGGER_PHOTO_ID_5292851517297020962" border="0" /&gt;&lt;/a&gt;Maybe not groundbreaking stuff, but handy none the less.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1581168319252833615-5428635517899706193?l=www.matthewtonkin.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.matthewtonkin.com/2007/09/categories-are-cool.html</link><author>noreply@blogger.com (Matthew Tonkin)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_FxLcWB2XDzw/SXP8DM0W4JI/AAAAAAAAAAY/WilVGv2ygDY/s72-c/shapeimage_2.png' height='72' width='72'/><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-1581168319252833615.post-1293302250488637399</guid><pubDate>Tue, 14 Aug 2007 19:00:00 +0000</pubDate><atom:updated>2009-09-13T10:45:22.405-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>cocoa</category><title>Cocoa Talk UniSA / Adelaide Uni 24th August 2007</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_FxLcWB2XDzw/SXOXGf0f8MI/AAAAAAAAAAM/v6qBlH6J7Nk/s1600-h/UniSA.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 211px;" src="http://2.bp.blogspot.com/_FxLcWB2XDzw/SXOXGf0f8MI/AAAAAAAAAAM/v6qBlH6J7Nk/s400/UniSA.png" alt="" id="BLOGGER_PHOTO_ID_5292740124967170242" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I’ll be giving a presentation to UniSA &amp;amp; Adelaide Uni staff and students on Cocoa Development. Hopefully I can share some words of wisdom (by wisdom I mean talk about some things I did wrong) to help you get started with Cocoa / Objective-C and all its goodness.&lt;br /&gt;&lt;br /&gt;It’s open to all UniSA and Adelaide University staff and students (and includes lunch thanks to the Apple University Consortium). If you’re thinking about Cocoa development (or sandwiches) then feel free to join us.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Date:&lt;/span&gt; Friday 24th August&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Time:&lt;/span&gt; 12.30 to 1.30&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Location:&lt;/span&gt; BJ1-13 [Bonython Jubilee Building] City East Campus, University of South Australia&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;RSVP:&lt;/span&gt; Please email &lt;a href="http://www.auc.edu.au/Contact+Us"&gt;Tim Sawyer&lt;/a&gt; if attending for catering purposes&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Agenda:&lt;/span&gt;&lt;br /&gt;Mac OS X development overview&lt;br /&gt;What is Cocoa / Objective-C&lt;br /&gt;Why Cocoa / Objective-C&lt;br /&gt;The Frameworks&lt;br /&gt;Anatomy of an Objective-C class&lt;br /&gt;How to get started&lt;br /&gt;Tips and Tricks (AKA: Mistakes I made)&lt;br /&gt;Good Resources (Online / Print / Open Source)&lt;br /&gt;The Apple University Consortium&lt;br /&gt;Mac developers in Australia&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1581168319252833615-1293302250488637399?l=www.matthewtonkin.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.matthewtonkin.com/2007/08/cocoa-talk-unisa-adelaide-uni-24th.html</link><author>noreply@blogger.com (Matthew Tonkin)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_FxLcWB2XDzw/SXOXGf0f8MI/AAAAAAAAAAM/v6qBlH6J7Nk/s72-c/UniSA.png' height='72' width='72'/><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-1581168319252833615.post-268436978866815030</guid><pubDate>Sat, 04 Aug 2007 19:00:00 +0000</pubDate><atom:updated>2009-09-13T10:45:17.766-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>cocoa</category><title>Open Source Cocoa Frameworks and Classes</title><description>Apple has a LOT of stuff in their frameworks, but there’s always something else you need. You always want more. It’s never enough that those boys and girls in Cupertino are working their fingers to the bone to provide you with development tools. FINE.&lt;br /&gt;&lt;br /&gt;If you need to go out for burgers when you’re not getting steak at home, here are some of my favorite burger joints....&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;OmniGroup:&lt;/span&gt; Subclasses and Categories for all your favorite Cocoa objects. There’s more stuff there than I care to discuss. Seriously, loads and loads of it. Well tested and rock solid.&lt;br /&gt;http://www.omnigroup.com/developer/&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;iMediaBrowser:&lt;/span&gt; Need a media browser for integrating with those pesky iLife apps. This one is just like the one used in the Apple apps (which they refuse to share - tsk tsk).&lt;br /&gt;http://imedia.karelia.com&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Karelia:&lt;/span&gt; Useful bits and bobs. I liken this site to that drawer below the sharp knifes but above the tea towels and glad wrap. The one with the string, glue, strips of velcro, a D-cell battery and other crap that you can never find when you are looking for it, but can always find when you’re not. BIG kudos to these guys on all their iMediaBrowser work.&lt;br /&gt;http://cocoa.karelia.com/&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Aquatic Prime:&lt;/span&gt; Some kind of registration framework. I haven’t actually used it, but I have drawn on some of their classes for simple tools. There’s a really cool NSData Encryption category. Niiiiiice...... (insert Borat accent here).&lt;br /&gt;http://aquaticmac.com/&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Infinite Loop:&lt;/span&gt; Crash Reporter that can send your crash reports to a designated email address. You get the stack trace and console log and everything (actually just the stack trace and console log).&lt;br /&gt;http://www.infinite-loop.dk/developer/&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Rainer Brockerhoff:&lt;/span&gt; RBSplitView is a great alternative to NSSplitView (you know, the thing that separates your inbox list from the mail preview). It’s like Apple’s own but on serious roids.&lt;br /&gt;http://www.brockerhoff.net/&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Matt ‘Legend’ Gemmell:&lt;/span&gt; A few cool bits and pieces including a HUD window and a much prettier NSBox.&lt;br /&gt;http://mattgemmell.com/source/&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;PSM Tab Bar Control:&lt;/span&gt; Safari style tabs (with more features). Used in Adium.&lt;br /&gt;http://www.positivespinmedia.com/dev/PSMTabBarControl.html&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;MUPhotoView (Blake Seely):&lt;/span&gt; iPhoto style photo grid (used in iMediaBrowser)&lt;br /&gt;http://blakeseely.com/subversion.html&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1581168319252833615-268436978866815030?l=www.matthewtonkin.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.matthewtonkin.com/2007/08/open-source-cocoa-frameworks-and.html</link><author>noreply@blogger.com (Matthew Tonkin)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-1581168319252833615.post-8138142681215817167</guid><pubDate>Sun, 15 Jul 2007 19:00:00 +0000</pubDate><atom:updated>2009-09-13T10:45:12.056-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>cocoa</category><title>Why Cocoa</title><description>In Mac OS X you can use any number of development languages including C, C++, Open GL, Ruby and probably some others I forget about. These options are handy to have, but it’s not really any different to developing using these same languages on another platform (one that could target a lot more users).&lt;br /&gt;&lt;br /&gt;The Business Advantage of developing in Mac OS X is Cocoa and Objective C, mostly because you get a whole lot of stuff for free. Low level things you don’t need to care about any more. Things that are a headache on other platforms.&lt;br /&gt;&lt;br /&gt;There is an infinite number of possibilities for software development and they fall into a few categories:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Stupid Software...&lt;/span&gt; Shouldn’t be developed no matter how cheap it is&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Brilliant Software...&lt;/span&gt; Should be developed no matter what the cost&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Infeasible* Software...&lt;/span&gt; Perhaps a good idea, but a (cost-benefit)*risk analysis indicates that it’s not feasible&lt;br /&gt;&lt;br /&gt;Infeasible software is the most interesting.  What wasn’t feasible last year might just be feasible today, and that’s because companies like Apple invest a lot of time in taking away the headaches of development, so we can focus on our business problem and develop great software on the cheap.&lt;br /&gt;&lt;br /&gt;What’s feasible on the Mac isn’t necessarily feasible on other platforms, which makes it exciting. It’s particularly exciting when you consider Agile development practices and exploring ideas. If you can explore an idea without breaking the bank, your much more likely to find something that works, and when you do, bring it back to other platforms perhaps.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;What? You want an example?&lt;/span&gt;&lt;br /&gt;Ok, here’s something really small. In Mac OS X you can create a custom view that draws stuff for your app and in 1 line of code you can convert it to a chunk of PDF data. 1 lousy line.&lt;br /&gt;It’s a small thing, but it could mean the difference between your app outputting a beautiful, small, scalable PDF file and some ugly JPG. It might just make the difference between an idea that progresses and one that gets canned.&lt;br /&gt;&lt;br /&gt;Still not impressed? Fair enough, it’s a fairly rudimentary example and it’s been in Mac OS X since the beginning. There’s much more exciting (but long winded) examples in newer frameworks such as CoreData, CoreImage and QuartzComposer.&lt;br /&gt;&lt;br /&gt;*Infeasible isn’t actually a word, but for todays purposes let’s pretend it is and means the opposite to feasible&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1581168319252833615-8138142681215817167?l=www.matthewtonkin.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.matthewtonkin.com/2007/07/why-cocoa.html</link><author>noreply@blogger.com (Matthew Tonkin)</author><thr:total>0</thr:total></item></channel></rss>
