<?xml version="1.0" encoding="utf-8" ?>

<rss version="2.0" 
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:admin="http://webns.net/mvcb/"
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
   xmlns:wfw="http://wellformedweb.org/CommentAPI/"
   xmlns:content="http://purl.org/rss/1.0/modules/content/"
   >
<channel>
    <title>Feelin' Fine - Apple</title>
    <link>http://blog.proculo.de/</link>
    <description>Macs &amp; more</description>
    <dc:language>en</dc:language>
    <admin:errorReportsTo rdf:resource="mailto:lex@proculo.de" />
    <generator>Serendipity 1.2.1 - http://www.s9y.org/</generator>
    
    <image>
        <url>http://blog.proculo.de/templates/default/img/s9y_banner_small.png</url>
        <title>RSS: Feelin' Fine - Apple - Macs &amp; more</title>
        <link>http://blog.proculo.de/</link>
        <width>100</width>
        <height>21</height>
    </image>

<item>
    <title>Why User Experience is Important</title>
    <link>http://blog.proculo.de/archives/185-Why-User-Experience-is-Important.html</link>
            <category>Development</category>
    
    <comments>http://blog.proculo.de/archives/185-Why-User-Experience-is-Important.html#comments</comments>
    <wfw:comment>http://blog.proculo.de/wfwcomment.php?cid=185</wfw:comment>

    <slash:comments>5</slash:comments>
    <wfw:commentRss>http://blog.proculo.de/rss.php?version=2.0&amp;type=comments&amp;cid=185</wfw:commentRss>
    

    <author>alexander.repty@mac.com (Alexander Repty)</author>
    <content:encoded>
    &lt;p&gt;Recently, &lt;a href=&quot;http://mark.wadham.me/&quot;&gt;Mark Wadham&lt;/a&gt; dumped his iPhone 4 in favour of an Android-based phone, the HTC Desire S and &lt;a href=&quot;http://mark.wadham.me/blog/2011/04/03/thoughts-on-switching-to-android/&quot;&gt;wrote a blog post&lt;/a&gt; about his switching experience.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Overall, he really seems to like his new phone, but he also lists a number of shortcomings compared to the iPhone. I noticed that one particular complaint stood out amongst the others, and Mark tried to play it down a little:&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;&lt;blockquote&gt;While certainly not bad, the UI clearly wasnt designed by the UX experts at Apple and I spotted a number of irritating inconsistencies and unintuitive aspects of the ui.&lt;/blockquote&gt;&lt;br /&gt;
&lt;blockquote&gt;Its hard to gauge just how much of this is simply me being used to iOS, but there is definitely some room for improvement of the user experience.  I think if the UX guys at work tried this phone they would find it quite irritating to use.&lt;/blockquote&gt;&lt;br /&gt;
&lt;blockquote&gt;To disable [haptic keyboard feedback] I had to turn off two settings in completely different parts of the menu. yeah, people into UX shouldnt get this phone &lt;/blockquote&gt;&lt;br /&gt;
&lt;blockquote&gt;Its not as fun to use as an iPhone, and if youre a real UX freak you should probably stick with the iPhone at least for now&lt;/blockquote&gt;&lt;br /&gt;
&lt;blockquote&gt;Despite the lesser UI experience, I actually like Android, mostly because of the freedom.&lt;/blockquote&gt;&lt;br /&gt;
&lt;blockquote&gt;[The Android phone is] missing the cleanness of the user experience, consistency in the user interface []&lt;/blockquote&gt;&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Overlooking the irony that Mark switched to Android because it&#039;s more &quot;open&quot; than iOS, he apparently thinks only &quot;UX freaks&quot; would care about the user experience, which couldn&#039;t be more wrong. We are all users, which is why we all care about user experience (except maybe for &lt;a href=&quot;http://twitter.com/evilmattgemmell&quot;&gt;@evilmattgemmell&lt;/a&gt;).&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Perhaps only a user experience expert can pinpoint what exactly is distracting or imperfect about a device&#039;s user experience, but those shortcomings are certainly going to annoy all users. If your device or software (or any other kind of product really) annoys your users, you have utterly failed in designing something worthwhile. A simple &quot;usable&quot; doesn&#039;t cut it.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Tue, 05 Apr 2011 15:04:13 +0200</pubDate>
    <guid isPermaLink="false">http://blog.proculo.de/archives/185-guid.html</guid>
    
</item>
<item>
    <title>On Going Indie</title>
    <link>http://blog.proculo.de/archives/184-On-Going-Indie.html</link>
            <category>Development</category>
    
    <comments>http://blog.proculo.de/archives/184-On-Going-Indie.html#comments</comments>
    <wfw:comment>http://blog.proculo.de/wfwcomment.php?cid=184</wfw:comment>

    <slash:comments>12</slash:comments>
    <wfw:commentRss>http://blog.proculo.de/rss.php?version=2.0&amp;type=comments&amp;cid=184</wfw:commentRss>
    

    <author>alexander.repty@mac.com (Alexander Repty)</author>
    <content:encoded>
    &lt;p&gt;Today is my last day as an employee at &lt;a href=&quot;http://www.enough.de/&quot;&gt;Enough Software&lt;/a&gt; and as of tomorrow, I will be independent. Hopefully this means I&#039;ll get to spend more time working on iOS and Mac projects of my own, but especially in the early stages of my new-found freedom, I will do a lot of contracting to cover the bills and make enough money to pay for our upcoming wedding (in September) and our honeymoon (January 2012).&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Over the years, I got to work on a number of exciting projects (such as &lt;a href=&quot;http://itunes.apple.com/de/app/s-banking-mobile-banking-mit/id320596872?mt=8&quot;&gt;S-Banking&lt;/a&gt;, which was #1 in the German App Store for quite some time and was even featured in one of Apple&#039;s TV commercials in Germany) at Enough Software, and I&#039;ll really miss the place and my co-workers. There are a lot of talented and bright people working here (including the best boss in the world), and transitioning from working at an office to working from home won&#039;t be easy. I&#039;ll also miss downtown Bremen, which is an awesome place to work - everything is so close!&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;On the other hand, I already have the best co-workers in the world, on Twitter. &lt;a href=&quot;http://speirs.org/&quot;&gt;Fraser Speirs&lt;/a&gt; once said that Twitter is like an office for the self-employed, and I couldn&#039;t agree more. Before Twitter, it would have been harder for me to take this step. I am pretty certain that I would feel that my fiancé, Maxie, and I were going through this alone and that no-one could possibly relate to what we&#039;re doing. With Twitter, I know there are dozens of others who have made the same experience or are doing it right now. When I &lt;a href=&quot;http://twitter.com/#!/arepty/status/52667619840495616&quot;&gt;tweeted about my last day as an employee&lt;/a&gt;, I got over 50 people congratulating me and wishing me good luck in my future endeavours in a matter of hours. People were even complaining (jokingly, I hope) that their timeline consisted of nothing but people congratulating me. If this isn&#039;t the right place and the right time, what is?&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;I am really excited about the upcoming changes, but of course, as with any life-altering decisions, I am also a little scared. It might all backfire and I might be looking for a new permanent position in a few months. I am hoping that my skills as an Objective-C developer are sufficient, so this hopefully won&#039;t happen. But there are just too many variables in a situation like this and it might not depend solely on my abilities.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;I&#039;m already working on a new iPhone app which I&#039;ll hopefully be able to tell you more about in a few weeks. I also have just started a contracting gig for a well-known Cocoa developer here in Germany, so my bases for the beginning should be covered. I also have a half-finished update for &lt;a href=&quot;http://foliocaseapp.com/&quot;&gt;Folio Case&lt;/a&gt;, which needs just a little fine-tuning, localization and beta testing before it&#039;s ready to go out. Looks like there won&#039;t be a shortage of projects for a while. :-)&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;In the end, working on my own means that I will enjoy a lot more freedom than I used to have. I will have a say in which projects I will do, and which projects I won&#039;t do. If the market stays the way it is, this might mean that I will get to try new things and even have my input on UI and UX valued - which isn&#039;t always the case when you&#039;re contracting. It means letting go of a steady income, which is something I will have to adjust to, but I am pretty certain that eventually, it will be worth it from a financial perspective - not to mention my personal happiness.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Today is my last day as an employee. Tomorrow, I will be an indie.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Tue, 29 Mar 2011 14:45:49 +0200</pubDate>
    <guid isPermaLink="false">http://blog.proculo.de/archives/184-guid.html</guid>
    
</item>
<item>
    <title>Useful iOS Libraries and Classes</title>
    <link>http://blog.proculo.de/archives/183-Useful-iOS-Libraries-and-Classes.html</link>
            <category>Development</category>
    
    <comments>http://blog.proculo.de/archives/183-Useful-iOS-Libraries-and-Classes.html#comments</comments>
    <wfw:comment>http://blog.proculo.de/wfwcomment.php?cid=183</wfw:comment>

    <slash:comments>1</slash:comments>
    <wfw:commentRss>http://blog.proculo.de/rss.php?version=2.0&amp;type=comments&amp;cid=183</wfw:commentRss>
    

    <author>alexander.repty@mac.com (Alexander Repty)</author>
    <content:encoded>
    Unless you suffer from &lt;a href=&quot;http://en.wikipedia.org/wiki/Not_Invented_Here&quot;&gt;Not Invented Here Syndrome&lt;/a&gt;, you most likely enjoy using open source iOS code that other developers share via &lt;a href=&quot;https://github.com/&quot;&gt;github&lt;/a&gt; (or other places) as much as I do. Whenever I see a useful new piece of code, be it a whole library or just a simple class, I immediately want to check out how it works and begin to think about how and where I can use it in an actual project. In other cases, I have a particular problem that I need a solution for and I may check to see whether I can find something suitable which already solved that particular problem. Then there&#039;s also the case where I develop a solution and open-source it for everyone to use.&lt;br /&gt;
