<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
 
 <title>Springenwerk Blog by Johannes Fahrenkrug</title>
 <link href="http://blog.springenwerk.com/atom.xml" rel="self"/>
 <link href="http://blog.springenwerk.com/"/>
 <updated>2013-01-29T07:06:43-08:00</updated>
 <id>http://blog.springenwerk.com/</id>
 <author>
   <name>Johannes Fahrenkrug</name>
   <email>johannes@springenwerk.com</email>
 </author>

 
 <entry>
   <title>Find unused and invalid Radiant Snippets</title>
   <link href="http://blog.springenwerk.com/2013/01/find-unused-and-invalid-radiant-snippets.html"/>
   <updated>2013-01-29T00:00:00-08:00</updated>
   <id>http://blog.springenwerk.com/2013/01/find-unused-and-invalid-radiant-snippets</id>
   <content type="html">&lt;p&gt;When using the Ruby on Rails based Radiant CMS system, you might find yourself wondering which snippets are unused or which non-existent snippets are referenced in a page, a layout or another snippet. I've created a small script that finds both unused as well as invalid snippets:&lt;p&gt;
  &lt;script src=&quot;http://gist.github.com/4664843.js&quot;&gt;&lt;/script&gt;
&lt;p&gt;Just run it like so:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;bundle exec ./script/runner dead_snippets.rb&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>iOS Workshops in Heidelberg im September</title>
   <link href="http://blog.springenwerk.com/2012/08/ios-workshops-in-heidelberg-im-september.html"/>
   <updated>2012-08-29T00:00:00-07:00</updated>
   <id>http://blog.springenwerk.com/2012/08/ios-workshops-in-heidelberg-im-september</id>
   <content type="html">&lt;p&gt;This post is in German because it is about two iOS Workshops I will be giving in Heidelberg, Germany next month.&lt;/p&gt;
&lt;p&gt;Ich gebe Ende September/Anfang Oktober zwei iOS Workshops in der Print Media Academy in Heidelberg: &lt;a href=&quot;http://dpunkt.de/veranstaltungen/3041/&quot;&gt;einer für Einsteiger (27.-28.09.2012)&lt;/a&gt; und &lt;a href=&quot;http://dpunkt.de/veranstaltungen/3042/&quot;&gt;einer für Fortgeschrittene (01.-02.10.2012)&lt;/a&gt;. Wenn man beim Anmelden im Bemerkungsfeld angibt, dass man über mich drauf aufmerksam geworden ist, gibt es 10% Rabatt!&lt;/p&gt;
&lt;p&gt;Ich habe diese Workshops schon mehrfach gegeben und bei den letzten Malen von den Teilnehmern folgende Bewertungen erhalten: Durchschnittsnote von 1,14 (Grundlagen Workshop) in 2011 und eine Durchschnittsnote von 1,50 (Grundlagen Workshop) und 1,17 (Fortgeschrittenen Workshop) im Frühjahr 2012.&lt;/p&gt;
&lt;p&gt;Hier noch ein kurzes Interview, das auf der &lt;a href=&quot;http://www.ios-devcon.de/&quot;&gt;iOS DevCon in Berlin&lt;/a&gt; im Juni aufgenommen worden ist, auf der ich auch einen verkürzten iOS Einsteiger Workshop gehalten habe.
  &lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;http://www.youtube.com/embed/JUvcPm4nDGg&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;Ich würde mich sehr freuen, den einen oder anderen auf den Workshops begrüßen zu dürfen! Vielen Dank für die Aufmerksamkeit :)&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Ruby Motion: A New Chapter for iOS Development</title>
   <link href="http://blog.springenwerk.com/2012/05/ruby-motion-a-new-chapter-for-ios-development.html"/>
   <updated>2012-05-03T00:00:00-07:00</updated>
   <id>http://blog.springenwerk.com/2012/05/ruby-motion-a-new-chapter-for-ios-development</id>
   <content type="html">&lt;p&gt;Ruby is one of my favorite programming languages. For a while I have been following and using &lt;a href=&quot;http://macruby.org/&quot;&gt;MacRuby&lt;/a&gt;. So naturally I am very excited about the launch of &lt;a href=&quot;http://rubymotion.com&quot;&gt;RubyMotion&lt;/a&gt;: MacRuby for iOS development! Spearheaded by the brilliant Laurent Sansonetti, it is a project you should definitely check out! I was involved in much of the beta testing period and was asked to contribute &lt;a href=&quot;https://github.com/HipByte/RubyMotionSamples/tree/master/Trollify&quot;&gt;one of the official sample projects&lt;/a&gt;. I wish Laurent all the best with his exciting start-up!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>iPhone Developers Conference Advisory Board</title>
   <link href="http://blog.springenwerk.com/2012/02/iphone-developers-conference-advisory-board.html"/>
   <updated>2012-02-14T00:00:00-08:00</updated>
   <id>http://blog.springenwerk.com/2012/02/iphone-developers-conference-advisory-board</id>
   <content type="html">&lt;p&gt;Last year I was able to &lt;a href=&quot;http://www.iphone-developer-conference.de/History/IPDC-2011/Speaker/Fahrenkrug-Johannes&quot;&gt;speak about Objective-C and Error and Exception Handling&lt;/a&gt; at the German iPhone Developers Conference. For this year's conference, I have been asked to be &lt;a href=&quot;http://www.iphone-developer-conference.de/Advisory-Board&quot;&gt;part of the advisory board&lt;/a&gt;. I'm really looking forward to it and I hope I can have a part in making this a great conference!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>I'm a Published Author: Objective-C Fundamentals</title>
   <link href="http://blog.springenwerk.com/2011/12/im-a-published-author-objective-c-fundamentals.html"/>
   <updated>2011-12-01T00:00:00-08:00</updated>
   <id>http://blog.springenwerk.com/2011/12/im-a-published-author-objective-c-fundamentals</id>
   <content type="html">&lt;img src=&quot;/images/posts/objective-c-fundamentals.png&quot;/&gt;
&lt;p&gt;Over a year ago the publisher Manning asked me to come aboard a book project: &lt;a href=&quot;http://www.manning.com/fairbairn/&quot;&gt;Objective-C Fundamentals&lt;/a&gt;. I ended up writing 3 chapters (about Core Data, GCD &amp;amp; blocks and Error &amp;amp; Exception Handling). It was an interesting experience and a lot of work. You can &lt;a href=&quot;http://www.manning.com/fairbairn/OCF_sample_ch13.pdf&quot;&gt;download the chapter about GCD &amp;amp; blocks for free here (PDF)&lt;/a&gt;. And you can find the &lt;a href=&quot;https://github.com/ChrisTec/iPhone-Book-CodeSamples&quot;&gt;source code for all of the book's projects on Github&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>SWDC 2011 Video: Mobile UI Design - Web or Native</title>
   <link href="http://blog.springenwerk.com/2011/11/swdc-2011-video-mobile-ui-design-web-or-native.html"/>
   <updated>2011-11-17T00:00:00-08:00</updated>
   <id>http://blog.springenwerk.com/2011/11/swdc-2011-video-mobile-ui-design-web-or-native</id>
   <content type="html">&lt;p&gt;I was invited to talk about &lt;a href=&quot;/2011/09/thoughts-on-mobile-ui-design.html&quot;&gt;mobile UI design&lt;/a&gt; at this year's wonderful &lt;a href=&quot;http://swdc.se&quot;&gt;Scandinavian Web Developers Conference&lt;/a&gt; in Stockholm. It was a great conference and I enjoyed it immensely! My talk was recorded and you can watch it right here in the comfort of your home!&lt;/p&gt;
&lt;iframe src=&quot;http://player.vimeo.com/video/32256530?title=0&amp;amp;byline=0&amp;amp;portrait=0&quot; width=&quot;400&quot; height=&quot;300&quot; frameborder=&quot;0&quot; webkitAllowFullScreen mozallowfullscreen allowFullScreen&gt;&lt;/iframe&gt;&lt;p&gt;&lt;a href=&quot;http://vimeo.com/32256530&quot;&gt;Johannes Fahrenkrug - Mobile UI Design - Web or Native&lt;/a&gt; from &lt;a href=&quot;http://vimeo.com/user1847395&quot;&gt;SWDC&lt;/a&gt; on &lt;a href=&quot;http://vimeo.com&quot;&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>How to Host a Developer Event</title>
   <link href="http://blog.springenwerk.com/2011/10/how-to-host-a-developer-event.html"/>
   <updated>2011-10-04T00:00:00-07:00</updated>
   <id>http://blog.springenwerk.com/2011/10/how-to-host-a-developer-event</id>
   <content type="html">&lt;p&gt;I'm currently in Berlin attending an event by Nokia and Microsoft that supposedly should attract developers to the Windows Phone 7 platform. The event enticed me to write about what (from the perspective of an attendee) would be the important ingredients for the success of such an event.&lt;/p&gt;

&lt;p&gt;
&lt;ul style=&quot;font-size: 12pt;&quot;&gt;
  &lt;li&gt;&lt;strong&gt;Reliable, secure, and fast&lt;/strong&gt; WiFi. Preferably, it should be free, too. But I'd be willing to pay a reasonable fee for it, as long as it's fast and reliable. Also, please don't make me log in on some website every half an hour. It's terribly annoying.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Power. Out. Lets.&lt;/strong&gt; Enough of them. I like to go online, code, and try out things during the event. Please provide enough power outlets so I'm not inhibited in using my machine.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;USB sticks with whatever SDK you want me to learn and work with.&lt;/strong&gt; If the SDK is not 4GB (I'm looking at you, Xcode), and the WiFi is fast and reliable, you might not need USB sticks. Otherwise, it's in your (the event organizer's) interest, to get your SDK on every attendee's machine as fast and as easily as possible.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Give me a device.&lt;/strong&gt; This sounds presumptuous, doesn't it? But think about it: Companies want you to develop for their platform. The success of their platform &lt;strong&gt;depends&lt;/strong&gt; on you writing software for it. If you give a developer a device, the chance that he/she will at least play around with it and possibly even try writing an app for it is very high. That's exactly what you want. Developers might spend some of their free time to learn about your platform if you give them a cool toy to play with. Don't miss that opportunity.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Don't bore me with slides all day.&lt;/strong&gt; At your event, you don't just want to market your platform to the developer. Your event might be the one shot opportunity to lower or completely remove the threshold for a developer to develop for your platform. The most effective way is to let developers follow along on their own machines. Tell them what to install a week or two before the event and have USB sticks ready for the ones who did not get around to installing it before the event. Then slowly develop a simple app step by step for everyone to follow along. Everyone will get aquatinted with your tools and your platform and you'll lower the threshold more than you could ever do with the prettiest slides. You want developers to go home and &lt;strong&gt;keep on developing&lt;/strong&gt; for your platform. Don't miss the unique opportunity to remove that threshold during your event and actually get everyone started.&lt;/li&gt;
  &lt;li&gt;Have &lt;strong&gt;knowledgeable developers&lt;/strong&gt; on site, not just marketing people.&lt;/li&gt;
  &lt;li&gt;Have &lt;strong&gt;great coffee&lt;/strong&gt;.&lt;/li&gt;
  &lt;li&gt;Have an easy, central spot on the web to find all the &lt;strong&gt;source code&lt;/strong&gt; and links to the relevant documentation.&lt;/li&gt;
  &lt;li&gt;Have &lt;strong&gt;microphones&lt;/strong&gt; for the Q&amp;amp;A.&lt;/li&gt;
  &lt;li&gt;Provide &lt;strong&gt;real contact email addresses&lt;/strong&gt; of the people you can contact when you have a question.&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;