&lt;br /&gt;
Over the past few weeks, I compiled a list of what I think are useful and/or interesting open source iOS libraries/classes, focussing solely on components that provide some sort of drop-in UI and leaving out anything that doesn&#039;t require linking against UIKit. If there is enough interest, I may write another blog post on non-UI components in the future.&lt;br /&gt;
&lt;br /&gt;
So, without further ado, here are some components that can be useful in one of your next iOS projects, or which you simply might find interesting to play around with. Some of these are well known, but hopefully you&#039;ll find something you didn&#039;t know existed. &lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;a href=&quot;http://three20.info/&quot;&gt;Three20&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Three20 is an open-source Objective-C library, originally developed by &lt;a href=&quot;http://joehewitt.com/&quot;&gt;Joe Hewitt&lt;/a&gt; as part of &lt;a href=&quot;https://github.com/facebook/facebook-ios-sdk&quot;&gt;Facebook Connect for iPhone&lt;/a&gt;. Three20 is probably the most well-known 3rd party library for iOS development and is in use in numerous popular iOS apps, such as &lt;a href=&quot;http://itunes.apple.com/us/app/facebook/id284882215?mt=8&quot;&gt;Facebook&lt;/a&gt;, &lt;a href=&quot;http://itunes.apple.com/us/app/posterous/id394252521?mt=8&quot;&gt;Posterous&lt;/a&gt; and &lt;a href=&quot;http://itunes.apple.com/us/app/pulse-news-reader/id371088673?mt=8&quot;&gt;Pulse&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
The library uses modular design, so developers can choose which parts of the library to use in their own projects, or develop extensions on their own.&lt;br /&gt;
&lt;br /&gt;
Among the things the library offers is a launcher which resembles the standard SpringBoard on Apple&#039;s iOS devices. Three20&#039;s URL-based navigation all across the app brings with it persistence, to ensure a smooth user experience even if the app was terminated while in the background.&lt;br /&gt;
&lt;br /&gt;
One of the most popular components is the photo viewer, which uses the standard datasource pattern to mimick the user interface of Apple&#039;s own Photos app. The message composer emulates Apple&#039;s Mail app to send any kind of message and is completely customizable, including autocompletion of recipient names, based on a data source you provide.&lt;br /&gt;
&lt;br /&gt;
There are also a number of clever components to facilitate the use of remote content in your app, such as an image view which takes a URL as a parameter and loads and displays the content by itself and a similar class for a table view. This is useful in a lot of cases and can vastly reduce the amount of glue code a developer has to produce.&lt;br /&gt;
&lt;br /&gt;
Another notable component is the built-in HTTP disk cache, since the default iOS component only uses a RAM cache - and as we all know, RAM is a scarce resource of many iOS devices and its contents will be lost when an app is shut down.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;a href=&quot;http://tapku.com/&quot;&gt;Tapku&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Perhaps the second biggest library after Three20, Tapku also emulates a lot of what Apple has built into their apps that come with iOS, but has left out of the Cocoa Touch APIs. A prominent example of this is Coverflow, which Apple uses in the iPod app when in landscape orientation. I&#039;ve used Tapku in the past for its calendar component, which closely resembles what Apple uses in their Calendar app.&lt;br /&gt;
&lt;br /&gt;
The library comes with an example project, so you can check out each component before you add the code to your app.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;a href=&quot;http://www.inappsettingskit.com/&quot;&gt;InAppSettingsKit&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
One of the not so strong points of iOS is user-adjustable preferences. The Apple-approved way of dealing with such preferences is to use a settings bundle, which will automatically appear in the Settings app. There are a number of advantages to this approach, such as consistency across application, but it also means that the user has to specifically look out for an entry for your app in Settings in order to make changes - or they have to be told that there is such a possibility, which is plain annoying.&lt;br /&gt;
&lt;br /&gt;
Enter InAppSettingsKit, which allows you to mimic the behaviour and style found in Settings.app inside your own app, based on your settings bundle (although there are customization options). The library provides a uniform experience for your users along with great ease-of-use.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;a href=&quot;http://getsharekit.com/&quot;&gt;ShareKit&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Many people nowadays use social networks as a large part of how they communicate with their friends and relatives, and to find information and entertainment. Users commonly share items they find interesting with their friends on social networking sites, and it can make sense for your app to allow users to easily share things.&lt;br /&gt;
&lt;br /&gt;
This is where ShareKit comes in. It provides an easy method to provide sharing functionality for a number of social networks (such as &lt;a href=&quot;http://www.facebook.com/&quot;&gt;Facebook&lt;/a&gt;, &lt;a href=&quot;http://twitter.com/&quot;&gt;Twitter&lt;/a&gt; and &lt;a href=&quot;http://www.delicious.com/&quot;&gt;Delicious&lt;/a&gt;) plus e-mail. The library&#039;s design is rather smart, to it will only offer those services which support the type of content the user wants to share, such as URLs, images, text or files. It even works offline out of the box and will persistently store items which can then be send when a connection is available.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;a href=&quot;https://github.com/route-me/route-me&quot;&gt;Route-Me&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Route-Me is an open-source replacement for large parts of MapKit, including support for various map sources. As of now, it supports &lt;a href=&quot;http://www.openstreetmap.org/&quot;&gt;OpenStreetMap&lt;/a&gt;, &lt;a href=&quot;http://www.bing.com/maps/&quot;&gt;Microsoft VisualEarth (now Bing Maps)&lt;/a&gt; and &lt;a href=&quot;http://cloudmade.com/&quot;&gt;CloudMade&lt;/a&gt; out of the box. There are classes for various other map sources, such as &lt;a href=&quot;http://maps.yahoo.com/&quot;&gt;Yahoo!&lt;/a&gt;, but those are included only for demonstration purposes and are not intended to be used in an actual application for licensing reasons.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;a href=&quot;https://github.com/TheRealKerni/Hockey&quot;&gt;Hockey&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Ever since iOS 4.0 introduced over-the-air installing, developers have been finding interesting ways to use it, especially to facilitate distribution of ad-hoc builds, which are commonly used for beta testing purposes.&lt;br /&gt;
&lt;br /&gt;
Hockey uses this approach to really make it easy on users to install new versions of apps they offering code for both PHP5-enabled servers and an iOS component which allows for in-app updates, including support for update notifications.&lt;br /&gt;
&lt;br /&gt;
The client library is optional though, so Hockey can also be used for installing and updating apps from Safari.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;a href=&quot;https://github.com/myell0w/MTStatusBarOverlay&quot;&gt;MTStatusBarOverlay&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
In the past few years, we&#039;ve seen a lot of UI innovation come from 3rd party developers, such as &lt;a href=&quot;http://itunes.apple.com/us/app/twitter/id333903271?mt=8&quot;&gt;Tweetie&lt;/a&gt;&#039;s (now Twitter for iPhone) pull to refresh (see &lt;a href=&quot;https://github.com/enormego/EGOTableViewPullRefresh&quot;&gt;EGOTableViewPullRefresh&lt;/a&gt; below) and &lt;a href=&quot;http://reederapp.com/2/&quot;&gt;Reeder&lt;/a&gt;&#039;s status bar overlays that indicate current progress without wasting valuable screen estate.&lt;br /&gt;
&lt;br /&gt;
MTStatusBarOverlay replicates this status bar overlay and makes it easy for developers to implement this kind of behaviour in their own apps, along with extensions such as a detail view that pops out of the status bar.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;a href=&quot;http://blog.proculo.de/archives/182-Using-KVO-to-annotate-UISliders.html&quot;&gt; ARAnnotatedSlider &lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Written by yours truly for &lt;a href=&quot;http://foliocaseapp.com/&quot;&gt;Folio Case&lt;/a&gt;, this is more an example of showing how to use Key-Value-Observing (KVO) in order to react to UI changes than a complete 3rd party library, but it should be able to adopt it for usage in your own apps without too much hassle.&lt;br /&gt;
&lt;br /&gt;
This example allows developers to add a callout view to UISliders, thus giving users direct feedback on their actions in the same place where they are currently focusing on anyway.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;a href=&quot;https://github.com/enormego/EGOTableViewPullRefresh&quot;&gt;EGOTableViewPullRefresh&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Ever since Loren Brichter came up with the pull-to-refresh mechanism in &lt;a href=&quot;http://itunes.apple.com/us/app/twitter/id333903271?mt=8&quot;&gt;Tweetie&lt;/a&gt; (now Twitter for iPhone), other developers have tried to emulate the behaviour. One such implementation is &lt;a href=&quot;http://www.enormego.com/&quot;&gt;enormego&lt;/a&gt;&#039;s EGOTableViewPullRefresh, which comes pretty close to Brichter&#039;s original (sans sound effects).&lt;br /&gt;
&lt;br /&gt;
Cross-posted to the &lt;a href=&quot;http://blog.j2mepolish.org/?p=412&quot;&gt;Enough Software Company Blog&lt;/a&gt;. 
    </content:encoded>

    <pubDate>Mon, 07 Feb 2011 12:01:18 +0100</pubDate>
    <guid isPermaLink="false">http://blog.proculo.de/archives/183-guid.html</guid>
    
</item>
<item>
    <title>Using KVO to annotate UISliders</title>
    <link>http://blog.proculo.de/archives/182-Using-KVO-to-annotate-UISliders.html</link>
            <category>Tutorials</category>
    
    <comments>http://blog.proculo.de/archives/182-Using-KVO-to-annotate-UISliders.html#comments</comments>
    <wfw:comment>http://blog.proculo.de/wfwcomment.php?cid=182</wfw:comment>

    <slash:comments>1</slash:comments>
    <wfw:commentRss>http://blog.proculo.de/rss.php?version=2.0&amp;type=comments&amp;cid=182</wfw:commentRss>
    

    <author>alexander.repty@mac.com (Alexander Repty)</author>
    <content:encoded>
    &lt;div class=&quot;serendipity_imageComment_left&quot; style=&quot;width: 83px&quot;&gt;&lt;div class=&quot;serendipity_imageComment_img&quot;&gt;&lt;a  class=&#039;serendipity_image_link&#039;  rel=&#039;lightbox&#039; href=&#039;http://blog.proculo.de/uploads/FolioCasePaging.jpg&#039;&gt;&lt;!-- s9ymdb:178 --&gt;&lt;img width=&quot;83&quot; height=&quot;110&quot; src=&quot;http://blog.proculo.de/uploads/FolioCasePaging.serendipityThumb.jpg&quot; alt=&quot;&quot;  /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;serendipity_imageComment_txt&quot;&gt;Annotated UISlider in Folio Case&lt;/div&gt;&lt;/div&gt;In &lt;a href=&quot;http://foliocaseapp.com&quot;&gt;Folio Case&lt;/a&gt;, I&#039;m using a custom UISlider with annotations to allow users to easily skim through the document and find the page they want. When the user taps the knob, a small bubble shows up that shows the page number that corresponds to the position where the knob currently is. The page number within the bubble is constantly updated as the user drags the knob around. When the user lets go, the app turns to the selected page, the knob snaps in place and the bubble slowly fades out. This approach makes sure that the user gets the information when he/she needs it and it doesn&#039;t stand in the way of getting things done. &lt;br /&gt;
&lt;br /&gt;
Ever since &lt;a href=&quot;http://foliocaseapp.com&quot;&gt;Folio Case&lt;/a&gt; was released, I&#039;ve been asked how I achieved this effect, as there is no built-in functionality for this behaviour in UIKit. The short answer is: using KVO (key value observing), I track whether the knob is being touched and moved and react appropriately.&lt;br /&gt;
&lt;br /&gt;
The long answer is, well, longer. If you&#039;re not familiar with the concept of KVO, you might want to read Apple&#039;s &lt;a href=&quot;http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/KeyValueObserving/KeyValueObserving.html&quot;&gt;Key Value Observing Programming Guide&lt;/a&gt;. In short, Apple describes KVO as &quot;a mechanism that allows objects to be notified of changes to specific properties of other objects&quot;. In practical use, this means that I can register as an observer to any property other classes expose, such as a UIView&#039;s frame. If I choose to do so, I will be notified whenever the object is being moved within its superview, which causes its frame to change.&lt;br /&gt;
&lt;br /&gt;
Now, in order to track a UISlider&#039;s knob movement, we will have to get a little tricky. A UISlider instance, once it is being displayed on the screen, has three subviews, all of which are instances of UIImageView. The third and foremost UIImageView instance contains the UISlider&#039;s knob. This might change at any time, so if you&#039;re going to use an approach like this in production code, be aware that it might change with the next release of iOS. However, the worst thing that can happen in this case is that the bubble won&#039;t be shown anymore.&lt;br /&gt;
&lt;br /&gt;
In &lt;code&gt;ARAnnotatedSliderView&lt;/code&gt;, which is my class to manage the UISlider and the bubble that is being conditionally displayed, I have the following method:&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;http://gist.github.com/595211.js&quot;&gt; &lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;kARPageScrubberViewKeypathFrame&lt;/code&gt; and &lt;code&gt;kARPageScrubberViewKeypathTracking&lt;/code&gt; are simple constant NSStrings, &lt;code&gt;@&quot;frame&quot;&lt;/code&gt; and &lt;code&gt;@&quot;tracking&quot;&lt;/code&gt;, respectively.  The first property I want to observe is the knob&#039;s frame, to be notified of changes in the knob&#039;s positioning. The second property I want to observe is the UISlider&#039;s &lt;i&gt;tracking&lt;/i&gt; property, to be notified when the user starts tracking the knob with his/her finger and when they stop, so I can dismiss the bubble. When one of those notifications kicks in, I react to it using this method:&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;http://gist.github.com/595226.js&quot;&gt; &lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
When the knob&#039;s frame was changed, this code makes sure that the bubble view stays right on top of it to ensure a smooth experience for the user. When tracking starts, I can use this notification to display the bubble, and when tracking stops, I can set up a timer to dismiss the bubble after a short while.&lt;br /&gt;
&lt;br /&gt;
As you can see from the complete code, this class is taken from &lt;a href=&quot;http://foliocaseapp.com&quot;&gt;Folio Case&lt;/a&gt; without (many) changes, and so is not well configurable. The bubble will always display &quot;Page %d&quot; where a class that was intended as being reusable would probably allow you to customize this setting. I&#039;ve set up a &lt;a href=&quot;http://github.com/alexrepty/ARAnnotatedSlider&quot;&gt;small example project for this on Github&lt;/a&gt;, if you&#039;d like to check it out and play with it. If someone ends up making a fully reusable class out of this, please let me know.&lt;br /&gt;
&lt;br /&gt;
If you&#039;d like to get back to me, feel free to leave a comment here or &lt;a href=&quot;http://twitter.com/arepty/&quot;&gt;follow me on Twitter&lt;/a&gt;. 
    </content:encoded>

    <pubDate>Fri, 24 Sep 2010 13:14:30 +0200</pubDate>
    <guid isPermaLink="false">http://blog.proculo.de/archives/182-guid.html</guid>
    
</item>
<item>
    <title>On Folio Case, Competition and Sales</title>
    <link>http://blog.proculo.de/archives/181-On-Folio-Case,-Competition-and-Sales.html</link>
            <category>Development</category>
    
    <comments>http://blog.proculo.de/archives/181-On-Folio-Case,-Competition-and-Sales.html#comments</comments>
    <wfw:comment>http://blog.proculo.de/wfwcomment.php?cid=181</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://blog.proculo.de/rss.php?version=2.0&amp;type=comments&amp;cid=181</wfw:commentRss>
    

    <author>alexander.repty@mac.com (Alexander Repty)</author>
    <content:encoded>
    When I released my iPad PDF reader &lt;a href=&quot;http://foliocaseapp.com/&quot;&gt;Folio Case&lt;/a&gt; &lt;a href=&quot;http://www.foliocaseapp.com/blog/files/folio_case_released.php&quot;&gt;on Thursday&lt;/a&gt;, I received a lot of praise for it. People found it to be beautiful, easy to use, even calling it the &lt;a href=&quot;http://www.macstories.net/ipad/folio-case-review/&quot;&gt;most elegant solution currently available on the iPad&lt;/a&gt;. Since Folio Case was focusing on a very pleasant reading experience, I never regarded the most downloaded PDF readers as my main competition - the differences were just too big, since those apps usually focus on a huge amount of features and lagged behind in user experience.&lt;br /&gt;
&lt;br /&gt;
However, Apple today released an update to &lt;a href=&quot;http://www.apple.com/ipad/features/ibooks.html&quot;&gt;iBooks&lt;/a&gt;, their fantastic eBook reader software from which Folio Case takes quite a bit of inspiration. iBooks is a direct competitor because it plays in the same league as Folio Case, if not actually higher. It has a reduced feature set, but a beautiful reading experience. The biggest problem here for me is, obviously, that iBooks is free while &lt;a href=&quot;http://bit.ly/getfoliocase&quot;&gt;Folio Case is priced at $5.99&lt;/a&gt; - and they say you just cannot compete with free. I cannot say I planned for this to happen, but I&#039;ll likely find out soon if it is possible to sustain a competitor to iBooks. The least I can do is try to keep my app from finding its untimely death at the bottom of the App Store charts.&lt;br /&gt;
&lt;br /&gt;
So what&#039;s my plan of action here? Fortunately, Folio Case had its origin as a fun little project on the side which just started because I didn&#039;t like any of the available PDF readers out there, &lt;a href=&quot;http://twitter.com/gruber/status/13334452692&quot;&gt;and it seems others didn&#039;t either&lt;/a&gt;. That means that it&#039;s easier for me to keep this app going than it would be for someone who depends on the income from their App Store sales. Speaking of sales, I thought I&#039;d share some sales numbers here to illustrate my point:&lt;br /&gt;
&lt;br /&gt;
Thursday, June 18 2010: 85 sales&lt;br /&gt;
Friday, June 19 2010: 100 sales&lt;br /&gt;
Saturday, June 20 2010: 123 sales&lt;br /&gt;
Sunday, June 21 2010: 76 sales&lt;br /&gt;
&lt;br /&gt;
That&#039;s 384 sales in total since Folio Case was approved for sale in the App Store, or about  1,180 in revenue for me after Apple&#039;s cut and before taxes. Not bad for four days of sales, but I don&#039;t expect these to stay at this level at all, for two reasons. First, there&#039;s now pretty good competition which is free. Second, this was the launch, which had &lt;a href=&quot;http://favstar.fm/users/arepty/status/16412146412&quot;&gt;quite a bit of buzz on Twitter&lt;/a&gt; and was bound to have higher sales numbers than what an app like this would get a few weeks after its release. I&#039;m pretty happy about selling 20 copies of Folio Case per day in the long run, but even that is going to require some effort on my part.&lt;br /&gt;
&lt;br /&gt;
So what am I going to do in the future? While Apple has several advantages over me, especially in the resources department, I believe I can be more flexible and deliver more quickly. I can have direct connections to customers, which helps both me and all of them. For example, on Saturday I had a pissed off customer who was complaining about crashes in Folio Case and demanded his money back. We wrote back and forth, I got help from him and identified the issue and submitted a fix, which is currently in review. The same customer just wrote to me, saying that iBooks behaves worse than Folio Case in his case, crashing more and not recovering at all. Suffice to say, thanks to me being able to help him out and taking a real interest in his problem, the customer is now rather happy.&lt;br /&gt;
&lt;br /&gt;
Cases like this will be my chance to keep Folio Case a viable product in the future. Right now, I am working on Folio Case 1.1 which will, among other features which I have yet to reveal, hopefully contain &lt;a href=&quot;https://www.dropbox.com/&quot;&gt;Dropbox&lt;/a&gt; support (Dropbox has yet to accept my application). Folio Case already allows downloading documents from the web, which iBooks doesn&#039;t, and this feature will help to allow users even more flexibility in managing their documents. Also, people seem to just love the page turning effect, and iBooks for some reason doesn&#039;t use that for PDF documents. Users who want a PDF reader which does exactly what they want it to do and offers a great reading experience at the same time will find it in Folio Case. In the future, I see Folio Case as the app iPad users should get when they have outgrown iBooks.&lt;br /&gt;
&lt;br /&gt;
In the end, I cannot say whether it&#039;s a smart idea to put more effort into Folio Case from a return-on-investment perspective. All I know is that it&#039;s what I love to do, and it&#039;s what those existing 384+ customers deserve, so I&#039;ll just push forward now. If I didn&#039;t have a day job and were living off the money from my App Store sales, I might see things differently. But even if I only get 10 sales per day in the next few months, it was all worth it because it&#039;s just been incredible so far. 
    </content:encoded>

    <pubDate>Mon, 21 Jun 2010 22:43:00 +0200</pubDate>
    <guid isPermaLink="false">http://blog.proculo.de/archives/181-guid.html</guid>
    
</item>
<item>
    <title>Paging-enabled UIScrollView With Previews</title>
    <link>http://blog.proculo.de/archives/180-Paging-enabled-UIScrollView-With-Previews.html</link>
            <category>Tutorials</category>
    
    <comments>http://blog.proculo.de/archives/180-Paging-enabled-UIScrollView-With-Previews.html#comments</comments>
    <wfw:comment>http://blog.proculo.de/wfwcomment.php?cid=180</wfw:comment>

    <slash:comments>10</slash:comments>
    <wfw:commentRss>http://blog.proculo.de/rss.php?version=2.0&amp;type=comments&amp;cid=180</wfw:commentRss>
    

    <author>alexander.repty@mac.com (Alexander Repty)</author>
    <content:encoded>
    &lt;p&gt;&lt;div class=&quot;serendipity_imageComment_left&quot; style=&quot;width: 45px&quot;&gt;&lt;div class=&quot;serendipity_imageComment_img&quot;&gt;&lt;a  class=&#039;serendipity_image_link&#039;  rel=&#039;lightbox&#039; href=&#039;http://blog.proculo.de/uploads/AppStoreGroceries.png&#039;&gt;&lt;!-- s9ymdb:174 --&gt;&lt;img width=&quot;45&quot; height=&quot;110&quot; src=&quot;http://blog.proculo.de/uploads/AppStoreGroceries.serendipityThumb.png&quot; alt=&quot;&quot;  /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;serendipity_imageComment_txt&quot;&gt;App Store&lt;/div&gt;&lt;/div&gt;In some of the applications that come with the iPhone, such as the App Store and Mobile Safari, Apple uses a technique for paging-enabled &lt;code&gt;UIScrollViews&lt;/code&gt; that show a little bit of the neighbouring pieces of content instead of displaying a single view controller over the whole width of the screen.  I think those previews are a really great UI element, since they&#039;re much easier to spot than the &lt;code&gt;UIPageControl&lt;/code&gt; which usually sits right below the UIScrollView. It shows the user that there is more (or no more) content right next to what they are currently seeing.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;&lt;div class=&quot;serendipity_imageComment_left&quot; style=&quot;width: 45px&quot;&gt;&lt;div class=&quot;serendipity_imageComment_img&quot;&gt;&lt;a  class=&#039;serendipity_image_link&#039;  rel=&#039;lightbox&#039; href=&#039;http://blog.proculo.de/uploads/Safari.png&#039;&gt;&lt;!-- s9ymdb:175 --&gt;&lt;img width=&quot;45&quot; height=&quot;110&quot; src=&quot;http://blog.proculo.de/uploads/Safari.serendipityThumb.png&quot; alt=&quot;&quot;  /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;serendipity_imageComment_txt&quot;&gt;Mobile Safari&lt;/div&gt;&lt;/div&gt;If you&#039;ve ever used &lt;code&gt;UIScrollView&lt;/code&gt;&#039;s &lt;code&gt;pagingEnabled&lt;/code&gt; property, you probably know that this is not easily doable. The &lt;code&gt;UIScrollView&lt;/code&gt; will stop only at multiples of its frame&#039;s width and cannot be configured to stop at shorter intervals. I recently needed to implement a paging-enabled &lt;code&gt;UIScrollView&lt;/code&gt; and was trying to replicate this behaviour and found a way to implement these previews.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://blog.proculo.de/archives/180-Paging-enabled-UIScrollView-With-Previews.html&quot;&gt;Read on for the full tutorial.&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;&lt;a href=&quot;http://blog.proculo.de/archives/180-Paging-enabled-UIScrollView-With-Previews.html#extended&quot;&gt;Continue reading &quot;Paging-enabled UIScrollView With Previews&quot;&lt;/a&gt;
    </content:encoded>

    <pubDate>Fri, 12 Feb 2010 17:14:00 +0100</pubDate>
    <guid isPermaLink="false">http://blog.proculo.de/archives/180-guid.html</guid>
    
</item>
<item>
    <title>NSConference 2010 UK</title>
    <link>http://blog.proculo.de/archives/179-NSConference-2010-UK.html</link>
            <category>Development</category>
    
    <comments>http://blog.proculo.de/archives/179-NSConference-2010-UK.html#comments</comments>
    <wfw:comment>http://blog.proculo.de/wfwcomment.php?cid=179</wfw:comment>

    <slash:comments>1</slash:comments>
    <wfw:commentRss>http://blog.proculo.de/rss.php?version=2.0&amp;type=comments&amp;cid=179</wfw:commentRss>
    

    <author>alexander.repty@mac.com (Alexander Repty)</author>
    <content:encoded>
    &lt;h1&gt;History of NSConference&lt;/h1&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Ever since the inaugural &lt;a href=&quot;http://www.nsconference.com/&quot;&gt;NSConference&lt;/a&gt; 2009 ended, I&#039;ve been looking forward to the next one. I, pretty much like everyone else, had a fantastic time there and really enjoyed Scotty&#039;s approach to hosting a conference.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Despite a number of really great and thoughtful presentations at NSConference 2009, the main focus and benefit for me was community. I met so many interesting and smart people there who have helped me become a better Cocoa developer in every regard. NSConference is the kind of event you can benefit from even if you don&#039;t think the sessions will bring you much new knowledge.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;With this kind of experience from last year&#039;s conference, Scotty (&lt;a href=&quot;http://twitter.com/macdevnet&quot;&gt;@macdevnet&lt;/a&gt;) and Tim (&lt;a href=&quot;http://twitter.com/timisted&quot;&gt;@timisted&lt;/a&gt;) had a lot of work to do. According to &lt;a href=&quot;http://www.mac-developer-network.com/news/why-nsconference/&quot;&gt;a blog post by Scotty&lt;/a&gt;, 85% of the delegates in 2009 signed up for the 2010 conference. That&#039;s a huge number and goes to show just how great the conference last year was. The question on my mind was not if this year&#039;s conference could live up to our expectations, but more how they would do it.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;Changes to Last Year&#039;s Conference&lt;/h1&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;There were some major changes in this year&#039;s conference. The most obvious one was that in addition to the workshops, which took place on Sunday, and the main conference (Monday and Tuesday), there now was an optional iPhone day that could be booked in addition to the main conference or on its own. This day even saw a number of new attendees, most of which did regret not going to the main conference after they experienced NSConference for themselves.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Another major change compared to last year&#039;s conference, which took place at the University of Hertfordshire campus in Hatfield, was that all workshop rooms, the main conference room and our hotel rooms were now in the same building. Even the restaurant and bar were there, which made it really easy to get to places and to find people.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;A very welcome change were the sponsored soft drinks during the coffee breaks, including Red Bull. Yes, there was free Red Bull. It was awesome.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;The Venue&lt;/h1&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;The venue for this year&#039;s event was in a rather remote location in a town called Wokefield Park near Reading, England. It was easily reachable by car, but I took two wrong turns on the way and ended up really close to the edge of the world. A lot of attendees got there by public transport, which wouldn&#039;t really have been an option for me, since I was traveling from Stansted Airport. Given my plane landed at 7pm and the train line between Stansted and London isn&#039;t currently operating on weekends, it would have taken me at least 5 hours to get there. So instead I chose to rent a car and get used to driving on the wrong side of the road and lots of roundabouts.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Remote location aside, the venue was a great choice for the conference. The rooms were rather nice, they had Nintendo Wiis there (although I didn&#039;t have time to play) and they had a number of coffee makers in the hall way, which all provided decent coffee. The instructions to make tea were a little confusing, but fortunately Mike Lee (&lt;a href=&quot;http://twitter.com/bmf&quot;&gt;@bmf&lt;/a&gt;) applied his engineering talent to the problem and quickly figured out what they meant.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;The Workshops&lt;/h1&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;I did sign up for Matt Gemmell&#039;s (&lt;a href=&quot;http://twitter.com/mattgemmell&quot;&gt;@mattgemmell&lt;/a&gt;) workshop appropriately titled &quot;The World According to Gemmell&quot;, but because of conflicting schedules, I only got to experience about half of it. There was a lot of talk about the iPad, bathroom reading and the opportunity for us developers to create apps for the device or adopt our existing ones. We were sitting in groups and, as a group exercise, got to design an iPad app. Matt graciously provided a number of ideas for groups who couldn&#039;t decide what to do. There were also some opportunities to get live feedback from Matt and the rest of the group on problems people were currently facing in their own apps.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;As I had to leave rather early, I don&#039;t really have any more insight to the end of Matt&#039;s workshop and no idea what was discussed in Drew McCormack&#039;s (&lt;a href=&quot;http://twitter.com/drewmccormack&quot;&gt;@drewmccormack&lt;/a&gt;) workshop at all, but I&#039;m sure others who were there will fill this void.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;1st Conference Day&lt;/h1&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;The main conference keynote was delivered by Mike Lee (of Delicious Library fame), who told us various anecdotes where he could apply his engineering skills to everyday (and rare) situations in his life. While doing that, he disclosed his super secret algorithm for awesomeness and encouraged us to fix problems whenever we encounter them and be the hero. During his session, Mike established the ongoing Matrix theme that we could see throughout the entire conference.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;After an encouraging keynote, Jonathan &quot;Wolf&quot; Rentzsch (&lt;a href=&quot;http://twitter.com/rentzsch&quot;&gt;@rentzsch&lt;/a&gt;) took us on a journey through many inner workings of Mac OS X and Objective-C applications. He delivered great insight into static analysis, runtime analysis, code injection and enhancing. He introduced us to various tools and showed how they relate to our jobs as Cocoa developers and did a really great job of not diving in too deep, so even people unfamiliar with the subject and the tools could follow his presentation. Some of the things I took away from this presentation are of a philosophical nature which should prove helpful in my future career.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;After this exciting subject, Dave Dribin (&lt;a href=&quot;http://twitter.com/ddribin&quot;&gt;@ddribin&lt;/a&gt;) gave his talk about clean code, which involved a lot of practical tips and some really controversial theses about various design patterns, such as delegation vs. notifications vs. KVO and the use of singletons. These statements caused a lot of discussion during Q&amp;A and during the whole conference, but Dave had a good answer to every single question that was asked, which for me really made the impression that he had some great points there. I left the session feeling good about the design principles I currently employ and with the intention of adopting even more of the practical tips he presented.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Next on the agenda was Drew McCormack&#039;s talk about data presentation, in which he focused mostly on table views (cells vs. views) and the Core Plot framework, which he started and helped develop last year. He presented various actual uses of the framework, which is still in development and pre-1.0. Based on my observation of the talk and what various other developers said during the break, Drew really got some attendees thinking about implementing the framework in their own apps.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;The final session for the first day was Marcus Zarra (&lt;a href=&quot;http://twitter.com/mzarra&quot;&gt;@mzarra&lt;/a&gt;) on Core Animation, which he just recently wrote a book on. His talk was aimed at novices and didn&#039;t dive in too deep, but gave a good overview about the topic. He introduced us to implicit and explicit animations, and showed a small demo app that proved how little animation code you actually have to write to get decent animations. Unfortunately, the allotted time for the session didn&#039;t allow him to go deeper and teach us about more in-depth procedures.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;The first day of the conference came to a close with a delightful banquet, which took place in the same room where we had our sessions. We all got to have some great conversations with like-minded people over wine and a three-course dinner. It moved to the bar once the wine was empty where we continued to have a phenomenal time that caused many of us to go to bed rather late and catch little sleep.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;2nd Conference Day&lt;/h1&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;The second day of the main conference was kicked off by Jeff LaMarche (&lt;a href=&quot;http://twitter.com/jeff_lamarche&quot;&gt;@jeff_lamarche&lt;/a&gt;), who was still severely jet-lagged and missing his clothes (he had replacements though) because the airline misplaced it and didn&#039;t deliver it until later that day. Jeff told us about some Objective-C language and design features and gave us an overview of runtime features, such as reflection/introspection. He made a point to make it clear that messing with the runtime can be rather dangerous, but he gave some safe-to-use examples of what can be done.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;The second session of the day was Andy Finnell&#039;s (&lt;a href=&quot;http://twitter.com/macgeek02&quot;&gt;@macgeek02&lt;/a&gt;) in-depth talk on OpenCL using an example app where he modeled the effect of painting with watercolour. He talked about OpenCL devices, contexts, vectors and queues as well as the meaning of OpenCL kernels and various implementation details. Unfortunately, the physics involved in modeling the spread of watercolour on paper are rather extensive, and Andy lost me and several other listeners during that segment. However, he did put up the source code to his sample app, so we can investigate this on our own.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;The next two sessions, on source code control by Dave Dribin and code signing by Graham Lee (&lt;a href=&quot;http://twitter.com/iamleeg&quot;&gt;@iamleeg&lt;/a&gt;), filled in for Matt Gemmell, who unfortunately had to leave the conference early for medical reasons. We were relieved to head that he did get better and is fine again now. Dave delivered his talk based on a talk he gave last year for a CocoaHeads group. He referred to version control systems as &quot;Time Machine for your source code&quot; and gave us various reasons on why we should use VCSs. His talk was very fact-based and had a history of source control systems up to current DVCSs such as Git and Mercurial. Graham Lee gave an overview of code signing and cleared  up some myths around the topic and concluded with a demo.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Following the lunch break, Aaron Hillegass (&lt;a href=&quot;http://twitter.com/aaronhillegass&quot;&gt;@AaronHillegass&lt;/a&gt;) of Big Nerd Ranch and Cocoa Programming for Mac OS X fame gave a talk on data persistence. He commented on the change away from direct file system access which we&#039;re currently seeing in the &quot;cloud&quot; and on the iPad. He followed it up with rather interesting bits about sync services, algorithms, examples, archiving and DBMS, which lead to notes about Core Data. Aaron had various pros and cons about every persistence solution he talked about, even Core Data, which led to his recently developed open source BNRPersistence framework, which looks very promising and is a lot faster than Core Data in most cases. He mentioned that the framework is still work-in-progress and that the community is welcome to supply patches.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Right before the mysterious Cocoa Rumble, which I am not going to talk about here (you have to see it to believe it), Danny Greg (&lt;a href=&quot;http://twitter.com/dannygreg&quot;&gt;@dannygreg&lt;/a&gt;), Martin Pilkington (&lt;a href=&quot;http://twitter.com/pilky&quot;&gt;@pilky&lt;/a&gt;) and I (&lt;a href=&quot;http://twitter.com/arepty&quot;&gt;@arepty&lt;/a&gt;)  presented Scotty with a few gifts that &lt;a href=&quot;http://pledgie.com/campaigns/7348&quot;&gt;dozens of Mac developers from around the world contributed to&lt;/a&gt;. We have video for it, so I am not going to write everything down. Just see for yourself.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;&lt;object width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/BSGiz_CingA&amp;hl=en_US&amp;fs=1&amp;&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/BSGiz_CingA&amp;hl=en_US&amp;fs=1&amp;&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Obviously, this day was followed by a lot of drinks and chatter in the bar, and much like the previous nights, everybody seemed to enjoy themselves and went to bed way too late at night. Unfortunately, this marked the end of the main conference and already saw a good number of developers leaving.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;iPhone Conference Day&lt;/h1&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;The day saw Mike Lee delivering his keynote titled &quot;Meet the User&quot; to a partially renewed crowd, and Mike does really know and understand the user he wants us to meet. Mike gave some practical real-life examples of bad user experience and showed us how they translate into our domain. He talked about feature creep, unnecessary branding and meaningless version naming schemes. This talk left me excited about the rest of the day and thinking about various incidents where I was guilty of letting slip in some of the user experience issues Mike talked about.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;In the day&#039;s second session, a better-rested and well-dressed Jeff LaMarche introduced us to OpenGL ES on the iPhone. He talked about differences between OpenGL and OpenGL ES (i.e. direct mode), differences between OpenGL ES 1.1 and 2.0, when to use OpenGL ES, the Cartesian coordinate system and its different uses (y-up vs. z-up). He gave a good overview and some pointers concerning data types and function naming schemes and general performance considerations, such as Thumb optimation for ARM6 and ARM7 CPUs. That&#039;s when the talk got a little more into the deep technical stuff, but was still very easy to follow, which I was a novice in terms of OpenGL ES really appreciated. We learned about triangles and the winding rule, viewports, orthographic code and geometry. Shortly before the end of the talk, Jeff also touched the topic of lighting and introduced its different aspects (ambient/diffuse/specular).&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Right before the lunch break, we got to hear Marcus Zarra talk about his absolute favourite topic, Core Data. Marcus introduced a framework that he has written called ZSync which allows for easy synchronisation of data between Macs and iPhones. Previously, this wasn&#039;t as easy to do due to the lack of Sync Services on the iPhone. The framework is still under development and will be rolled out in 3 phases, leading up to cloud sync at one point. Like BNRPersistence, feedback and contribution by developers is welcome. I could tell from the Q&amp;A that people were genuinely excited about this technology and are looking forward to using it in their own products.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;The second-to-last presentation of the day was about developing a game using Core Animation, presented by Drew McCormack who must have been exhausted after his workshop on Sunday and his talk on the first day of the conference. Drew explained how he created the whole game using Core Animation rather than OpenGL ES and why this probably is a bad idea, but worked out for him anyway. He presented various animation inside the game and showed us, based on his source code, how they were implemented. I was really surprised to see how easily many things can be done using Core Animation and a free game programming library (for physics), such as cocos2d.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;The conference&#039;s final session saw Jeff LaMarche&#039;s third appearance, and by now he could hear the beer calling for him all the way from the bar. Ignoring those calls, Jeff gave us a good overview of GameKit and quite a bit of example code and even provided some methods for working around GameKit&#039;s lack of an online play API, for which we still have to use low-level CFNetwork ourselves. He provides sample code for his implementation, but it&#039;s not a large-scale open source library like BNRPersistence or ZSync.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;As an iPhone developer, especially the final 2 sessions made an impression with me, mostly because they covered APIs which I hadn&#039;t yet used. However, they got me really excited about writing a Core-Animation-based game using GameKit for local multiplayer. In combination with the upcoming iPad, I think there&#039;s an opportunity around the corner which I may have to explore.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;Conclusion&lt;/h1&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;NSConference 2010 in the UK was a great conference and even managed to be better than last year&#039;s conference. I felt the focus of the talks was a little different, with lots of frameworks being introduced and discussed. However, almost one week later, I still don&#039;t see any of it as advertising. I rather regret not having had the time to have used any of the great technologies introduced by these talented developers.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;I took a lot of practical advise from the conference, but also various general tips and tricks about user experience and life as an engineer. Maybe that&#039;s because of all the smoke breaks with Mike Lee, but it certainly helped my thought process in so many ways.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;In general, it showed once more that NSConference&#039;s focus is community. One thing I constantly heard from various random attendees is that it is so much easier to get in contact with people at NSConference compared to other conferences. And this is one thing I wouldn&#039;t want to miss for the world.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Thanks to Scotty, Tim, Dave and everyone else involved for putting together such a great conference for us to enjoy and get together.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;Photos&lt;/h1&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;I took some pictured during the event and a selection of those is available on Flickr: &lt;a href=&quot;http://www.flickr.com/photos/alexrepty/sets/72157623253034969/&quot;&gt;http://www.flickr.com/photos/alexrepty/sets/72157623253034969/&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://blog.j2mepolish.org/?p=285&quot;&gt;Cross-posted to J2ME Polish Blog&lt;/a&gt; 
    </content:encoded>

    <pubDate>Tue, 09 Feb 2010 15:54:43 +0100</pubDate>
    <guid isPermaLink="false">http://blog.proculo.de/archives/179-guid.html</guid>
    
</item>
<item>
    <title>Attaching a UIToolbar to the iPhone's Keyboard</title>
    <link>http://blog.proculo.de/archives/178-Attaching-a-UIToolbar-to-the-iPhones-Keyboard.html</link>
            <category>Tutorials</category>
    
    <comments>http://blog.proculo.de/archives/178-Attaching-a-UIToolbar-to-the-iPhones-Keyboard.html#comments</comments>
    <wfw:comment>http://blog.proculo.de/wfwcomment.php?cid=178</wfw:comment>

    <slash:comments>5</slash:comments>
    <wfw:commentRss>http://blog.proculo.de/rss.php?version=2.0&amp;type=comments&amp;cid=178</wfw:commentRss>
    

    <author>alexander.repty@mac.com (Alexander Repty)</author>
    <content:encoded>
    One nifty little &lt;a href=&quot;http://www.apple.com/iphone/&quot;&gt;iPhone&lt;/a&gt; feature that left an impression with me is the way that the keyboard in the &quot;&lt;a href=&quot;http://www.apple.com/iphone/iphone-3gs/messages.html&quot;&gt;Messages&lt;/a&gt;&quot; application slides in and out with the keyboard, as if it were attached to it - but it isn&#039;t. I needed a similar feature for an app that I&#039;m currently working on for a client, so I decided to investigate how to implement this feature in my own stuff.&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;&lt;div class=&quot;serendipity_imageComment_left&quot; style=&quot;width: 142px&quot;&gt;&lt;div class=&quot;serendipity_imageComment_img&quot;&gt;&lt;a  class=&#039;serendipity_image_link&#039;  rel=&#039;lightbox&#039; href=&#039;http://blog.proculo.de/uploads/Messages_NoKeyboard.png&#039;&gt;&lt;!-- s9ymdb:168 --&gt;&lt;img width=&quot;71&quot; height=&quot;110&quot; src=&quot;http://blog.proculo.de/uploads/Messages_NoKeyboard.serendipityThumb.png&quot; alt=&quot;&quot;  /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;serendipity_imageComment_txt&quot;&gt;Viewing messages, keyboard not shown.&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;serendipity_imageComment_left&quot; style=&quot;width: 142px&quot;&gt;&lt;div class=&quot;serendipity_imageComment_img&quot;&gt;&lt;a  class=&#039;serendipity_image_link&#039;  rel=&#039;lightbox&#039; href=&#039;http://blog.proculo.de/uploads/Messages_WithKeyboard.png&#039;&gt;&lt;!-- s9ymdb:169 --&gt;&lt;img width=&quot;71&quot; height=&quot;110&quot; src=&quot;http://blog.proculo.de/uploads/Messages_WithKeyboard.serendipityThumb.png&quot; alt=&quot;&quot;  /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;serendipity_imageComment_txt&quot;&gt;Keyboard displayed. The toolbar moves up, attached to the keyboard.&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;
&lt;br /&gt;
Although my first instinct was to simply use an implicit animation using &lt;code&gt;&lt;a href=&quot;http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIView_Class/UIView/UIView.html&quot;&gt;UIView&lt;/a&gt;&lt;/code&gt;&#039;s &lt;code&gt;&lt;a href=&quot;http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIView_Class/UIView/UIView.html#//apple_ref/occ/clm/UIView/beginAnimations:context:&quot;&gt;+beginAnimations:context:&lt;/a&gt;&lt;/code&gt; method, I decided to quickly search the web for some information on how other developers approached this problem.&lt;br /&gt;
&lt;br /&gt;
The results were a little surprising, possibly because the proper way to do it wasn&#039;t as easily available before iPhone OS 3.0 - various people on different message boards and mailing lists suggested a hack that involved looping through all instances of &lt;code&gt;&lt;a href=&quot;http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIWindow_Class/UIWindowClassReference/UIWindowClassReference.html&quot;&gt;UIWindow&lt;/a&gt;&lt;/code&gt; to find the one containing an instance of &lt;code&gt;UIKeyboard&lt;/code&gt;, a private class that isn&#039;t even documented in the iPhone SDK. Those hacks then proceeded to modify the dimensions of the view that contains the keyboard and adding the &lt;code&gt;&lt;a href=&quot;http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIToolbar_Class/Reference/Reference.html&quot;&gt;UIToolbar&lt;/a&gt;&lt;/code&gt; instance as a subview, so it would animate into the key window right along with the keyboard.&lt;br /&gt;
&lt;br /&gt;
Needless to say, these hacks are not exactly future-proof or what I would consider a proper implementation of this feature. The &lt;a href=&quot;http://en.wikipedia.org/wiki/Core_Animation&quot;&gt;Core Animation&lt;/a&gt; route was the one to go, so I proceeded in that direction.&lt;br /&gt;
&lt;br /&gt;
More about this after the jump. &lt;br /&gt;&lt;a href=&quot;http://blog.proculo.de/archives/178-Attaching-a-UIToolbar-to-the-iPhones-Keyboard.html#extended&quot;&gt;Continue reading &quot;Attaching a UIToolbar to the iPhone&#039;s Keyboard&quot;&lt;/a&gt;
    </content:encoded>

    <pubDate>Tue, 06 Oct 2009 20:30:54 +0200</pubDate>
    <guid isPermaLink="false">http://blog.proculo.de/archives/178-guid.html</guid>
    
</item>
<item>
    <title>Mobile Developer's Guide to the Galaxy</title>
    <link>http://blog.proculo.de/archives/176-Mobile-Developers-Guide-to-the-Galaxy.html</link>
            <category>Development</category>
    
    <comments>http://blog.proculo.de/archives/176-Mobile-Developers-Guide-to-the-Galaxy.html#comments</comments>
    <wfw:comment>http://blog.proculo.de/wfwcomment.php?cid=176</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://blog.proculo.de/rss.php?version=2.0&amp;type=comments&amp;cid=176</wfw:commentRss>
    

    <author>alexander.repty@mac.com (Alexander Repty)</author>
    <content:encoded>
    &lt;a  class=&#039;serendipity_image_link&#039;  rel=&#039;lightbox&#039; href=&#039;http://blog.proculo.de/uploads/MDGTTG.png&#039;&gt;&lt;!-- s9ymdb:166 --&gt;&lt;img width=&quot;110&quot; height=&quot;110&quot; style=&quot;float: left; border: 0px; padding-left: 5px; padding-right: 5px;&quot; src=&quot;http://blog.proculo.de/uploads/MDGTTG.serendipityThumb.png&quot; alt=&quot;&quot;  /&gt;&lt;/a&gt;A couple of weeks ago, my employer, &lt;a href=&quot;http://www.enough.de/&quot;&gt;Enough Software&lt;/a&gt;, published a small booklet titled &quot;&lt;a href=&quot;http://www1.j2mepolish.org/downloads/MobileDevelopersGuideToTheGalaxy.pdf&quot;&gt;Mobile Developer&#039;s Guide to the Galaxy&lt;/a&gt;&quot; in co-operation with &lt;a href=&quot;http://www.7val.com/&quot;&gt;Sevenval&lt;/a&gt; and &lt;a href=&quot;http://www.wipconnector.com/&quot;&gt;WIP&lt;/a&gt;. For the second edition, which has just been released, I&#039;ve been asked to contribute a chapter on iPhone development.&lt;br /&gt;
&lt;br /&gt;
So I did, and it can be found on pages 16 through 20 in the PDF, which you may &lt;a href=&quot;http://www1.j2mepolish.org/downloads/MobileDevelopersGuideToTheGalaxy.pdf&quot;&gt;grab here&lt;/a&gt;. Feedback is welcome, a contact email address can be found in the document (p. 52).&lt;br /&gt;
&lt;br /&gt;
Enjoy! 
    </content:encoded>

    <pubDate>Fri, 02 Oct 2009 14:44:26 +0200</pubDate>
    <guid isPermaLink="false">http://blog.proculo.de/archives/176-guid.html</guid>
    
</item>
<item>
    <title>Asynchronous Networking Using NSOperation And Delegates</title>
    <link>http://blog.proculo.de/archives/175-Asynchronous-Networking-Using-NSOperation-And-Delegates.html</link>
            <category>Tutorials</category>
    
    <comments>http://blog.proculo.de/archives/175-Asynchronous-Networking-Using-NSOperation-And-Delegates.html#comments</comments>
    <wfw:comment>http://blog.proculo.de/wfwcomment.php?cid=175</wfw:comment>

    <slash:comments>6</slash:comments>
    <wfw:commentRss>http://blog.proculo.de/rss.php?version=2.0&amp;type=comments&amp;cid=175</wfw:commentRss>
    

    <author>alexander.repty@mac.com (Alexander Repty)</author>
    <content:encoded>
    Lately, I have been using a lot of REST APIs for various projects that I have been working on. One development pattern that I have constantly used among all these projects is that of using various &lt;code&gt;&lt;a href=&quot;http://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Reference/NSOperation_class/Reference/Reference.html&quot;&gt;NSOperation&lt;/a&gt;&lt;/code&gt; objects, feed them to an &lt;code&gt;&lt;a href=&quot;http://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Reference/NSOperationQueue_class/Reference/Reference.html&quot;&gt;NSOperationQueue&lt;/a&gt;&lt;/code&gt; and get the results fed back to the caller via &lt;a href=&quot;http://www.stepwise.com/Articles/Technical/2000-03-03.01.html&quot;&gt;delegation&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Why Would You Do This?&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Now, why would you go through the trouble of learning all these APIs, creating a delegate protocol and implementing all this stuff if you could use a simple &lt;code&gt;initWithContentsOfURL:&lt;/code&gt; (or similar)? The main reason here is asynchronous networking. If you&#039;re going to just fetch network data, such as strings, images or whole XML documents from remote servers, you are going to see some latency, especially if you&#039;re developing for the iPhone and running on an EDGE or 3G network.&lt;br /&gt;
&lt;br /&gt;
If you were to use synchronous networking from within your main thread, you would be blocking your application&#039;s UI until your method stack returns and the system can redraw your views. If you&#039;re looking at multiple seconds of latency, which might easily occur if you&#039;re fetching dynamically generated data from a server, this practically makes your application unusable. The solution to this problem is to push networking tasks into separate functions and move those to different threads.&lt;br /&gt;
&lt;br /&gt;
&lt;a  class=&#039;serendipity_image_link&#039;  rel=&#039;lightbox&#039; href=&#039;http://blog.proculo.de/uploads/Bildschirmfoto2009-09-29um00.29.53.png&#039;&gt;&lt;!-- s9ymdb:164 --&gt;&lt;img width=&quot;110&quot; height=&quot;79&quot; style=&quot;border: 0px; padding-left: 5px; padding-right: 5px;&quot; src=&quot;http://blog.proculo.de/uploads/Bildschirmfoto2009-09-29um00.29.53.serendipityThumb.png&quot; alt=&quot;&quot;  /&gt;&lt;br /&gt;Asynchronous networking keeps the main thread available for drawing and other tasks.&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Clean Thread Management&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Of course, you could just detach new thread selectors all over your controller, but that would be rather ugly, error-prone and a bitch to maintain. Fortunately, Apple introduced &lt;code&gt;NSOperation&lt;/code&gt; and &lt;code&gt;NSOperationQueue&lt;/code&gt; a while back (in Mac OS X 10.5 Leopard).&lt;br /&gt;
&lt;br /&gt;
For your projects, you will create a subclass of &lt;code&gt;NSOperation&lt;/code&gt; and override the &lt;code&gt;-main&lt;/code&gt; method to do your bidding. This is where the heavy lifting should take place and all your network latency will not matter anymore. I have written a sample application that uses an &lt;code&gt;NSOperation&lt;/code&gt; subclass to fetch an image via HTTP and return it to the controller using a delegate protocol that I have written specifically for this task. My &lt;code&gt;-main&lt;/code&gt; method look like this:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
- (void)main {&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;NSImage *image = nil;&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;NSError *error = nil;&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;NS_DURING&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;if ([self isCancelled]) {&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;NS_VOIDRETURN;&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;NSData *data = [NSData dataWithContentsOfURL:_url options:NSDataReadingUncached error:&amp;error];&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;if (nil != error) {&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;[(NSObject *)_delegate performSelectorOnMainThread:@selector(errorOccurred:) withObject:error waitUntilDone:NO];&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;NS_VOIDRETURN;&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;image = [[NSImage alloc] initWithData:data];&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;NS_HANDLER&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;NS_ENDHANDLER&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;sleep(2); // for illustration purposes&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;[(NSObject *)_delegate performSelectorOnMainThread:@selector(didReceiveImage:) withObject:image waitUntilDone:NO];&lt;br /&gt;
}&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
This method does nothing more than what you would previously have done to retrieve an image given a URL (&lt;code&gt;_url&lt;/code&gt; and &lt;code&gt;_delegate&lt;/code&gt; are instance variables that were filled during initialization). The delegate implements the selectors defined in my protocol, &lt;code&gt;errorOccurred:&lt;/code&gt; and &lt;code&gt;didReceiveImage:&lt;/code&gt;.&lt;br /&gt;
&lt;br /&gt;
So much for the heavy lifting. But how do you actually get this method to run in the first place? This is easy, thanks to &lt;code&gt;NSOperationQueue&lt;/code&gt;, which provides a method to queue &lt;code&gt;NSOperation&lt;/code&gt; subclasses for execution. In my application controller&#039;s &lt;code&gt;-awakeFromNib&lt;/code&gt; method, I instantiate my &lt;code&gt;NSOperation&lt;/code&gt; subclass and add it to the &lt;code&gt;NSOperationQueue&lt;/code&gt; like this:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
- (void)awakeFromNib {&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;[_progressIndicator startAnimation:self];&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;NSURL *url = [NSURL URLWithString:@&quot;http://alexrepty.com/other/kiwi.jpg&quot;];&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;ImageFetchOperation *operation = [[[ImageFetchOperation alloc] initWithURL:url delegate:self] autorelease];&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;[_queue addOperation:operation];&lt;br /&gt;
}&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Add the implementation of the delegate protocol and you&#039;re done! What you end up with is a nice, clean and efficient way of dealing with networking that helps to keep your code readable, error-free and makes for a better user experience by keeping the main thread free of blocking operations.&lt;br /&gt;
&lt;br /&gt;
&lt;a  class=&#039;serendipity_image_link&#039;  rel=&#039;lightbox&#039; href=&#039;http://blog.proculo.de/uploads/Bildschirmfoto2009-09-29um00.30.07.png&#039;&gt;&lt;!-- s9ymdb:165 --&gt;&lt;img width=&quot;110&quot; height=&quot;89&quot; style=&quot;border: 0px; padding-left: 5px; padding-right: 5px;&quot; src=&quot;http://blog.proculo.de/uploads/Bildschirmfoto2009-09-29um00.30.07.serendipityThumb.png&quot; alt=&quot;Isn&#039;t Kiwi cute?&quot; /&gt;&lt;br /&gt;Delegation makes sure your application controller has immediate access to the image once it has been fetched.&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Yes, the cat in the picture is mine. :)&lt;br /&gt;
&lt;br /&gt;
Feel free to &lt;a href=&quot;http://alexrepty.com/other/ImageFetcher.zip&quot;&gt;download the source code&lt;/a&gt; for this example and use it in your own projects. If you have any comments or questions, use the box below or &lt;a href=&quot;http://twitter.com/arepty&quot;&gt;ask me on Twitter&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Update&lt;/strong&gt;: I&#039;ve published the source code for this tutorial on &lt;a href=&quot;http://github.com/&quot;&gt;Github&lt;/a&gt;:&lt;br /&gt;
&lt;a href=&quot;http://github.com/alexrepty/Asynchronous-Image-Fetcher/fast_forward&quot;&gt;http://github.com/alexrepty/Asynchronous-Image-Fetcher/fast_forward&lt;/a&gt;&lt;br /&gt;
 
    </content:encoded>

    <pubDate>Mon, 28 Sep 2009 23:41:48 +0200</pubDate>
    <guid isPermaLink="false">http://blog.proculo.de/archives/175-guid.html</guid>
    
</item>
<item>
    <title>Lab Tick 0.9.4 Released</title>
    <link>http://blog.proculo.de/archives/174-Lab-Tick-0.9.4-Released.html</link>
            <category>Lab Tick</category>
    
    <comments>http://blog.proculo.de/archives/174-Lab-Tick-0.9.4-Released.html#comments</comments>
    <wfw:comment>http://blog.proculo.de/wfwcomment.php?cid=174</wfw:comment>

    <slash:comments>2</slash:comments>
    <wfw:commentRss>http://blog.proculo.de/rss.php?version=2.0&amp;type=comments&amp;cid=174</wfw:commentRss>
    

    <author>alexander.repty@mac.com (Alexander Repty)</author>
    <content:encoded>
    I have just released Lab Tick 0.9.4 which introduces full 64-bit-support for users running a 64-bit-capable machine and Mac OS X 10.6 Snow Leopard.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://labtick.proculo.de/files/LabTick_0.9.4.dmg&quot;&gt;Download the new version here&lt;/a&gt; or use Lab Tick&#039;s built-in updating mechanism. 
    </content:encoded>

    <pubDate>Fri, 11 Sep 2009 23:10:32 +0200</pubDate>
    <guid isPermaLink="false">http://blog.proculo.de/archives/174-guid.html</guid>
    
</item>
<item>
    <title>Lab Tick 0.9.3 Released &amp; Snow Leopard Compatibility</title>
    <link>http://blog.proculo.de/archives/173-Lab-Tick-0.9.3-Released-Snow-Leopard-Compatibility.html</link>
            <category>Lab Tick</category>
    
    <comments>http://blog.proculo.de/archives/173-Lab-Tick-0.9.3-Released-Snow-Leopard-Compatibility.html#comments</comments>
    <wfw:comment>http://blog.proculo.de/wfwcomment.php?cid=173</wfw:comment>

    <slash:comments>5</slash:comments>
    <wfw:commentRss>http://blog.proculo.de/rss.php?version=2.0&amp;type=comments&amp;cid=173</wfw:commentRss>
    

    <author>alexander.repty@mac.com (Alexander Repty)</author>
    <content:encoded>
    &lt;p&gt;Last night, I released &lt;a href=&quot;http://labtick.proculo.de/&quot;&gt;Lab Tick 0.9.3&lt;/a&gt; which fixes a number of small bugs. The biggest change in this release is support for fast user switching. In previous versions of Lab Tick, you either had to disable or quite Lab Tick before you would switch to a different account on your notebook - otherwise, Lab Tick would continue to run and try to control the illumination. This caused erratic behaviour when another instance of Lab Tick was running under a different account.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Also, since Xcode 3.2 in Snow Leopard comes with a static analyzer built-in, I could find a number of small memory leaks, which should hopefully reduce memory usage by a bit.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;However, even though Lab Tick 0.9.3 runs perfectly fine on Snow Leopard, it won&#039;t run in 64 bit. That is because some of the APIs I use to control the backlit keyboard are not fully 64-bit-capable and have been deprecated by Apple. I will look into replacing those APIs with modern ones that have 64 bit support. Since spare time is always an issue, I cannot make any promises on a release date.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Until then, I hope the lack of support for 64 bit doesn&#039;t bother you too much.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Tue, 08 Sep 2009 10:46:55 +0200</pubDate>
    <guid isPermaLink="false">http://blog.proculo.de/archives/173-guid.html</guid>
    
</item>
<item>
    <title>CocoaHeads Bremen Coding Competition</title>
    <link>http://blog.proculo.de/archives/172-CocoaHeads-Bremen-Coding-Competition.html</link>
            <category>Development</category>
    
    <comments>http://blog.proculo.de/archives/172-CocoaHeads-Bremen-Coding-Competition.html#comments</comments>
    <wfw:comment>http://blog.proculo.de/wfwcomment.php?cid=172</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://blog.proculo.de/rss.php?version=2.0&amp;type=comments&amp;cid=172</wfw:commentRss>
    

    <author>alexander.repty@mac.com (Alexander Repty)</author>
    <content:encoded>
    &lt;p&gt;Recently, I&#039;ve founded a &lt;a href=&quot;http://cocoaheads.org/&quot; target=&quot;_blank&quot;&gt;CocoaHeads&lt;/a&gt; chapter for the city of &lt;a href=&quot;http://cocoaheads.org/de/Bremen/index.html&quot; target=&quot;_blank&quot;&gt;Bremen&lt;/a&gt;. We&#039;ve had a lot of initial interest in our meetings and have managed about 15 people coming to each of the meetings. For our second meeting, I organized a small challenge for which I gave away a coupon code to receive the first three &lt;a href=&quot;http://www.mac-developer-network.com/category/shows/screencasts/nsconference2009/&quot; target=&quot;_blank&quot;&gt;NSConference 2009 videos&lt;/a&gt; for free (Thanks, Scotty!). This challenge was well received and got me thinking about organizing something bigger and better, much like what &lt;a href=&quot;http://ironcoder.org/blog&quot; target=&quot;_blank&quot;&gt;Ironcoder&lt;/a&gt; used to be, but just for our local CocoaHeads chapter.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;I&#039;ve started asking around on Twitter (I&#039;m &lt;a href=&quot;http://twitter.com/arepty&quot; target=&quot;_blank&quot;&gt;@arepty&lt;/a&gt;, by the way) for software vendors to donate licenses, and with the Mac developer community being as fantastic as always, I received pledges for software licenses worth over 500  within a couple of days. To top this off, falkemedia has thrown three one-year subscriptions of their magazine Mac Life into the mix, so the winners of the upcoming competition have quite a lot of stuff to look forward to.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;The competition details (theme and API) will be announced at our meeting next Thursday, August 13th 2009. Please note that this being strictly a competition for the Bremen chapter of CocoaHeads, you will only be eligible to enter if you have participated in one of our local meetings in the past or will participate on Thursday. Participants will have about three weeks to build an app (Mac or iPhone) with the theme and API that I will choose for them. After the deadline, I will judge the apps and announce winners at the September meeting of our chapter.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;You&#039;re probably interested to learn what kind of software was pledged as prizes for the competition, so here&#039;s the complete list:&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;&lt;a class=&#039;serendipity_image_link&#039; href=&#039;http://www.realmacsoftware.com/rapidweaver/&#039; target=&quot;_blank&quot;&gt;&lt;!-- s9ymdb:163 --&gt;&lt;img width=&quot;128&quot; height=&quot;128&quot; style=&quot;border: 0px; padding-left: 5px; padding-right: 5px;&quot; src=&quot;http://blog.proculo.de/uploads/CHBCC/RapidWeaver.png&quot; alt=&quot;RapidWeaver&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;RapidWeaver (5 licenses)&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;&lt;a class=&#039;serendipity_image_link&#039; href=&#039;http://www.realmacsoftware.com/littlesnapper/&#039; target=&quot;_blank&quot;&gt;&lt;!-- s9ymdb:163 --&gt;&lt;img width=&quot;128&quot; height=&quot;128&quot; style=&quot;border: 0px; padding-left: 5px; padding-right: 5px;&quot; src=&quot;http://blog.proculo.de/uploads/CHBCC/LittleSnapper.png&quot; alt=&quot;LittleSnapper&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt; LittleSnapper (5 licenses)&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;&lt;a class=&#039;serendipity_image_link&#039; href=&#039;http://connectedflow.com/changes/&#039; target=&quot;_blank&quot;&gt;&lt;!-- s9ymdb:151 --&gt;&lt;img width=&quot;128&quot; height=&quot;128&quot; style=&quot;border: 0px; padding-left: 5px; padding-right: 5px;&quot; src=&quot;http://blog.proculo.de/uploads/CHBCC/Changes.png&quot; alt=&quot;Changes&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;Changes (2 licenses)&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;&lt;a class=&#039;serendipity_image_link&#039; href=&#039;http://www.mcubedsw.com/software/lighthousekeeper&#039; target=&quot;_blank&quot;&gt;&lt;!-- s9ymdb:151 --&gt;&lt;img width=&quot;128&quot; height=&quot;128&quot; style=&quot;border: 0px; padding-left: 5px; padding-right: 5px;&quot; src=&quot;http://blog.proculo.de/uploads/CHBCC/LighthouseKeeper.png&quot; alt=&quot;Lighthouse Keeper&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;Lighthouse Keeper (1 license)&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;&lt;a class=&#039;serendipity_image_link&#039; href=&#039;http://www.mcubedsw.com/software/codecollectorpro&#039; target=&quot;_blank&quot;&gt;&lt;!-- s9ymdb:151 --&gt;&lt;img width=&quot;128&quot; height=&quot;128&quot; style=&quot;border: 0px; padding-left: 5px; padding-right: 5px;&quot; src=&quot;http://blog.proculo.de/uploads/CHBCC/CodeCollectorPro.png&quot; alt=&quot;Code Collector Pro&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;Code Collector Pro (1 license)&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;&lt;a class=&#039;serendipity_image_link&#039; href=&#039;http://www.versionsapp.com/&#039; target=&quot;_blank&quot;&gt;&lt;!-- s9ymdb:151 --&gt;&lt;img width=&quot;128&quot; height=&quot;128&quot; style=&quot;border: 0px; padding-left: 5px; padding-right: 5px;&quot; src=&quot;http://blog.proculo.de/uploads/CHBCC/Versions.png&quot; alt=&quot;Versions&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;Versions (3 licenses)&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;&lt;a class=&#039;serendipity_image_link&#039; href=&#039;http://www.coversutra.com/&#039; target=&quot;_blank&quot;&gt;&lt;!-- s9ymdb:151 --&gt;&lt;img width=&quot;128&quot; height=&quot;128&quot; style=&quot;border: 0px; padding-left: 5px; padding-right: 5px;&quot; src=&quot;http://blog.proculo.de/uploads/CHBCC/CoverSutra.png&quot; alt=&quot;CoverSutra&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;CoverSutra (3 licenses)&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;&lt;a class=&#039;serendipity_image_link&#039; href=&#039;http://www.pixelespressoapps.com/decloner/&#039; target=&quot;_blank&quot;&gt;&lt;!-- s9ymdb:151 --&gt;&lt;img width=&quot;128&quot; height=&quot;128&quot; style=&quot;border: 0px; padding-left: 5px; padding-right: 5px;&quot; src=&quot;http://blog.proculo.de/uploads/CHBCC/Decloner.png&quot; alt=&quot;Decloner&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;Decloner (5 licenses)&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;&lt;a class=&#039;serendipity_image_link&#039; href=&#039;http://zykloid.com/posterino&#039; target=&quot;_blank&quot;&gt;&lt;!-- s9ymdb:151 --&gt;&lt;img width=&quot;128&quot; height=&quot;128&quot; style=&quot;border: 0px; padding-left: 5px; padding-right: 5px;&quot; src=&quot;http://blog.proculo.de/uploads/CHBCC/Posterino.png&quot; alt=&quot;Posterino&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;Posterino (5 licenses)&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;&lt;a class=&#039;serendipity_image_link&#039; href=&#039;http://www.maccoremac.com/&#039; target=&quot;_blank&quot;&gt;&lt;!-- s9ymdb:151 --&gt;&lt;img width=&quot;128&quot; height=&quot;128&quot; style=&quot;border: 0px; padding-left: 5px; padding-right: 5px;&quot; src=&quot;http://blog.proculo.de/uploads/CHBCC/MentalCase.png&quot; alt=&quot;Mental Case&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;Mental Case (1 license)&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;&lt;a class=&#039;serendipity_image_link&#039; href=&#039;http://www.macmation.com/TimeBoxed&#039; target=&quot;_blank&quot;&gt;&lt;!-- s9ymdb:151 --&gt;&lt;img width=&quot;128&quot; height=&quot;128&quot; style=&quot;border: 0px; padding-left: 5px; padding-right: 5px;&quot; src=&quot;http://blog.proculo.de/uploads/CHBCC/TimeBoxed.png&quot; alt=&quot;TimeBoxed&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;TimeBoxed (5 licenses)&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;&lt;a class=&#039;serendipity_image_link&#039; href=&#039;http://www.maclife.de/&#039; target=&quot;_blank&quot;&gt;&lt;!-- s9ymdb:156 --&gt;&lt;img width=&quot;300&quot; height=&quot;69&quot; style=&quot;border: 0px; padding-left: 5px; padding-right: 5px;&quot; src=&quot;http://blog.proculo.de/uploads/CHBCC/MacLife.png&quot; alt=&quot;Mac Life&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;Mac Life magazine (3 one-year subscriptions)&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;In my opinion, that is one fantastic line-up of prizes - especially for developers. They will be distributed as follows among the best-ranking participants:&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;&lt;strong&gt;First prize&lt;/strong&gt;: RapidWeaver, LittleSnapper, Lighthouse Keeper, Code Collector Pro, Decloner, Posterino, Versions, TimeBoxed, CoverSutra, Changes, Mental Case, Mac Life subscription&lt;br /&gt;
&lt;strong&gt;Second prize&lt;/strong&gt;: RapidWeaver, LittleSnapper, Decloner, Posterino, Versions, TimeBoxed, CoverSutra, Changes, Mac Life subscription&lt;br /&gt;
&lt;strong&gt;Third prize&lt;/strong&gt;: RapidWeaver, LittleSnapper, Decloner, Posterino, Versions, TimeBoxed, CoverSutra, Mac Life subscription&lt;br /&gt;
&lt;strong&gt;Fourth and fifth prize&lt;/strong&gt;: RapidWeaver, LittleSnapper, Decloner, Posterino, TimeBoxed&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Including the Mac Life subscriptions, the amount of all the prizes comes to over 1,000 . I&#039;d like to thank all of the sponsors for their generous offers and hope that all those who attend next week&#039;s meeting are going to enjoy the competition. I&#039;m looking forward to seeing what you guys will come up with.&lt;/p&gt;&lt;br /&gt;
 
    </content:encoded>

    <pubDate>Fri, 07 Aug 2009 13:56:40 +0200</pubDate>
    <guid isPermaLink="false">http://blog.proculo.de/archives/172-guid.html</guid>
    
</item>
<item>
    <title>I got me a Twitshirt!</title>
    <link>http://blog.proculo.de/archives/171-I-got-me-a-Twitshirt!.html</link>
            <category>Mac stuff</category>
    
    <comments>http://blog.proculo.de/archives/171-I-got-me-a-Twitshirt!.html#comments</comments>
    <wfw:comment>http://blog.proculo.de/wfwcomment.php?cid=171</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://blog.proculo.de/rss.php?version=2.0&amp;type=comments&amp;cid=171</wfw:commentRss>
    

    <author>alexander.repty@mac.com (Alexander Repty)</author>
    <content:encoded>
    It has this &lt;a href=&quot;https://twitter.com/mattgemmell/status/2277421425&quot;&gt;great quote&lt;/a&gt; by &lt;a href=&quot;https://twitter.com/mattgemmell&quot;&gt;Matt Legend Gemmell&lt;/a&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;a  class=&#039;serendipity_image_link&#039;  rel=&#039;lightbox&#039; href=&#039;http://blog.proculo.de/uploads/Foto28.jpg&#039;&gt;&lt;!-- s9ymdb:150 --&gt;&lt;img width=&quot;110&quot; height=&quot;83&quot; style=&quot;border: 0px; padding-left: 5px; padding-right: 5px;&quot; src=&quot;http://blog.proculo.de/uploads/Foto28.serendipityThumb.jpg&quot; alt=&quot;&quot;  /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
By the way, I&#039;m &lt;a href=&quot;http://twitter.com/arepty&quot;&gt;@arepty on Twitter&lt;/a&gt;. 
    </content:encoded>

    <pubDate>Sat, 04 Jul 2009 13:12:22 +0200</pubDate>
    <guid isPermaLink="false">http://blog.proculo.de/archives/171-guid.html</guid>
    
</item>
<item>
    <title>NSConference</title>
    <link>http://blog.proculo.de/archives/170-NSConference.html</link>
            <category>Development</category>
    
    <comments>http://blog.proculo.de/archives/170-NSConference.html#comments</comments>
    <wfw:comment>http://blog.proculo.de/wfwcomment.php?cid=170</wfw:comment>

    <slash:comments>1</slash:comments>
    <wfw:commentRss>http://blog.proculo.de/rss.php?version=2.0&amp;type=comments&amp;cid=170</wfw:commentRss>
    

    <author>alexander.repty@mac.com (Alexander Repty)</author>
    <content:encoded>
    Last week, I made a short trip to the UK for the first ever &lt;a href=&quot;http://www.nsconference.com/&quot; title=&quot;NSConference&quot;&gt;NSConference&lt;/a&gt;, organised by &lt;a href=&quot;http://www.mac-developer-network.com/&quot; title=&quot;Steve &#039;Scotty&#039; Scott&quot;&gt;Steve &quot;Scotty&quot; Scott&lt;/a&gt; and &lt;a href=&quot;http://www.timisted.net/blog/&quot; title=&quot;Tim Isted&quot;&gt;Tim Isted&lt;/a&gt;. With a list of speakers including well-known developers such as &lt;a href=&quot;http://mattgemmell.com/&quot; title=&quot;Matt Legend Gemmell&quot;&gt;Matt Legend Gemmell&lt;/a&gt;, &lt;a href=&quot;http://www.zarrastudios.com/ZDS/Home/Home.html&quot; title=&quot;Marcus Zarra&quot;&gt;Marcus Zarra&lt;/a&gt;, &lt;a href=&quot;http://www.algorithm.com.au/&quot; title=&quot;André Pang&quot;&gt;André Pang&lt;/a&gt;, &lt;a href=&quot;http://www.atomicwang.org/motherfucker/Index/Index.html&quot; title=&quot;Mike Lee&quot;&gt;Mike Lee&lt;/a&gt; and a bunch more, I was sure that attending would be worth the time, money and effort.&lt;br /&gt;
&lt;br /&gt;
Fortunately, I arrived on Wednesday already, so I could participate in the big get-together at the bar that night. A lot of people who arrived early, too, had a great time getting to know each other, drinking beer and cider and generally talking about Mac development related stuff. Getting to know a bunch of people who I just knew from Twitter made this evening a blast.&lt;br /&gt;
&lt;br /&gt;
Obviously, a night such as that one had its drawbacks - namely, alcohol consumption. Too much of it for a clear head on Thursday morning, anyway. About three cups of coffee, a great breakfast, two paracetamol and a Red Bull later, I was back on my feet and excited about the sessions that the day would offer. And I should not be disappointed. All the speakers knew their stuff really well and presented us with great material and inspiration to start working on something that would utlize our new-found knowledge. Especially &lt;a href=&quot;http://www.fscript.org/prof/prof.htm&quot; title=&quot;Philippe Mougin&quot;&gt;Philippe Mougin&lt;/a&gt; seemed to have hit a nail with his talk about &lt;a href=&quot;http://www.fscript.org/&quot; title=&quot;F-Script&quot;&gt;F-Script&lt;/a&gt;, as everyone seemed to be eager to use it right away and find out more about their and Apple&#039;s applications.&lt;br /&gt;
&lt;br /&gt;
Thursday night saw the NSConference banquet taking place, which was a great dinner along with the chance to meet even more fellow developers and have some great conversations. Also, even more beer and cider, although I managed to drink in moderation and avoid taking even more medication the next morning.&lt;br /&gt;
&lt;br /&gt;
After four more great sessions and a somewhat decent lunch, we got to be witnesses of the first ever Cocoa Faceoff, which pitted the speakers from America against those from Europe with each team joined by two delegates. Both teams had 30 minutes to design a Cocoa application, along with an iPhone version for conference organisers. By the end of the time, the teams should present their idea to the audience which would judge these applications. Scotty made promises of glory for the winning team and shame for the losers - while seeming completely impartial (*cough*).&lt;br /&gt;
&lt;br /&gt;
Tim and Scotty would grab each speaker out of their group for a few minutes, so that they could provide a quick tip to the remaining delegates. This proved to be a lot of entertainment, although it resulted in Xcode being unusable at some point and almost got the Mac Pro destroyed.&lt;br /&gt;
&lt;br /&gt;
Both teams presented their application ideas to the cheers of the audience, and Europe took the win, with a barely noticeable higher noise level than the American team achieved.&lt;br /&gt;
&lt;br /&gt;
With this, the first ever UK Mac developer conference came to a close, and all of us could go home and look back on a few days full of great talks, informative conversations and a lot of fun. I couldn&#039;t find one person who didn&#039;t enjoy the conference or didn&#039;t think they walked away with some very valuable knowledge.&lt;br /&gt;
&lt;br /&gt;
All that said, I&#039;m looking forward to NSConference 2.0 next year.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.flickr.com/photos/alexrepty/sets/72157617078961142/&quot; title=&quot;iPhone pictures of NSConference&quot;&gt;I also posted some pictures on Flickr&lt;/a&gt;. 
    </content:encoded>

    <pubDate>Mon, 20 Apr 2009 12:04:54 +0200</pubDate>
    <guid isPermaLink="false">http://blog.proculo.de/archives/170-guid.html</guid>
    
</item>

</channel>
</rss>