&lt;p&gt;Those are my thoughts. What do you think? What did I miss?&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Thoughts on Mobile UI Design</title>
   <link href="http://blog.springenwerk.com/2011/09/thoughts-on-mobile-ui-design.html"/>
   <updated>2011-09-12T00:00:00-07:00</updated>
   <id>http://blog.springenwerk.com/2011/09/thoughts-on-mobile-ui-design</id>
   <content type="html">&lt;p&gt;I participated in a very interesting panel discussion at &lt;a href=&quot;http://Frontendconf.ch&quot;&gt;Frontendconf.ch&lt;/a&gt; on Saturday with &lt;a href=&quot;http://robertnyman.com/&quot;&gt;Robert Nyman&lt;/a&gt;, &lt;a href=&quot;http://bastianallgeier.com&quot;&gt;Bastian Allgeier&lt;/a&gt;, &lt;a href=&quot;http://twitter.com/twtomcat&quot;&gt;Markus Leutwyler&lt;/a&gt;, and &lt;a href=&quot;http://www.smashingmagazine.com/author/vitaly-friedman/&quot;&gt;Vitaly Friedman&lt;/a&gt;.&lt;/p&gt;
  &lt;img src=&quot;/images/posts/frontendconf-fishbowl.jpg&quot;/&gt; (Photo taken by &lt;a href=&quot;http://www.noedine.de/&quot;&gt;Nadine Fischer&lt;/a&gt;.)
&lt;p&gt;We talked about the pros and cons of using native or web technologies to develop mobile applications, as well as why it's disappointing to imitate native UI and the &amp;quot;write once, run everywhere&amp;quot; lie. I think the time is ripe for me to write down what I think about UI design for mobile applications. I want to point out that my opinion on this topic has not only been shaped by my own experience, but without doubt also by other great developers and designers that I have talked to or that have written about this topic, most notably &lt;a href=&quot;http://jtaby.com/&quot;&gt;Majd Taby&lt;/a&gt;.&lt;/p&gt;
  
&lt;h2&gt;Part 1: Are we learn resistant?&lt;/h2&gt;
&lt;p&gt;Do you remember Java Swing? Swing is the primary Java GUI widget toolkit. It enables you to write your app and its UI once and then run it on every platform that runs Java! Isn't that amazing? Quick! Call everyone you know and tell them about it! This will change everything! Oh no, wait. Swing has been around since roughly 1996. And it hasn't really changed anything. Do you know a single app that is using Swing? Or better yet: &lt;span class=&quot;strong_text&quot;&gt;Do you enjoy using any Swing app?&lt;/span&gt; The answer to both questions is most likely No. Why is that? Isn't it a great idea to develop an app and its UI once and then run it on every platform? No, it isn't. Here's why: Cross-platform UIs suck. &lt;span class=&quot;strong_text&quot;&gt;Cross-platform UI means that it looks and feels terrible on every platform&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;People choose a platform for a reason (at least sometimes): They prefer the UX of one platform to the UX of another; they don't want everything to be the same, they like that their platform is different (sometimes unknowingly). They get used to how things look and feel and they shun applications that feel odd and alien, even out of place. &lt;span class=&quot;strong_text&quot;&gt;If you want to create a truly great user experience on multiple platforms, you have to really know those platforms.&lt;/span&gt; The cross-platform UI problem can't simply be solved by making the buttons and windows look like native apps on the platform. There is more to it than style and color: Different platforms offer different UI concepts and elements (for example sheets and drawers on Mac OS X), but also things like the locations of &amp;quot;OK&amp;quot; and &amp;quot;Cancel&amp;quot; buttons are different on different platforms. Keyboard shotcuts are different. Menu layouts are different. Help systems are different. There simply is no such thing as a &amp;quot;one size fits all&amp;quot; UI.&lt;/p&gt;
&lt;p&gt;On the desktop, this truth is pretty much established and accepted (and has been for quite a while). On mobile, however, this whole discussion has come up again and again and is still going on. Are we learn resistant? &lt;span class=&quot;strong_text&quot;&gt;Cross-platform UI is a bad idea on the desktop. Cross-platform UI also is a bad idea on mobile.&lt;/span&gt; Period. Just because mobile is hot stuff (and will be for the foreseeable future) doesn't make cross-platform UIs a good idea again all of a sudden. We need to learn from the past. &lt;span class=&quot;strong_text&quot;&gt;Cross-platform UI is a conceptual mistake.&lt;/span&gt; It can't be fixed by better technology.&lt;/p&gt;
&lt;p&gt;There is, however, one big exception to that rule: The web. (Actually, there's another one: games. But we won't focus on those now.)&lt;/p&gt;

&lt;h2&gt;Part 2: The one exception: The web.&lt;/h2&gt;
&lt;p&gt;&lt;span class=&quot;strong_text&quot;&gt;Surprisingly, cross-platform UI works on the web.&lt;/span&gt; People are used to it. People don't think it's odd that GMail doesn't look like Outlook or Mail.app. They don't complain that the buttons on Twitter look different from the button of the other apps they use. They are able to use Google+ and Facebook although the UI looks &amp;quot;foreign&amp;quot; in comparison to other apps on their platform. Strangely enough, all those things that make cross-platform UI a bad idea seem to be absolutely OK on the web. Why is that? It has to do with expectation. &lt;span class=&quot;strong_text&quot;&gt;When users open their web browser, they know that they are entering a very diverse space&lt;/span&gt;: All web pages look different. That's OK. People are OK with that. They even like it. It's like entering a bookstore: You know and you expect that it will be full of books and magazines with different sizes, different layouts, different content structures, different colors and different content. You are not surprised by that at all. You would be unpleasantly surprised, however, if that next volume of an encyclopedia you're collecting (yes, that's far-fetched) would look totally different from the other volumes. Maybe they just used different, thinner paper. Or it's paper-back and not leather-bound. Or one issue of a magazine you're collecting would have a completely different shape, different style and different layout with the editorial in the back and the table of contents in the middle. That would be an unexpected unpleasant surprise: Just like apps with a foreign, cross-platform UI that run alongside your normal native apps. They don't fit in your collection. In the bookstore - the browser - that is OK, though. Users expect it.&lt;/p&gt;
&lt;p&gt;So as a developer we are in a great space on the web: &lt;span class=&quot;strong_text&quot;&gt;We have complete freedom to come up with one great UI&lt;/span&gt; (not multiple ones for every platform), it runs on every platform and we get away with it. However, we can ruin that great space for ourselves. How? By mimicking native UI in our web applications. When our web app looks exactly like a Mac or a Windows app, people will expect it to behave &lt;strong&gt;exactly&lt;/strong&gt; like such a native app. The problem is that it won't. The mimicking can come quite close to the real thing, but it will never be exactly as good. It is and always will be an imitation. But users don't care how something is implemented: &lt;span class=&quot;strong_text&quot;&gt;If it looks like my other apps, it should behave like my other apps.&lt;/span&gt; By making a web app look like a native app, we make the user forget that he's &amp;quot;in the bookstore&amp;quot; where everything is different. We take our own freedom to do what we want in terms of UI away from us if me imitate a native app. Worse yet, it will only look native-ish on one platform and will once again look foreign on all the other platforms.&lt;/p&gt;
&lt;p&gt;So what should we do? &lt;span class=&quot;strong_text&quot;&gt;&amp;quot;Build a UI and UX that is platform-agnostic.&amp;quot;&lt;/span&gt; (&lt;a href=&quot;http://jtaby.com/2011/07/01/the-next-generation-of-mobile-web-apps.html&quot;&gt;Building the Next Generation of Mobile Web Applications&lt;/a&gt; by Majd Taby). Don't imitate native. You will only disappoint because you won't be able to fully satisfy the expectations users have of an app that looks native. Instead, pleasantly surprise your users by not looking native, but offering features, animations, and conveniences that they would not have expected of a web application.&lt;/p&gt;
&lt;p&gt;So now what about mobile?&lt;/p&gt;

&lt;h2&gt;Part 3: What about mobile?&lt;/h2&gt;
&lt;p&gt;On mobile devices the same rules apply. Maybe even more so: The UI and UX patterns differ even more between mobile platforms than they do between desktop platforms. And on mobile people like the differences between platforms even more, too: They sometimes militantly defend Android against iOS or vice-versa. &lt;span class=&quot;strong_text&quot;&gt;They don't want every platform to be the same.&lt;/span&gt; They want the apps on &amp;quot;their&amp;quot; platform to be different from apps on other platforms. They want their iPhone apps to be iPhone-y (no pun intended) or their Android apps to be Android-ish. So once again: The same rules apply: &lt;span class=&quot;strong_text&quot;&gt;An app that has an icon on the home screen is perceived by the user as &amp;quot;an app&amp;quot;&lt;/span&gt;, no matter if it actually launches the browser without the toolbar, if it is a web app wrapped in a PhoneGap shell of if it is a native app. To the user, it's an app. It has an icon, so it's an app. The rest are implementation details that the user doesn't (and shouldn't) care about. &lt;span class=&quot;strong_text&quot;&gt;So if the user perceives it to be a native app like all the other apps, it has to behave like one.&lt;/span&gt; Otherwise the user will be disappointed. You hold your device in landscape mode and the toolbars aren't visible anymore or the UI gets messed up or there's no animation when you move from portrait to landscape? Disappointment. The thing that looks-like-a-table-view-but-really-isn't is jerky when you scroll it? Disappointment. The swipe gesture that should advance to the next page doesn't move the content underneath your finger but only triggers a page-move animation once you're completely done with the swipe and you have lifted your finger off the screen again? Disappointment. The element you are dragging around on the screen with your finger always lags behind and jerkily jumps to where your finger is every half a second instead of buttery smoothly following its movement? Disappointment. You're breaking the illusion with stuff like that. Touch devices blur the lines between the user and the content. They give the user the feeling that they can actually touch the objects on the screen and directly manipulate them. Don't break that illusion.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;strong_text&quot;&gt;Imitating native UI with web technologies on a mobile device will only disappoint.&lt;/span&gt; It's just not on par with the native experience (yet). But fear not: You can still build great mobile applications with web technologies: Just don't fake native. The web has its own thing going. And once the user opens the browser or, as it were, &amp;quot;enters the bookstore,&amp;quot; you have full creative freedom of coming up with a great, unique UI for your app. You will pleasantly surprise your users instead of disappointing them. For example, you could implement pinch &amp;amp; zoom in your mobile web app to let users zoom into an image: They'll be amazed because they wouldn't have expected that to work in a web app. If you fake native UI, however, they would take it for granted because it works in every other app and they would be disappointed if it's possibly not as smooth as in a native app. You can only lose if you try to fake native UI.&lt;/p&gt;
&lt;p&gt;So, just like on the desktop, you can only get away with cross-platform UI in the browser and only if you don't try to make it look like a native app. So the big question remains: Should I use native or web technologies for my app?&lt;/p&gt;

&lt;h2&gt;Part 4: So... native or web?&lt;/h2&gt;
&lt;p&gt;The answer is: It depends. The first question you have to ask yourself is &lt;span class=&quot;strong_text&quot;&gt;&amp;quot;What do I want to achieve with this mobile app?&amp;quot;&lt;/span&gt; If the answer is &amp;quot;I just HAVE to be in the App Store!&amp;quot;, you're doing it wrong and you probably shouldn't make an app at all. If you have a restaurant and just want to display your menu and opening times, you don't need an app. People would hate it. &lt;span class=&quot;strong_text&quot;&gt;People expect apps to either be useful, beautiful and stunning and/or entertaining&lt;/span&gt;. If it's neither of the above, don't even bother thinking about making one. No one would download it. You'd be much better off making a beautiful mobile website and maybe put some money into SEO instead of wasting your money on an app. Being &amp;quot;in the App Store&amp;quot; is no golden magic ticket to success: You can't just put anything in there. &lt;span class=&quot;strong_text&quot;&gt;The days were people are amazed simply by the fact that you have an app in the store are long over.&lt;/span&gt; If, on the other hand, you hire an expert that makes your restaurant app a work of art, which gives the user a visually stunning experience, something that's fun to use and that they want to show off to their friends: Go ahead, make an app. But if you do make an app, make one that you would want to use. Otherwise, don't even bother.&lt;/p&gt;
&lt;p&gt;But what if you have a great idea for an app and you want it to run on multiple mobile platforms? Once again, the same rules apply: &lt;span class=&quot;strong_text&quot;&gt;If you want to put it in the App Store(s), users will expect it to be on par with native apps in terms of speed, UI and UX&lt;/span&gt;. Frankly, the easiest way to be on par with native apps is to be a native app: If it's in the App Store, people will apply the same quality criteria to your app as to every other app, no matter what technology you've built it with. Telling your customers &amp;quot;Well, of course the scrolling is jerky, it's built with web technologies!&amp;quot; will not fly. They don't care what technology you've used to build it. Also, to put the final nail in the mimicking-native-UI coffin: Building something with web technologies that's on par with native is hard and difficult work. &lt;span class=&quot;strong_text&quot;&gt;It's a myth that it's so much easier and faster to build an app with web technologies.&lt;/span&gt; It could very well take longer and still have a worse user experience. Building a simple native app is, well, simple. It might be way more complicated to build it with web technologies (if you try to mimic native).&lt;/p&gt;
&lt;p&gt;All that being said, I want to make one thing clear: &lt;span class=&quot;strong_text&quot;&gt;I am absolutely convinced that you can build stunning and fast mobile applications with web technologies today.&lt;/span&gt; But I would not recommend to use web technologies today to create an app for the App Store. As an exception I might name &lt;a href=&quot;http://www.appcelerator.com/&quot;&gt;Appcelerator Titanium&lt;/a&gt; which lets you use JavaScript to build your application, but creates real native controls and UI elements from your JavaScript code at runtime. So you end with an app with a real native UI that also feels and behaves like a native app. I haven't personally used it yet, but the concept seems to make sense. And you should also keep an eye on the things that &lt;a href=&quot;http://www.strobecorp.com/&quot;&gt;Strobe&lt;/a&gt; is working on.&lt;/p&gt;
&lt;p&gt;So if you don't want to sell your app, don't have a big budget, don't need any native-only device features like access to the camera and want to be available on multiple mobile platforms, you should consider building a mobile website or web app. However, make no mistake: Creating a truly stunning mobile web app is a challenge, too: Just because you use web technologies doesn't mean that everything is as easy as putting an img tag on a page. Creating a great mobile web app requires true software craftsmanship.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;strong_text&quot;&gt;So putting ideologies and technology preferences aside and considering just your end user, I'm convinced that - when targeting the App Store - you can provide the best, smoothest, most polished experience if you create a native app.&lt;/span&gt; That might very well change over the next few years, especially when hardware accelerated CSS transforms and WebGL become available on all major mobile platforms. However, even then one thing will remain the same: Mimicking native UI will most likely be a path to user disappointment.&lt;/p&gt;
&lt;p&gt;Of course big companies like Google and Apple could agree on a standard that provides web developers with standard UI elements like navigation controllers or table views that get rendered in an optimized indistinguishable-from-native way on different platforms. The problem is they won't. They have no interest whatsoever in making mobile cross-platform development easier. They want that your great app is only available on their platform. So I doubt that they will put any significant resources into making web technologies the more attractive choice for App Store-targeted development any time soon. Or ever.&lt;/p&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;My conclusion is as simple as it probably will be polarizing: &lt;span class=&quot;strong_text&quot;&gt;If you want the best possible user experience for your users and you are targeting the App Store(s), build a native app.&lt;/span&gt; Otherwise you will most likely disappoint your users. If you don't need to be or don't want to be on the App Store(s) and your application is a good fit for a web-like application whose usability wouldn't suffer from not being able to use certain native UI elements or features, build a great mobile web app. Don't mimic native UI, though. The web has it's own thing going for it. Leverage that and pleasantly surprise your users by using advanced features that modern mobile browsers support already today.&lt;/p&gt;
&lt;p&gt;So this post turned out to be longer than I thought. Please share your opinion and let me know what you think.&lt;/p&gt;
  























</content>
 </entry>
 
 <entry>
   <title>Upcoming Conferences</title>
   <link href="http://blog.springenwerk.com/2011/08/upcoming-conferences.html"/>
   <updated>2011-08-25T00:00:00-07:00</updated>
   <id>http://blog.springenwerk.com/2011/08/upcoming-conferences</id>
   <content type="html">&lt;p&gt;Next month I'll be in Zurich. I will be &lt;a href=&quot;http://frontendconf.ch/speakers#id32&quot;&gt;speaking about Cappuccino and SproutCore at Frontendconf.ch&lt;/a&gt;.
In November I'll be speaking about &lt;a href=&quot;http://www.iphonedevcon.de/Speaker/Fahrenkrug-Johannes&quot;&gt;Objective-C and error &amp;amp; exception handling on iOS at iPhone Dev Con&lt;/a&gt; in Cologne.&lt;/p&gt;
&lt;p&gt;I hope to see you there!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>About Apple's CloudOS</title>
   <link href="http://blog.springenwerk.com/2011/08/about-apples-cloudos.html"/>
   <updated>2011-08-02T00:00:00-07:00</updated>
   <id>http://blog.springenwerk.com/2011/08/about-apples-cloudos</id>
   <content type="html">&lt;p style=&quot;font-weight: bold&quot;&gt;When I first posted this I wasn't aware that iCloud.com was an under-NDA developer preview. So I've removed the screenshot and some other stuff. If you're not a developer, &lt;a href=&quot;https://twitter.com/#!/devongovett/status/98420359837130752&quot;&gt;try this&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I have been poking around in Apple's beautiful new &lt;a href=&quot;http://www.icloud.com&quot;&gt;iCloud.com&lt;/a&gt; page a bit. Judging by the &lt;a href=&quot;https://www.icloud.com/system/cloudos/en-us/952/javascript-packed.js&quot;&gt;source code&lt;/a&gt; that is freely accessible to anyone, it recreates &lt;a href=&quot;http://en.wikipedia.org/wiki/SpringBoard&quot;&gt;SpringBoard&lt;/a&gt; in SproutCore, making the icons behave and move almost the same way they do on iOS. It uses SproutCore version 1.6.0.rc.1, &lt;a href=&quot;http://blog.sproutcore.com/statecharts-in-sproutcore/&quot;&gt;statecharts&lt;/a&gt; and &lt;a href=&quot;http://groups.google.com/group/sproutcore/browse_thread/thread/70ccfb52f352a9c2?pli=1&quot;&gt;modules&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The interesting thing is that the application is called &amp;quot;CloudOS&amp;quot;. That might possibly hint to more, or it might just be an ambitious name for the project. You can find the &lt;a href=&quot;https://www.icloud.com/system/cloudos/en-us/952/javascript-packed.js&quot;&gt;source code of CloudOS here&lt;/a&gt;. You might want to put it through something like &lt;a href=&quot;http://jsbeautifier.org/&quot;&gt;JSBeautifier&lt;/a&gt; to make it readable.&lt;/p&gt;
&lt;p&gt;I thought it would be fun to add more items CloudOS's SpringBoardView. After some experimenting I came up with this piece of code that you can just copy and paste into your browser's JavaScript console to add a github icon to your iCloud SpringBoard:&lt;br/&gt;
  &lt;script src=&quot;https://gist.github.com/1119870.js&quot;&gt; &lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;Note, however, that you'll get an error when you click on the github icon. Enjoy poking around, and if you find out how to fix it, fork &lt;a href=&quot;https://gist.github.com/1119870&quot;&gt;my gist&lt;/a&gt; or leave a comment!
  &lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>An Overdue Update</title>
   <link href="http://blog.springenwerk.com/2011/08/an-overdue-update.html"/>
   <updated>2011-08-01T00:00:00-07:00</updated>
   <id>http://blog.springenwerk.com/2011/08/an-overdue-update</id>
   <content type="html">&lt;p&gt;This is really an overdue update. I haven't posted anything here for over 6 months. I've been busy with quite a few things, so let me give you a short update:
  
&lt;ul&gt;
  &lt;li&gt;I've spent the winter in the beautiful Bay Area in California. I was able to attend some local developer meetups, meet some friends at Apple and visit the &lt;a href=&quot;http://strobecorp.com&quot;&gt;Strobe&lt;/a&gt; offices in San Francisco. Most of all I enjoyed the time with friends and great weather, though. We will definitely spend next winter there again!&lt;/li&gt;
  &lt;li&gt;In March I gave a &lt;a href=&quot;http://it-republik.de/konferenzen/ext_scripts/v2/php/sessions-popup.php?module=mobiletechcon2011spring&amp;id=17381&quot;&gt;1-day iOS workshop at the MobileTech conference&lt;/a&gt; in Munich. It covered everything from Objective-C, Xcode 4, Cocoa, Provisining Profiles and the App Store. The audience was very nice, it was a lot of fun. I hope I can give such workshops more often in the future. Here's a short video interview with me that was taken right after the workshop (in German):&lt;br/&gt;&lt;iframe width=&quot;560&quot; height=&quot;349&quot; src=&quot;http://www.youtube.com/embed/b7vhn1EivRg&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/li&gt;
  &lt;li&gt;I also went to Luxembourg in March and coached two talented iOS developers on-site for two days.&lt;/li&gt;
  &lt;li&gt;In April I was approached by Charles Jolley of &lt;a href=&quot;http://sproutcore.com&quot;&gt;SproutCore&lt;/a&gt; and Strobe fame to do some contract work for &lt;a href=&quot;http://strobecorp.com&quot;&gt;Strobe&lt;/a&gt;. I've been working on and off on different exciting things for them since then. It's an exceptionally nice and talented team!&lt;/li&gt;
  &lt;li&gt;In April the German Mac Developer magazine also published two articles by me: one &lt;a href=&quot;https://twitter.com/#!/jfahrenkrug/status/55664775304183808&quot;&gt;about SproutCore&lt;/a&gt; and one &lt;a href=&quot;https://twitter.com/#!/MacRuby/statuses/55686821165805568&quot;&gt;about MacRuby&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;In May I went to Verona, Italy to give a talk about &lt;a href=&quot;http://sproutcore.com&quot;&gt;SproutCore&lt;/a&gt; and &lt;a href=&quot;http://www.cappuccino.org&quot;&gt;Cappuccino&lt;/a&gt; at &lt;a href=&quot;http://www.jsday.it/2011/archive/speaker/johannes-fahrenkrug&quot;&gt;JSDay.it&lt;/a&gt;. It was a great little conference and Verona is beautiful! You can &lt;a href=&quot;http://www.slideshare.net/jfahrenkrug/jsconfit-2011-a-wondrous-experience-of-sound-light-and-code&quot;&gt;see the slides here&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;In June I went back to California for &lt;a href=&quot;http://developer.apple.com/wwdc&quot;&gt;WWDC 2011&lt;/a&gt;, my fifth WWDC in a row. It was the best one yet.&lt;br/&gt;
    &lt;img src=&quot;/images/posts/johannes-fahrenkrug-wwdc11.jpg&quot;/&gt;&lt;/li&gt;
  &lt;li&gt;Right after WWDC I also attended the world's first Cappuccino conference, &lt;a href=&quot;http://www.cappcon.org&quot;&gt;CappCon&lt;/a&gt;. It was amazing to have the who-is-who of the Cappuccino community in one spot. The talks were great and some very exciting announcements were made.&lt;/li&gt;
  &lt;li&gt;During WWDC, I also got a copy of the May issue of MacTech magazine, which featured a cover article by me about Cappuccino:&lt;br/&gt;&lt;img src=&quot;/images/posts/mactech-cappuccino.jpg&quot;/&gt;&lt;/li&gt;
  &lt;li&gt;On July 1st my fifth year as a freelancer began. I can't believe it's been over 4 years already!&lt;/li&gt;
&lt;/ul&gt;

So those are the main things that have happened in my professional life.
&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>VertexHelper Pro on the Mac App Store</title>
   <link href="http://blog.springenwerk.com/2011/01/vertexhelper-pro.html"/>
   <updated>2011-01-06T00:00:00-08:00</updated>
   <id>http://blog.springenwerk.com/2011/01/vertexhelper-pro</id>
   <content type="html">&lt;p&gt;VertexHelper Pro is a tool that lets you easily define physics body vertices for your game's sprite images. It is available on the Mac App Store: &lt;a href=&quot;http://itunes.apple.com/us/app/vertexhelper-pro/id411684411?mt=12&quot;&gt;Get VertexHelpre Pro here (iTunes Link)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This video shows you what it does and how it works:&lt;br /&gt;
&lt;object width=&quot;480&quot; height=&quot;385&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/2IWOR7JA9zU?fs=1&amp;amp;hl=en_US&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/2IWOR7JA9zU?fs=1&amp;amp;hl=en_US&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;480&quot; height=&quot;385&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;
&lt;p&gt;I hope you like it!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>SproutCore Touch Image Search Demo (iPad and Desktop)</title>
   <link href="http://blog.springenwerk.com/2010/11/sproutcore-touch-image-search-demo.html"/>
   <updated>2010-11-22T00:00:00-08:00</updated>
   <id>http://blog.springenwerk.com/2010/11/sproutcore-touch-image-search-demo</id>
   <content type="html">&lt;p&gt;I have started to rediscover &lt;a href=&quot;http://sproutcore.com&quot;&gt;SproutCore&lt;/a&gt;. It's been over 2 years since &lt;a href=&quot;/2008/07/socialsprout-using-sproutcore-in.html&quot;&gt;I last played around with it&lt;/a&gt; and a lot has happened since. I'm &lt;a href=&quot;http://www.iphonedevcon.de/02-Dezember.01dezember1.0.html&quot;&gt;giving a talk about using SproutCore for iOS development next month&lt;/a&gt; and I've built a demo application for it. It's a Google Image Search client that supports touch gestures to pinch and zoom the image and autorotation: So for best results try it out on your iPad.&lt;/p&gt;

&lt;p style=&quot;margin-top: 30px&quot;&gt;&lt;h1&gt;&lt;a class=&quot;swbluelink&quot; href=&quot;/static/image_search/en/23462fa8c9787d47c984eedae43b70ab9ec01040/index.html&quot;&gt;Try it!&lt;/a&gt;&lt;/h1&gt;&lt;/p&gt;

&lt;p&gt;&lt;h4&gt;Some screenshots (in the spirit of this &lt;a href=&quot;http://www.apple.com/the-beatles/&quot;&gt;unforgettable announcement&lt;/a&gt;):&lt;/h4&gt;
  &lt;img src=&quot;/images/posts/sproutcore-image-search1.png&quot; alt=&quot;SproutCore Touch Image Search Screenshot 1&quot;/&gt;
  &lt;img src=&quot;/images/posts/sproutcore-image-search2.png&quot; style=&quot;margin-top: 10px&quot; alt=&quot;SproutCore Touch Image Search Screenshot 2&quot;/&gt;
&lt;/p&gt;
&lt;p&gt;Oh, and the &lt;a href=&quot;https://github.com/jfahrenkrug/iphonedevcon2010-sproutcore-demo&quot;&gt;code is on github&lt;/a&gt;, of course!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>JSConf EU 2010</title>
   <link href="http://blog.springenwerk.com/2010/10/jsconf-eu-2010.html"/>
   <updated>2010-10-14T00:00:00-07:00</updated>
   <id>http://blog.springenwerk.com/2010/10/jsconf-eu-2010</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;http://www.springenwerk.com/images/posts/jsconfeu_logo.png&quot;/&gt;&lt;/p&gt;
&lt;p&gt;I was able to attend &lt;a href=&quot;http://jsconf.eu&quot;&gt;JSConf EU 2010&lt;/a&gt; last month. It was one of the best conferences I have ever attended. The quality of most talks was outstanding. The conference was also quite small so that you had a chance to actually talk to the people you wanted to meet. &lt;a href=&quot;http://www.crockford.com/&quot;&gt;Douglas Crockford&lt;/a&gt; gave a &lt;a href=&quot;http://jsconf.eu/2010/speaker/loopage_by_douglas_crockford.html&quot;&gt;talk&lt;/a&gt;, as did the creator of JavaScript himself, &lt;a href=&quot;http://brendaneich.com/&quot;&gt;Brendan Eich&lt;/a&gt; and &lt;a href=&quot;http://jsconf.eu/2010/speaker/using_the_web_to_deliver_the_n.html&quot;&gt;Dion Almear and Ben Galbraith&lt;/a&gt; of the palm webOS project.&lt;/p&gt;
&lt;p&gt;Other talks I immensly enjoyed were &lt;a href=&quot;http://jsconf.eu/2010/speaker/getting_functional_with_fab.html&quot;&gt;&amp;quot;Getting Functional with (fab)&amp;quot;&lt;/a&gt; by &lt;a href=&quot;http://twitter.com/jedschmidt&quot;&gt;Jed Schmidt&lt;/a&gt;. His slides were absolutely exceptional and the talk was both very entertaining and fascinatingly detailed. You can &lt;a href=&quot;http://jsconf.eu/2010/speaker/getting_functional_with_fab.html&quot;&gt;watch his talk here&lt;/a&gt;. If you haven't checked out &lt;a href=&quot;http://github.com/jed/fab&quot;&gt;(fab)&lt;/a&gt; yet, you should do so right now!&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://jsconf.eu/2010/speaker/oh_no_not_again.html&quot;&gt;&amp;quot;The Front-end Takeover&amp;quot;&lt;/a&gt; by &lt;a href=&quot;http://www.twitter.com/aq&quot;&gt;Aaron &amp;quot;That Bacon Guy&amp;quot; Quinn&lt;/a&gt; was - as expected - both entertaining and insightful. It was nice to meet Aaron in person at the pre conference &lt;a href=&quot;http://codefoodbar.org/&quot;&gt;code food bar&lt;/a&gt; event.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://jsconf.eu/2010/speaker/the_jquery_divide_by_rebecca_m.html&quot;&gt;&amp;quot;The jQuery Divide&amp;quot;&lt;/a&gt; by &lt;a href=&quot;http://twitter.com/rmurphey&quot;&gt;Rebecca Murphey&lt;/a&gt; showed how it is important to actually learn and use JavaScript and not just a framework.&lt;/p&gt;
&lt;p&gt;Another absolute highlight was &lt;a href=&quot;http://jsconf.eu/2010/speaker/lessons_learnt_pushing_browser.html&quot;&gt;&amp;quot;Lessons learnt pushing browsers to the limit&amp;quot;&lt;/a&gt;  by &lt;a href=&quot;http://twitter.com/bfirsh&quot;&gt;Ben Firshman&lt;/a&gt;. Juicy details about performance issues and solutions learnt while porting an &lt;a href=&quot;http://benfirshman.com/projects/jsnes/&quot;&gt;NES Emulator to JavaScript&lt;/a&gt;. Wonderful. This is the kind of stuff I attend conferences for :).&lt;/p&gt;
&lt;p&gt;While Tobias Schneider's (of &lt;a href=&quot;http://wiki.github.com/tobeytailor/gordon/&quot;&gt;Gordon&lt;/a&gt; fame) talk &lt;a href=&quot;http://jsconf.eu/2010/speaker/not_your_mothers_javascript.html&quot;&gt;&amp;quot;Not your Mother's JavaScript!&amp;quot;&lt;/a&gt; was definitely interesting, I wish he would have shown more examples and more cool stuff. Maybe my expectations were just too high.&lt;/p&gt;
&lt;p&gt;Another fantastic talk was &lt;a href=&quot;http://jsconf.eu/2010/speaker/socketio_websockets_for_everyo.html&quot;&gt;&amp;quot;Socket.IO: WebSockets for everyone&amp;quot;&lt;/a&gt; by &lt;a href=&quot;http://twitter.com/rauchg&quot;&gt;Guillermo Rauch&lt;/a&gt;. &lt;a href=&quot;http://github.com/learnboost/socket.io&quot;&gt;Socket.IO&lt;/a&gt; is a library that enables websockets for (almost) every browser, even IE 5.5(!). A fantastic talk about an equally fantastic library. Definitely check out the &lt;a href=&quot;http://github.com/guille/jsconf-todo-demo&quot;&gt;demo code&lt;/a&gt; for this talk.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://twitter.com/mutle&quot;&gt;Mutwin Kraus&lt;/a&gt;' talk about &lt;a href=&quot;http://jsconf.eu/2010/speaker/using_to_develop_classic_2d_ga.html&quot;&gt;&amp;quot;Using canvas to develop classic 2D games&amp;quot;&lt;/a&gt; was both interesting and practical. Mutwin talked about &lt;a href=&quot;http://github.com/mutle/jsscummvm&quot;&gt;JSScummVM&lt;/a&gt;, canvas, sprites and masking. Good stuff!&lt;/p&gt;
&lt;p&gt;Of course the final talk by Chris Williams - &lt;a href=&quot;http://jsconf.eu/2010/communityjs_by_chris_williams.html&quot;&gt;&amp;quot;community.js&amp;quot;&lt;/a&gt; was very powerful and introduced the &lt;a href=&quot;http://promotejs.com/&quot;&gt;Promote.JS&lt;/a&gt; project to improve JavaScript documentation visibility. A very good idea.&lt;/p&gt;
&lt;p&gt;So what's left to say? I can't wait for JSConf.eu 2011!&lt;/p&gt;
&lt;p&gt;&lt;a href='https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Number' title='JavaScript Number .toPrecision'&gt;&lt;img src='http://static.jsconf.us/promotejsv.gif' height='280' width='160' alt='JavaScript Number .toPrecision'/&gt;&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Media Markt iPhone App</title>
   <link href="http://blog.springenwerk.com/2010/08/media-markt-iphone-app.html"/>
   <updated>2010-08-16T00:00:00-07:00</updated>
   <id>http://blog.springenwerk.com/2010/08/media-markt-iphone-app</id>
   <content type="html">&lt;p&gt;I will be on &lt;a href=&quot;http://www.alwayssmokin.com/&quot;&gt;vaca&lt;/a&gt;&lt;a href=&quot;http://www.natenal.com/&quot;&gt;tion&lt;/a&gt; till the 6th of September. Before I go I'd like to share 3 little pieces of news, though. A few days ago, &lt;a href=&quot;http://itunes.apple.com/de/app/media-markt/id386304604?mt=8&quot;&gt;the official Media Markt iPhone app&lt;/a&gt; (iTunes link) hit the AppStore. (&lt;strong&gt;Update: For some time, I have not been involved with the development of this app anymore.&lt;/strong&gt;) Media Markt is like the German Best Buy or Fry's. I had the opportunity of developing it. I did not, however, come up with the concept for it. Any praise or criticism for it has to be directed elsewhere :).&lt;/p&gt;
&lt;p&gt;Some technical background might be interesting for you. The app uses &lt;a href=&quot;http://three20.info/&quot;&gt;Three20&lt;/a&gt;. It's a great framework, but I'm not sure if I'll use it again. It greatly simplyfies the loading and displaying of remote resources, the persistence of the navigation stack, caching and style. But I've found myself fighting the framework quite frequently when I wanted to do something non-standard. I think I can still say that the benefits outweigh the bad parts, especially for this kind of application. But it does add quite a bit of (source-)bloat which I'm not particularly fond of. Anyway, I don't want to complain, it's a powerful and free framework and thank you to all the developers that have put time, thought and engery into it!&lt;/p&gt;
&lt;p&gt;Also, the zooming of the diffenent pages of the ads is done using &lt;a href=&quot;http://developer.apple.com/iphone/library/documentation/GraphicsImaging/Reference/CATiledLayer_class/Introduction/Introduction.html&quot;&gt;CATiledLayer&lt;/a&gt;. Each page is cut up into tiles on three different zoom levels (25%, 50%, 100%). So the initial pages load rather quickly, and when as you zoom in, the higher resolution tiles are loaded and smoothly displayed. That way you get a fast and smooth zooming experience and only the data is loaded that the user actually is interested in seeing. A much better solution than making the user wait long while an 8MB high-res PDF is being loaded. The cool thing is that I had an opportunity to get THE Apple UIScrollView expert, &lt;a href=&quot;http://twitter.com/elizablock&quot;&gt;Eliza Block&lt;/a&gt; (of &lt;a href=&quot;http://developer.apple.com/iphone/library/samplecode/ScrollViewSuite/Introduction/Intro.html&quot;&gt;ScrollViewSuite&lt;/a&gt; fame), to answer my questions and &lt;a href=&quot;http://twitter.com/jfahrenkrug/status/15950615783&quot;&gt;give me advice at WWDC this year&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The app was released on 12 August and jumped into the top 5 of free apps in the German AppStore within a day, briefly being number 3:&lt;br/&gt;
  &lt;img style=&quot;padding: 10px&quot; src=&quot;/images/posts/mm-iphone-app-top3.png&quot;/&gt;
&lt;/p&gt;
&lt;p&gt;Another app that I've developed and that is available now is the &lt;a href=&quot;http://itunes.apple.com/de/app/liebherr-ice-crusher/id385527840?mt=8&quot;&gt;Liebherr Ice Crusher&lt;/a&gt; (iTunes Link).
  &lt;img style=&quot;padding: 10px&quot; src=&quot;/images/posts/liebherr-ice-crusher-app.jpg&quot;/&gt;&lt;br/&gt;
It uses &lt;a href=&quot;http://www.cocos2d-iphone.org/&quot;&gt;Cocos2D&lt;/a&gt; and &lt;a href=&quot;http://www.box2d.org/&quot;&gt;Box2D&lt;/a&gt; for physics simulation. I've created &lt;a href=&quot;http://www.springenwerk.com/2010/02/introducing-vertexhelper-for-box2d.html&quot;&gt;VertexHelper&lt;/a&gt; while working on this app. I just did the development, the design and concept are nothing I can take credit for.
&lt;/p&gt;
&lt;p&gt;The third piece of news is that I was mentioned in the major German newspaper &lt;a href=&quot;http://www.zeit.de/2010/30/Wolkenwaechter?page=all&quot;&gt;&quot;Die Zeit&quot; in an article about cloud computing security&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;That's it! See you in September.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Script to download all WWDC 2010 Session Material</title>
   <link href="http://blog.springenwerk.com/2010/06/wwdc-2010-material-downloader.html"/>
   <updated>2010-06-10T00:00:00-07:00</updated>
   <id>http://blog.springenwerk.com/2010/06/wwdc-2010-material-downloader</id>
   <content type="html">&lt;a href=&quot;http://github.com/jfahrenkrug/wwdc2010-material-downloader&quot;&gt;&lt;img src=&quot;/images/posts/wwdc2010material.png&quot; alt=&quot;wwdc2010&quot;/&gt;&lt;/a&gt;&lt;br/&gt;
&lt;p&gt;If you are attending &lt;a href=&quot;http://developer.apple.com/wwdc&quot;&gt;WWDC 2010&lt;/a&gt; you no doubt want to get a hold of all the great sample code and session material. I've written a script that will download it all for you and organize it in folders for each session. You can &lt;a href=&quot;http://github.com/jfahrenkrug/wwdc2010-material-downloader&quot;&gt;download it here on github&lt;/a&gt;. Enjoy and see you next year.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>See you at WWDC 2010</title>
   <link href="http://blog.springenwerk.com/2010/06/will-be-at-wwdc-2010.html"/>
   <updated>2010-06-01T00:00:00-07:00</updated>
   <id>http://blog.springenwerk.com/2010/06/will-be-at-wwdc-2010</id>
   <content type="html">&lt;img src=&quot;http://img.skitch.com/20100601-k38kjijc9wca4f4m7ur9bwj29m.jpg&quot; alt=&quot;wwdc2010&quot;/&gt;&lt;br/&gt;
I will be attending &lt;a href=&quot;http://developer.apple.com/wwdc&quot;&gt;WWDC&lt;/a&gt; again this year. It's my 4th WWDC in a row and I'm sure it will be great. Apple really has to make up for the annoyingly late announcement of the dates this year. If you'll be there too make sure to say Hi. I'll be staying at the &lt;a href=&quot;http://www.executivehotels.net/sanfranciscohotel/s_vintage_home.cgi&quot;&gt;Executive Hotel Vintage Court, Union Square&lt;/a&gt; and I'll be &lt;a href=&quot;http://twitter.com/jfahrenkrug&quot;&gt;twittering&lt;/a&gt; throughout the conference.


</content>
 </entry>
 
 <entry>
   <title>Introducing Raphuccino: Cappuccino meets RaphaelJS</title>
   <link href="http://blog.springenwerk.com/2010/04/introducing-raphuccino.html"/>
   <updated>2010-04-27T00:00:00-07:00</updated>
   <id>http://blog.springenwerk.com/2010/04/introducing-raphuccino</id>
   <content type="html">&lt;p&gt;I will make this post very short: &lt;a href=&quot;http://raphaeljs.com&quot;&gt;RaphaelJS&lt;/a&gt; is amazing. It is a Javascript library that lets you easily create and manipulate vector graphics. I thought it would be great to have a beautiful Objective-J API to use it in &lt;a href=&quot;http://cappuccino.org&quot;&gt;Cappuccino&lt;/a&gt; projects. What I came up with is &lt;a href=&quot;http://www.github.com/jfahrenkrug/Raphuccino&quot;&gt;Raphuccino&lt;/a&gt;. You can &lt;a href=&quot;http://www.github.com/jfahrenkrug/Raphuccino&quot;&gt;find the code on github&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This video shows you what it's all about:&lt;object width=&quot;640&quot; height=&quot;385&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/vJsI_FB3iKg&amp;hl=en_US&amp;fs=1&amp;rel=0&amp;hd=1&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/vJsI_FB3iKg&amp;hl=en_US&amp;fs=1&amp;rel=0&amp;hd=1&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;640&quot; height=&quot;385&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Ruby Tool To Check If WWDC 2010 Has Been Announced</title>
   <link href="http://blog.springenwerk.com/2010/03/ruby-tool-to-check-if-wwdc-2010-has.html"/>
   <updated>2010-03-31T00:00:00-07:00</updated>
   <id>http://blog.springenwerk.com/2010/03/ruby-tool-to-check-if-wwdc-2010-has</id>
   <content type="html">Every Mac and iPhone developer is waiting for Apple to finally announce the dates of this year's WWDC. So to be the first to know when they announce it, &lt;a href=&quot;http://gist.github.com/raw/350198/87b2e86b3f9b1b3597dbf1ca1752f835d592a764/wwdc2010.rb&quot;&gt;I wrote a little ruby script&lt;/a&gt; that checks the &lt;a href=&quot;http://developer.apple.com/wwdc&quot;&gt;WWDC website&lt;/a&gt; for changes.&lt;br /&gt;
The really cool thing is that it works with both MRI and &lt;a href=&quot;http://www.macruby.org/&quot;&gt;MacRuby&lt;/a&gt;. But when you run it with MacRuby it uses HotCocoa and hence is much cooler:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/_-dK4R3d1lbc/S7MtUkvHINI/AAAAAAAAA6g/vl9E7yuHFAo/s1600/Screen+shot+2010-03-31+at+13.05.08.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/_-dK4R3d1lbc/S7MtUkvHINI/AAAAAAAAA6g/vl9E7yuHFAo/s320/Screen+shot+2010-03-31+at+13.05.08.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;It will check every 10 seconds and use NSSpeechSynthesizer to actually tell you when WWDC 2010 has been announced. So here's the code:&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;http://gist.github.com/350198.js&quot;&gt;
&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
And you can &lt;a href=&quot;http://gist.github.com/raw/350198/87b2e86b3f9b1b3597dbf1ca1752f835d592a764/wwdc2010.rb&quot;&gt;download it here&lt;/a&gt;. Enjoy!&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4366452231084261097-8489212033788445915?l=blog.springenwerk.com' alt='' /&gt;&lt;/div&gt;
</content>
 </entry>
 
 <entry>
   <title>Introducing VertexHelper for Box2D & Chipmunk Vertices</title>
   <link href="http://blog.springenwerk.com/2010/02/introducing-vertexhelper-for-box2d.html"/>
   <updated>2010-02-26T00:00:00-08:00</updated>
   <id>http://blog.springenwerk.com/2010/02/introducing-vertexhelper-for-box2d</id>
   <content type="html">&lt;p&gt;&lt;b&gt;Update: VertexHelper Pro (with Undo/Redo and the option to save and load your work) is now available on the Mac AppStore.&lt;/b&gt; &lt;a href=&quot;http://itunes.apple.com/us/app/vertexhelper-pro/id411684411?mt=12&quot;&gt;Get VertexHelpre Pro here (iTunes Link)&lt;/a&gt; and you'll do a good deed to help me put bread on the table and continue developing VertexHelper. Thanks!&lt;/p&gt;
I found it extremely tedious to define the vertices of sprites for the Box2D or Chipmunk physics engines. Maybe I was just not using the right tool. So I wrote my own. It's called VertexHelper and it lets you graphically define vertices of sprites for Box2D and Chipmunk bodies/shapes. You can &lt;a href=&quot;http://github.com/jfahrenkrug/VertexHelper&quot;&gt;find it on github&lt;/a&gt;.&lt;br /&gt;
This video shows you what it does and how it works:&lt;br /&gt;
&lt;object width=&quot;640&quot; height=&quot;505&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/oigdrgh286E&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/oigdrgh286E&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;640&quot; height=&quot;505&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;
Enjoy!&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4366452231084261097-7531387138345402674?l=blog.springenwerk.com' alt='' /&gt;&lt;/div&gt;
&lt;br/&gt;&lt;hr/&gt;&lt;h3&gt;Comments&lt;/h3&gt;
&lt;div class=&quot;swcomment&quot;&gt;&lt;h4&gt;&lt;a href=&quot;http://davidcann.com/&quot;&gt;davidcann&lt;/a&gt; said...&lt;/h4&gt;
&lt;p style=&quot;margin-left: 30px&quot;&gt;This is great!  Thanks!&lt;/p&gt;
&lt;em class=&quot;swlightgray&quot; style=&quot;margin-left: 30px&quot;&gt;March 17, 2010 07:21 PM&lt;/em&gt;&lt;/div&gt;
&lt;div class=&quot;swcomment&quot;&gt;&lt;h4&gt;&lt;a href=&quot;http://www.blogger.com/profile/06650223978538123548&quot;&gt;Johannes Fahrenkrug&lt;/a&gt; said...&lt;/h4&gt;
&lt;p style=&quot;margin-left: 30px&quot;&gt;Thanks for noticing that, Robustus. I&amp;#39;ll take care of it!&lt;/p&gt;
&lt;em class=&quot;swlightgray&quot; style=&quot;margin-left: 30px&quot;&gt;March 03, 2010 04:19 PM&lt;/em&gt;&lt;/div&gt;
&lt;div class=&quot;swcomment&quot;&gt;&lt;h4&gt;&lt;a href=&quot;http://www.blogger.com/profile/06755286794448766703&quot;&gt;Robustus&lt;/a&gt; said...&lt;/h4&gt;
&lt;p style=&quot;margin-left: 30px&quot;&gt;Very appreciate that you built such an app for free.&lt;br /&gt;&lt;br /&gt;Just to mention that you may need to do some conversions between CGRect and NSRect, CGPoint and NSPoint.&lt;br /&gt;&lt;br /&gt;eg in your code:&lt;br /&gt;-(CALayer *)hitTest:(NSPoint)aPoint&lt;br /&gt;&lt;br /&gt;NSPointInRect(aPoint,[self bounds])&lt;br /&gt;&lt;br /&gt;is better to use the following&lt;br /&gt;&lt;br /&gt;NSPointInRect(aPoint,NSRectFromCGRect([self bounds]))&lt;br /&gt;&lt;br /&gt;Nice app!! I like it a lot!!&lt;/p&gt;
&lt;em class=&quot;swlightgray&quot; style=&quot;margin-left: 30px&quot;&gt;March 03, 2010 10:12 AM&lt;/em&gt;&lt;/div&gt;
&lt;div class=&quot;swcomment&quot;&gt;&lt;h4&gt;&lt;a href=&quot;http://www.blogger.com/profile/18340499315254385758&quot;&gt;Ben&lt;/a&gt; said...&lt;/h4&gt;
&lt;p style=&quot;margin-left: 30px&quot;&gt;This is great (I just wish it had been around a couple months ago). Well done!&lt;/p&gt;
&lt;em class=&quot;swlightgray&quot; style=&quot;margin-left: 30px&quot;&gt;February 26, 2010 03:57 PM&lt;/em&gt;&lt;/div&gt;
</content>
 </entry>
 
 
</feed>