<?xml version="1.0"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Ben Dodson: Weblog</title>
    <link>http://bendodson.com/weblog/</link>
    <atom:link href="http://bendodson.com/weblog/rss.xml" rel="self" type="application/rss+xml" />
    <description>The interests and ramblings of an iOS Developer</description>
    <language>en-gb</language>
    <pubDate>Mon, 02 Apr 2012 11:47:41 +0100</pubDate>
    <lastBuildDate>Mon, 02 Apr 2012 11:47:41 +0100</lastBuildDate>

    
    <item>
      <title>iPhone apps on the new iPad</title>
      <link>http://bendodson.com/weblog/2012/03/16/iphone-apps-on-the-new-ipad/index.html</link>
      <pubDate>Fri, 16 Mar 2012 16:08:00 +0000</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2012/03/16/iphone-apps-on-the-new-ipad/index.html</guid>
      <description>&lt;p&gt;I received a new iPad today (along with a 1080p Apple TV) and whilst I don&amp;#8217;t want to review it in detail (there are plenty of other reviews) I will say that the screen is absolutely incredible. Whilst most 3rd party apps are not retina-ready yet, those that are look stunning. I actually used my iPad to answer my emails today as it looked so much crisper than my iMac!&lt;/p&gt;

&lt;p&gt;Anyway, one of the things that has interested me is how iPhone apps would look on the new iPad. Bearing in mind that there are 4x as many pixels, I assumed that Apple would use retina versions of iPhone apps scaled up. As you might recall, the original iPad and iPad 2 would use regular iPhone apps and scale them rather than using the retina equivelants (something &lt;a href='http://bendodson.com/weblog/2011/06/10/does-ios-5-finally-allow-retina-display-iphone-apps-to-run-unscaled-on-the-ipad/'&gt;I&amp;#8217;ve written about before&lt;/a&gt;). I could understand this for imagery but the keyboard and text looked horrible when scaled making any app that wasn&amp;#8217;t a game pretty much unusable at 2x mode on an iPad.&lt;/p&gt;

&lt;p&gt;Fortunately this has changed with the new iPad. Apps are stills scaled, but the fonts are much crisper as is the keyboard.&lt;/p&gt;

&lt;p&gt;To demonstrate, I&amp;#8217;ve tested a couple of apps on iOS 5.1 on both the iPad 2 and new iPad and listed some screenshots below. These have been scaled down to fit the page so you will need to click / tap each one to load up the fullsize versions. You won&amp;#8217;t notice the difference (aside from some colour improvements) unless you view at fullsize as they look pretty similar when scaled down.&lt;/p&gt;

&lt;p&gt;The new iPad is on the left - iPad 2 is on the right.&lt;/p&gt;

&lt;h2 id='wallabee'&gt;WallaBee&lt;/h2&gt;

&lt;p&gt;&lt;a href='http://files.bendodson.com/weblog/2012/03/ipad3/wallabee-1.PNG'&gt;&lt;img src='http://files.bendodson.com/weblog/2012/03/ipad3/wallabee-1-thumb.jpg' alt='' /&gt;&lt;/a&gt; &lt;a href='http://files.bendodson.com/weblog/2012/03/ipad2/wallabee-1.PNG'&gt;&lt;img src='http://files.bendodson.com/weblog/2012/03/ipad2/wallabee-1-thumb.jpg' alt='' /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href='http://files.bendodson.com/weblog/2012/03/ipad3/wallabee-2.PNG'&gt;&lt;img src='http://files.bendodson.com/weblog/2012/03/ipad3/wallabee-2-thumb.jpg' alt='' /&gt;&lt;/a&gt; &lt;a href='http://files.bendodson.com/weblog/2012/03/ipad2/wallabee-2.PNG'&gt;&lt;img src='http://files.bendodson.com/weblog/2012/03/ipad2/wallabee-2-thumb.jpg' alt='' /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href='http://files.bendodson.com/weblog/2012/03/ipad3/wallabee-3.PNG'&gt;&lt;img src='http://files.bendodson.com/weblog/2012/03/ipad3/wallabee-3-thumb.jpg' alt='' /&gt;&lt;/a&gt; &lt;a href='http://files.bendodson.com/weblog/2012/03/ipad2/wallabee-3.PNG'&gt;&lt;img src='http://files.bendodson.com/weblog/2012/03/ipad2/wallabee-3-thumb.jpg' alt='' /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2 id='spotify'&gt;Spotify&lt;/h2&gt;

&lt;p&gt;&lt;a href='http://files.bendodson.com/weblog/2012/03/ipad3/spotify-1.PNG'&gt;&lt;img src='http://files.bendodson.com/weblog/2012/03/ipad3/spotify-1-thumb.jpg' alt='' /&gt;&lt;/a&gt; &lt;a href='http://files.bendodson.com/weblog/2012/03/ipad2/spotify-1.PNG'&gt;&lt;img src='http://files.bendodson.com/weblog/2012/03/ipad2/spotify-1-thumb.jpg' alt='' /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href='http://files.bendodson.com/weblog/2012/03/ipad3/spotify-2.PNG'&gt;&lt;img src='http://files.bendodson.com/weblog/2012/03/ipad3/spotify-2-thumb.jpg' alt='' /&gt;&lt;/a&gt; &lt;a href='http://files.bendodson.com/weblog/2012/03/ipad2/spotify-2.PNG'&gt;&lt;img src='http://files.bendodson.com/weblog/2012/03/ipad2/spotify-2-thumb.jpg' alt='' /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href='http://files.bendodson.com/weblog/2012/03/ipad3/spotify-3.PNG'&gt;&lt;img src='http://files.bendodson.com/weblog/2012/03/ipad3/spotify-3-thumb.jpg' alt='' /&gt;&lt;/a&gt; &lt;a href='http://files.bendodson.com/weblog/2012/03/ipad2/spotify-3.PNG'&gt;&lt;img src='http://files.bendodson.com/weblog/2012/03/ipad2/spotify-3-thumb.jpg' alt='' /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2 id='foursquare'&gt;Foursquare&lt;/h2&gt;

&lt;p&gt;&lt;a href='http://files.bendodson.com/weblog/2012/03/ipad3/foursquare-1.PNG'&gt;&lt;img src='http://files.bendodson.com/weblog/2012/03/ipad3/foursquare-1-thumb.jpg' alt='' /&gt;&lt;/a&gt; &lt;a href='http://files.bendodson.com/weblog/2012/03/ipad2/foursquare-1.PNG'&gt;&lt;img src='http://files.bendodson.com/weblog/2012/03/ipad2/foursquare-1-thumb.jpg' alt='' /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href='http://files.bendodson.com/weblog/2012/03/ipad3/foursquare-2.PNG'&gt;&lt;img src='http://files.bendodson.com/weblog/2012/03/ipad3/foursquare-2-thumb.jpg' alt='' /&gt;&lt;/a&gt; &lt;a href='http://files.bendodson.com/weblog/2012/03/ipad2/foursquare-2.PNG'&gt;&lt;img src='http://files.bendodson.com/weblog/2012/03/ipad2/foursquare-2-thumb.jpg' alt='' /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2 id='path'&gt;Path&lt;/h2&gt;

&lt;p&gt;&lt;a href='http://files.bendodson.com/weblog/2012/03/ipad3/path-1.PNG'&gt;&lt;img src='http://files.bendodson.com/weblog/2012/03/ipad3/path-1-thumb.jpg' alt='' /&gt;&lt;/a&gt; &lt;a href='http://files.bendodson.com/weblog/2012/03/ipad2/path-1.PNG'&gt;&lt;img src='http://files.bendodson.com/weblog/2012/03/ipad2/path-1-thumb.jpg' alt='' /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href='http://files.bendodson.com/weblog/2012/03/ipad3/path-2.PNG'&gt;&lt;img src='http://files.bendodson.com/weblog/2012/03/ipad3/path-2-thumb.jpg' alt='' /&gt;&lt;/a&gt; &lt;a href='http://files.bendodson.com/weblog/2012/03/ipad2/path-2.PNG'&gt;&lt;img src='http://files.bendodson.com/weblog/2012/03/ipad2/path-2-thumb.jpg' alt='' /&gt;&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>iOS 5.1 Location Services Bug</title>
      <link>http://bendodson.com/weblog/2012/03/14/ios-5-1-location-services-bug/index.html</link>
      <pubDate>Wed, 14 Mar 2012 21:30:00 +0000</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2012/03/14/ios-5-1-location-services-bug/index.html</guid>
      <description>&lt;p&gt;Whilst using the public version of iOS 5.1 I&amp;#8217;ve noticed an interesting bug with one of my apps. &lt;a href='http://itunes.apple.com/gb/app/wallabee/id479211430?mt=8'&gt;WallaBee&lt;/a&gt; uses Location Services but as all good apps should it makes a point of stopping location monitoring after a certain amount of inactivity (to save battery) and also when the app goes into the background. Location monitoring starts up again as soon as you go back to the foreground or navigate to a page that will require more precise location monitoring.&lt;/p&gt;

&lt;p&gt;On iOS 5.0.*, closing the app would lead to the Location Services indicator disappearing immediately. On iOS 5.1, Location Services stays active for ~10 seconds after it&amp;#8217;s been told explicitly to stop monitoring. Initially I thought this might be a problem with the code I&amp;#8217;d written but, after some testing on multiple devices and with multiple apps, it turns out this is an issue that affects all location based apps on iOS 5.1.&lt;/p&gt;

&lt;p&gt;It isn&amp;#8217;t really a big issue but it is fairly annoying, particularly as some apps do keep monitoring your location in the background so you end up trying to work out what is still running only to realise it&amp;#8217;s the OS not giving up when it should do. It&amp;#8217;s particularly annoying as an app developer - v1.0.3 of WallaBee came out on the day iOS 5.1 was released and I&amp;#8217;ve now had 3 enquries as to why Location Services is less efficient in the new version (whereas it&amp;#8217;s actually much more efficient in the app).&lt;/p&gt;

&lt;p&gt;In terms of why iOS 5.1 is doing this, I can only assume that Location Services is told to turn off after the full amount of background task allowance has been used. If an app doesn&amp;#8217;t ask to run in the background, it has around 10 seconds after being closed to do any tidying up (i.e. saving documents, closing network connections) before the OS forcably terminates it. This seems to be the case with Location Services as if you close the app and then force quit, the service is stopped (suggesting ownership is with the app, not the OS).&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s probably an oversight on Apple&amp;#8217;s part (as I can&amp;#8217;t think of a good reason why this would be built-in) but I thought I&amp;#8217;d put up a post on the issue for any other developers who run into the problem and for anyone using my apps and wondering why Location Services is still active once the app is closed.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>The curious case of "the new iPad"</title>
      <link>http://bendodson.com/weblog/2012/03/13/the-curious-case-of-the-new-ipad/index.html</link>
      <pubDate>Tue, 13 Mar 2012 11:15:00 +0000</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2012/03/13/the-curious-case-of-the-new-ipad/index.html</guid>
      <description>&lt;p&gt;The strangest thing that happened at the iPad announcement last week turned out not to be the lack of Siri, presence of a home button, or uninteresting iOS 5.1 update, but instead the name; &amp;#8220;the new iPad&amp;#8221; rather than the universally predicted &amp;#8220;iPad 3&amp;#8221; (or late runner &amp;#8220;iPad HD&amp;#8221;). Based on this news, most people seem to think that there is a convergence with other product names in that everything will end up as just &amp;#8220;iPad&amp;#8221;, &amp;#8220;MacBook Air&amp;#8221;, &amp;#8220;iPod Nano&amp;#8221;, etc. In particular, people are predicting that the iPhone 5 (which would actually be the iPhone 6 - drives me crazy!) will now be launched as &amp;#8220;the new iPhone&amp;#8221;.&lt;/p&gt;

&lt;p&gt;I don&amp;#8217;t think this is correct.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve tried explaining it on Twitter but 140 characters ain&amp;#8217;t a lot of room to play with so I thought I&amp;#8217;d lay some thoughts out on Apple&amp;#8217;s naming conventions in this post. I&amp;#8217;ll also try and second guess some of Apple&amp;#8217;s future product announcements based purely on naming.&lt;/p&gt;

&lt;h2 id='ipod'&gt;iPod&lt;/h2&gt;

&lt;p&gt;The iPod is the pure example of the new iPad naming philosophy as they have always just been known as individual products. i.e. iPod, iPod Nano, iPod Shuffle, etc. Every year (pretty much) a new device is launched that immediately replaces the old ones. If you look at something like the iPod Nano, there have now been six of them (all in various shapes and sizes) but you can only ever buy the latest version. In support documents, they are simply referred to by generation i.e. this case will work with &amp;#8220;iPod Nano (6th generation)&amp;#8221;.&lt;/p&gt;

&lt;h2 id='mac'&gt;Mac&lt;/h2&gt;

&lt;p&gt;The Mac lineup is slightly different to the iPod lineup in that there are more customisations that can be made. You can change processors, RAM, hard drives, screen sizes, etc but fundamentally there is only one product per line. When a new product is released, the old one is immediately unavailable. The naming is also slightly different - rather than referring to the latest Mac mini as &amp;#8220;Mac mini (10th Generation)&amp;#8221; it is referred to by date making the latest one &amp;#8220;Mac mini (Mid 2011)&amp;#8221;. This works because the Mac line can be updated multiple times per year with processor bumps, etc, so it makes sense to refer to its launch date rather than its generation. This is the same naming convention that a lot of Apple&amp;#8217;s software uses such as iWork &amp;#8216;09. Whilst iTunes isn&amp;#8217;t named after a year (it&amp;#8217;s just a version) you could add &amp;#8220;20&amp;#8221; in front to make them year based as they have been annual since v8.0 came out in 2008.&lt;/p&gt;

&lt;p&gt;As regards the future of the Mac lineup, there are currently 5 products; MacBook Air, MacBook Pro, Mac mini, iMac, and Mac Pro. I believe that convergence is going to happen on the MacBook Air / Pro lineup as it makes sense that Apple will make the Pro thinner, lighter, and will remove the optical drive. This is further evidenced by the fact that the MacBook itself was removed a while ago leaving the name free. In future, if you want an Apple laptop, you&amp;#8217;ll just get &amp;#8220;MacBook&amp;#8221; - it could be any size from 11&amp;#8221;-17&amp;#8221; with various configurations but it will be one line. It&amp;#8217;s also fairly likely that the Mac Pro will be removed for a slightly beefier iMac leading to just 3 lines; MacBook, Mac mini, iMac. That&amp;#8217;s just pure speculation but it makes complete sense to me. If you want portable computing, you choose iPad or MacBook but you choose Mac mini or iMac for desktop computing.&lt;/p&gt;

&lt;h2 id='ipad'&gt;iPad&lt;/h2&gt;

&lt;p&gt;The iPad lineup should have been simple - a single product that gets updated yearly and will always be known as &amp;#8220;iPad&amp;#8221;. However, Apple threw a spanner in the works by calling the second generation the &amp;#8220;iPad 2&amp;#8221;. There was no need to do this when the iPad 2 was the same price as the iPad and completely replaced it as per the iPod lineup but now they are stuck with it. By naming the iPad 3 &amp;#8220;the new iPad&amp;#8221;, it looks like they are trying to go back to that model but there is a big issue with that; the iPad 2 is still available for sale at a $100 discount. In Apple&amp;#8217;s defence they&amp;#8217;ve done a pretty good job of making this work with the structure of their website showing only &amp;#8220;iPad&amp;#8221; and then the &amp;#8220;iPad 2&amp;#8221; is a small button at the bottom. There is also a comparison chart which very quickly shows that &amp;#8220;the new iPad&amp;#8221; is newer than the &amp;#8220;iPad 2&amp;#8221;. It&amp;#8217;s hardly an ideal situation though.&lt;/p&gt;

&lt;p&gt;So why have they done it? Whilst the iPad 2 could have been completely removed and replaced by the new iPad (which would make the naming all work out nicely) they wanted to keep selling the iPad 2 at a discount as it beats the competition quite nicely. The only real competitor to the iPad has been the Kindle Fire so by making the entry-level iPad slightly cheaper they can appeal to some of the people that might have been stuck choosing between the two. They couldn&amp;#8217;t retroactively rename the iPad 2 so they were stuck with the name.&lt;/p&gt;

&lt;p&gt;My feeling on this is that the iPad 2 is going to be removed from sale before the end of 2012 and replaced by a smaller form factor (say 8&amp;#8221;) and given a new line; &amp;#8220;iPad Nano&amp;#8221; or &amp;#8220;iPad Mini&amp;#8221;. This will get Apple to a good place where they have a cheaper iPad and the premium iPad and two simple lines that can be updated in the same way as the iPod lineup. I say this as if the iPad 2 was going to stick around for a full year I think the new iPad would have been called &amp;#8220;iPad 2 Pro&amp;#8221; as that&amp;#8217;s essentially what it is - same form factor, better screen.&lt;/p&gt;

&lt;h2 id='iphone'&gt;iPhone&lt;/h2&gt;

&lt;p&gt;This is the real issue - what will the new iPhone be called. Based on my tweet yesterday, most people think it will be called &amp;#8220;the new iPhone&amp;#8221; to follow the iPad example. I highly doubt it. The difference with the iPhone to all of Apple&amp;#8217;s other products is that they keep selling the old models for up to 2 years. Just look at the lineup now; &amp;#8220;iPhone 3GS&amp;#8221;, &amp;#8220;iPhone 4&amp;#8221;, &amp;#8220;iPhone 4S&amp;#8221;. If the next iPhone is referred to simply as &amp;#8220;the new iPhone&amp;#8221; then you&amp;#8217;ll end up with &amp;#8220;iPhone 4&amp;#8221;, &amp;#8220;iPhone 4S&amp;#8221;, &amp;#8220;iPhone&amp;#8221;. That might work, but in 2013 you&amp;#8217;d have &amp;#8220;iPhone 4S&amp;#8221;, &amp;#8220;iPhone&amp;#8221;, &amp;#8220;iPhone&amp;#8221; and that&amp;#8217;s where it falls apart.&lt;/p&gt;

&lt;p&gt;This is a tricky one for Apple and I don&amp;#8217;t really have the answer. Let&amp;#8217;s take a look at possible names for the next generation iPhone:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;iPhone 5&lt;/em&gt; - it&amp;#8217;s the 6th generation iPhone so that won&amp;#8217;t work.&lt;/li&gt;

&lt;li&gt;&lt;em&gt;iPhone 6&lt;/em&gt; - Original, 3G, 3GS, 4, 4S, 6. Doesn&amp;#8217;t really work as a numbering system but I wouldn&amp;#8217;t rule it out.&lt;/li&gt;

&lt;li&gt;&lt;em&gt;iPhone 4G&lt;/em&gt; - yesterday I thought this was a pretty good idea. Then I remembered that iOS 5.1 now refers to HSDPA+ as &amp;#8220;4G&amp;#8221; so I don&amp;#8217;t think this can be used anymore.&lt;/li&gt;

&lt;li&gt;&lt;em&gt;iPhone LTE&lt;/em&gt; - it&amp;#8217;ll definitely have LTE integrated and iPhone&amp;#8217;s have been named after their wireless tech before. However, LTE isn&amp;#8217;t available around the world like 3G was so I don&amp;#8217;t think they&amp;#8217;ll go for this.&lt;/li&gt;

&lt;li&gt;&lt;em&gt;iPhone HD&lt;/em&gt; - no. Just no.&lt;/li&gt;

&lt;li&gt;&lt;em&gt;the new iPhone&lt;/em&gt; - I don&amp;#8217;t think they can pull that trick twice.&lt;/li&gt;

&lt;li&gt;&lt;em&gt;iPhone 2012&lt;/em&gt; - maybe.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It&amp;#8217;s a difficult situation and there is no obvious choice. I can see it going a number of ways though:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The long rumoured &amp;#8220;iPhone Nano&amp;#8221; makes an appearance leading Apple to create just two lines; iPhone and iPhone Nano. iPhone 4/4S won&amp;#8217;t be sold at a discount (they&amp;#8217;ll just disappear) meaning that Apple can refer to the iPhone 6 as just &amp;#8220;iPhone&amp;#8221;. I don&amp;#8217;t think they can do this if they continue selling the 4/4S though.&lt;/li&gt;

&lt;li&gt;iPhone changes to a year numbering system much like the Mac lineup - whilst you would just have &amp;#8220;2012&amp;#8221; instead of &amp;#8220;mid 2012&amp;#8221; it might work and allows you to distinguish between multiple versions easily. Not the tidiest of solutions though - &amp;#8220;iPhone &amp;#8216;12&amp;#8221; or &amp;#8220;iPhone 2012&amp;#8221; doesn&amp;#8217;t have the same simplicity as &amp;#8220;iPhone 6&amp;#8221; or &amp;#8220;iPhone&amp;#8221;&lt;/li&gt;

&lt;li&gt;Apple name it &amp;#8220;iPhone LTE&amp;#8221; - it might not be available everywhere but at least it distinguishes. Might have an issue in 2013 though - LTES won&amp;#8217;t work and there won&amp;#8217;t be another wireless technology to use.&lt;/li&gt;

&lt;li&gt;Apple choose something that isn&amp;#8217;t in that list perhaps naming it after a design element with something like &amp;#8220;iPhone Curve&amp;#8221; (though obviously not &amp;#8220;Curve&amp;#8221; - RIM would have a fit if they&amp;#8217;re still around)&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id='summary'&gt;Summary&lt;/h2&gt;

&lt;p&gt;Whilst nearly all of the Apple product line has converged to yearly updates that replace the previous model, the iPad 2 has caused a problem in that it&amp;#8217;s still hanging around at a discount. I&amp;#8217;m fairly sure this is going to be replaced by a mini or a nano at some point in the near future thus ending this particular story.&lt;/p&gt;

&lt;p&gt;The iPhone, however, is a completely different story and I&amp;#8217;m confident that Apple won&amp;#8217;t name the next model &amp;#8220;the new iPhone&amp;#8221; unless they stop selling 3 versions of iPhone at the same time. That is doable (if a new line appears in the way I expect it to for the iPad) but I think it more likely that they will name the next iPhone after something about the device that we don&amp;#8217;t know about yet; design, haptic touch, etc.&lt;/p&gt;

&lt;p&gt;As usual, time will tell. Apple have a habit of choosing things that you wouldn&amp;#8217;t expect.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Analyzing the iPad 3 invite</title>
      <link>http://bendodson.com/weblog/2012/03/03/analyzing-the-ipad3-invite/index.html</link>
      <pubDate>Sat, 03 Mar 2012 12:08:00 +0000</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2012/03/03/analyzing-the-ipad3-invite/index.html</guid>
      <description>&lt;p&gt;A lot has been made in the Apple press recently about the invite to the Apple Media Event on 7th March which is widely expected to introduce the iPad 3. Specifically, the invite appears to show an iPad with an improved screen and no home button:&lt;/p&gt;

&lt;p&gt;&lt;img src='http://files.bendodson.com/weblog/2012/03/ipad3-invite.jpg' alt='iPad 3 Invite' /&gt;&lt;/p&gt;

&lt;p&gt;Obviously there will be a &amp;#8220;Retina Display&amp;#8221; in the iPad 3 (I&amp;#8217;ll eat my iPad 2 if there isn&amp;#8217;t) but the lack of a home button is something that has floated around before, mainly due to the gestures built into iOS 5 that allow you to close apps with a 4/5 finger grab. I only ever use the gestures to get around on my iPad but I don&amp;#8217;t really think the home button would be completely removed. For a start it has too many purposes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Closes apps (can be done with a gesture)&lt;/li&gt;

&lt;li&gt;Lets you access the multi-tasking tray (can also be done with a gesture)&lt;/li&gt;

&lt;li&gt;Allows screenshots to be taken (press at the same time as the power button)&lt;/li&gt;

&lt;li&gt;Access to Siri (on the iPhone 4S at least - one assumes the same will happen in the iPad 3)&lt;/li&gt;

&lt;li&gt;Accessibility shortcuts (triple tap to invert colours for example)&lt;/li&gt;

&lt;li&gt;Force restart the device (hold at the same time as the power button for a while)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whilst some of these things could be done in other ways, I just don&amp;#8217;t buy the idea that they would remove it - doing things with gestures is great but they are more like keyboard shortcuts for power users than an intuitive way to navigate.&lt;/p&gt;

&lt;p&gt;With the above in mind, it was obvious to me that the invite was showing an iPad 3 in landscape and I set out to prove this with some judicious screenshotting (thanks home button) and photoshopping. However, it didn&amp;#8217;t quite work out as I expected&amp;#8230;&lt;/p&gt;

&lt;p&gt;As Apple have very helpfully used the &amp;#8220;bubble&amp;#8221; background on the iPad in their invite, it should be quite trivial to work out the placement of the icons by mapping them to the unique bubble clusters in the image. For example. there is a unique cluster next to the calendar icon:&lt;/p&gt;

&lt;p&gt;&lt;img src='http://files.bendodson.com/weblog/2012/03/invite-cluster.jpg' alt='iPad 3 Invite Bubble Cluster' /&gt;&lt;/p&gt;

&lt;p&gt;From the invite, we know that there are at least 3 icons showing in the &amp;#8220;dock&amp;#8221; &amp;#8211; Maps, Calendar, and Keynote &amp;#8211; and you can only have a maximum of 6 icons. I screenshotted the iPad in both orientations with all the possible combinations of 3, 4, 5, and 6 icons and only one came out close to the bubble layout of the invite:&lt;/p&gt;

&lt;p&gt;&lt;img src='http://files.bendodson.com/weblog/2012/03/ipad-portrait.jpg' alt='iPad 3 Invite Mockup - Portrait' /&gt;&lt;/p&gt;

&lt;p&gt;Hmm, that scuppered my landscape theory. Let&amp;#8217;s take a closer look at the calendar icon when it&amp;#8217;s in this formation:&lt;/p&gt;

&lt;p&gt;&lt;img src='http://files.bendodson.com/weblog/2012/03/icon-segment.jpg' alt='iPad 3 Invite Mockup - Portrait' /&gt;&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve also done some basic distortion in photoshop to change the angles so that it matches (roughly) the perspective of the Apple invite:&lt;/p&gt;

&lt;p&gt;&lt;img src='http://files.bendodson.com/weblog/2012/03/icon-segment-skewed.jpg' alt='iPad 3 Invite Mockup - Portrait' /&gt;&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m pretty confident of the location as it&amp;#8217;s one of the only possibilities that causes the page control (the little dots and the search icon) to be cut off when photographed at that angle.&lt;/p&gt;

&lt;p&gt;If you look at the two side by side, we can see that the bubble cluster is a pretty good match, but it isn&amp;#8217;t exact:&lt;/p&gt;

&lt;p&gt;&lt;img src='http://files.bendodson.com/weblog/2012/03/invite-cluster.jpg' alt='iPad 3 Invite Bubble Cluster' /&gt; &lt;img src='http://files.bendodson.com/weblog/2012/03/mockup-cluster.jpg' alt='iPad 3 Invite Mockup Bubble Cluster' /&gt;&lt;/p&gt;

&lt;p&gt;The icons in the invite are actually slightly bigger than those on the iPad 2.&lt;/p&gt;

&lt;p&gt;So what does this all mean? I have a number of theories:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The iPad 3 has no home button and its icon layout is slightly different&lt;/li&gt;

&lt;li&gt;This isn&amp;#8217;t the iPad 3 - it&amp;#8217;s a different device (i.e. a 7 inch iPad hence the slightly different icon arrangement)&lt;/li&gt;

&lt;li&gt;It&amp;#8217;s a photoshopped invite and means nothing - there won&amp;#8217;t be any big surprises&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If I was a betting man I&amp;#8217;d go with option 3. Whilst it&amp;#8217;s intriguing to disect these invites to see if they have any deeper meaning, the reality is that it&amp;#8217;s probably been photoshopped together with a few mistakes (the bubbles not matching) and something to get the blogosphere worked up (no home button). I highly doubt that the iPad 3 will lose the home button and I have my reservations that a smaller form factor will be announced (despite the fact that I&amp;#8217;d prefer a smaller iPad).&lt;/p&gt;

&lt;p&gt;In terms of the announcement, my predictions are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;iPad 3 with &amp;#8220;Retina Display&amp;#8221; that is 2048x1536 with the same @2x syntax for developers to make their apps compatible. It will be slightly more expensive than the iPad 2 (say an extra $50-70) but the iPad 2 will see a price drop to something like $399 or $429.&lt;/li&gt;

&lt;li&gt;Apple TV with 1080p output (the invite says &amp;#8220;something to see&amp;#8221; and &amp;#8220;something to touch&amp;#8221; - Apple TV and iPad 3)&lt;/li&gt;

&lt;li&gt;Updated iTunes content to accomodate a 1080p Appple TV and an iPad that is beyond 1080p.&lt;/li&gt;

&lt;li&gt;iOS 5.1 with 3rd party Siri APIs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I guess we&amp;#8217;ll see on March 7th!&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>I've been looking forward to this day for a long time</title>
      <link>http://bendodson.com/weblog/2012/02/16/ive-been-looking-forward-to-this-day-for-a-long-time/index.html</link>
      <pubDate>Thu, 16 Feb 2012 20:56:00 +0000</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2012/02/16/ive-been-looking-forward-to-this-day-for-a-long-time/index.html</guid>
      <description>&lt;p&gt;Today has seen the culmination of several months of work and several years of planning. I launched my latest app, &lt;a href='http://itunes.apple.com/gb/app/wallabee/id479211430?mt=8'&gt;WallaBee&lt;/a&gt;, which I like to call &amp;#8220;The ultimate collectables game&amp;#8221;. It&amp;#8217;s a mixup of several ideas from things such as Gowalla, Pokémon, PackRat, and Baseball Trading cards (or Football stickers if you&amp;#8217;re in the UK).&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m not going to do a big post about it now as you can find out all the details at &lt;a href='http://wallab.ee/'&gt;wallab.ee&lt;/a&gt; (or just &lt;a href='http://itunes.apple.com/gb/app/wallabee/id479211430?mt=8'&gt;download the app&lt;/a&gt;) but I did want to give a few shout outs.&lt;/p&gt;

&lt;p&gt;Firstly, this app wouldn&amp;#8217;t be possible without &lt;a href='http://twitter.com/al86shaw'&gt;Alan Shaw&lt;/a&gt; and &lt;a href='http://twitter.com/lonelycoo'&gt;Simon Wicks&lt;/a&gt; who have both invested a huge amount of time in this project. They&amp;#8217;ve put up with my constant changes and demands as well as suggesting many great ideas that I wouldn&amp;#8217;t have come up with on my own. I&amp;#8217;m proud to be launching this app with such great co-partners.&lt;/p&gt;

&lt;p&gt;Secondly I&amp;#8217;d like to thank &lt;a href='http://karategraphics.com/'&gt;Andrew Cameron of Karate Grafika&lt;/a&gt; who designed the beautiful icons you&amp;#8217;re hopefully collecting today. We spent a lot of time searching for the right designer and we&amp;#8217;re overwhelmed with the amount of positive reviews we&amp;#8217;ve received for Andy&amp;#8217;s work. Andy is the &amp;#8216;secret sauce&amp;#8217; of our app and we&amp;#8217;re very lucky to be working with him.&lt;/p&gt;

&lt;p&gt;Finally, I&amp;#8217;d like to thank &lt;a href='http://twitter.com/ericl'&gt;Eric Longstaff&lt;/a&gt; who has taken on the role of Community Manager and is replying to people on our &lt;a href='http://support.wallab.ee'&gt;support forum&lt;/a&gt; almost has quickly as they can submit questions! It&amp;#8217;s great to have someone with so much charisma on our team who believes in the project and wants to make sure that everybody else is enjoying it.&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s been a wild ride getting to this point and I really hope that people see the amount of time and effort we&amp;#8217;ve spent in trying to get the little details right. We know that there is further work to be done and we have an ambitious roadmap. Version 1.0.1 (coming soon) will add localisation support for 5 languages and a big v1.1 update at the end of March which will introduce a heap of social features. We are essentially a startup but I want to make it clear that our entire focus is on delighting our players - we&amp;#8217;ve invested in the most expensive package GetSatisfaction had so we can keep on top of our community and we&amp;#8217;re absolutely committed to getting things right.&lt;/p&gt;

&lt;p&gt;A few people have pointed out that we&amp;#8217;re just using the ideas of Gowalla and PackRat and putting them together. I want to confront that issue head on. Yes, their are similarities, but we believe the devil is in the detail.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;We are focussed on a single thing; items. We have a location database (built up from data aquired from Gowalla for my &lt;a href='http://itunes.apple.com/us/app/highlights/id428756645?mt=8'&gt;Highlights app&lt;/a&gt; - incidentally, this database is not a wholesale copy but something that has been carefully curated and augmented with data from a number of other platforms over a period of 12 months) and we allow players and developers to add to this database but it&amp;#8217;s not our key focus. We are fundamentally not a check-in service.&lt;/li&gt;

&lt;li&gt;We don&amp;#8217;t just want to build a community of players, we also want to build a community of developers. That&amp;#8217;s why we launched 3 full APIs with our app that you can interact with today. These include real time notifications and access to all of our high-resolution item artwork. If you build something on our platform, we&amp;#8217;ll promote it. You can find out more in our &lt;a href='http://wallab.ee/developers/'&gt;Developer Portal&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;The most important thing, the item that is at the core of who we are, is that we are dedicated to the player. We promise to listen, adapt, and make changes that the community wants rather than just blazing our own trail. We will never fundamentally change our product on a whim when we know that it&amp;#8217;s not what our community wants. We built this app because it&amp;#8217;s the app we wanted to use. We will never deviate from that course or that core belief.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I sincerely hope that you&amp;#8217;ll enjoy using WallaBee. It&amp;#8217;s been my dream for the past few years and, whilst this this is just the start, I treasure it as the biggest moment of my career.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Path uploads your entire iPhone address book to their servers</title>
      <link>http://bendodson.com/weblog/2012/02/07/path-uploads-your-entire-iphone-address-book-to-their-servers/index.html</link>
      <pubDate>Tue, 07 Feb 2012 20:17:00 +0000</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2012/02/07/path-uploads-your-entire-iphone-address-book-to-their-servers/index.html</guid>
      <description>&lt;p&gt;Some great finds by &lt;a href='http://mclov.in/'&gt;Arun Thampi&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Upon inspecting closer, I noticed that my entire address book (including full names, emails and phone numbers) was being sent as a plist to Path. Now I don’t remember having given permission to Path to access my address book and send its contents to its servers, so I created a completely new “Path” and repeated the experiment and I got the same result – my address book was in Path’s hands.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I always wondered how Path managed to match me up so quickly to my friends when the only thing I&amp;#8217;d given it was my email address. Turns out that it uploads your entire phone book and then matches names / email addresses to give you recommendations. It&amp;#8217;s incredibly slick, but it is a privacy concern.&lt;/p&gt;

&lt;p&gt;&lt;a href='http://mclov.in/2012/02/08/path-uploads-your-entire-address-book-to-their-servers.html#dsq-comment-432202082'&gt;The CEO of Path replied&lt;/a&gt; to the post with:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Arun, thanks for pointing this out. We actually think this is an important conversation and take this very seriously. We upload the address book to our servers in order to help the user find and connect to their friends and family on Path quickly and effeciently as well as to notify them when friends and family join Path. Nothing more.&lt;/p&gt;

&lt;p&gt;We believe that this type of friend finding &amp;amp; matching is important to the industry and that it is important that users clearly understand it, so we proactively rolled out an opt-in for this on our Android client a few weeks ago and are rolling out the opt-in for this in 2.0.6 of our iOS Client, pending App Store approval.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;At least they are going to make it opt-in but the various commentors on that article do point out that a hash table would have avoided this whole scenario. I&amp;#8217;m glad that I finally know how Path were doing that matching though - it&amp;#8217;s been bugging me for weeks&amp;#8230;&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Calling all beta testers</title>
      <link>http://bendodson.com/weblog/2012/01/31/calling-all-beta-testers/index.html</link>
      <pubDate>Tue, 31 Jan 2012 15:28:00 +0000</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2012/01/31/calling-all-beta-testers/index.html</guid>
      <description>&lt;p&gt;I&amp;#8217;m happy to announce that my biggest app yet is going to be available in mid-February. It&amp;#8217;s currently running in a closed beta but I&amp;#8217;m now looking to expand the beta testing pool significantly in the run up to launch.&lt;/p&gt;

&lt;p&gt;If you have some spare time and would like to help me out (as well as maybe getting some free stuff once it launches) then please fill out my &lt;a href='https://docs.google.com/a/bendodson.com/spreadsheet/viewform?formkey=dG9vLXluM3RwNnZYNDRGendxWXBfTEE6MQ'&gt;beta tester application form&lt;/a&gt;. Based on previous betas, I expect interest to be high so I&amp;#8217;ve had to implement a cap on how many people I can accept. Please bear in mind that beta testing can take a lot of time (as you&amp;#8217;ll be required to feedback on each build that is sent out) so if you don&amp;#8217;t have the time please don&amp;#8217;t apply as your position could go to somebody else who is available.&lt;/p&gt;

&lt;p&gt;If your application is successful, I&amp;#8217;ll be in touch by the 3rd of February.&lt;/p&gt;

&lt;p&gt;I can&amp;#8217;t wait to show you all what I&amp;#8217;ve been working on for the past 6 months. More details will be available soon&amp;#8230;&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>What's happening with iOS 5.1?</title>
      <link>http://bendodson.com/weblog/2012/01/31/whats-happening-with-ios-5-1/index.html</link>
      <pubDate>Tue, 31 Jan 2012 09:57:00 +0000</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2012/01/31/whats-happening-with-ios-5-1/index.html</guid>
      <description>&lt;p&gt;iOS 5.1 Beta 1 was released to developers back in November 2011. Since then there have only been 2 additional betas (the last of which was just over 3 weeks ago) but not one of them has added anything worthy of a 5.x update. There are only two additions of note for developers.&lt;/p&gt;

&lt;p&gt;&lt;a href='http://www.macrumors.com/2012/01/09/apple-seeds-ios-5-1-beta-3-to-developers/'&gt;MacRumors reports&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;iOS 5.1 introduces a new API to mark files or directories that should not be backed up. For NSURL objects, add the NSURLIsExcludedFromBackupKey attribute to prevent the corresponding file from being backed up.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Whilst &lt;a href='http://www.anandtech.com/show/5158/apple-seeds-ios-51-beta-to-developers'&gt;AnandTech reports&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;On supported devices, iOS automatically inserts recognized phrases into the current text view when the user has chosen dictation input. The new UIDictationPhrase class (declared in UITextInput.h) provides you with a string representing a phrase that a user has dictated. In the case of ambiguous dictation results, the new class provides an array containing alternative strings. New methods in the UITextInput protocol allow your app to respond to the completion of dictation.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Neither of these things are worthy of a 5.x update as the first is just a reworking of a bug fix in 5.0.1 and the second doesn&amp;#8217;t really have much of a practical use. If we look back at previous .x updates, Apple always puts something in that will appeal (and can be marketed) to the end user:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;iOS 4.1&lt;/strong&gt; - GameCenter, HDR Photo Capture, iTunes Ping (haha), HD Video Uploads&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;iOS 4.2&lt;/strong&gt; - AirPrint, AirPlay, Fonts for Notes (it&amp;#8217;s a big deal), Voice Memos App - was also the release that bought iOS 4 to the iPad&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;iOS 4.3&lt;/strong&gt; - Personal Hotspot, AirPlay in 3rd Party Apps, Home Sharing, 2x faster JavaScript in Safari, Mute Switch preference for iPad&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are all big updates and carry a number of new features which end users can relate to (i.e. they are not all dependent on developers integrating a new API). That&amp;#8217;s what I don&amp;#8217;t understand about iOS 5.1 so far – there are no end user features and the new bits that are there are very minor API updates that most developers won&amp;#8217;t use.&lt;/p&gt;

&lt;p&gt;In addition to these rather minor updates, there is also the question of timing. iOS 5.1 has been with developers for over 2 months with a very slow release cycle.&lt;/p&gt;

&lt;p&gt;So what&amp;#8217;s happening?&lt;/p&gt;

&lt;p&gt;My theory (and this is all speculation) is that iOS 5.1 does indeed add something big but we won&amp;#8217;t see it until mid-February when the iPad 3 is announced. This is because the iPad 3 will come with iOS 5.1 pre-installed and so a number of the new features will be directly tied to that. As soon as the event is over, developers will be given a 5.1 GM along with around 3 weeks to submit apps to the App Store if they want to update to the new features.&lt;/p&gt;

&lt;p&gt;My current guess is that Siri will be prominent in iOS 5.1 as the introduction of the iPad 3 means there will be another device out there with Siri support (and that&amp;#8217;s if they don&amp;#8217;t open Siri up to the iPad 2 / iPhone 4). A 3rd party API for Siri will allow all kinds of amazing apps to appear (take a look at my &lt;a href='http://bendodson.com/weblog/2011/12/06/hows-the-london-underground-ask-siri/'&gt;Tube Updates plugin for SiriProxy&lt;/a&gt; for example) and will look great during the iPad 3 announcement keynote when Scott Forstall gets a number of prominent development studios to show off what they&amp;#8217;ve done in 2 weeks of having access to the API.&lt;/p&gt;

&lt;p&gt;However, Siri APIs do not a .x release make as that isn&amp;#8217;t enough to make most people upgrade (such as the iPhone 4 and iPad 2 which I doubt are going to get Siri). A few other things I would hope to see in iOS 5.1 are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Widgets&lt;/strong&gt; - the ability for developers to create Notification Center widgets such as the Weather and Stocks ones which come preinstalled. This is an area when Android is nominally &amp;#8220;winning&amp;#8221; and is something which should have been in iOS 5 in my opinion.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Facebook Integration&lt;/strong&gt; - I&amp;#8217;m not a big fan of Facebook but I can see it getting iOS level integration similar to Twitter.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Improved Siri&lt;/strong&gt; - Aside from 3rd party dev support, allowing things like &amp;#8220;read my mail&amp;#8221; or &amp;#8220;open this app&amp;#8221;. I&amp;#8217;d really like a &amp;#8220;lower brightness&amp;#8221; command.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;iBooks&lt;/strong&gt; - Not really a big announcement but &lt;a href='http://bendodson.com/weblog/2012/01/30/retina-display-graphics-reappear-in-ibooks-2/'&gt;I speculated yesterday that iBooks might become part of the core OS&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aside from that I can&amp;#8217;t really think of anything they can add to this release. I&amp;#8217;d like to see a new maps app without Google (Apple have aquired enough mapping companies) and profiles on the iPad (so you can have multiple accounts) but I think these are more likely for iOS 6.0. Not related to iOS 5.1, but I&amp;#8217;d also like to see iMessages bought over to the Mac App Store as well.&lt;/p&gt;

&lt;p&gt;One thing is for certain though – iOS 5.1 beta 3 is a long way off from what iOS 5.1 will actually be. It just isn&amp;#8217;t a 5.x update at the moment but I&amp;#8217;m certain all will be revealed at the iPad 3 keynote sometime in mid-February. If you&amp;#8217;ve got any ideas for what you expect to see in iOS 5.1 &lt;a href='http://bendodson.com/contact/'&gt;send me an email&lt;/a&gt; or &lt;a href='http://twitter.com/bendodson'&gt;tweet at @bendodson&lt;/a&gt; and I&amp;#8217;ll add the best ideas to the list.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Retina display graphics reappear in iBooks 2</title>
      <link>http://bendodson.com/weblog/2012/01/30/retina-display-graphics-reappear-in-ibooks-2/index.html</link>
      <pubDate>Mon, 30 Jan 2012 00:00:00 +0000</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2012/01/30/retina-display-graphics-reappear-in-ibooks-2/index.html</guid>
      <description>&lt;p&gt;Matthew Panzarino for TNW:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Now, with the release of the iBooks 2 application, the Retina-ready images are on display yet again, but our source says it is highly doubtful that including them this time is an accident.&lt;/p&gt;

&lt;p&gt;These images would display correctly on a screen 2048×1536 pixels in dimension (double the res of the iPad 2′s screen) at a PPI of 260. That is lower than the iPhone 4/4S display, which clocks in at just over 300 PPI, but should still qualify as a Retina display due to the viewing distance to the iPad being greater.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;These @2x files appeared in a version of iBooks during August 2010 but turned out to be a red herring (or an accident as TNWs source puts it). However, with rumours ramping up for a March launch of the iPad 3, it&amp;#8217;s highly likely that these retina display graphics are now needed.&lt;/p&gt;

&lt;p&gt;The thing that confuses me is that iBooks doesn&amp;#8217;t come pre-installed on iOS so Apple could easily push out a v2.0.1 safe in the knowledge that a non-retina version wouldn&amp;#8217;t end up on the new iPad. This is undoubtedly what will happen with the iWorks suite of apps (a minor update to add retina compatibility) so why add @2x versions of UI components to iBooks now?&lt;/p&gt;

&lt;p&gt;In my opinion, this was either a mistake (again) or Apple are planning on having iBooks installed by default on the iPad 3.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>A Sneak Peek at Atomix Magazine v2.0</title>
      <link>http://bendodson.com/weblog/2012/01/29/a-sneak-peek-at-atomix-magazine-v2/index.html</link>
      <pubDate>Sun, 29 Jan 2012 00:00:00 +0000</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2012/01/29/a-sneak-peek-at-atomix-magazine-v2/index.html</guid>
      <description>&lt;p&gt;I&amp;#8217;ve long been interested in magzines on the iPad and how they can be adapted to make best use of the medium. I was therefore very excited when &lt;a href='http://atomixmag.com/'&gt;Atomix Magazine&lt;/a&gt; first launched in April last year as it was made exclusively for iPad and is focussed on videogames. At the time, most iPad magazines were using the &lt;a href='http://www.adobe.com/solutions/digital-publishing.html'&gt;Adobe publishing system&lt;/a&gt; which allows publishers to simply export their InDesign files to a custom iPad app. Whilst it works as a basic system for getting content to the iPad (which is better than no content), it is lacking when you consider that most magazines are at different physical sizes to the iPad. This means that unless publishers put the work in to rescale their content (and most don&amp;#8217;t - I&amp;#8217;m looking at you Future Publishing), then you end up needing to zoom in and pan around to read the content. Atomix was different in that the entire magazine was designed solely for the iPad and should have done away with these problems.&lt;/p&gt;

&lt;p&gt;The content itself was absolutely fantastic but there were a number of issues I had with the app itself. In the first few issues they decided to go with a weird parralex background system which meant that the text scrolled differently to the background. You&amp;#8217;d actually scroll – sometimes making the text unreadable – and then the background image would rubber band to where it should be. This was eventually sorted but then there were problem with fitting content onto a page (as shown in the image below). Whilst there were dividing lines which looked kind of like page breaks, the content would run to maybe 140% of the iPad height which meant you&amp;#8217;d read one column, scroll to keep reading, then have to scroll back up to read the next column. These issues nearly made me give up on Atomix purely because reading it was so frustrating.&lt;/p&gt;

&lt;p&gt;&lt;img src='http://files.bendodson.com/weblog/2012/01/atomix-pagination.jpg' alt='Bad page layout in Atomix Magazine' /&gt;&lt;/p&gt;

&lt;p&gt;These layout problems were solved late last year (along with some problems relating to downloads) but by that point another bone of contention had cropped up; Newsstand. For those that don&amp;#8217;t know, Newsstand was a system introduced with iOS 5 which basically made any magazine app able to show its latest issue as an app icon. This meant that you could see when a new issue was available and there were a number of useful additions such as the ability for new issues to download automatically in the background if you had a subscription. Atomix didn&amp;#8217;t have Newsstand support when iOS 5 launched which I felt was unfortunate considering that iOS 5 had been in beta for nearly 3 months (plenty of time to integrate the new APIs for an app which is only available on iPad). Other readers obviously felt the same as the &lt;a href='http://twitter.com/#!/atomixmag/'&gt;@AtomixMag&lt;/a&gt; twitter account was always bombarded with people looking for an update on Newsstand support.&lt;/p&gt;

&lt;p&gt;Fortunately, this is now being implemented in version 2.0 of the app which will be available tomorrow. The Newsstand support extends not only to moving the app to the Newsstand folder, but also to implementing background downloads if you opt for a subscription. This is a great feature as issues can sometimes take a while to download (they&amp;#8217;re around 300MB on average). Aside from Newsstand support, the app has been updated so that issues open a lot faster, has better graphics when you run or close an issue, and has a new download system meaning that any old issues you try to download will auto-resume if you close the app.&lt;/p&gt;

&lt;p&gt;&lt;img src='http://files.bendodson.com/weblog/2012/01/atomix-newsstand.jpg' alt='Atomix Magazine with Newsstand support' /&gt;&lt;/p&gt;

&lt;p&gt;Aside from the new version of the app and a new issue of the magazine coming tomorrow, Atomix also promised a &amp;#8221;&lt;a href='http://twitter.com/#!/atomixmag/status/162949681381519361'&gt;big announcement&lt;/a&gt;&amp;#8221; related to the publication. It turns out that this announcement relates to pricing in that Atomix Magazine will be free from now on! With Newsstand support, you are able to take out a free subscription that will work for future issues as well as allowing you to download previous issues free of charge. For this to work, you have to agree to pass on your personal information (a requisite for free subscriptions from Apple) but Atomix has said that they won&amp;#8217;t actually store the information that is sent to them as they don&amp;#8217;t need it.&lt;/p&gt;

&lt;p&gt;&lt;img src='http://files.bendodson.com/weblog/2012/01/atomix-subscription.jpg' alt='Free subscription to Atomix Magazine' /&gt;&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve been reading the new issue of the magazine today and I have to say that the whole app does feel a lot snappier and easier to read. Proper paging has been implemented so that all of the content fits nicely into the space and the virtual layout works nicely. You scroll from left to right to go through the different stories but then these are paged vertically so you have to scroll down to read. Some articles have more content underneath so you scroll left to right to read it like a regular magazine but you are prevented from going to the next story unless you scroll to the top of the article. Overall I find it works very well and gives you a good overview of how pages are connected, something that is often a problem in tablet magazines. If I had one criticism, it&amp;#8217;s that there is no indication of how far through the magazine you are and I&amp;#8217;m hopeful this is something they will look to implement in future versions.&lt;/p&gt;

&lt;p&gt;Whilst I was loathe to recommend it a few months ago, this update now makes Atomix a shining example of how iPad magazines should be. It doesn&amp;#8217;t try to add too much interactivity but instead focusses on great content laid out in the best way possible with a few interactive elements that delight rather than annoy. If you are an app developer, I would urge you to download Atomix and compare it with a magazine such as Edge, a magazine that could have got it right but instead opted for the lazy InDesign route. The differences should be clear. With Apple promoting Newsstand in a big way, I would expect more magazine publishers to follow Atomix example and go down the bespoke app route.&lt;/p&gt;

&lt;p&gt;If you&amp;#8217;re a fan of video games, then you should definitely &lt;a href='http://itunes.apple.com/gb/app/atomix-mag/id429125775?mt=8'&gt;download this magazine&lt;/a&gt;. You won&amp;#8217;t be disappointed.&lt;/p&gt;

&lt;p&gt;&lt;img src='http://files.bendodson.com/weblog/2012/01/atomix-issue.jpg' alt='v2.0 of Atomix Magazine' /&gt;&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>BenDodson.com gets an update</title>
      <link>http://bendodson.com/weblog/2012/01/26/bendodsoncom-gets-an-update/index.html</link>
      <pubDate>Thu, 26 Jan 2012 00:00:00 +0000</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2012/01/26/bendodsoncom-gets-an-update/index.html</guid>
      <description>&lt;p&gt;The last time my website got a major upgrade was back on the &lt;a href='http://bendodson.com/weblog/2009/04/26/london-underground-tube-updates-api-is-live/'&gt;26th April 2009&lt;/a&gt; when I moved from a self-built system to Wordpress (for my blog at least). Since then there have been a few minor design tweaks and a few page changes but the majority has stayed the same.&lt;/p&gt;

&lt;p&gt;Today I&amp;#8217;ve put live a big update that covers the design, content, and functionality of the site. The main reasons for a change were two-fold; to help me update the site more frequently and to ensure a better reading experience for visitors, regardless of device.&lt;/p&gt;

&lt;h2 id='design'&gt;Design&lt;/h2&gt;

&lt;p&gt;The design changes are actually fairly minimal. I&amp;#8217;ve put in a nicer font with more spacing and I&amp;#8217;ve removed some unnecessary sidebars to make the site full width - it should be a lot more comfortable to read in a traditional browser. However, the biggest change is the introduction of a mobile stylesheet which still shows the full content of the site but rendered in a much nicer way. Needless to say, this has been optimised for iPhone but it should work on any mobile device.&lt;/p&gt;

&lt;h2 id='content'&gt;Content&lt;/h2&gt;

&lt;p&gt;Managing the content on my site has always been a bit of a chore from a UX view as it caters to very different audiences. You might want to &lt;a href='http://bendodson.com/contact/contract-ios/'&gt;hire me&lt;/a&gt;, look at &lt;a href='http://bendodson.com/apps/'&gt;my apps&lt;/a&gt;, play with some of &lt;a href='http://bendodson.com/projects/'&gt;my projects&lt;/a&gt;, or simply &lt;a href='http://bendodson.com/weblog/'&gt;read my blog&lt;/a&gt;. You might have come here looking for a &lt;a href='http://bendodson.com/projects/browser-extensions/'&gt;Firefox extension&lt;/a&gt;, to &lt;a href='http://bendodson.com/weblog/2011/06/09/airplay-mirroring-tv-out-and-the-apple-tv-as-a-games-console/'&gt;read a post about the Apple TV&lt;/a&gt;, or because you want to see &lt;a href='http://bendodson.com/work/apps/'&gt;my portfolio&lt;/a&gt;. Regardless, I&amp;#8217;ve done a slight reorganisation so that the main pieces of the site are all readily accessible. This was mainly done by separating &lt;a href='http://bendodson.com/apps/'&gt;my apps&lt;/a&gt; from &lt;a href='http://bendodson.com/projects/'&gt;my projects&lt;/a&gt; and restructuring the &lt;a href='http://bendodson.com/work/'&gt;work section&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As more and more people have come to my site, the number of emails I have to deal with has increased dramatically. I&amp;#8217;m always keen to hear from people and so &lt;a href='http://bendodson.com/weblog/2010/11/04/contact-forms/'&gt;I had my email addresses displayed loud and proud&lt;/a&gt; on my contact page. This hasn&amp;#8217;t changed but I have introduced some new pages called &amp;#8220;Guidelines&amp;#8221; which might help you if your enquiry fits into a particular area. For example, if you&amp;#8217;re &lt;a href='http://bendodson.com/contact/contract-ios/'&gt;contacting me about a contract position&lt;/a&gt;, you&amp;#8217;ll be able to see my day rate and the projects I enjoy so that you can be sure I&amp;#8217;m the right person for the job. Whilst I expect to receive significantly less enquiries, I&amp;#8217;m hopeful that those I do receive (particularly for work) are more fruitful for both parties.&lt;/p&gt;

&lt;p&gt;Finally, &lt;a href='http://bendodson.com/weblog/'&gt;my blog&lt;/a&gt; has been updated so that I can now link to external sites that I find interesting and just add a comment to them (similar to the linked lists on &lt;a href='http://daringfireball.net/'&gt;Daring Fireball&lt;/a&gt;). Quite often I see an interesting topic that I&amp;#8217;d like to comment on that is too big for Twitter but too small for a full blown blog post. Now that I can link to external stories more easily I should be able to keep the weblog posts more regular.&lt;/p&gt;

&lt;p&gt;If you&amp;#8217;re wondering about comments, I don&amp;#8217;t allow them on my website and I haven&amp;#8217;t done for over a year now. Keeping on top of moderation, etc, was providing too much of a hassle and I prefer the one-to-one contact of email or the public sharing of Twitter which ensures that I can actually reply (most people didn&amp;#8217;t sign up for email alerts on comments). However, I do frequently update my posts to include any interesting comments people send to me so please do &lt;a href='http://bendodson.com/contact/'&gt;get in touch&lt;/a&gt; if you have something to add.&lt;/p&gt;

&lt;h2 id='functionality'&gt;Functionality&lt;/h2&gt;

&lt;p&gt;This is where the biggest update has come. I&amp;#8217;ve long been getting bored with Wordpress and have always found it a bit of a chore to put posts out. Also, the site was quite slow but the various caching plugins I found weren&amp;#8217;t quite doing it for me. To that end, the entire site has been replaced with completely static HTML (aside from some of the project pages). I write all my blog posts in Markdown and these are now pushed through &lt;a href='https://github.com/mojombo/jekyll'&gt;Jekyll&lt;/a&gt; to be converted to pure HTML. However the coolest bit (for me) is that I&amp;#8217;m running a Dropbox instance on my server - this means that whenever I compile the site with Jekyll on one of my macs, all of the generated files are automatically synced to my server and then through a symlink to my web directory. In short, I can post entries more quickly and they will load much faster for you.&lt;/p&gt;

&lt;p&gt;Anyway, I hope you enjoy the new site. If you find any problems please &lt;a href='http://bendodson.com/contact/'&gt;let me know&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One More Thing&lt;/strong&gt; - I almost forgot! &lt;a href='https://github.com/bendodson'&gt;All of my code samples and snippets are now available on GitHub&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>UK Carrier O2 sends your phone number to every website you visit</title>
      <link>http://bendodson.com/weblog/2012/01/25/uk-carrier-o2-sends-your-phone-number-to-every-website-you-visit/index.html</link>
      <pubDate>Wed, 25 Jan 2012 00:00:00 +0000</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2012/01/25/uk-carrier-o2-sends-your-phone-number-to-every-website-you-visit/index.html</guid>
      <description>&lt;p&gt;Lewis Peckover:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you&amp;#8217;re on O2&amp;#8217;s UK mobile network (not ADSL), you&amp;#8217;ll (probably) see a line beginning with &lt;code&gt;x-up-calling-line-id&lt;/code&gt; - followed by your mobile phone number in plain text&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Looks like O2 is sending users mobile phone numbers in plain text over HTTP headers to every site they visit whilst using their network. At the moment the issue appears to be limited to certain APNS on the UK O2 network.&lt;/p&gt;

&lt;p&gt;When asked about it, &lt;a href='https://twitter.com/o2/status/161872584634408960'&gt;O2 responded with&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The mobile number in the HTML is linked to how the site determines that your browsing from a mobile device&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As Lewis points out, a &amp;#8221;&lt;a href='https://twitter.com/lewispeckover/status/161879864159383552'&gt;User-agent header ID&amp;#8217;s the device&lt;/a&gt;&amp;#8221; so this seems a slightly odd stance (particularly as it isn&amp;#8217;t happening on all mobile devices).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; O2 say that it&amp;#8217;s a technical error and that this header should only be sent to whitelisted servers. It does beg the question, which servers are whitelisted? Presumably just O2&amp;#8217;s own websites but it&amp;#8217;s still not good to be sending information like this in plaintext.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>How not to ask for an iOS app review - A review of Jumpship Thrust Control 2</title>
      <link>http://bendodson.com/weblog/2011/12/12/how-not-to-ask-for-an-ios-app-review-a-review-of-jumpship-thrust-control-2/index.html</link>
      <pubDate>Mon, 12 Dec 2011 00:00:00 +0000</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2011/12/12/how-not-to-ask-for-an-ios-app-review-a-review-of-jumpship-thrust-control-2/index.html</guid>
      <description>&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The CEO of Monkeybin emailed me with a few corrections to this piece. Be sure to read the updates at the bottom of the page.&lt;/p&gt;
&lt;p&gt;I get contacted by quite a few developers of iOS apps asking for me to write a review up on my blog. Occasionally I agree and I'm always completely honest and independent in my thoughts. If I don't like the app, I say so and this is either met with annoyance (&quot;we only wanted you to publish a good review&quot;) or with good grace (&quot;thanks for your honest review - we've taken your criticisms on board and aim to fix them for the next release&quot;). Today, I received an email from &lt;a href=&quot;http://monkeybin.no/&quot;&gt;Monkeybin Studios&lt;/a&gt; asking me to review their game &quot;&lt;a href=&quot;http://itunes.apple.com/gb/app/jumpship-thrust-control/id422849746?mt=8&quot;&gt;Jumpship Thrust Control&lt;/a&gt;&quot;. Be careful what you wish for, it might just come true...&lt;/p&gt;
&lt;p&gt;This was a bit of an odd one (as you'll see in a moment) so I think I'll review the app by listing the email that was sent below and then dissecting each section. This will hopefully serve as a) a review of the app and b) as a lesson on how not to ask for iOS app reviews (not just from me, but from any blog or review site).&lt;/p&gt;
&lt;blockquote&gt;
	&lt;p&gt;Hi Fellow Gamer!&lt;/p&gt;
	&lt;p&gt;Please find attached details of Jumpship Thrust Control 2 - a new game on the scene for iPhone and iPad users - we’d love it if you can review it on your site.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Sounds interesting - maybe I'll review it. Shame they didn't include a download link to the game though as it's actually version 2.0 of an app called &quot;JumpShip Thrust Control&quot;. The first time I searched for it (copying and pasting the name), iTunes couldn't find it. Also, there is no detail here (or later in the email) of pricing information. I've no idea if this is a paid app (in which case, where is free promotional code so I can download it) or a free app. Turns out this is a free app and you can use In-App Purchases to unlock later levels. If you are asking for a review of your app, be sure to include pricing information (as it's a key review metric) as well as any promotional codes so that a reviewer can use the full app.&lt;/p&gt;
&lt;blockquote&gt;
	&lt;p&gt;Give it a try – we promise the top-notch graphics and the old school side-scroller “action” nature of the game will have you hooked. It’s a throwback to the days of Atari and Commodore 64 video gaming but with 2012 style graphics!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;2012 style graphics you say? An interesting pitch when games like Infinity Blade II came out in 2011. By way of demonstration, here is a screenshot of the app:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://files.bendodson.com/old-weblog/2011/12/IMG_0095.png&quot; alt=&quot;IMG_0095.PNG&quot; title=&quot;IMG_0095.PNG&quot; border=&quot;0&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I think that pretty much speaks for itself. An oil type background (looks alright) with some clipart stuck on top. The only bit that I could claim is even modern is that the flames at the back move a little bit but I believe this is a fairly simple effect to do with Cocos2D so we shouldn't put too much stock in it.&lt;/p&gt;
&lt;blockquote&gt;
	&lt;p&gt;When I say “new game” Jumpship Thrust Control is actually a completely re-vamped and much improved version of an existing game from the team at Monkeybin Studios; you have to steer a spaceship through many different types of beautiful but hazardous terrain, navigating many evil obstacles in the way!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When I first read this sentence, I thought &quot;ah good, at least they admit it's a rip-off game&quot; but then they go on to say that it's a remake of one of their old games! I think you'll find that this exact game mechanic has been popularised oh so many times before. Here's a small history of these games:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Super_Cobra&quot;&gt;Super Cobra&lt;/a&gt; (Atari game from 1983 - the original game of this type I believe)
&lt;li&gt;&lt;a href=&quot;http://www.helicoptergame.net/&quot;&gt;Helicopter Game&lt;/a&gt; (Flash game made in 2004 - the most well known on the internet)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://itunes.apple.com/gb/app/helicopter/id322998366?mt=8&quot;&gt;Helicopter&lt;/a&gt; (iPhone version of the above two games - blatant copying in 2009)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That's just a very quick run through how this game has appeared over the years but there are hundreds of copies with different types of vehicle ranging from tractors to spaceships. This is just another one of those that doesn't even try to avoid the obvious link in that the first level is &quot;cave&quot; where every helicopter version of this genre starts. Why is a spaceship in a cave (and &lt;a href=&quot;http://starwars.wikia.com/wiki/Exogorth&quot;&gt;are they sure it's a cave&lt;/a&gt;?). They could have at least tried a funny parody to make this game different in the same way that &lt;a href=&quot;http://itunes.apple.com/gb/app/baby-monkey-going-backwards/id447960108?mt=8&quot;&gt;Baby Monkey (Going Backwards On A Pig)&lt;/a&gt; did with the platforming genre, but no, it's just a shameless copy.&lt;/p&gt;
&lt;blockquote&gt;
	&lt;p&gt;Gamers said the previous version was too difficult and there was nothing to cater for the serious gamers over the casual gamers.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Let's clarify something here; there are casual gamers and there are serious gamers. Serious gamers play on the PS3 and Xbox, casual games play on the Wii and on mobile phones (with the possible exception of Infinity Blade II which is console quality on the iPhone). This is a casual game by the fact that it's horribly repetitive and is the sort of thing you play on the tube when you've finished reading the paper.&lt;/p&gt;
&lt;blockquote&gt;
	&lt;p&gt;The many improvements in the new version include 3 different player modes (beginner, intermediate and expert) plus 5 new terrains to master and easier controls for the spaceship; there’s also a training mode built in to get you up to speed with controlling the spaceship before you try the beginners’ level for real.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;New terrains and level difficulty does not a &quot;serious gamer&quot; game make. If they'd wanted to make it more competitive they should have put in some sort of peer-to-peer mechanic where two people start at the same time on different devices and the first one to die loses. If they'd wanted to make it more engaging over a long time period (rather than a pick up and play kind of game) then they should have put in a levelling system with spaceship upgrades (which you could charge real money for with In-App Purchasing). Adding a difficulty level isn't going to make all the Battlefield 3 and Skyrim players drop their controllers and pick up this app instead.&lt;/p&gt;
&lt;blockquote&gt;
	&lt;p&gt;Just to make your life easier, we attach a couple of reviews we have already written that highlight some of the key features of the game. Perhaps you can cut and paste some of the comments and claim them as your own review?! (Just thinking of your time. :))&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This was the part of the email where I made up my mind to do a review of the app. You can download and read their prewritten reviews: &lt;a href=&quot;http://files.bendodson.com/jumpship-review-1.doc&quot;&gt;review #1&lt;/a&gt; and &lt;a href=&quot;http://files.bendodson.com/jumpship-review-2.doc&quot;&gt;review #2&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It's difficult to know where to start but this is sort of behaviour is what I hate about the app industry in many ways. There are thousands of apps out there but they are hard to find unless you get coverage in the right places. That does not mean you email blogs with pre-written reviews asking them to &quot;claim them as your own&quot;. Just don't do it. If you want to have your app reviewed, you have to accept that people may not like it sometimes. Take their criticism, and improve your app. It's insulting to be given pre-written content as you're basically saying to the reviewer &quot;we don't trust your judgement or other write-ups - just use our content&quot;.&lt;/p&gt;
&lt;p&gt;That's not to say you shouldn't provide text to a reviewer, but it should be done as a press release. That way, they can pick and choose any interesting elements (e.g. &quot;this is the first game to use x feature&quot;) and write it into their review without physically copying / pasting. You can also include reviews from other real people that show off good features of your app, particularly if you've had good press coverage from other outlets. But don't ever write your own reviews and ask people to use them. That is incredibly underhand and doesn't do either the journalism or app development industries any favours.&lt;/p&gt;
&lt;blockquote&gt;
	&lt;p&gt;Thanks in advance for taking a look at our game and Happy Jumpshipping!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I've got a few thoughts on the app which I haven't covered above so I'll quickly list them:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Levels&lt;/strong&gt; - there is only 1 level included with the game followed by 4 trial levels that you get a little distance with before being asked to make an In-App Purchase. There is also a boss level which can be purchased. Both In-App Purchases cost 69p which is fair enough but this isn't detailed anywhere in the app description. The description says &quot;5 great new landscape levels&quot;, the &quot;what's new&quot; text says &quot;5 NEW LEVELS&quot;, and the email I got said &quot;5 new terrains to master&quot;. At no point does it say you'll need to purchase these until you're in the game. It's a free game, so it's understandable you'll have to pay at some point, but it's deceptive to list &quot;5 levels&quot; everywhere when you are actually only getting one with your download.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bugs&lt;/strong&gt; - it's buggy as hell. On my second go on the first level, my ship would no longer blow up. Here's a photo of something that just shouldn't happen on a game thats main bit of code is &quot;if ship hits wall, ship explodes&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://files.bendodson.com/old-weblog/2011/12/IMG_0103.png&quot; alt=&quot;IMG_0103.PNG&quot; title=&quot;IMG_0103.PNG&quot; border=&quot;0&quot; /&gt;&lt;/p&gt;
&lt;p&gt;As well as that issue, the UI would freeze if I closed the app and came back to it whilst it was on the pause menu. Music would still play but I couldn't touch anything so had to force quit the app. That would be annoying if you were on a high-score streak and got a text message or a phone call.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Training&lt;/strong&gt; - training mode is apparently designed to be a place where you can't crash in order to get you used to the game. They don't tell you this anywhere in the app though so you'd be forgiven for wondering what is going on as the game never ends, you can't crash, and no power-ups or walls appear anywhere.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Power-ups&lt;/strong&gt; - there are power ups littered through the game (with icons that look like they were plucked from windows 95) but no description of what they do. You have to learn by trial and error that a blue orb means you can delete a bit of level or that something that looks like a move cursor is actually a power up to shrink you temporarily.&lt;/p&gt;
&lt;h3&gt;Summary&lt;/h3&gt;
&lt;p&gt;Overall the game is just plain awful. When you take into account the deception around In-App Purchases and that they are trying to get reviewers to post pre-written reviews, it becomes a despicable game. Very little thought has gone into gameplay or design and the only reason I even downloaded it was as an example of how to demonstrate what not to do.&lt;/p&gt;
&lt;p&gt;In terms of how you should market your apps, I can strongly recommend putting together a good media pack such as the one outlined by &lt;a href=&quot;http://retrodreamer.com/blog/2011/08/how-to-media-kits-retro-dreamer-style/&quot;&gt;Retro Dreamer&lt;/a&gt; (linked to from &lt;a href=&quot;http://iosdevweekly.com/issues/4/&quot;&gt;iOS Dev Weekly Issue 4&lt;/a&gt;, a must subscription for iOS developers). I have a &lt;a href=&quot;http://highlightsapp.com/files/media-kit.zip&quot;&gt;media kit&lt;/a&gt; for my apps such as &lt;a href=&quot;http://itunes.apple.com/gb/app/highlights/id428756645?mt=8&quot;&gt;Highlights&lt;/a&gt; which has some screenshots, information, and release notes that allow any reviewers to have a complete overview of the app. If you follow that guide, you'll find you get a lot more responses from app reviewers than if you follow the example taken by Monkeybin Studios.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update (12th December 2011):&lt;/strong&gt; I replied to the email to let them know I'd put this review up and got the following response:&lt;/p&gt;
&lt;blockquote&gt;
	&lt;p&gt;Hi Ben,&lt;/p&gt;
	&lt;p&gt;Thanks for your review. We respect your opinion and we have taken notes of our mistakes and your sugesstions. Hopefully we'll do better in future. We respect your judgment, pre-written reviews were just because of the fact that many webmasters may receive hundreds of emails daily and they may not find a time to write for every one.&lt;/p&gt;
	&lt;p&gt;Anyways, Thanks again!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I have respect for a company that actually replies to negative criticism so that's good at least. I still think the app can be vastly improved and hopefully we'll see that happen in this case at some point.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update (15th December 2011):&lt;/strong&gt; Today I received an email from the CEO of Monkeybin to let me know that the person who contacted me regarding writing a review was not in fact an employee of Monkeybin but instead a freelancer who had operated outside of their remit.&lt;/p&gt;
&lt;blockquote&gt;
	&lt;p&gt;Hi Ben,&lt;/p&gt;
	&lt;p&gt;My name is Haakon Langaas Lageng, and I am the CEO at Monkeybin. You have been in touch with &lt;strong&gt;***&lt;/strong&gt;, and I would like to point out that &lt;strong&gt;***&lt;/strong&gt; is not a Monkeybin employee.&lt;/p&gt;
	&lt;p&gt;We hired them as a freelancing marketing manager to do the promotions for JumpShip Thrust Control, and it got out of hand. They were free to do the promotions the way they thought would be best, since we were pressed on time doing other projects. It resulted in methods that is not up to Monkeybin's ethics or standards, and not how we want to be perceived by the gaming community.&lt;/p&gt;
	&lt;p&gt;As the CEO of Monkeybin, this is of course completely my responsibility. Unfortunately, what was happening here slipped my eyes. I found out only yesterday what has been going on.&lt;/p&gt;
	&lt;p&gt;I just saw on your site that &lt;strong&gt;***&lt;/strong&gt; sent you an &quot;explanation&quot; on the 12th December, and I am sorry they got around doing that before I put the brakes on.&lt;/p&gt;
	&lt;p&gt;If you are going to publish what I just wrote here, please omit &lt;strong&gt;***&lt;/strong&gt; name. They made some bad judgements, yes, but in the end, as I said, it is all my responsibility.&lt;/p&gt;
	&lt;p&gt;Thank you for your time.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It takes a lot of guts for a CEO to claim ultimate responsibility for an error by a contractor rather than trying to use it as an excuse and I applaud Haakon for it. Let this be a lesson to everybody that you should fully research anybody you ask to promote apps for you and ensure you stay on top of what is being done in your companies name.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>How's the London Underground? Ask Siri!</title>
      <link>http://bendodson.com/weblog/2011/12/06/hows-the-london-underground-ask-siri/index.html</link>
      <pubDate>Tue, 06 Dec 2011 00:00:00 +0000</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2011/12/06/hows-the-london-underground-ask-siri/index.html</guid>
      <description>&lt;p&gt;After seeing &lt;a href=&quot;http://www.youtube.com/watch?v=AN6wy0keQqo&quot;&gt;SiriProxy in action on YouTube&lt;/a&gt;, I was keen to grab an iPhone 4S to have a play with it. I managed to pick one up at the Apple Store yesterday and today I'm pleased to release my first SiriProxy plugin; &lt;a href=&quot;https://github.com/bendodson/SiriProxy-TubeUpdates&quot;&gt;TubeUpdates&lt;/a&gt;. It's a basic plugin that lets you ask Siri for the status of a London Underground line thanks to my &lt;a href=&quot;http://tubeupdates.com/&quot;&gt;TubeUpdates API&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://files.bendodson.com/old-weblog/2011/12/IMG_0066.png&quot; alt=&quot;SiriProxy-TubeUpdates - A standard request&quot; title=&quot;IMG_0066.PNG&quot; border=&quot;0&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I've not dabbled with Ruby for a while but building the plugin was fairly straightforward. All of the code is &lt;a href=&quot;https://github.com/bendodson/SiriProxy-TubeUpdates/&quot;&gt;available on GitHub&lt;/a&gt; but the main piece looks like this:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;listen_for&lt;/span&gt;&lt;span class=&quot;sr&quot;&gt; /[what is,what&amp;#39;s] the status of (.*)/i&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;line&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;encodedline&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;line&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gsub&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;+&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;url&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;URI&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;parse&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;http://tubeupdates.com/siri/?line=&amp;#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;encodedline&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;json&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Net&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;HTTP&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;url&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;parse&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;json&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;say&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;status&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
    
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;messages&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;count&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;
	    &lt;span class=&quot;n&quot;&gt;response&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ask&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;There are additional details. Would you like to hear them?&amp;quot;&lt;/span&gt;
	    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;response&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=~&lt;/span&gt; &lt;span class=&quot;sr&quot;&gt;/yes/i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;#process their response            &lt;/span&gt;
	        &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;messages&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;each&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;message&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
	            &lt;span class=&quot;n&quot;&gt;say&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;message&lt;/span&gt;
	        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	    &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;request_completed&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;The matching in the first line ensures that you can ask either &quot;what is (or what's) the status of (the line name)&quot;. This is then url encoded and &quot;the line name&quot; is sent to a Siri endpoint I created on the Tube Updates site. The site will return a JSON string of the tube line status which is then parsed and spoken back to the user. E.g. &quot;The Circle line is running a good service&quot;.&lt;/p&gt;
&lt;p&gt;If there are any messages for the line (these are generally details of delays), then an additional step is performed; the user is asked if they would like to hear the details and answering &quot;yes&quot; will list them.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://files.bendodson.com/old-weblog/2011/12/IMG_0065.png&quot; alt=&quot;SiriProxy-TubeUpdates - A delayed line&quot; title=&quot;IMG_0065.PNG&quot; border=&quot;0&quot; /&gt;&lt;/p&gt;
&lt;p&gt;And that's pretty much it! I've got a few ideas for more complex plugins that can interface directly with iPhone apps so I'll have a play with those when I get a spare moment. If you've got any comments or feature requests for this plugin, then &lt;a href=&quot;http://bendodson.com/contact&quot;&gt;get in touch&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As an aside, this is the first project I've published that is written in Ruby and the first time I've put anything up on GitHub.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Goodbye Gowalla</title>
      <link>http://bendodson.com/weblog/2011/12/03/goodbye-gowalla/index.html</link>
      <pubDate>Sat, 03 Dec 2011 00:00:00 +0000</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2011/12/03/goodbye-gowalla/index.html</guid>
      <description>&lt;p&gt;I'd originally been planning to post up a review of Gowalla v4 (late I know, but it was fairly in-depth look at a company gone mad) but last nights news that Gowalla is to be acquired by Facebook means that I've bought forward another post I'd been planning; my goodbye to Gowalla. After being a loyal user for just over 2 years, the time has finally come for me to delete the app that has been a key part of my life for a rather long time.   
&lt;h3&gt;Beginnings&lt;/h3&gt;
Gowalla was built by a company called Alamofire (before they changed their name to just Gowalla) and I became acquainted to it via one of their other projects; &lt;a href=&quot;http://apps.facebook.com/packrat/&quot;&gt;PackRat&lt;/a&gt;. It was a game that involved collecting sets of cards with different icons on was pretty addictive. When they decided to make a mobile game, I assumed it would be similar to PackRat but with a location element. Instead, Gowalla was created allowing you to check-in at places as well as collect virtual items. The collection part wasn't terribly well thought out and went through several iterations but it garnered quite a cult following. In addition to items, you could collect &quot;stamps&quot; by checking in at locations and &quot;pins&quot; by completing tasks (e.g. check in at 10 different coffee shops).&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://files.bendodson.com/old-weblog/2011/12/100-stamps.png&quot; alt=&quot;My first 100 stamps!&quot; title=&quot;100-stamps.PNG&quot; border=&quot;0&quot; /&gt;&lt;/p&gt;
&lt;p&gt;For a time, everything was rosy. New items would come out on a Tuesday (leading to mass checkins at the categories the item was likely to appear at) and people were steadily competing to see how many stamps they could get. I think the highest I ever saw was somebody who had checked in at over 9500 places.&lt;/p&gt;
&lt;p&gt;During 2009, I quit playing PackRat as they introduced a number of changes which made the game less enjoyable (e.g. locking key cards unless you got friends to join the game, adding &quot;bling&quot;). This was probably a premonition of things to come as Gowalla would eventually make the same mistake - disenfranchising their core audience rather than embracing it.&lt;/p&gt;

&lt;h3&gt;Developing for Gowalla&lt;/h3&gt;
&lt;p&gt;In October 2009 I &lt;a href=&quot;http://bendodson.com/weblog/2009/10/07/gowalla-tools-web-app-find-your-missing-gowalla-items/&quot;&gt;created a basic web app for iPhone&lt;/a&gt; that would allow you to find items by showing you the categories that were most likely to drop a specific item. It proved to be incredibly popular, so over Christmas 2009 I introduced 13 new tools or web apps in a project I called &quot;Gowalla Tools&quot; which ranged from being able to view Flickr photos at Gowalla spots to temporarily turning Gowalla.com into a PackRat game (thanks to some JavaScript) which would allow people to collect coins which were then used to give out prizes. This again was so popular that I started to devote more time to making apps that ran on top of Gowalla. There wasn't an official API when I started but by early 2010, Gowalla launched the first version of their API. This is where things started to deteriorate…&lt;/p&gt;

&lt;h3&gt;The Fallout&lt;/h3&gt;
&lt;p&gt;The new API started out with good intentions, but constant breakages and undocumented changes made it a frustration to use, let alone build apps with. At the time, I'd been working on a native iPhone app but there was no way it could go out with the Gowalla API as it was. Had Gowalla altered anything, then the app would have remained broken until I could fix it and then sit through the 2 week Apple App Review process - not ideal. So it was that I rallied together a few other developers and a number of Gowalla players and wrote a letter entitled &quot;&lt;a href=&quot;http://gowallatools.com/api/&quot;&gt;Thoughts On The Gowalla API&lt;/a&gt;&quot;. Gowalla never replied or apologised (and one of the team called me a &quot;jackass&quot; when I met them at SXSW a year later) but the API did eventually improve months later.&lt;/p&gt;

&lt;h3&gt;The Reconcilliation&lt;/h3&gt;
&lt;p&gt;In August 2010, after the API had been updated and a number of (highly priced) apps had been built on top of it, I decided to &lt;a href=&quot;http://vimeo.com/14045036&quot;&gt;relaunch Gowalla Tools&lt;/a&gt;. Initially it was going to be called &quot;Gowalla Plus&quot; but that idea didn't sit well with Gowalla:&lt;/p&gt;

&lt;blockquote&gt;
	&lt;p&gt;Hey Ben,&lt;/p&gt;
	&lt;p&gt;Adam sent along your email to me regarding naming conventions. Hopefully I can address both of our concerns in this email.&lt;/p&gt;
	&lt;p&gt;These are always sticky situations because we want to support the app developers building great apps on the API, but we also need to avoid confusion from both a legal and customer support standpoint. You've likely observed that our naming conventions follow this standard approach:&lt;/p&gt;
	&lt;p&gt;Gowalla for iPhone, Gowalla for iPad, Gowalla for Android, etc.&lt;/p&gt;
	&lt;p&gt;I'm afraid GowallaPlus is simply too close to our mark and if we let it fly, we have to let everything fly from a trademark standpoint. To be honest, I've always been a concerned about GowallaTools, but have wanted to avoid hassling you.&lt;/p&gt;
	&lt;p&gt;We deal with complaints and support email every week from folks who believe certain apps sold in the iTunes store starting with Gowalla in their names are actually our product. We'll be working with each of these developers to change their names.&lt;/p&gt;
	&lt;p&gt;I'm not against a mention of Gowalla in the name. I just can't have the name on the front side.&lt;/p&gt;
	&lt;p&gt;[ProductName] for Gowalla would be acceptable.&lt;/p&gt;
	&lt;p&gt;The likelihood of folks believing GowallaPlus is our app is super high, based on our experience with the other apps in the store.&lt;/p&gt;
	&lt;p&gt;Thanks for letting us know your thoughts in advance. I'm in hopes we can encourage you to develop your own brand name for your line up of products. I think you've got a good thing going.&lt;/p&gt;
	&lt;p&gt;Related: I'd love to get a beta of the &quot;travel edition&quot; if you're open to it. I'm traveling to South America later this month and would love to give it run. Seems perfect!&lt;/p&gt;
	&lt;p&gt;Let me know your thoughts and questions. I know we haven't always been your favorite guys to be developing with, but I hope we can find some solutions here that work for everyone.&lt;/p&gt;
	&lt;p&gt;Thanks Ben!&lt;/p&gt;
	&lt;p&gt;jw&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Of course, no other app was ever actually removed for having the word &quot;Gowalla&quot; in it. In any case, I decided to rebrand my projects as &quot;Wallabee&quot; and started off by releasing my &lt;a href=&quot;http://bendodson.com/projects/wallabee/#travel&quot;&gt;&quot;Wallabee: Travel Edition&quot; app&lt;/a&gt;; an app that let you check-in multiple people on Gowalla with more than 99% savings on data usage (which translates into big savings if you're using data roaming). Unfortunately, despite being a free app (and the encouragement from Josh above), Gowalla never publicised it in anyway e.g. on their Twitter feed or blog.&lt;/p&gt;

&lt;p&gt;Over Christmas 2010, I &lt;a href=&quot;http://wallab.ee/xmas2010/&quot;&gt;unleashed some plans for further apps and developments&lt;/a&gt; including an Item Hunter, Time Travel Edition (showing historical changes to places), and version 2 of the Travel Edition app. Unfortunately the release of version 2.0 was &lt;a href=&quot;http://wallab.ee/pouch/2010/12/14/travel-edition-2-0-delay-due-to-functionality-changes/&quot;&gt;delayed&lt;/a&gt; due to Gowalla having an issue with the mass check-in facility I'd added.&lt;/p&gt;
&lt;p&gt;Finally, in March 2011, myself and a number of good friends I've made through Gowalla launched the &lt;a href=&quot;http://wallab.ee/pouch/&quot;&gt;Wallabee Pouch&lt;/a&gt;, a definitive guide to all aspects of Gowalla. It also featured the &quot;&lt;a href=&quot;http://wallab.ee/pouch/items/directory/&quot;&gt;Item Directory&lt;/a&gt;&quot;, the largest repository of information about Gowalla items including real-time item drop rates and statistics.&lt;/p&gt;

&lt;h3&gt;SXSW / Re-evaluation&lt;/h3&gt;
&lt;p&gt;In late 2010, I decided to head over to Austin for SXSW in March 2011 as I was keen to meet up with the Gowalla team and a few other Gowalla players were all heading over for a week of item hunting, stamp collecting, and general socialising. I'd also opened up a conversation with Gowalla around their vacancy for an iPhone developer so I was keen to have a discussion about it whilst I was there. Unfortunately, things turned out slightly different to how I imagined. I saw firsthand some of the pettiness and childlike behaviour that certain players exhibited around items and suddenly realised why Gowalla tried not to have much to do with their original players if they all acted like that. Despite organising a meet up around the iPhone developer role, it fell through with the HR contact failing to arrange anything (apparently a systemic problem within the company - departments often have no interaction with each other and there is &quot;rampant disorganisation&quot; - that was a quote from an employee).&lt;/p&gt;
&lt;p&gt;The most important part for me of SXSW was listening to Josh's talk on the future of location-based services, a talk that I still maintain is one of the most interesting I've ever attended. It was at that point that I realised the writing was on the wall for the item-based gamification of Gowalla and that they would eventually change into just being a service based on check-ins. I decided to stop focussing on items and &lt;a href=&quot;http://bendodson.com/weblog/2011/03/27/gamification-social-validation-gowalla-and-moving-on-from-wallabee-what-i-learned-at-sxsw/&quot;&gt;stood down from Wallabee&lt;/a&gt; to focus on making travel based tools instead. My premonition turned out to be correct when &lt;a href=&quot;http://blog.gowalla.com/post/9378150015/going-forward&quot;&gt;Gowalla announced that items wouldn't be making it&lt;/a&gt; to the next version of the app in August 2011.&lt;/p&gt;

&lt;h3&gt;Highlights&lt;/h3&gt;
&lt;p&gt;Once I'd stopped working on Wallabee, I started focussing intently on my next big project; &lt;a href=&quot;http://highlightsapp.com/&quot;&gt;Highlights&lt;/a&gt;. It was an app that would help you find the best places around you by using recommendations from other users. The twist was that it used location data from both Foursquare and Gowalla and used a complex algorithm to rank them based on comments, tips, highlights, photos, etc. It also pulled in vast amounts of data from other services like Last.fm, Yelp, and Flickr. To power the system, I tapped into the Pubsubhubbub hub for Gowalla courtesy of &lt;a href=&quot;http://superfeedr.com/&quot;&gt;Superfeedr&lt;/a&gt; - this allowed me to get every checkin that happened on Gowalla in real-time and build up my own vast database of checkin data and locations thus bypassing the need to directly connect to Gowalla's API (due to the issues I'd had previously). You can &lt;a href=&quot;http://bendodson.com/weblog/2011/07/25/the-inside-story-on-powering-highlights/&quot;&gt;read more about the integration in a post I did about it&lt;/a&gt; if that sort of thing interests you!&lt;/p&gt;
&lt;p&gt;On September 2nd (which also happened to be my birthday), Apple made Highlights their &quot;iPad App of the Week&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://files.bendodson.com/old-weblog/2011/12/IMG_0001.png&quot; alt=&quot;Highlights - iPad App of the Week&quot; title=&quot;IMG_0001.PNG&quot; border=&quot;0&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I sent some promotional codes direct to Josh (and a few other Gowalla staff members) in the hope that they might at least tweet about the app or put up a blog post about it as they had for other apps (although I found out later that the one app they publicised was part-built by one of their developers). As a one-man development studio, a single tweet from Gowalla would have made a big difference in the number of downloads but unfortunately it didn't happen. Despite being featured by Apple, given high ratings on app review sites, and being reviewed in numerous magazines and popular sites (such as TUAW), Gowalla didn't want to acknowledge it. &lt;/p&gt;
&lt;p&gt;If I was running a company with an API and one of the apps got a lot of good press, I'd be the first person to try and publicise it as it can only benefit both parties. It still surprises me that Gowalla never understood 3rd party developers and I often wonder why they even bothered making a public API.&lt;/p&gt;

&lt;h3&gt;Gowalla v4.0&lt;/h3&gt;
&lt;p&gt;During September 2011, Gowalla released version 4.0 of their app to great fanfare at TechCrunch Disrupt. On the surface, it looked like a solid update. A beautiful design and a core rethinking of the product meant that they were stepping in the direction I thought they would after the talk at SXSW. However, once I got to use the app, I couldn't believe how badly wrong they had got it. I'm not going to go into a huge amount of detail on it (as I believe the app will disappear soon anyway) but here are my main points about what is wrong with Gowalla v4:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Stories&lt;/strong&gt; - The fundamental idea that a check-in is a story is genius. Whilst going to the grocery store isn't really worthy of a &quot;story&quot;, there are many times when story is exactly the word to use. When I heard about it, I thought that Gowalla would extend the great work they'd done on starting and ending points of journeys. They had previously put out an update which would show a little aeroplane graphic showing when people had travelled from one location to another and had gone further to detect when a journey had begun and ended. For instance, I got a &quot;Survived SXSW&quot; badge only once I got back to Gatwick Airport in the UK as that's when my SXSW journey had begun from. I imagined they'd use this so that if I went on holiday, it would detect that and bundle up all my checkins and photos as a single story. What actually happened is that a story is a single place only thing and is more about the people that are there rather than the places. It works great if you have lots of friends in a single place but it kind of sucks if you're doing a pub crawl or going to more than one place. The fact that people can also check you in despite not being there (some people kept saying &quot;Ben's here&quot; at spots in the US which kind of annoyed me) instantly made this a painful update.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Notes&lt;/strong&gt; - In Gowalla v3, you could leave notes for people at a spot. They could only read these notes when they checked in at that place. This was a great usage of the location-based nature of the app but was removed. Apparently it was going to be put back in at some point but it's never materialised.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Guides&lt;/strong&gt; - The main button on the Gowalla app is a section called &quot;Guides&quot;. It's beautifully designed (looks a bit like the &quot;popular&quot; section of Highlights) but is completely inappropriate to be the main feature of the app. It basically shows you the best places to go in a city based on check-ins and what Gowalla have featured (as well as other companies like Disney and National Geographic). The problems are twofold; 1) it's poorly implemented (the top spot to visit in Disney's Animal Kingdom was Spaceship Earth, the iconic ride from Epcot - not quite right) and 2) it's limited to 60 places. This means that in the UK, the only guide is for London. The next nearest is Amsterdam. How this is of any use to people day-to-day is beyond me. The key feature should have been stories until such a point that guides were auto-generated (like Highlights is) at which point it could have been more prominent.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are just 3 of the main criticisms I have but overall the whole product is just lousy. Whilst it's beautiful to look at, very little thought has gone into how the user will engage the product as highlighted by the way Guides is the largest button in the interface. I also got really frustrated with the way that bits of the UI would load in later (so the photos might appear and then a few seconds later text would appear). This is obviously to keep loading times down but there is no indicator of it happening so the UI is constantly moving leading to a jarring experience. From a technical point of view, it has obviously not undergone any external testing as it crashes a huge amount.&lt;/p&gt;

&lt;p&gt;Overall, the product felt like it had been rushed to get it out for TechCrunch Disrupt. Rather than pausing and releasing a top-rate product, they pushed out a half-built poorly thought out mess and they have suffered for it. Whilst there are many reviews hammering them for removing items (and not delivering on their promise of letting people export them in a &quot;really cool way&quot;), there are hundreds of 1 star reviews on iTunes from people hating the new update for the reasons above. I think the biggest problem is that they removed functionality without replacing it within anything better. Also, the changes weren't communicated to regular users. My mum, for example, loved using Gowalla v3 but when v4 came up she had no idea what had happened. She, like many users, doesn't read the Gowalla blog or see the updates on TechCrunch so had no idea that items were going or that they were going to fundamentally change direction.&lt;/p&gt;

&lt;p&gt;How could it have been done better? I had always thought that Gowalla would spin off into two kick-ass products; a game (based on items) and a check-in service (with stories as I described them). Instead, it cut off the bit it didn't like and released an updated check-in service that did less than it promised. It doesn't aid in the discovery of places and it doesn't aid in the telling of stories.&lt;/p&gt;

&lt;h3&gt;Facebook&lt;/h3&gt;

&lt;p&gt;After a torrent of negative feedback, suspicions grew that Gowalla would be shut down during November 2011. Many of their employees had started using Foursquare and it looked like several prominent members of &lt;a href=&quot;http://twitter.com/#!/etherbrian/status/137330108997443586&quot;&gt;staff had been sacked&lt;/a&gt;. To make matters worse, Gowalla v4.0.3 had mysteriously disappeared from the App Store without warning. When rumours emerged that Gowalla was &lt;a href=&quot;http://money.cnn.com/2011/11/30/technology/startup_acquisitions/&quot;&gt;looking for a buyer&lt;/a&gt; (and had been brushed off by Google and Groupon) I thought that they would definitely be disappearing. Who would want to buy a company that had made such a monumental cockup and was haemorrhaging users?&lt;/p&gt;

&lt;p&gt;Ah, Facebook.&lt;/p&gt;

&lt;p&gt;Using a tactic referred to as &quot;aqhiring&quot;, it would appear that Facebook is &lt;a href=&quot;http://money.cnn.com/2011/12/02/technology/gowalla_facebook/index.htm&quot;&gt;buying Gowalla out&lt;/a&gt; and taking some of the employees to Facebook HQ to work on a new timeline feature. This most likely means that Gowalla will close down (and I'd imagine PackRat with it) as all the staff are reassigned to Facebook projects - I think it highly unlikely that Gowalla will survive as a Facebook product or keep going alone.&lt;/p&gt;

&lt;p&gt;Many people are now worried about data from Gowalla being moved over to Facebook. We'll have to wait and see if this actually happens but in the mean time a large number of people are deleting their Gowalla accounts to keep their privacy safe. I'm now officially done with Gowalla and today I did the same.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://files.bendodson.com/old-weblog/2011/12/Screen-Shot-2011-12-03-at-12.54.54.png&quot; alt=&quot;Screen Shot 2011 12 03 at 12 54 54&quot; title=&quot;Screen Shot 2011-12-03 at 12.54.54.png&quot; border=&quot;0&quot; /&gt;&lt;/p&gt;

&lt;h3&gt;In closing...&lt;/h3&gt;

&lt;p&gt;Gowalla has been a big part of my life for the past couple of years. I've made some great friends and I've had some truly great experiences. Discovering new places when looking for items was a highlight and I'm proud of the apps and features I was able to build on top of Gowalla. However, there have also been some truly horrible times both with Gowalla itself and some of the people that have played it. Whilst I wish them all the best, I honestly don't think Gowalla is going to survive in it's current form and I don't think that it should.&lt;/p&gt;

&lt;p&gt;To finish off, I'd like to thank everybody who made Gowalla a great experience for me from the people I've met playing to those that supported the apps I built. I'd also like to personally thank 3 people at Gowalla who helped me out when they could and to whom I'm very grateful; Jon Carroll, Adam McManus, and Andrew Dupont. I hope they get what they want from the transition that is about to happen.&lt;/p&gt;

&lt;p&gt;I'd also like to thank whoever at Gowalla designed this icon for my &quot;Ben Dodson Apps&quot; spot...&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://files.bendodson.com/old-weblog/2011/12/422-0a295dbebaf7fff8a7590632a228bc08-200.png&quot; alt=&quot;422 0a295dbebaf7fff8a7590632a228bc08 200&quot; title=&quot;422-0a295dbebaf7fff8a7590632a228bc08-200.png&quot; border=&quot;0&quot; width=&quot;200&quot; height=&quot;200&quot; style=&quot;border: 0&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It was never sent to me (I found it on their server - don't ask) and they never used it on my spot page (saying they don't do portraits for spot icons) but I've always really liked it over the one that was &lt;a href=&quot;http://gowalla.com/spots/7127793&quot;&gt;eventually used&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>The API behind Gowalla v4</title>
      <link>http://bendodson.com/weblog/2011/10/24/the-api-behind-gowalla-v4/index.html</link>
      <pubDate>Mon, 24 Oct 2011 00:00:00 +0100</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2011/10/24/the-api-behind-gowalla-v4/index.html</guid>
      <description>&lt;p&gt;A few weeks ago, Gowalla released version 4.0 of their app to an overwhelmingly negative response. I myself will be posting a review soon but in this quick post I wanted to share a few tips on how to use the new API that is powering the app as an official API is apparently not coming until Q1 2012.   
In a post entitled &quot;&lt;a href=&quot;http://groups.google.com/group/gowalla-dev/browse_thread/thread/880cc4a5de51e016&quot;&gt;Where the Gowalla API is going&lt;/a&gt;&quot; on the official Gowalla Developers Group, it was revealed that most bits of the existing API &quot;should be working&quot; but a version 2 of the API would be coming in 2012 that enables developers to leverage the new features such as stories, lists, likes, guides, and so on. Unfortunately, several parts of the existing API broke on launch of the new app (including OAuth integration which took out nearly all 3rd party apps, trips, and an advanced search API) and some parts were completely removed (such as PubSubhubbub, one of the key things that actually made the Gowalla API a compelling thing to use). I have a number of apps that use the old API and were affected in small ways (I learnt long ago never to make direct calls to the Gowalla API) but there were a few things like trips that I needed direct access to more immediately. So, I spent a few minutes digging into the new Gowalla app and found the new connection details that are required to talk to the new API.&lt;/p&gt;

&lt;p&gt;It's actually fairly easy! Firstly, instead of connecting to http://api.gowalla.com/ change the URL to &lt;strong&gt;https://api9000.gowalla.com/&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Next, there are 4 headers you have to send with every request. 2 of them, &quot;&lt;code&gt;Accept: application/json&lt;/code&gt;&quot; and &quot;&lt;code&gt;X-Gowalla-API-Key&lt;/code&gt;&quot;, were required for the old API but Gowalla have also added an &quot;&lt;code&gt;X-Gowalla-Bruce-Lee&lt;/code&gt;&quot; header (with a password so they know it's the Gowalla app using the API) and an &quot;&lt;code&gt;X-Gowalla-API-Version&lt;/code&gt;&quot; header which seems to suggest they are taking my advice of 18 months ago and versioning the API rather than just breaking existing apps. So, the full headers you need to send are:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;text&quot;&gt;Accept: application/json
X-Gowalla-API-Key: YOUR-API-KEY-HERE
X-Gowalla-Bruce-Lee: l33tkuned0
X-Gowalla-API-Version: 2
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;If you do that, you should be able to call an API endpoint such as users/bendodson where you'll find a load of new data that isn't in the normal API. That should also give you a good idea of the naming conventions of new endpoints (e.g. /lists rather than /trips). In all of my testing, existing features such as OAuth have worked fine.&lt;/p&gt;

&lt;p&gt;As a final example, the trips detail API is still broken on the current API (despite this being &quot;looked into&quot; 2 weeks ago). If you were to request &lt;code&gt;trips/168&lt;/code&gt; you'll get a 404 not found error. This is one of the many broken API calls that is affecting apps that are currently out in the wild. However, if you change your code to use the new URL and the new headers, you can request &lt;code&gt;lists/168&lt;/code&gt; to get full details of the trip you are after. Some of the keys will have changed name but it should be enough to get your app at least up and running.&lt;/p&gt;

&lt;p&gt;Obviously, you use all of the above at your own risk. Gowalla are unlikely to break anything immediately as any changes to the headers, endpoints, or keys will break their app. However, there will probably be changes as and when they release new versions of their apps.&lt;/p&gt;

&lt;p&gt;I have been very vocal on both &lt;a href=&quot;http://bendodson.com/weblog/2011/05/12/one-year-on-further-thoughts-on-the-gowalla-api/&quot;&gt;the good&lt;/a&gt; and &lt;a href=&quot;http://techcrunch.com/2010/05/12/gowalla-api-problems/&quot;&gt;the bad&lt;/a&gt; points of the Gowalla API in the past. There had been a real effort to alert 3rd party developers to changes in recent months but the new v4 app fundamentally broke important parts of the API (particularly OAuth login) and fixes were slow coming or have still yet to come with regards to the /trips endpoint. Putting an API out for the new app in Q1 of next year is a very long time to wait for something that really should have launched alongside or shortly after the new app particularly as the API does already exist. In short, Gowalla really have a long way to improve in their dealings with 3rd party developers. Personally, I'm moving my apps away from Gowalla and starting to use other services but I'll be posting more about that soon.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update [25th Oct 2011]:&lt;/strong&gt; Andrew Dupont responded to this article on the Gowalla Devs Group with:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;At any rate, we've fixed the trips API. Let me know if anything's still out of order.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Turns out Gowalla will fix things if you complain enough...&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Highlights v1.1 - Gowalla Trips, Last.fm Events, and Translations</title>
      <link>http://bendodson.com/weblog/2011/08/20/highlights-v1-1-gowalla-trips-last-fm-events-and-translations/index.html</link>
      <pubDate>Sat, 20 Aug 2011 00:00:00 +0100</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2011/08/20/highlights-v1-1-gowalla-trips-last-fm-events-and-translations/index.html</guid>
      <description>&lt;p&gt;If you've been following my &lt;a href=&quot;http://bendodson.com/weblog/&quot;&gt;blog&lt;/a&gt; or &lt;a href=&quot;http://twitter.com/bendodson&quot;&gt;twitter feed&lt;/a&gt;, you'll know about my iOS app &quot;&lt;a href=&quot;http://itunes.apple.com/us/app/highlights/id428756645?mt=8&quot;&gt;Highlights&lt;/a&gt;&quot; that lets you find interesting places around the world based on data from Gowalla and Foursquare. The app is doing phenomenally well in the UK becoming the #1 paid iPad travel app and reaching the top 20 of all paid iPad apps! I'm happy to announce that version 1.1 is now available as a free upgrade on the App Store and has a number of great new features.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Last.fm Events&lt;/strong&gt; - When looking at a theatre, park, or music venue, Highlights will show you the upcoming events and let you tap through to Last.fm to find out more and list yourself as attending.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gowalla Trips&lt;/strong&gt; - Each location can now show you every trip it has been added to on Gowalla. This isn't just the featured trips, but every single trip ever created. When you're looking at a trip, you can choose to add it to your planner with one tap making it really easy to plan a day out in a new town. Additionally, you can find trips near you via the planner and also search for trips around the world.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;View plans on a map&lt;/strong&gt; - In the previous version, you could see your plans on a map if you were running the app on an iPad. With version 1.1 we've bought this feature to the iPhone as well. Just look at any of your plans and you'll find a new toggle to switch between list and map.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Review Translation&lt;/strong&gt; - When browsing reviews, you may come across some that aren't in English. Just double-tap the review to have it automatically translated!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Faster Navigation&lt;/strong&gt; - If you find yourself jumping from location to location via the trips or nearby spots features, you may find you have to go back through lots screens to get back to the first location you were looking at. You can now just hold down your finger on a back button anywhere in the app to be taken back to the first screen.&lt;/li&gt; 
&lt;li&gt;&lt;strong&gt;Report a Problem&lt;/strong&gt; - Sometimes mistakes are made and old or incorrect data is pulled down through Foursquare or Gowalla. You can now tap a &quot;Report a Problem&quot; button on any location page to have it automatically flagged for us to fix it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In addition, there are various speed improvements and bug fixes (including an issue with the iPad app not showing all of the screens in certain situations) - there is also the option to send a crash report anonymously in the unlikely event that the app crashes.&lt;/p&gt;
&lt;p&gt;Thanks to everybody who has downloaded the app so far. If you enjoy this update, please leave a review on iTunes. If you run into any problems, please email me via help@highlightsapp.com before leaving a negative review as I'm unable to respond to reviews on iTunes.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>The inside story on powering Highlights</title>
      <link>http://bendodson.com/weblog/2011/07/25/the-inside-story-on-powering-highlights/index.html</link>
      <pubDate>Mon, 25 Jul 2011 00:00:00 +0100</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2011/07/25/the-inside-story-on-powering-highlights/index.html</guid>
      <description>&lt;p&gt;Last week I released my latest iOS app, &quot;&lt;a href=&quot;http://itunes.apple.com/us/app/highlights/id428756645?mt=8&quot;&gt;Highlights&lt;/a&gt;&quot;, which is designed to show you the best places in your area or anywhere in the world based on crowd sourced data from Gowalla and Foursquare. In this article, I want to explain how the recommendations engine works and also how I managed to solve some of the biggest challenges along the way.&lt;/p&gt;

&lt;h2&gt;Search by recommendations&lt;/h2&gt;

&lt;p&gt;During SXSW 2011, I made the decision to move away from doing development on apps based around Gowalla items and instead to apps based on travelling and discovery (mainly due to an &lt;a href=&quot;http://www.slideshare.net/firewheel/where-are-we-going-sxsw-2011&quot;&gt;excellent talk by Gowalla CEO Josh Williams&lt;/a&gt; on the subject of check-in apps). It was in Austin that I had the idea for Highlights as I was constantly trying to find the best places to eat, drink, or visit as a tourist and finding it hard to choose amongst the variety of locations on offer. I initially decided to do some prototyping based on the Gowalla API to see if I could come up with a way to sort places based on popularity but the API only lets you sort by creation date or number of checkins. In my opinion, the number of people at a place does not form a recommendation - more people probably go to McDonald's than the local burger joint yet that does not necessarily make it a better choice for dinner. What I needed was a way to filter based on a recently added Gowalla feature; Highlights (from which the name of the app descends). At the time there was no API call to do this (e.g. searching for the &quot;steak&quot; highlight in Austin) so I &lt;a href=&quot;http://groups.google.com/group/gowalla-dev/browse_thread/thread/a67d3106e4a95976&quot;&gt;posted a request on the Gowalla developer boards&lt;/a&gt; - The feature was added as part of the &quot;&lt;a href=&quot;http://groups.google.com/group/gowalla-dev/browse_thread/thread/c7fcf5d9701b088f/e67f9bbc28244a8e?lnk=gst&amp;q=advanced#e67f9bbc28244a8e&quot;&gt;advanced spot search API&lt;/a&gt;&quot; by Andrew Dupont just under a month later.&lt;/p&gt;

&lt;p&gt;Whilst toying with the idea of searching by Highlights, I realised that there was a big problem with the way I was going to approach recommendations - whilst Highlights were a definitive recommendation, there just weren't enough of them being created to power an app of the scale I imagined. It would work great in places where Gowalla use is pervasive (e.g. Austin) but even in a capital city like London searching by Highlights just doesn't return enough places. What I needed was a way to give a location a score based on a number of criteria such as number of users, highlights, comments, photos, artwork, etc - basically all the data that was available for a spot. The only way that was going to happen was with a huge API change from Gowalla or if I could somehow get a hold of all the data they had...&lt;/p&gt;

&lt;h2&gt;PubSubHubbub to the rescue&lt;/h2&gt;

&lt;p&gt;Back in 2010, &lt;a href=&quot;http://hub.gowalla.com/&quot;&gt;Gowalla launched a PubSubHubbub hub&lt;/a&gt; powered by &lt;a href=&quot;http://superfeedr.com/&quot;&gt;Superfeedr&lt;/a&gt; that allowed for realtime notifications of checkins either by user or spot. Whereas before you'd have to subscribe to an RSS feed and check it every so often for updates, PubSubHubbub allows for you to subscribe to that feed and have them push the data to you as soon as an update is available. It's very similar to the difference between checking mail on your iPhone manually or having it pushed to you automatically.&lt;/p&gt;

&lt;p&gt;At the time, I was working on some funky Gowalla item stuff and so I wanted to use realtime notifications so that I could track items around the world. The biggest issue was that I'd need to manually subscribe to each feed which was tricky as there were around 3 million to follow at the time (it would have taken a month for all the subscriptions to go through if I looped through them one at a time and that doesn't include the work to follow new spots as they're created). I had been chatting to &lt;a href=&quot;http://twitter.com/#!/julien51&quot;&gt;Julien Genestoux&lt;/a&gt; (CEO and Founder of Superfeedr)  about getting access to the &lt;a href=&quot;http://superfeedr.com/documentation#track&quot;&gt;Track API&lt;/a&gt; which gets around that problem by letting you subscribe to feeds in a much more powerful way (e.g. by keyword, location, or hub). With access to Track, I'd be able to subscribe to every notification, in realtime, that Gowalla pushed out.&lt;/p&gt;

&lt;p&gt;It was whilst chatting to Julien after SXSW that I realised that PubSubHubbub could solve my problems. By using the Track API, my server would be hit with data every time somebody checked in anywhere in the world with Gowalla. I could save that information each time and basically build up my own version of Gowalla's database that I could search with a custom ranking engine. With the theory solved, it was time to get practical and put everything to the test.&lt;/p&gt;

&lt;h2&gt;The Walrus and The Carpenter&lt;/h2&gt;

&lt;p&gt;After a few nights I was able to put my first test version together codenamed &quot;The Walrus&quot; (purely because it uses feeds and I like the way the oysters say &quot;feed&quot; during the story of &quot;&lt;a href=&quot;http://www.youtube.com/watch?v=Nql1_RKwQt0&quot;&gt;The Walrus and The Carpenter&lt;/a&gt;&quot; in Alice in Wonderland). Its task would be to get the spot information from the data Superfeedr were sending and work out if it was a spot I wanted to keep - I automatically remove a lot of nonsense spots (e.g. Airport Gates, Houses, McDonalds) so there was no sense saving what wasn't needed. Only a certain amount of data is sent through such as the name and location of the spot and some of its imagery, but I would need a lot more than that so when a spot was saved to the database for the first time, a note was placed on it to tell me to go and get more information.&lt;/p&gt;

&lt;p&gt;At the same time as The Walrus was churning through the data was being sent, a script on the server (codenamed &quot;The Carpenter&quot;) would run once a minute and look through the database for any spots with missing data. When it found one, it would go to the Gowalla API and the Foursquare API and get all of the data it needed and then update its record before marking it as suitable for use within the Highlights app.&lt;/p&gt;

&lt;p&gt;It took a few revisions (and a massive server upgrade) until everything was running smoothly but it enabled me to process the thousands of checkins that occur every day in realtime. With thousands of checkins coming in every day, I was ready to write an algorithm that would let me search spots based on popularity.&lt;/p&gt;

&lt;h2&gt;Search by recommendations: Attempt 2&lt;/h2&gt;

&lt;p&gt;Whilst I originally started by ranking based on checkins and highlights, I was able to do much more than that with the huge dataset I'd amassed. Every spot is now searched based on a huge range of standard criteria (i.e. number of photos taken at a place) as well as time sensitive information that I have such as frequency between checkins and times of day. This means that a new spot in the area can still be ranked higher than an old place with a huge number of visitors as I can see that it is gaining traction faster and will overtake it at some point in the future.&lt;/p&gt;

&lt;p&gt;It wasn't until June 2011 when the first version of the app was in beta and I was visiting my parents in Devon that I realised a second big problem. Places with few active Gowalla or Foursquare users were showing very few spots. This wasn't because of a lack of places or data, but just because nobody had checked in anywhere in the last month meant that no alert for me to get the spot data had been sent to &quot;The Carpenter&quot; script. Essentially, whilst my dataset was vast and comprised of millions of active spots, it wasn't showing those niche places (which are often better) that don't get checked into as often. Of course, these places would get added the next time someone checked in but I didn't want to have gaps when the app launched.&lt;/p&gt;

&lt;p&gt;To fix this oversight, if the app finds less than 50 results in the area, it will go and do a manual check with Gowalla and get a basic listing of spots with the rubbish ones removed by the same filter &quot;The Walrus&quot; uses. It adds these to the browse page sorted by checkin but it crucially adds them as &quot;pending&quot; to my database so that &quot;The Carpenter&quot; can check them and rank them for next time. Basically, every time you browse an area, the app learns!&lt;/p&gt;

&lt;h2&gt;Reviews and Photos&lt;/h2&gt;

&lt;p&gt;Rather than just listing places, I wanted to show more about them when you went through to a detail page. I was able to show a map, address, telephone numbers, and various other bits but the two key areas of information come from Reviews and Photos. With Reviews, a call is made to both the Gowalla and Foursquare APIs in order to get Highlights and Tips from each service and merge them together with the most recent shown first. This gives an excellent and balanced overview of a place that I think works really well. I wanted to add Yelp recommendations as well but unfortunately their API is very poor for matching places or for pulling out recommendations (it limits you to 3 teasers) - I hope to add them in future if their API improves. With Photos, a similar system was used but this time it pulls images from Gowalla, Foursquare, and Flickr thanks to their geolocation API. This again adds a brilliantly balanced view which should always return some results.&lt;/p&gt;


&lt;h2&gt;The Future&lt;/h2&gt;

&lt;p&gt;My database currently has over 1 million locations in hundreds of countries with over 7 million checkins recorded, yet this increases every second of the day as people check-in around the world as well as browsing with the Highlights app. I'm constantly tinkering with the algorithm to make sure it gives the best results as well as finding ways to remove duplicate spots or rogue locations but version 1.1 of the app will make it possible to flag up any issues so they can be cleared up immediately.&lt;/p&gt;

&lt;p&gt;I wrote Highlights out of a desire to find the best places and I am its biggest user as well as its creator - it has helped me find some great bars as well as finding a dinosaur-themed crazy golf course less than 5km from my house that I knew nothing about! The unique way in which it finds and sorts places means it should be able to find the best places anywhere in the world. In short, I'm confident it will help you whether you are finding places to eat on holiday or are just planning a pub-crawl at university. Give it a try and &lt;a href=&quot;http://bendodson.com/contact&quot;&gt;let me know&lt;/a&gt; how you get on with it.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Review: GeoWiz</title>
      <link>http://bendodson.com/weblog/2011/07/10/review-geowiz/index.html</link>
      <pubDate>Sun, 10 Jul 2011 00:00:00 +0100</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2011/07/10/review-geowiz/index.html</guid>
      <description>&lt;p&gt;One of the things that amazes me about the iPhone is the way in which it can be used in so many different ways thanks to the power of apps. I'm always interested to see new uses of the technology and so was particularly keen to take a look at GeoWiz which is a new app in the area of teaching. GeoWiz is an app aimed at children to help them make Geography &quot;fascinating and interesting&quot;. It originally started as a board game elementary school project in California before becoming a &quot;social mission software solution&quot; app of which 50% of the apps selling price goes towards supporting schools. With some interesting features such as Game Center integration and a points system, this should be an interesting app in the new medium of digital teaching.&lt;/p&gt;
&lt;p&gt;So what is it like?&lt;/p&gt;
&lt;p&gt;When I was growing up, I had a subscription to an excellent magazine called &quot;&lt;a href=&quot;http://waldo.wikia.com/wiki/Wally's_World!&quot;&gt;Wally's World&lt;/a&gt;&quot;. It was part of the &quot;Where's Wally&quot; series and each issue looked at a different country and details such as culture, flags, animals, etc. It was a great way of learning as it was fun, had a few games (mainly word searches), but above all it was easily digestible knowledge. In many ways, I was hoping GeoWiz was going to be something similar with fun games and lots to learn. Unfortunately, that is not the case.&lt;/p&gt;

&lt;img src=&quot;http://files.bendodson.com/old-weblog/2011/07/IMG_0017.png&quot; alt=&quot;GeoWiz&quot; title=&quot;IMG_0017.PNG&quot; border=&quot;0&quot; width=&quot;400&quot; height=&quot;600&quot; /&gt;

&lt;p&gt;Firstly, lets take a look at what GeoWiz offers. The general premise is a number of games based around memory retention of key facts around Geography, namely continents, countries, capitals, and flags. These games can either be the standard &quot;matching certain objects under revolving tiles&quot; genre or tapping on a country to match it to the capital listed at the bottom of the page.&lt;/p&gt;

&lt;img src=&quot;http://files.bendodson.com/old-weblog/2011/07/IMG_0019.png&quot; alt=&quot;Continents Memory&quot; title=&quot;IMG_0019.PNG&quot; border=&quot;0&quot; width=&quot;400&quot; height=&quot;600&quot; /&gt;

&lt;img src=&quot;http://files.bendodson.com/old-weblog/2011/07/IMG_0022.png&quot; alt=&quot;Click on the country whose capital is named at the bottom.&quot; title=&quot;IMG_0022.PNG&quot; border=&quot;0&quot; width=&quot;400&quot; height=&quot;600&quot; /&gt;

&lt;p&gt;The tile game is pretty good but doesn't really help you learn anything (after all, you're matching shapes as quickly as possible, not taking them in). The flag game, on the other hand, is incredible difficult. I had no idea which country had &quot;Brazzaville&quot; as a capital so I just tapped each of the flags as quickly as possible until I found which one it was. There aren't any point deductions for getting answers wrong so you can win the game fairly quickly just by tapping all over the place. That's when I found an interesting bug; all of the answers are behind tiles in reverse order. If I tap on the bottom right-hand corner and then move my way right to left up the board, then that appears to be the solution almost every time as demonstrated by the screenshot below showing a perfect score in 3 seconds.&lt;/p&gt;

&lt;img src=&quot;http://files.bendodson.com/old-weblog/2011/07/IMG_0023.png&quot; alt=&quot;Cheating on GeoWiz&quot; title=&quot;IMG_0023.PNG&quot; border=&quot;0&quot; width=&quot;400&quot; height=&quot;600&quot; /&gt;

&lt;p&gt;So much for the gaming, how do you go about learning? Rather than details on each location in the style of an encyclopaedia, countries are just listed out with their flag, name, and capital. There are 4 screens yet each of them are the same just with a different sort order.&lt;/p&gt;

&lt;img src=&quot;http://files.bendodson.com/old-weblog/2011/07/IMG_0029.png&quot; alt=&quot;Learning in GeoWiz&quot; title=&quot;IMG_0029.PNG&quot; border=&quot;0&quot; width=&quot;400&quot; height=&quot;600&quot; /&gt;

&lt;p&gt;Tapping on a country gives you the same information but a bit larger. However, there are links to other services such as Wikipedia and NatGeo. Unfortunately, these are just inbuilt Safari windows that show no indication of loading and lack the controls of the native browser. It would probably have been better to have external links open in Safari or even to have an &quot;Open in Safari&quot; control for those that want to bookmark or have more control over the browsing experience.&lt;/p&gt;

&lt;img src=&quot;http://files.bendodson.com/old-weblog/2011/07/IMG_0032.png&quot; alt=&quot;Looking at a country&quot; title=&quot;IMG_0032.PNG&quot; border=&quot;0&quot; width=&quot;400&quot; height=&quot;600&quot; /&gt;

&lt;p&gt;I was willing to put the issues above aside as the app has some interesting credentials in terms of it's creation and how it is supposed to be used. For example, it contains OpenFeint and Game Center integration to keep children interested in progressing and competing with their friends. I appreciate the idea of adding integration for gaming networks and it's one of the things that persuaded me to review the app, but the implementation is lacking. There are only 3 achievements and they are all trivial to unlock, especially for the Angry Birds generation. Also, the issues with gameplay I mentioned (e.g. easy to cheat) will make a mockery of the leaderboards very quickly.&lt;/p&gt;

&lt;img src=&quot;http://files.bendodson.com/old-weblog/2011/07/IMG_0039.png&quot; alt=&quot;GeoWiz on Game Center&quot; title=&quot;IMG_0039.PNG&quot; border=&quot;0&quot; width=&quot;400&quot; height=&quot;600&quot; /&gt;

&lt;p&gt;Another area of interest is to use points earned in the games to get pocket money. Again though, the feature is let down by lack of basic UI work. The feature is hard to find and it isn't immediately obvious how it works or how you set it up - I only knew what it was due to a short description on the iTunes app page. I also have an issue with tying revision into pocket money as this smacks of bad parenting to me. Not being a Father, I can't really comment but I wouldn't want my children coming to me with an app and saying &quot;I got 150 points so you owe me £1&quot; especially when it is so easy to game the system. It seems to me that both parent and child would be better served by reading through a child's atlas together and keeping rewards for when they've actually passed a test or school or gained a good grade, not for when they've done a bit of revision.&lt;/p&gt;

&lt;img src=&quot;http://files.bendodson.com/old-weblog/2011/07/IMG_0035.png&quot; alt=&quot;Points in GeoWiz&quot; title=&quot;IMG_0035.PNG&quot; border=&quot;0&quot; width=&quot;400&quot; height=&quot;600&quot; /&gt;

&lt;img src=&quot;http://files.bendodson.com/old-weblog/2011/07/IMG_0036.png&quot; alt=&quot;Account Summary on GeoWiz&quot; title=&quot;IMG_0036.PNG&quot; border=&quot;0&quot; width=&quot;400&quot; height=&quot;600&quot; /&gt;

&lt;p&gt;The final area in the app that interested me is the promise that 50% of the app sale price goes to your child's school. It turns out that you need to find the button to do this (which isn't obvious) and then choose from a prefilled list of US schools. Whilst I appreciate the intention, it seems a little pointless to me. I'd rather use the 50% (which is £6 or $10) on the pocket money reward or actually giving it directly to my school especially as I'm based in the UK. Also, it would make more sense in my mind for the &quot;choose your school&quot; screen to happen automatically the first time you open the app. That ensures that everyone who uses the app gives a donation and also makes much more sense from a users perspective.&lt;/p&gt;

&lt;img src=&quot;http://files.bendodson.com/old-weblog/2011/07/IMG_0037.png&quot; alt=&quot;GeoWiz Donation&quot; title=&quot;IMG_0037.PNG&quot; border=&quot;0&quot; width=&quot;400&quot; height=&quot;600&quot; /&gt;

&lt;p&gt;On the whole, I'm not terribly impressed with GeoWiz. It has good intentions but the app is severely lacking in polish or finesse. From the app side of things, it doesn't support the iPhone 4 Retina Display so looks awful on any new devices. This is unacceptable in my mind as adding retina support is trivial, especially for a new app. Aside from technical implementation, there is a distinct lack of structure to the application. The main menu can only be accessed when you first open the app and you can't go back unless you force quit from the multi-tasking tray. Whilst all of the menu options are available on every page, it's the fact that you can't go back to a page you've previously seen that doesn't sit well. Add to this the lack of the regular status bar so you can't see battery life, network activity, or the time (all important things), poorly laid out navigation controls, and lack of instruction on complex features like points rewards and I can see both children and parents getting frustrated quickly. Yes the games are fun (for a time) but the poor build quality means they are easily cheated.&lt;/p&gt;

&lt;p&gt;In short, your child is unlikely to gain much from this app. Geography is not simply knowing what the capital of the Congo is and identifying it's flag. It's about culture, the uniqueness of a place, and what we can learn from it. If I had £11.99/$19.99 to spend on teaching my child geography, I'd invest in either a child edition atlas or encyclopaedia and spend some quality time with them telling them about the world. I'm hopeful that one day someone will create an app similar to the &quot;Wally's World&quot; magazines of my youth as there is real potential for child and parent to learn together (especially with the iPad). However, GeoWiz is not it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; I was given a free copy of this application to review. I tested it on an iPhone 4 running iOS 5.0 beta 2. If you have an app for iOS that you would like me to review, please &lt;a href=&quot;http://bendodson.com/contact/&quot;&gt;contact me&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Does iOS 5 finally allow retina display iPhone apps to run unscaled on the iPad?</title>
      <link>http://bendodson.com/weblog/2011/06/10/does-ios-5-finally-allow-retina-display-iphone-apps-to-run-unscaled-on-the-ipad/index.html</link>
      <pubDate>Fri, 10 Jun 2011 00:00:00 +0100</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2011/06/10/does-ios-5-finally-allow-retina-display-iphone-apps-to-run-unscaled-on-the-ipad/index.html</guid>
      <description>&lt;p&gt;When the iPad was first launched, one of its original touted features was the ability to run the majority of apps available in the app store (the only ones that wouldn't work were those requiring a camera but they should now work on the iPad 2). This was a great boon for Apple as they were able to claim that there were hundreds of thousands of apps available at launch but the implementation kinda sucked. Unless the app was a game (which tends to scale quite nicely if built using OpenGL), you'd end up with a pixelly mess. With the launch of the iPhone 4 and Retina Display level apps, I had always assumed that the iPad would get an update to allow it to run Retina Display iPhone apps at their full 960x640 resolution but nothing was forthcoming. So, has this been fixed in iOS 5?&lt;/p&gt;
&lt;p&gt;In a word, no, nothing has changed at all (as of iOS 5 Beta 1 at least).&lt;/p&gt;
&lt;p&gt;I had been meaning to write a post about the issue of app scaling a few months ago but what finally pushed me into action (aside from the iOS 5 beta) was an update for one of my favourite games, Peggle, which finally bring Retina Display graphics to the iPhone. It was then that I thought that perhaps Apple had finally gotten Retina Display apps working on the iPad but unfortunately it looks like that isn't going to be happening. This is a great shame as there are many brilliant iPhone games that have been optimised for the iPhone and would work brilliantly on the iPad, but the developers just haven't bothered to update them. Peggle is a good case in point so I'm going to use it as a demonstration with some screenshots I've knocked up to illustrate my point (note that you can click on the images below to see the real size versions).&lt;/p&gt;
&lt;p&gt;First off, here is Peggle running on the iPhone 4 at full Retina Display resolution:&lt;/p&gt;
&lt;a href=&quot;http://files.bendodson.com/old-weblog/2011/06/IPHONE-RETINA-full.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://files.bendodson.com/old-weblog/2011/06/IPHONE-RETINA.jpg&quot; alt=&quot;iPhone 4 with Peggle on a Retina Display&quot; title=&quot;IPHONE-RETINA.jpg&quot; border=&quot;0&quot; width=&quot;600&quot; height=&quot;322&quot; /&gt;&lt;/a&gt;

&lt;p&gt;Looks pretty nice! Now let's take a look at it on the iPad 2:&lt;/p&gt;

&lt;a href=&quot;http://files.bendodson.com/old-weblog/2011/06/IPAD-NORMAL-1x-full.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://files.bendodson.com/old-weblog/2011/06/IPAD-NORMAL-1x.jpg&quot; alt=&quot;iPad running Peggle at 1x resolution&quot; title=&quot;IPAD-NORMAL-1x.jpg&quot; border=&quot;0&quot; width=&quot;600&quot; height=&quot;420&quot; /&gt;&lt;/a&gt;

&lt;p&gt;That is running at 480x320px black boxed in the middle of the screen. Now this doesn't look too bad as it would look exactly as the app would on a handset without a Retina Display (that is to say that there would be no pixelation at this size). Obviously it's awful from a usability point of view (why play a game using less than 25% of your screen?) but the real problem comes when we tap 2x to scale it up to almost full size on the iPad:&lt;/p&gt;

&lt;a href=&quot;http://files.bendodson.com/old-weblog/2011/06/IPAD-NORMAL-2x-full.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://files.bendodson.com/old-weblog/2011/06/IPAD-NORMAL-2x.jpg&quot; alt=&quot;iPad running Peggle at 2x resolution&quot; title=&quot;IPAD-NORMAL-2x.jpg&quot; border=&quot;0&quot; width=&quot;600&quot; height=&quot;420&quot; /&gt;&lt;/a&gt;

&lt;p&gt;(it probably doesn't look too bad in the thumbnail but click to see it at it's native size and you'll see the issue).&lt;/p&gt;

&lt;p&gt;The problem is that rather than using the 960x640px assets that are available in the app (as they are used on the iPhone 4), the iPad instead just doubles up the 480x320px version resulting in a fairly fuzzy mess. Seeing as the assets exist in the app already, it should look something more like this:&lt;/p&gt;

&lt;a href=&quot;http://files.bendodson.com/old-weblog/2011/06/IPAD-WITH-RETINA-full.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://files.bendodson.com/old-weblog/2011/06/IPAD-WITH-RETINA.jpg&quot; alt=&quot;Mockup showing an iPad running Peggle at iPhone 4 Retina Display resolution&quot; title=&quot;IPAD-WITH-RETINA.jpg&quot; border=&quot;0&quot; width=&quot;600&quot; height=&quot;420&quot; /&gt;&lt;/a&gt;

&lt;p&gt;The iPad (both the original and the iPad 2) are more than powerful enough to cope with it so it can't be an issue of hardware specs. The only technical problem I could see would be what happens when you scale between 1x and 2x modes (as it would be difficult to have it dynamically switch between the two resolutions). However, my solution would be that if you are running an app updated to Retina Display quality, it should always run at the full size removing the need for the button.&lt;/p&gt;

&lt;p&gt;Overall, I think the real problem is that Apple don't want iPhone apps to look good on the iPad. If games like Peggle worked on the iPad at pretty much native resolution, then there would be no incentive for iOS developers to develop solely for the iPad. This isn't a problem so much for games (aside from losing revenue for games that have &quot;HD&quot; added on the end... I'm looking at you Angry Birds) but it might be for apps like Facebook (not that they've bothered making an iPad app anyway). If normal utilities worked at double-resolution, the main argument for developing apps on the iPad would be for UI reasons, and not all iOS developers care about that (though they should).&lt;/p&gt;

&lt;p&gt;Looks like the iPad is forever going to be limited to running iPhone apps at a scaled resolution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update - 22nd June 2011:&lt;/strong&gt; Ben Wetzel emailed me to let me know about &lt;a href=&quot;http://rpetri.ch/cydia/retinapad/&quot;&gt;RetinaPad&lt;/a&gt;, an app for jailbroken iPads that allows you to run Retina Display iPhone apps at full resolution - it will also scale up common components and text for non-Retina Display apps.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>AirPlay Mirroring, TV Out, and the Apple TV as a games console</title>
      <link>http://bendodson.com/weblog/2011/06/09/airplay-mirroring-tv-out-and-the-apple-tv-as-a-games-console/index.html</link>
      <pubDate>Thu, 09 Jun 2011 00:00:00 +0100</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2011/06/09/airplay-mirroring-tv-out-and-the-apple-tv-as-a-games-console/index.html</guid>
      <description>&lt;p&gt;In my &lt;a href=&quot;http://bendodson.com/weblog/2011/06/08/wwdc-2011-keynote-predictions-vs-reality/&quot;&gt;article yesterday following up on the WWDC keynote&lt;/a&gt;, I mentioned that I'd be looking more deeply at the AirPlay Mirroring mode in iOS 5 as it holds a number of interesting surprises. Whilst the ability to mirror the content of the iPad 2 wirelessly to the Apple TV is still impressive, the fact that developers can utilise the existing TV-Out functionality to use the Apple TV as a secondary screen is much more exciting.&lt;/p&gt;

&lt;iframe src=&quot;http://player.vimeo.com/video/24892773&quot; width=&quot;600&quot; height=&quot;330&quot; frameborder=&quot;0&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;Before I look into that, let me go over a brief introduction of what AirPlay Mirroring is and how it works. At the moment, it is only supported on the iPad 2 due to it's superior CPU (the A5 chip which is &lt;a href=&quot;http://www.macrumors.com/2011/06/09/ios-5-opens-door-to-true-1080p-apple-tv/&quot;&gt;widely rumoured&lt;/a&gt; to be making an appearance in the next iPhone and next Apple TV allowing for full 1080p resolution... at last). To enable it, all you need to do is go to the usual AirPlay icon hidden in the multi-tasking tray and you'll find a new option that allows you to enable mirroring mode.&lt;/p&gt;

&lt;img src=&quot;http://files.bendodson.com/old-weblog/2011/06/IMG_0002.png&quot; alt=&quot;AirPlay Mirroring on iOS 5&quot; title=&quot;IMG_0002.PNG&quot; border=&quot;0&quot; width=&quot;600&quot; height=&quot;450&quot; /&gt;

&lt;p&gt;As soon as this is enabled, anything that is displayed on the iPad is instantly displayed on the Apple TV as well. If you rotate the device, the screen rotates on your television as well and it works with every app. If, like me, you've been waiting for the BBC to update their iPlayer app to work with AirPlay, you need wait no longer - the mirroring feature works with every single app (with no way of stopping it) as it is baked into the OS so you can stream content from any app to your television.&lt;/p&gt;

&lt;p&gt;However, whilst that is impressive, my later discovery has much more potential.  Every since the Apple TV was announced, blogs and forums have been full of people saying &quot;we want apps for the Apple TV&quot;. I have always felt this to be a bad move as a) there is limited space on the Apple TV and b) they would suck. Why, you ask? Well, the Apple TV only comes with a standard Apple Remote with it's 4 directional buttons, and the &quot;play&quot; and &quot;menu&quot; buttons. This might be good enough for basic browsing through a filesystem (although text entry is a pain) but it's not conjusive to the sort of experience iOS users have come to expect from their apps. I have always maintained that the best option would be to allow anybody with an iOS device to transmit apps to the Apple TV as a secondary monitor as you can then display content on the big screen and use the iPhone or iPad to control it with touch gestures.&lt;/p&gt;

&lt;p&gt;Luckily, that's what Apple have done.. they just haven't told anyone.&lt;/p&gt;

&lt;img src=&quot;http://files.bendodson.com/old-weblog/2011/06/DSC00952.jpg&quot; alt=&quot;AirMaps&quot; title=&quot;DSC00952.JPG&quot; border=&quot;0&quot; width=&quot;600&quot; height=&quot;450&quot; /&gt;

&lt;p&gt;This is a screenshot of a test app I built for the iPhone last year called &quot;AirMaps&quot;. Originally, I used an iPad-to-VGA adapter to plug the iPhone into my screen. The app was a simple trackpad that allowed you to manipulate Google Maps on the television. It works well enough with pinch, double-tap, etc, but having to plug in via a cable was always going to be arduous.  However, now with the AirPlay mirroring &lt;strong&gt;any app with TV-Out functionality will automatically broadcast it's secondary screen to the Apple TV&lt;/strong&gt;. This is exactly what I've been talking about for the past year.&lt;/p&gt;

&lt;p&gt;&quot;Now&quot;, you might say, &quot;that all looks rather fancy, but what are the real world implications&quot;. In a word, gaming. This feature, unmentioned though it has been, is going to bring iOS gaming to a new level. With this functionality, you can now turn the Apple TV into a games console (and a particular cheap one at that when you consider hardware and software costs).&lt;/p&gt;

&lt;p&gt;By way of example, I have loaded up &quot;&lt;a href=&quot;http://itunes.apple.com/gb/app/the-incident/id385533456?mt=8&quot;&gt;The Incident&lt;/a&gt;&quot; on my iPad 2 and iPhone. This game made some headlines a few months ago when it announced it was adding TV-Out in a rather special way. You could plug your iPad into the television with the cable, but then use WiFi on the iPhone to control the iPad app (which in turn was broadcast to the television). This was much better than the previous route but still meant you needed 2 iOS devices and a £50 cable. Now with AirPlay Mirroring on iOS 5, this functionality works out of the box without the need for the cable.&lt;/p&gt;

&lt;img src=&quot;http://files.bendodson.com/old-weblog/2011/06/DSC00951.jpg&quot; alt=&quot;&quot;The Incident&quot; over AirPlay&quot; title=&quot;DSC00951.JPG&quot; border=&quot;0&quot; width=&quot;600&quot; height=&quot;450&quot; /&gt;

&lt;p&gt;The iPad is connected wirelessly to the AppleTV thanks to AirPlay mirroring, and the iPhone is connected to the iPad over WiFi to enable it to work as a controller. Amazingly (considering it's running at 720p), the whole thing works incredibly quickly and responsively.  Obviously, this setup is rather convuluted (as you still need an iPad 2 and an iPhone) but there are other apps that will work with just an iPad 2. For example, you can now present using Keynote wirelessly (the iPad will display your presenter notes whilst the AppleTV shows the slides) but you can also play games like Real Racing 2 HD completely wirelessly using your iPad as a controller. This is truly remarkable stuff and something that I know is going to be huge once iOS 5 comes out in a few months time.&lt;/p&gt;

&lt;p&gt;I put together a brief video to demo this a little better but please feel free to get in touch on &lt;a href=&quot;http://twitter.com/bendodson&quot;&gt;Twitter&lt;/a&gt; or via &lt;a href=&quot;http://bendodson.com/contact/&quot;&gt;email&lt;/a&gt; if you have any questions.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>WWDC 2011 Keynote - Predictions vs Reality</title>
      <link>http://bendodson.com/weblog/2011/06/08/wwdc-2011-keynote-predictions-vs-reality/index.html</link>
      <pubDate>Wed, 08 Jun 2011 00:00:00 +0100</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2011/06/08/wwdc-2011-keynote-predictions-vs-reality/index.html</guid>
      <description>&lt;p&gt;The day before the WWDC 2011 keynote, &lt;a href=&quot;http://bendodson.com/weblog/2011/06/06/wwdc-2011-predictions-ios-5-lion-and-icloud/&quot;&gt;I posted an article&lt;/a&gt; with a number of predictions that I was making along with a promise to do a follow up to see how accurate that was. Having now watched the keynote video and had a chance to play around with iOS 5.0 (on both models of iPad and the iPhone 4), I'm now ready to take a look at what I believe are the most exciting changes coming around the corner.&lt;/p&gt;
	
&lt;h3&gt;iOS 5.0&lt;/h3&gt;

&lt;p&gt;Apple did pretty much as expected by introducing a whole new notifications system. It was not, as I'd hoped, a part of the wasted screen space currently used for search but copied completely from Android by using a swipe-down gesture from the status bar. I'm still not convinced that this is the best place for it (as new users won't know to swipe-down from the top of the screen - there is no indication anything is up there) so we might see it move before iOS 5 gets made public. In terms of how notifications work, it is a similar system to Game Center with a nice Growl-style overlay appearing at the top of the screen - this is tappable to go direct to the app or you can ignore it and look at it in the Notification Center overlay. One thing I will say about notifications is that the customisable options are incredibly good - each app can be customised so you can have notifications show up in the old modal style (I do this for txts), the banner style, or not at all. You can also choose whether they appear in the Notification Center, on the Lock Screen, and how many notifications an app is allowed to display. This was unexpected from me as Apple doesn't usually give you the option to personalise - whilst there is a lot of complexity in what can be done, they have laid it out in the settings in a very clear fashion.&lt;/p&gt;

&lt;img src=&quot;http://files.bendodson.com/old-weblog/2011/06/IMG_0017.png&quot; alt=&quot;Notification Center Options&quot; title=&quot;IMG_0017.PNG&quot; border=&quot;0&quot; width=&quot;400&quot; height=&quot;600&quot; /&gt;

&lt;p&gt;Speaking of &quot;View in Lock Screen&quot;, this was something else I'd thought might be available. Notifications stack up in the unused space as they come in but the really nice touch is that you can slide a notification (just like the unlock slider) in order to go direct to that app. For example, if you had notifications for txts, emails, and Twitter, you could slide the email notification to go direct to that email. It's a minor thing, but saves a huge amount of time and is more effective than going to the app that last sent you a notification which was the default unlock action.&lt;/p&gt;

&lt;p&gt;In terms of widgets, there was a lot less than I had anticipated. Whilst there are widgets, there are only two of them and they're hardly exciting; weather and stocks. Thankfully, they can be turned off in the settings if you don't want them. If enabled, they reside at the top of the Notification Center which is as good a place as any but there is no option to put them on either the home screen or the lock screen. I disabled stocks (as I have little interest in them) but I've had weather enabled for the past 2 days. The unique feature they've added is localisation in that it uses the GPS to show you the weather where you are - sure enough, it flips between London and Surbiton depending on if I'm at home or in the office. But what is the point of the feature? I looked out the window earlier to see it was raining - the widget qualified this by also saying it was raining. It would be far more useful to have a widget that shows weather at a specific location (e.g. is it raining in London whilst I'm at home) rather than what the weather is doing at your current location. Also, whilst you can swipe the weather to get a forecast it doesn't remember this setting the next time you look at it (so I'm always having to swipe to see the bit that could be of interest).&lt;/p&gt;

&lt;img src=&quot;http://files.bendodson.com/old-weblog/2011/06/IMG_0019.png&quot; alt=&quot;Weather Widget, iOS 5&quot; title=&quot;IMG_0019.PNG&quot; border=&quot;0&quot; width=&quot;400&quot; height=&quot;600&quot; /&gt;

&lt;p&gt;I'm sure we'll see the ability to create widgets at some point, but probably not for the launch of iOS 5. Adding the ability for 3rd party devs to create them (i.e. having a Facebook widget) would be a good move in my opinion and would be even better if they could be added to the lock screen.&lt;/p&gt;

&lt;p&gt;Aside from widgets and the notification positions, the rest of my iOS 5 predictions were on the mark. Wireless syncing with iTunes is in complete with delta updates (so you no longer need to download 500MB update every time they update the OS). As a bonus, when syncing with iTunes, you can still use the phone even if you are plugged in via a cable. This makes a huge difference as getting a txt just before you start a half hour import of all your music is very tedious! Game Center saw a number of improvements and the new iCloud functionality allows for the saving of game state as I suggested. No word yet that FaceTime is working on 3G but that may happen before we get to the end of the beta period. Also, Apple quite often add additional functionality before going Gold Master so it's quite plausible that things will move around and we'll see the introduction of improved voice control.&lt;/p&gt;

&lt;p&gt;One interesting piece which I hadn't seen coming was the introduction of iMessage. This is basically a silent update to the Messages app so that when you are sending a message to somebody else who has an iOS device, it does it through your internet connection for free rather than via SMS or MMS. This is a genius move (and bound to annoy the people at RIM and the mobile carriers) as it means you can now use an iPod Touch as an iPhone when on WiFi (as you have iMessages and FaceTime). The UI works incredibly well with the colour of the speech bubbles and some minor differences in text to differentiate between a free message and a paid message. It also automatically updates on all of your devices so you have all of your conversations no matter whether you are using an iPad or iPhone. All in all, a very good update.&lt;/p&gt;

&lt;h3&gt;Lion&lt;/h3&gt;

&lt;p&gt;As I'd thought, there wasn't a lot to say about Lion although they did spend half an hour going over all of the pieces that had already been demoed in the past. The most interesting announcement was that Lion was going to retail for $29.99 and would only be available via the Mac App Store. This is another bold move from Apple but there are a lot of details left open (which my Twitter feed is full off!) such as &quot;what happens if I want to reinstall from scratch&quot; and &quot;what if I have no internet connection&quot;. I'm sure Apple will address these in good time but my gut feeling is that Lion will update the BIOS on your machine in order that you can install from the Mac App Store. At the moment, holding &quot;cmd&quot; allows you to boot from CD, USB, or over WiFi network from another machine so it wouldn't be a stretch for that WiFi support to expand to connect to the Mac App Store to download the OS. Lion also creates a backup partition from which it can restore itself so that would solve many problems.&lt;/p&gt;

&lt;p&gt;In my last article I did briefly mention that AirDrop might be expanded to allow wireless file sharing with iOS 5 - as iOS 5 didn't get an updated file system, this didn't materialise but it might be something that appears in later versions (e.g. iOS 5.2). The other speculation I had was that iBooks would make it to the desktop - again, this didn't happen but iTunes has been updated (for Snow Leopard users as well) so that you can now purchase books on the desktop and have them automatically sent to your iOS devices (with support for iOS 4.3 available now as well). This is a good step but I'm sure we'll see iBooks in the Mac App Store soon.&lt;/p&gt;

&lt;h3&gt;iCloud&lt;/h3&gt;

&lt;p&gt;This was the one piece that nobody knew much about and was therefore the most anticipated - it certainly didn't disappoint.&lt;/p&gt;

&lt;p&gt;Everybody had agreed beforehand that there would be some sort of iTunes-sync system so that you would be able to access your iTunes library everywhere. Unfortunately, I hadn't thought that this would be US only (in that you still can't redownload your purchased music outside of the US). This is most likely due to the legal licenses required and, if past experience is anything to go by, it will most likely be 6-12 months before we see sight of that here in the UK. However, the fact that it's coming is noteworthy in itself and is a good push for the music industry.&lt;/p&gt;

&lt;p&gt;However, iTunes Match was the showstopping announcement. A service whereby your music is scanned, uploaded (if they don't have it already), and then shared to all devices for $24.99 a year... oh, and that includes any MP3s from other locations (e.g. Amazon, Google, Bittorrent). How they managed to make the music industry accept that I'll never know but it is an amazing announcement to make. I particularly like the way they've compared the service with rivals Amazon and Google on the official website:&lt;/p&gt;

&lt;img src=&quot;http://files.bendodson.com/old-weblog/2011/06/Screen-shot-2011-06-08-at-15.14.04.png&quot; alt=&quot;There's iCloud. And then there's everything else.&quot; title=&quot;Screen shot 2011-06-08 at 15.14.04.png&quot; border=&quot;0&quot; width=&quot;600&quot; height=&quot;372&quot; /&gt;

&lt;p&gt;There is still no sign of a subscription iTunes deal (i.e. pay $9.99 a month and get free streaming access to all iTunes content) but I'm sure that will be appearing at some point in the next year now that they've made such headway with iTunes Match (which is a much bigger legal minefield).&lt;/p&gt;

&lt;p&gt;In terms of the rest of iCloud, it was pretty much as I'd had it on my wish list. Completely free syncing of all your information between all devices along with 3rd party APIs so your apps can sync state as well. The API looks well thought out and very easy to use so I'm sure uptake will be strong from other developers. Making it completely free across the board was also a brilliant move.&lt;/p&gt;

&lt;h3&gt;One More Thing...&lt;/h3&gt;

&lt;p&gt;I had speculated that there would be a &quot;one more thing&quot; which would deal with the Apple TV. My dream has been for developers to be able to use the Apple TV as a secondary screen for their apps rather than using a component cable plugged into a HDTV (which works, but isn't a graceful solution). Whilst it wasn't mentioned, the Keynote did have one slide showing &quot;AirPlay Mirroring&quot; which turns out to be a solution just for the iPad 2 allowing you to mirror everything on the screen to your Apple TV. This isn't AirPlay, this is fully baked in mirroring of all apps with no way for developers to disable it (so I can finally watch BBC iPlayer on my Apple TV). It's not without flaws at the moment (quite jerky probably as rendering on two screens - it could turn off the iPad screen really but doesn't) but I'm sure these will be ironed out before launch.&lt;/p&gt;

&lt;p&gt;However, the mirroring goes further than that as if you are using an app which supports TV-Out (e.g. Keynote), then turning mirroring on treats the Apple TV as a secondary screen. I'm not sure why they didn't make a big deal out of this future as it is a game changer - you can now play games like &quot;The Incident&quot; on your TV wirelessly from your device and it works incredibly well. I built a little proof-of-concept mapping application which put a trackpad on my iPad and Google Maps on the Apple TV and it works brilliantly - I'll be posting an article about this soon...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; I've now posted an article entitled &lt;a href=&quot;http://bendodson.com/weblog/2011/06/09/airplay-mirroring-tv-out-and-the-apple-tv-as-a-games-console/&quot;&gt;AirPlay Mirroring, TV Out, and the Apple TV as a games console&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Summary&lt;/h3&gt;

&lt;p&gt;Overall, the WWDC 2011 Keynote was one of the best Keynotes in recent years. Whilst the 30 minute ramble about Lion (which we'd already seen) probably wasn't necessary, the low price-point and Mac App Store only made it interesting. iOS 5 is a massive leap forward with a number of very interesting features (including custom text message tones.. finally!) and iCloud is going to be an incredible revolution once 3rd party apps get updated to use it. As a user, I'm excited by the new software coming out, but I'm even more excited as a developer. There is a huge amount of documentation to go through but what I've seen so far has been nothing short of exceptional. It looks like 2011 is going to be another great year for iOS.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>WWDC 2011 Predictions - iOS 5, Lion, and iCloud</title>
      <link>http://bendodson.com/weblog/2011/06/06/wwdc-2011-predictions-ios-5-lion-and-icloud/index.html</link>
      <pubDate>Mon, 06 Jun 2011 00:00:00 +0100</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2011/06/06/wwdc-2011-predictions-ios-5-lion-and-icloud/index.html</guid>
      <description>&lt;p&gt;I've been watching Apple keynotes with a keen interest for many, many years and I usually make a number of predictions; some correct, some completely off the mark. However, this is the first time I've decided to publish my thoughts prior to a keynote. I don't claim that all of these things will come true -- some of them are just on my wishlist -- but I will come back to this list tomorrow to see how accurate I was.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; My &lt;a href=&quot;http://bendodson.com/weblog/2011/06/08/wwdc-2011-keynote-predictions-vs-reality/&quot;&gt;follow up article&lt;/a&gt; is now available with details of the WWDC Keynote and how my predictions panned out.   
The most crucial thing about the core Apple products -- Macs, iPhones, iPads, and iPods -- is not the hardware. There are cheaper, faster components for personal computers, there are lighter more powerful smartphones, and I dare say we'll see some tablets soon which make the iPads engorged iPod Touch design feel dated. Whilst they are all aesthetically pleasing, the hardware is actually fairly underwhelming (aside from a few innovations such as the Retina Display). What makes Apple products so desirable is the software and it is for that reason that I think WWDC 2011 is going to be one of the most important conferences in recent years. With major updates for iOS and OS X at the same time, Apple has everything to gain if it gets it right, and a lot to lose if it gets it wrong. Throw into the mix a pre-announcement on cloud technology, and we could yet be surprised by what was generally perceived to be a keynote which would lack anything completely unexpected. Apple have released a press announcement and plastered the Moscone Center in posters showing that WWDC 2011 = iOS 5, Mac OS X Lion, and iCloud. For that reason, I'll take a look at each one in turn to give my predictions on what we might see announced tomorrow.&lt;/p&gt;

&lt;h3&gt;iOS 5.0&lt;/h3&gt;

&lt;p&gt;Definitely the highlight for me (as an iOS developer), I firmly believe that iOS 5 is going to be the biggest update to iOS since iOS 2.0 added the App Store. Why? Up until this point, iOS has been a leader in both innovation and in user experience. However, the home screens are now feeling dated and Android, Windows Phone 7, and WebOS are now creeping up in terms of features and UI (especially in the area surrounding notifications, widgets, and tiles). So, what will Apple add to iOS 5?&lt;/p&gt;

&lt;h4&gt;Notifications&lt;/h4&gt;
&lt;p&gt;The notifications system in the current versions of iOS is pretty shameful when stacked up against the competition. Alerts come in one at a time and overwrite previous alerts (for example, if my app sends 2 pushes, you'll only see the second one. If another app sends a push, you won't even see mine just theirs). The advent of local notifications, push notifications, and badge icons worked well as a stopgap for true multitasking, but the horrible modal UI just doesn't feel right on a phone anymore when consumers are getting more used to seeing unobtrusive notifications. When you start getting issues such as a push notification overlaying the phone panel (so you have to close a push before you can hang up on someone), the system is obviously broken. I expect this will be one of the major tentpoles of iOS 5 and we'll see a notifications system more similar to a cross between Android and Growl. On Android, you can pull down the status bar to see a list of all notifications and every app that has an unread notification is visible in the status bar as a small icon. There are notifications for new emails, tethering, available wi-fi hotspots, and 3rd party apps (e.g. new tweets). However, they are totally unobtrusive. &lt;/p&gt;

&lt;p&gt;I don't think this will be copied verbatim as the UI convention doesn't work (how many users know to pull down the status bar?). What I think more likely is that the search dialogue (swipe to the right from the first home screen) will be replaced with search and notifications. At the moment, the keyboard slides up automatically to take up half the screen and the search box takes up about 50px at the top. If the keyboard didn't come up, there would be a large amount of space to list notifications in a similar way to search results (e.g. by app with a badge or other count to show notification titles) with one-touch access to the application in question.&lt;/p&gt;

&lt;p&gt;But how do you know when you have notifications? I would guess that there will be an Android-similar status bar icon but that there will also be Growl-style notifications in-app. These are already used for Game Center (ever noticed when you start up a Game Center enabled app that you'll get a dialogue slide in from the top saying &quot;Welcome back, username&quot;?) so it's not a stretch to expect that they would be available, and tappable, for 3rd party notifications.&lt;/p&gt;

&lt;h4&gt;Home Screens / Widgets&lt;/h4&gt;
&lt;p&gt;The home screens have been the same on iOS since version 1.0 and are now feeling slightly dated, especially when you consider the number of apps available on the App Store. iOS 4 saw the introduction of folders and 11 screens worth of apps (meaning you can install over 2000 apps) but this still seems a way of adding more rather than making it easy to prioritise. I love the folders system, but there are other players now who are doing this better. Ashamedly, Microsoft are one of them with their tiles system which is integral to both Windows Phone 7 and the recently previewed Windows 8. It is most likely that the home screens will stay as they are but a new dashboard system (or perhaps &quot;Mission Control&quot; to keep in with Lion branding... see later) will be added in order to add one or two screens of your most-used apps. This might come in the form of a gesture, an app, or just being the default landing page after you unlock the phone (with another swipe necessary to take you to all apps) but I think it likely we'll see some changes to how apps can be organised. &lt;/p&gt;

&lt;p&gt;This leads me nicely into Widgets which are another thing which has been popular for a while, both in OS X in the form of Dashboard, and on Android phones. On Android, some apps can drop widgets onto the home screen so you can have a space (maybe 4 app icons by 2 app icons in size) that shows you your Facebook updates or a wall clock, etc. The problems are that on Android there are no design conventions so they generally look awful - they also take up far too many system resources (e.g. the Facebook app used up 10% of my battery on average due to the way in which it checked for updates). I would expect Apple to solve both of these problems in a graceful way.&lt;/p&gt;

&lt;p&gt;One last word on the home screen - I don't expect them to be gotten rid of or for widgets and apps to coincide (as on Android). The reason for this is that OS X Lion has an app overlay modelled on iOS but maintains its dashboard separately (interestingly with a swipe to the right from the apps page as per my suggestion for notifications). Whilst this &lt;em&gt;could&lt;/em&gt; be an interesting tactic by Apple to lull us into a false sense of security (e.g. Lion beta has iOS home screens therefore home screens aren't changing but actually they are *dun dun daaaaaaaa*) I doubt it. I expect the home screen to remain as it is but for there to be a new dashboard screen to replace the first home screen (or some other way of accessing a widget laced dashboard).&lt;/p&gt;

&lt;h4&gt;Lock Screen&lt;/h4&gt;
&lt;p&gt;Heavily connected to both of the above, the lock screen needs an overhaul. A system which combines notifications and widgets would be best (so you can see, without unlocking your phone) how many emails, texts, and Twitter mentions you have as well as seeing what the weather is like in your area) but I think it's linked fairly intrinsically to the home screen system. It could be that the &quot;Dashboard&quot; I mention above is in fact the lock screen with home screens being unchanged but I think that would be a mistake - you can't add too much to the lock screen as the whole purpose is for it to have no touch input (incase it is activated by accident). Having a list of your notifications (so you can see if that *bing* was a notification of a baseball game starting or a new email) would be an excellent addition, but loading it up with touchable widgets would not be.&lt;/p&gt;

&lt;h4&gt;Updates&lt;/h4&gt;
&lt;p&gt;There are two kinds of updates available to iOS; app updates and system updates. At present, both suck and for pretty much the same reasons. The first major problem is incremental updating. If you want to update your device or an app, you have to download a whole new version of the software (which can be hundreds of megabytes in the case of system software and games) when there may only be a handful of lines of code changed. I don't think that 3rd party apps will get the ability to do incremental updates yet (as I imagine this to be hard to implement and check for Apple and developers) but there is no reason why iOS software can't be updated in this way - OS X has been doing it for years with full combo updates available to download when things go completely wrong. The other issue (for iOS updates at least) is that you need to be tethered to iTunes. This wasn't an issue for iPods as it was generally accepted that you need to be connected to iTunes to add music so doing updates through it is logical. However, iTunes is now a bloated mess, dealing with a multitude of media and updating. It is no longer suitable for updating things like phones and post-PC devices (the iPad). iOS devices need the ability to update themselves without being linked to a computer and iOS 5 is the time to make that happen (in fact it has already been discovered that this is on the cards thanks to an over-zealous copyeditor on iTunes). The update to iOS 5 will be done in the old fashioned way but I expect that updating to iOS 5.1 (or 5.0.1) will be able to be done independently from a PC (and hopefully over a 3G connection if incremental updates are issued).&lt;/p&gt;

&lt;p&gt;To learn more about software updates on iOS, check out my post about &lt;a href=&quot;http://bendodson.com/weblog/2011/02/11/mobile-os-updates-android-vs-ios/&quot;&gt;iOS updates vs Android updates&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;Other improvements&lt;/h4&gt;
&lt;p&gt;There are lots of other areas that could use improving but these are all fairly minor in comparison with the design overhauls above. Maps would do well to be updated as it pales in comparison to Android but this is largely in the hands of Google (see the problem there?) until Apple break away with their own mapping solution. I was hoping that would happen this time around but from the rumours flying around it would seem that we are going to be stuck with Google as the only built-in mapping solution for at least the next year. Game Center is another tool which needs a radical overhaul in order to make it relevant. Adding a gamification layer equivalent to Xbox Live seemed a good idea but Achievements are half-baked (you can't see a total gamerscore as per Xbox Live) and the interface is, well, horrible. Now that there are Universal apps, it would make sense for game progress to be syncable (although I'll come to this in the iCloud section below) as there is nothing more frustrating that having to play a game twice on two separate devices (or on one as if you do a restore on your phone you lose your app data). The file system is something which could do with a tweak as syncing pages documents to iOS devices is quite painful through iTunes - this is something more likely to be solved by iCloud but the actual process of accessing files on the device may well be changed. Finally, there are things like &quot;read it later&quot; which we already know are coming to Safari (I bet Instapaper are happy about that) as well as minor updates to each of the major apps bundled with iOS so that Steve can say &quot;there are over 100 updates&quot; or something similar.&lt;/p&gt;

&lt;p&gt;On the whole, the main basis of iOS 5 should be about a fundamental rethink of how apps are accessed and used. Whilst apps and the home screen system were revolutionary, they are now 4 years old and showing their age - it's time for an update which allows for unobtrusive notifications, easy access to app information via widgets, and lightweight updates available everywhere. Getting FaceTime to work on 3G (as promised) would also be a nice touch seeing as Skype has been doing it for months...&lt;/p&gt;

&lt;h3&gt;Lion&lt;/h3&gt;

&lt;p&gt;I'm not going to say a huge amount about Lion as I think we've seen the majority of the biggest pieces in the numerous developer previews (which despite NDA have been demoed extensively on YouTube and Apple Rumour sites as well as on the &lt;a href=&quot;http://www.apple.com/macosx/lion/&quot;&gt;official Apple website&lt;/a&gt;). There is obviously a huge UI overhaul with Mission Control and Launchpad as well as bring a number of other innovations from iOS (reverse scrolling, iOS scrollbars, new segmented controls, overhauled calendar interface, etc) but the most exciting things for me are Mail, Auto Save, Versions, and AirDrop.&lt;/p&gt;

&lt;h4&gt;Mail&lt;/h4&gt;

&lt;p&gt;The built-in Mail app has been lacking for a little while, especially now that competitors such as Sparrow are taking a lot of the limelight on the Mac App Store. With Lion, Mail is becoming more like the iPad version which for me is one of the nicest email clients around. Apple will claim &quot;conversations&quot; as a big step forward but the truth is that Gmail has been doing it for a very, very long time (&lt;span style=&quot;text-decoration: line-through&quot;&gt;10 years or so in fact&lt;/span&gt; It was actually 7 years as Gmail started up in 2004 - thanks to &lt;a href=&quot;https://twitter.com/mattydsmith/status/77650864956907520&quot;&gt;@mattydsmith&lt;/a&gt; for the correction). However, it is a welcome improvement. I for one haven't got on well with Sparrow (bit too buggy for me at the moment) so I'm looking forward to the new version of Mail just for a few of the most basic improvements like conversations.&lt;/p&gt;

&lt;h4&gt;Auto Save&lt;/h4&gt;

&lt;p&gt;Just like iOS apps, Mac apps will now be built to take advantage of &quot;auto save&quot; - basically, whenever you change something, it is saved automatically rather than when you press the floppy disk icon (maybe this is the death of that button at last?). To be fair, this has existed for a long time in the OS itself (e.g. when you are in System Settings, you never save anything apart from when you apply network settings - everything is saved as soon as you change a toggle) and apps have faked it with autosaves (even Office does that) but this is the first time that support is baked into the OS making it a lot more efficient and reliable. A minor feature, maybe, but one that I'm sure will be welcomed by anybody that has lost data due to power failure or human error.&lt;/p&gt;

&lt;h4&gt;Versions&lt;/h4&gt;

&lt;p&gt;Related in many ways to Auto Save, Versions is basically Time Machine for files. Every time you alter a file, a backup is stored away somewhere so you can go back in time and get that version you wished you hadn't overwritten by accident. This has happened to be from time to time (especially when I get overzealous with my copy-paste commands and overwrite something I didn't mean to but then do something to break the &quot;undo&quot; button) so this will be another welcome addition. To an extent, I have this already for most of my work material as I have the packrat addition for Dropbox (which means every single file in my Dropbox is versioned automatically) but it will be nice to have the feature when I'm not connected to the internet.&lt;/p&gt;

&lt;h4&gt;AirDrop&lt;/h4&gt;

&lt;p&gt;A feature that hasn't been mentioned much in the press is AirDrop, a way for you to share files easily between computers. Basically, with two computers near each other, opening up AirDrop will allow you to share files without any of the usual network hoops such as Bluetooth handshakes or passwords. Whilst this could be done already if you have setup file sharing, the point is that it works out of the box. The reason I'm excited about it is because I expect it to be compatible with iOS 5 so you can very easily share files between your Mac and iPhone / iPad without a) tethering via a cable or b) iTunes. Definitely something to watch out for.&lt;/p&gt;

&lt;p&gt;In addition to the above, I would expect there to be a few new headline features announced tomorrow for Lion. iWork is well overdue for an update and I don't think it's a stretch of the imagination to expect iBooks to make its way to the desktop (or at least the iBooks store). Ideally I'd like to see iTunes completely rebuilt as separate apps with the Mac App Store becoming the place for Mac and iOS apps (maybe even Universal apps that run on all devices - e.g. download Twitter and it will work on iPhone, iPad, and Mac with one binary.. no reason it can't be done. I'm not saying iOS apps running on Mac OS X, just that the Mac version could be bundled so for one payment you get all 3 versions). iTunes should be an audio playback utility (and store) only with Quicktime taking over TV Shows and Movies and iBooks managing your ebooks. It astounds me that everything is still controlled from iTunes. Do I expect it to be updated tomorrow? Realistically, no. iTunes updates tend to come with iPod updates in September but I'd still hope that at some point (and Lion would be the best time to do it) that some parts of iTunes could be split out to other apps. This was one thing that iOS does very well (e.g. the iPod app doesn't control everything) so taking this &quot;back to the mac&quot; would make sense.&lt;/p&gt;

&lt;h3&gt;iCloud&lt;/h3&gt;

&lt;p&gt;This is the big unknown quantity. What is iCloud? Apple have made the unprecedented move of announcing the name (and the icon) ahead of the announcement although this was most likely to stop people wondering if the iPhone 4S (or iPhone 5) would be announced or not (hint: it won't be). Most bets are on iCloud being a storage locker for music so that you can stream your iTunes library but there are a lot better things that can be done. I've broken them down by type:&lt;/p&gt;

&lt;h4&gt;Music&lt;/h4&gt;

&lt;p&gt;Starting with music, it is generally accepted that iCloud is going to be heavily tied to iTunes. Music labels have apparently done deals with Apple so that streaming will be enabled but the real question is on implementation. Consensus appears to be that your iTunes purchases will be available to stream from Apple's servers to your iOS devices and Macs wherever you are. There would be no upload (as they have the master copies) and there is some advantage to this approach in that you don't need to have your iPhone synced with your 20GB library - you can just stream as and when you need it. The downside is a) you need to have purchased from iTunes (fair enough) and b) you need an internet connection. Apple tends to introduce new systems which are essentially crippled at launch and then build them up over time so I'd expect that the above is true and pretty much the extent of the music portion of iCloud. In future, we'll be able to upload our own MP3s to stream and cache things offline, etc, but for now it is most likely to be just previous iTunes purchases (although this is good news for me as I have many iTunes purchases which were lost due to a nonexistent backup strategy and now have to be re-bought as iTunes doesn't allow you to re-download music for free like it does with apps). I expect Apple to also launch a Spotify rival in the form of a monthly subscription to get streaming (and maybe offline caching) of iTunes content but this is more likely to come in September with new iPods and a new version of iTunes than at this announcement. I'll happily be wrong on that issue though as whilst I love Spotify, its library of music is nowhere near as comprehensive as Apple's.&lt;/p&gt;

&lt;h4&gt;Files&lt;/h4&gt;

&lt;p&gt;iDisk sucks. I don't know anybody who thinks otherwise. I also don't know anybody who uses a Mac who doesn't use Dropbox. This is a problem for Apple and one it needs to sort out fast. With their fancy new data centre and OS X Lion, there is no reason why they can't rule the online file storage space (especially if they tie it in with Versions and Time Machine along with fancy new routers to do the whole thing without your Mac being on). For this to work, there is one key requirement - uploading must be fast and easy (iDisk seems to take an age) and files need to be accessible everywhere (by which I mean, on iOS). That's pretty much it, nothing revolutionary. The keynote part of this will probably revolve around new Time Capsules and Airport Extremes which allow for your mac to sync incredibly quickly with their internal hard drives and then for the router to sync with the cloud whilst your computer is off. This is better for the environment and uses less resources on the Mac (as Dropbox hogs all memory and CPU cycles if you have a lot of updates to do) but I expect it to be an optional extra - obviously you'll be able to use file sharing on iCloud without an Apple router, it'll just be better if you have one.&lt;/p&gt;

&lt;h4&gt;Apps&lt;/h4&gt;

&lt;p&gt;The best thing that iCloud could do would be to open itself up as a 3rd party API. This would allow app developers who don't have access to servers and web technology (which is a lot of them bearing in mind most come from software development backgrounds, not web development like me) to sync their data between their own apps with minimal hassle. A good example of this is Things, a to-do list app by Cultured Code. It's a fantastic app but its main failing is that there is not yet a public way for you to sync content over the internet between iOS apps (e.g. iPad and iPhone) or to the Mac (e.g. iPhone to Mac or Mac to Mac). It can be done with WiFi and they are working on cloud-sync solutions, but with a 3rd party API this would have been done already. Another good example is games like Angry Birds in which you lose your progress if you wipe your iPhone or switch to your iPad (or upgrade from an iPhone 3GS to an iPhone 4). With a 3rd party API, developers could sync game save data to the cloud ready for it be downloaded on all of your devices so you never again lose your high scores. Developers win as their apps become more intuitive and cohesive and consumers win as they now have an ecosystem for their devices which maintains their data without them thinking about it. If anything, I would say that this is the biggest potential area for iCloud and I really hope to see this announced tomorrow.&lt;/p&gt;

&lt;h4&gt;MobileMe&lt;/h4&gt;

&lt;p&gt;The final area of iCloud is the takeover of MobileMe. I think it's fairly safe to say that MobileMe won't exist after tomorrow and will be absorbed by iCloud. However, there are updates that need to happen. At £59 a year, it's overpriced for a system which most people only use to sync their address books and calendars. Free email has been around for years (with Gmail having a superior offering), Flickr is better than the photo syncing and Dropbox is better than iDisk - the only thing worth having (aside from contact / iCal sync) is Find My iPhone which was recently made free for new iOS devices anyway. I won't speculate on pricing for iCloud (as we don't know what it is yet) but I'd expect that the syncing aspects will be free for anyone with OS X Lion or iOS devices in future (and just a nominal fee, around the $30 mark, for everyone else). The cost advantage of having syncing between all devices will net Apple more profit (just from apps and devices) than charging for that syncing service.&lt;/p&gt;

&lt;h3&gt;One More Thing...&lt;/h3&gt;

&lt;p&gt;There is one other thing that I've been predicting for a while and I'm hopeful we'll see a push in the right direction tomorrow; Apple TV Apps. When I say apps, I don't mean native apps on the Apple TV. That won't work for the simple reason that the Apple TV only comes bundled with a basic remote which provides very little control for things more advanced than the YouTube app that comes bundled (and that's bad enough when it comes to text entry). No, what I mean is that iOS 5 apps on iPhone and iPad should be allowed to use the Apple TV as a secondary screen. APIs exist for this (in a way) with a cable in that an iPad-to-VGA adapter can let you display your apps on a secondary monitor (e.g. using the Keynote app you can display your presentation on a projector and notes on your iPad) and the iPad 2 introduced mirroring mode allowing you to play games at HD resolution on your TV with the component cable. However, I want to be able to play something like Real Racing wirelessly with my iPhone providing the app and acting as a wireless steering wheel, yet transmitting the data to the TV so that the Apple TV can display the game. There are issues to solve with lag (especially in HD gaming) but these could be solved by having an app payload sent over to the TV and cached locally as part of an initial load (kind of like buffering a movie) and then the remote only sending light data packets with control information. As an example, use the Apple Remote app with an Apple TV and you'll find it highly responsive - you can scroll and tap on the iPhone to control the Apple TV and it all works in real time. Just imagine if you could transmit your Keynote presentation wirelessly and then control it in the same way or play Angry Birds on the big screen. Throw in a built-in version of Game Center and suddenly Apple will be up against the entrenched console systems in the living room - you wouldn't even need to change the name AirPlay as the &quot;play&quot; could be about gaming rather than just AV playback. I've been talking about this ever since the iPad was launched but I think now is the time it could become a reality - it's a long shot but we'll see tomorrow!&lt;/p&gt;

&lt;h3&gt;Summary&lt;/h3&gt;

&lt;p&gt;In conclusion, tomorrow could be one of the many defining moments in Apple's history. If iOS 5 gets enough of a redesign to keep it fresh when compared to the newcomers, if OS X Lion launches soon with more upgrades than those previewed, and if iCloud introduces true syncing between them, then it will set the tone for Apple for the next 5 years. However, if iCloud is anything like the MobileMe launch (e.g. a shambles), then things will turn out very differently.&lt;/p&gt;

&lt;p&gt;I'll be &lt;a href=&quot;http://twitter.com/bendodson/&quot;&gt;tweeting&lt;/a&gt; any major announcements as they happen and I'll chuck up a summary post tomorrow to see how many of my predictions have come true. In the meantime, if you have any opinions, fire me a &lt;a href=&quot;http://twitter.com/bendodson/&quot;&gt;message on Twitter&lt;/a&gt; or &lt;a href=&quot;http://bendodson.com/contact/&quot;&gt;drop me an email&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>WikiLocation adds support for 36 locales</title>
      <link>http://bendodson.com/weblog/2011/05/28/wikilocation-adds-support-for-36-locales/index.html</link>
      <pubDate>Sat, 28 May 2011 00:00:00 +0100</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2011/05/28/wikilocation-adds-support-for-36-locales/index.html</guid>
      <description>&lt;p&gt;It's been just over a year since I started &lt;a href=&quot;http://wikilocation.org/&quot;&gt;WikiLocation&lt;/a&gt;, a simple REST-ful API to access geocoded Wikipedia articles.  During that time, hundreds of developers have made use of the API in mashups, apps, and commercial products.&lt;/p&gt;
&lt;p&gt;Today, I'm happy to announce that I've added locale support to the WikiLocation API. This means that the API now provides access to over &lt;strong&gt;3.8 million geocoded articles across 36 different languages&lt;/strong&gt;. The following languages are now supported via a simple &quot;locale&quot; parameter which can be added to any API call (full details can be found in the &lt;a href=&quot;http://wikilocation.org/documentation/&quot;&gt;WikiLocation API Documentation&lt;/a&gt;):&lt;/p&gt;

&lt;ul&gt;
										&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://ar.wikipedia.org/&quot;&gt;ar&lt;/a&gt;&lt;/strong&gt; - 6,273 articles&lt;/li&gt;
							&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://bg.wikipedia.org/&quot;&gt;bg&lt;/a&gt;&lt;/strong&gt; - 17,689 articles&lt;/li&gt;
							&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://ca.wikipedia.org/&quot;&gt;ca&lt;/a&gt;&lt;/strong&gt; - 128,364 articles&lt;/li&gt;
							&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://cs.wikipedia.org/&quot;&gt;cs&lt;/a&gt;&lt;/strong&gt; - 7 articles&lt;/li&gt;
							&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://da.wikipedia.org/&quot;&gt;da&lt;/a&gt;&lt;/strong&gt; - 23,041 articles&lt;/li&gt;
							&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://de.wikipedia.org/&quot;&gt;de&lt;/a&gt;&lt;/strong&gt; - 335,275 articles&lt;/li&gt;
							&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://en.wikipedia.org/&quot;&gt;en&lt;/a&gt;&lt;/strong&gt; - 1,101,616 articles&lt;/li&gt;
							&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://eo.wikipedia.org/&quot;&gt;eo&lt;/a&gt;&lt;/strong&gt; - 45,864 articles&lt;/li&gt;
							&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://es.wikipedia.org/&quot;&gt;es&lt;/a&gt;&lt;/strong&gt; - 141,352 articles&lt;/li&gt;
							&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://fa.wikipedia.org/&quot;&gt;fa&lt;/a&gt;&lt;/strong&gt; - 15,519 articles&lt;/li&gt;
							&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://fi.wikipedia.org/&quot;&gt;fi&lt;/a&gt;&lt;/strong&gt; - 16,494 articles&lt;/li&gt;
							&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://fr.wikipedia.org/&quot;&gt;fr&lt;/a&gt;&lt;/strong&gt; - 248,977 articles&lt;/li&gt;
							&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://he.wikipedia.org/&quot;&gt;he&lt;/a&gt;&lt;/strong&gt; - 1 article&lt;/li&gt;
							&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://hu.wikipedia.org/&quot;&gt;hu&lt;/a&gt;&lt;/strong&gt; - 25,830 articles&lt;/li&gt;
							&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://id.wikipedia.org/&quot;&gt;id&lt;/a&gt;&lt;/strong&gt; - 16,634 articles&lt;/li&gt;
							&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://it.wikipedia.org/&quot;&gt;it&lt;/a&gt;&lt;/strong&gt; - 149,882 articles&lt;/li&gt;
							&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://ja.wikipedia.org/&quot;&gt;ja&lt;/a&gt;&lt;/strong&gt; - 60,780 articles&lt;/li&gt;
							&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://ko.wikipedia.org/&quot;&gt;ko&lt;/a&gt;&lt;/strong&gt; - 7,805 articles&lt;/li&gt;
							&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://lt.wikipedia.org/&quot;&gt;lt&lt;/a&gt;&lt;/strong&gt; - 33,280 articles&lt;/li&gt;
							&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://ms.wikipedia.org/&quot;&gt;ms&lt;/a&gt;&lt;/strong&gt; - 24,628 articles&lt;/li&gt;
							&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://nl.wikipedia.org/&quot;&gt;nl&lt;/a&gt;&lt;/strong&gt; - 446,506 articles&lt;/li&gt;
							&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://no.wikipedia.org/&quot;&gt;no&lt;/a&gt;&lt;/strong&gt; - 42,267 articles&lt;/li&gt;
							&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://pl.wikipedia.org/&quot;&gt;pl&lt;/a&gt;&lt;/strong&gt; - 166,734 articles&lt;/li&gt;
							&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://pt.wikipedia.org/&quot;&gt;pt&lt;/a&gt;&lt;/strong&gt; - 141,814 articles&lt;/li&gt;
							&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://ro.wikipedia.org/&quot;&gt;ro&lt;/a&gt;&lt;/strong&gt; - 23,297 articles&lt;/li&gt;
							&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://ru.wikipedia.org/&quot;&gt;ru&lt;/a&gt;&lt;/strong&gt; - 190,546 articles&lt;/li&gt;
							&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://sk.wikipedia.org/&quot;&gt;sk&lt;/a&gt;&lt;/strong&gt; - 5,451 articles&lt;/li&gt;
							&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://sl.wikipedia.org/&quot;&gt;sl&lt;/a&gt;&lt;/strong&gt; - 9,719 articles&lt;/li&gt;
							&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://sr.wikipedia.org/&quot;&gt;sr&lt;/a&gt;&lt;/strong&gt; - 52,093 articles&lt;/li&gt;
							&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://sv.wikipedia.org/&quot;&gt;sv&lt;/a&gt;&lt;/strong&gt; - 31,790 articles&lt;/li&gt;
							&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://tr.wikipedia.org/&quot;&gt;tr&lt;/a&gt;&lt;/strong&gt; - 9,448 articles&lt;/li&gt;
							&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://uk.wikipedia.org/&quot;&gt;uk&lt;/a&gt;&lt;/strong&gt; - 96,889 articles&lt;/li&gt;
							&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://vi.wikipedia.org/&quot;&gt;vi&lt;/a&gt;&lt;/strong&gt; - 71,375 articles&lt;/li&gt;
							&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://vo.wikipedia.org/&quot;&gt;vo&lt;/a&gt;&lt;/strong&gt; - 94,470 articles&lt;/li&gt;
							&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://war.wikipedia.org/&quot;&gt;war&lt;/a&gt;&lt;/strong&gt; - 91 articles&lt;/li&gt;
							&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://zh.wikipedia.org/&quot;&gt;zh&lt;/a&gt;&lt;/strong&gt; - 19,828 articles&lt;/li&gt;
					&lt;/ul&gt;

&lt;p&gt;In addition to these new articles and language filters, I have also updated the &lt;a href=&quot;http://wikilocation.org/&quot;&gt;WikiLocation.org website&lt;/a&gt; with a new visual design which should make it easier to find critical information. Finally, the API has been relocated to a new dedicated server to provide even faster access for your applications.&lt;/p&gt;

&lt;p&gt;If you have any feedback or questions relating to the API, please &lt;a href=&quot;http://wikilocation.org/contact/&quot;&gt;get in touch&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>One year on: further thoughts on the Gowalla API</title>
      <link>http://bendodson.com/weblog/2011/05/12/one-year-on-further-thoughts-on-the-gowalla-api/index.html</link>
      <pubDate>Thu, 12 May 2011 00:00:00 +0100</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2011/05/12/one-year-on-further-thoughts-on-the-gowalla-api/index.html</guid>
      <description>&lt;p&gt;Today is the one-year anniversary of a letter I put together entitled &quot;&lt;a href=&quot;http://gowallatools.com/api/&quot;&gt;Thoughts on the Gowalla API&lt;/a&gt;&quot;, a very critical look at the ever-changing API provided for the popular location-based service.  The article was picked up on &lt;a href=&quot;http://techcrunch.com/2010/05/12/gowalla-api-problems/&quot;&gt;TechCrunch&lt;/a&gt; and has been &lt;a href=&quot;http://blog.apigee.com/detail/api_design_rules/&quot;&gt;mentioned at conferences&lt;/a&gt; and events but I also like to think that it prompted a few changes. In this post, I want to revisit some of the points I made and hopefully highlight some of the changes that have come about as well showing where further improvements could be made.&lt;/p&gt;

&lt;h2&gt;History&lt;/h2&gt;
&lt;p&gt;When I first put the post together, I was running a service called Gowalla Tools and coming up against constant changes to the API and a very unresponsive developer community.  I decided to put the tools and services I was building on indefinite hiatus whilst I waited for some changes to take place.  The most important of these was putting in place a process of notifying API developers when changes were going to happen rather than making them and only occasionally sending out a notification a few days later. Fortunately this is now the case and Gowalla have assembled a fantastic team of developers who are constantly available on the &lt;a href=&quot;http://groups.google.com/group/gowalla-dev&quot;&gt;Gowalla Developers Google Group&lt;/a&gt;. The big changes really started to happen in August 2010 when &lt;a href=&quot;http://blog.gowalla.com/post/977720465/hello-3rd-party-apps-gowalla-checks-in-with-oauth&quot;&gt;Gowalla announced that their OAuth 2.0 implementation&lt;/a&gt; was now complete and you could now make secure authenticated calls including the ability to check users in at a spot (something which hadn't existed up until that point).&lt;/p&gt;

&lt;p&gt;Once OAuth 2.0 was introduced, I started to play around with the API again and launched a new service called &lt;a href=&quot;http://wallab.ee/&quot;&gt;Wallabee&lt;/a&gt; in September.  The first application was entitled &quot;&lt;a href=&quot;http://wallab.ee/apps/travel-edition/&quot;&gt;Wallabee: Travel Edition&lt;/a&gt;&quot; and allowed users to check-in using over 95% less data than the official app making it a) much faster and b) a lot cheaper when you are travelling overseas.  The app was a big success, frequently appearing in the &quot;What's Hot&quot; section of the App Store, and several of the Gowalla employees have used it whilst travelling. Over Christmas I made a number of announcements about future app plans and in March 2011 I, along with a number of contributors, launched The Wallabee Pouch. It was a new player guide, a directory of information, and home to &lt;a href=&quot;http://wallab.ee/pouch/items/directory/&quot;&gt;The Item Directory&lt;/a&gt;, the largest and most up-to-date repository of Gowalla items.  This was all made possible due to an API that no longer changed and the incredibly helpful advice provided by many of the Gowalla Developers. I'd like to personally thank &lt;a href=&quot;http://twitter.com/amcmanus/&quot;&gt;Adam McManus&lt;/a&gt; who provided a lot of advice and support whilst I was working on The Item Directory, probably the biggest drain on their API at present.&lt;/p&gt;

&lt;p&gt;I went to SXSW in March and was very privileged to meet the Gowalla team and spend some time chatting to their developers. I also listened to some incredibly powerful talks by &lt;a href=&quot;http://schedule.sxsw.com/events/event_IAP6984&quot;&gt;Josh Williams&lt;/a&gt; and &lt;a href=&quot;http://schedule.sxsw.com/events/event_IAP5756&quot;&gt;Jon Carroll&lt;/a&gt; which made me make some fundamental changes to the way I was working with Gowalla - you can read all about that on my &lt;a href=&quot;http://bendodson.com/weblog/2011/03/27/gamification-social-validation-gowalla-and-moving-on-from-wallabee-what-i-learned-at-sxsw/&quot;&gt;SXSW and Gamification post&lt;/a&gt;.  It eventually led to me handing over Wallabee to another developer so I could focus on some of my own Gowalla apps that were focussed on the story and travelling elements of the service rather than the item and game based sections, but I'll get back to this shortly.&lt;/p&gt;

&lt;h2&gt;The API&lt;/h2&gt;

&lt;blockquote&gt;&lt;p&gt;We accept that changes have to happen but these just need to be conveyed to developers in a better way. We propose that any changes be submitted to the Gowalla Developer Group at least 1 week in advance of a change so that we can update our code as necessary. We also suggest that a “version” parameter be added across the API so that legacy scripts can continue to work without changes. In this way, a developer can move to the next API version to take advantage of any new features and data but won’t risk having their hard work undone by what could be a very minor change (e.g. renaming a parameter).&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;This is probably the biggest area of improvement that the Gowalla API has undergone. This time last year, parameters were changed without consultation and code breakage was a frequent distraction. Now however, many changes are submitted to the Developer Group in advance and opinion is sought on the best ways to improve the API. This was highlighted most recently to me by Rob Mack who sent out an &lt;a href=&quot;http://groups.google.com/group/gowalla-dev/browse_thread/thread/412852f04007ab4a#&quot;&gt;incredibly detailed post about changes&lt;/a&gt; they were going to make to the Check-In API. The changes were detailed along with a timeline of when they'd go into effect (3 weeks in future) and a promise that anybody who wouldn't be able to meet the deadline would be able to get an extension if they emailed. This was followed up weekly with reminders of the impending changes. It's this kind of conversation and service that goes beyond what I had originally suggested and makes it such a pleasure to work with the API now. There have been numerous suggestions from the community that have been added to the API in recent months and responses to bugs or questions are incredibly fast.  Whilst versioning hasn't come into effect, it hasn't really needed to as any changes have been non-destructive or have had a sensible transition period.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;It may also be worth setting up a dedicated Twitter account for API changes as Foursquare has done with @foursquareapi - this would allow you to make quick posts to the community about any changes or downtime.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Whilst posts on the Developer Board have been greatly improved, I still believe that having a Twitter account for broadcasts about downtime or any major changes would be a good idea. I currently subscribe to the full emails of the board and so I can get an email whenever anybody posts something new - sometimes these are API developers asking basic questions yet sometimes they are important posts by the Gowalla devs that could easily get lost in the noise (especially if you have digests on). By having a feed that just posted notices from the Gowalla developers, visibility of changes would be greatly improved.&lt;/p&gt;


&lt;h2&gt;Cheating&lt;/h2&gt;

&lt;p&gt;I originally wrote a section about cheaters purely because the option to check-in was not available in the API despite the fact it could be done easily using a JavaScript hack on the mobile site. The main reason for not having it in the API was that it would increase the ease for cheaters to make false check-ins just to collect stamps and items. Whilst the API was eventually updated to allow check-ins, the number of people cheating the system is still very high.  A lot of trips are completed by people that haven't been to the spots and increases in check-in radius (which was a sliding scale depending on spot size and is now 5km regardless) have only exacerbated the problem. A lot of Gowalla players report these users to Gowalla via GetSatisfaction or email but there isn't any visibility on action taken. There have, however, been instances where users have been suspended for checking-in too fast, oftentimes incorrectly just on the basis of community feedback.  In my letter last year, I said:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;With regards to cheating, it should be fairly simple to ascertain if somebody is checking-in illegally as you can measure the time and distance between two spots and see if the speed is over a certain threshold (e.g. if you have checked-in at Austin and London within 2 minutes then there is obviously a problem). An automated system could monitor such things and then suspend an account giving it limited permissions (e.g. no item trading) until a Gowalla developer (or STE member) has a chance to review the account and unlock or ban the user.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;I know that this is possible as I decided to build my own system to do exactly this detection in order to stop the vigilante justice that had been seen.  However, many of the cheating accounts are private and are therefore unaccessible through the API which means Gowalla needs to tackle this problem themselves. I still believe that an automated system could work and involving the STE members would allow for a certain level of visibility on solving the issue.&lt;/p&gt;

&lt;p&gt;These issues are particularly troubling at the moment due to the launch of Gowalla Rewards, the ability to pick up items at certain locations which have some form of real world reward attached to them. This issue has been solved slightly by &lt;a href=&quot;http://wallab.ee/pouch/items/tips/&quot;&gt;a policy Gowalla put in place&lt;/a&gt; which basically limits how many items you receive based on the number of check-ins you make - whilst a good system, it did essentially pitch those players who like items against those that like the stamps and trips (again read my &lt;a href=&quot;http://bendodson.com/weblog/2011/03/27/gamification-social-validation-gowalla-and-moving-on-from-wallabee-what-i-learned-at-sxsw/&quot;&gt;post on gamification&lt;/a&gt; for more details on this) and it wasn't relayed to the community very well at all.  There is still a lot of work to be done in this area in my opinion.&lt;/p&gt;


&lt;h2&gt;Publicising&lt;/h2&gt;

&lt;p&gt;One of other items I suggested was:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Creating a directory of applications that use the API (such as Foursquare has)&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Again, this is something that hasn't happened yet but there have been some very small moves to publicise things that have been made with the Gowalla API.  On the post announcing OAuth integration, a couple of projects that used the API were mentioned and on the official Gowalla twitter feed, a couple of web apps have been mentioned (they both did the same thing about 4 months apart, but still).  However, making brief reference to 4 apps over the course of a year doesn't really promote all of the cool things that people are making. It also doesn't encourage other developers to get involved as, without promotion by Gowalla, the API feels a little like an afterthought which is a shame given the huge amount of improvement that has been made.&lt;/p&gt;

&lt;p&gt;A page highlighting some of the applications made using the API would enable new developers to see a benefit to writing apps for the service - it also enables developers to get their app across to the core audience (as most apps developed are going to be targeting users already on the Gowalla service). I'm hopeful that the Gowalla twitter account will be posting out a few more of the great 3rd party apps that people have made over the coming months.&lt;/p&gt;

&lt;h2&gt;Documentation&lt;/h2&gt;

&lt;p&gt;One of the final criticisms I had was in the documentation of the API as it was particularly sparse.  Most of the comments on the Developer Boards were about errors being returned that weren't documented anywhere or about nuances in the API calls (e.g. why can't I check-in at the same place twice within an hour?) - However, the documentation has improved dramatically over the last few months with the Gowalla team listening to feedback from developers and patching up the docs or adding new pages as requested. A particularly difficult area was the new &lt;a href=&quot;http://hub.gowalla.com/&quot;&gt;PubSubHubbub&lt;/a&gt; feature (which should really be publicised more - it's amazing) yet &lt;a href=&quot;http://gowalla.com/api/docs/pshb&quot;&gt;documentation was put up within a few days&lt;/a&gt; of a request on the boards.&lt;/p&gt;

&lt;h2&gt;Summary&lt;/h2&gt;

&lt;p&gt;Overall, the Gowalla API has improved dramatically in the past year. With a solid foundation and regular updates from developers, there is now very little risk to basing an app on the API as opposed to last year when maintenance was taking longer than development.  There are still a few areas which could use improvement, particularly around publicising of 3rd party endeavours and communicating better around misdemeanours, but on the whole I can wholeheartedly recommend the API to any developer interested in location based services. There have been a lot of new API calls created and I get the feeling that there is some very exciting stuff around the corner. I would also recommend looking into the &lt;a href=&quot;http://hub.gowalla.com/&quot;&gt;PubSubHubbub&lt;/a&gt; functionality as this puts Gowalla way ahead of its competitors by providing real-time notification of check-ins.&lt;/p&gt;

&lt;p&gt;Finally, I'd like to thank all the developers at Gowalla who have put so much time and effort into improving the API, particularly &lt;a href=&quot;http://twitter.com/therealadam&quot;&gt;Adam Keys&lt;/a&gt;, &lt;a href=&quot;http://twitter.com/andrewdupont&quot;&gt;Andrew Dupont&lt;/a&gt;, and &lt;a href=&quot;http://twitter.com/robmack&quot;&gt;Rob Mack&lt;/a&gt; who have been incredibly responsive on the Developer Boards.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Font Finder: Now available for Firefox 4 and Safari 5</title>
      <link>http://bendodson.com/weblog/2011/05/10/font-finder-now-available-for-firefox-4-and-safari-5/index.html</link>
      <pubDate>Tue, 10 May 2011 00:00:00 +0100</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2011/05/10/font-finder-now-available-for-firefox-4-and-safari-5/index.html</guid>
      <description>&lt;p&gt;Many of you will be familiar with &lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/font-finder/&quot;&gt;Font Finder&lt;/a&gt;, one of my first Firefox Extensions.  The purpose of Font Finder was to display information about the selected font within your browser including information like size, line-height, color, etc. It also went further by not only showing you the font-family stack, but also determining which one was actively being rendered on your machine (as the font you see might be different to other users depending on your installed fonts).&lt;/p&gt;

&lt;p&gt;I'm happy to announce that as of today, Font Finder is now available as a &lt;a href=&quot;http://bendodson.com/projects/browser-extensions/font-finder.safariextz&quot;&gt;Safari 5 Extension&lt;/a&gt;.  It has also been updated to be fully compatible with &lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/font-finder/&quot;&gt;Firefox 4&lt;/a&gt;.  I'm not planning on building it for any other browsers (e.g. IE9, Chrome) but if you have any suggestions for improvements to either version, please &lt;a href=&quot;http://bendodson.com/contact/&quot;&gt;get in touch&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This is just the first step in porting Font Finder to Safari 5 and I will shortly be releasing an update which makes full use of the Safari UI rather than containing everything within an alert box - I will also be adding a lot more information, particularly around CSS 3.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Portal 2 on the new iMac (10.6.6)</title>
      <link>http://bendodson.com/weblog/2011/05/04/portal-2-on-the-new-imac-10-6-6/index.html</link>
      <pubDate>Wed, 04 May 2011 00:00:00 +0100</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2011/05/04/portal-2-on-the-new-imac-10-6-6/index.html</guid>
      <description>&lt;p&gt;Today I purchased one of the brand new iMacs that were released yesterday. One of the first things I installed was Steam and Portal 2 (as I'm looking forward to playing co-operatively with a friend on Windows) but I was surprised when trying to play that it required OS X 10.6.7&lt;/p&gt;

&lt;img src=&quot;http://files.bendodson.com/old-weblog/2011/05/Screen-shot-2011-05-04-at-20.24.23.png&quot; alt=&quot;Portal 2 requires Mac OS 10.6.7&quot; title=&quot;Screen shot 2011-05-04 at 20.24.23.png&quot; border=&quot;0&quot; width=&quot;420&quot; height=&quot;122&quot; /&gt;

&lt;p&gt;This is surprising because 10.6.7 has been around for a little while now so why wasn't it on the new iMacs by default.  After trying a system update, I found that there was no update for the 10.6.6 iMacs and other people had tried the Combo Update downloadable from Apple to no avail.&lt;/p&gt;

&lt;p&gt;After downloading all of Portal 2, I decided not to give up easily and see if there was a way around it. Developers are generally lazy and so they are probably just checking for the string 10.6.6 in the system version.  As this version of 10.6.6 has all of the drivers for the new graphics card required for Portal 2, I thought there would probably be no harm in changing that system version to 10.6.7 to get past the Steam requirements. Turns out I was right!&lt;/p&gt;

&lt;p&gt;To get your copy of Portal 2 running on your new iMac, navigate to &lt;code&gt;/System/Library/CoreServices/&lt;/code&gt; - now copy the file &lt;code&gt;SystemVersion.plist&lt;/code&gt; to your desktop and open it for editing. Change the references to 10.6.6 to 10.6.7 and save. Now you'll want to delete the existing version and then copy your new file in it's place - you will need admin rights to do this.&lt;/p&gt;

&lt;p&gt;Once that's done, fire up Portal 2 - you may get the &quot;System requirements failed&quot; message but if you press &quot;Continue anyway&quot; then Portal 2 will load and be perfectly playable (at 1080p).&lt;/p&gt;

&lt;p&gt;Now, go forth and continue testing!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; when a 10.6.7 fix does come available for the new iMac, you should probably edit the &lt;code&gt;SystemVersion.plist&lt;/code&gt; file and change the references back to 10.6.6 just to make sure nothing bad happens...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[20/05/11] Update:&lt;/strong&gt; OS X 10.6.7 is now available through System Update for the new iMacs - make sure you reverse the process above before updating.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Review: Worldictionary for iOS</title>
      <link>http://bendodson.com/weblog/2011/05/01/review-worldictionary-for-ios/index.html</link>
      <pubDate>Sun, 01 May 2011 00:00:00 +0100</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2011/05/01/review-worldictionary-for-ios/index.html</guid>
      <description>&lt;p&gt;&lt;a href=&quot;http://itunes.apple.com/gb/app/worldictionary-instant-translator/id429372600?mt=8&quot;&gt;Worldictionary&lt;/a&gt; is a translation app for iPhone that allows you to use the built-in camera to detect and translate words on the go.  The only language I understand other than English and the various programming languages I've picked up is Latin, so an app to help me understand various signs and documents in foreign countries is definitely useful for me!&lt;/p&gt;

&lt;img src=&quot;http://files.bendodson.com/old-weblog/2011/05/IMG_0414.png&quot; alt=&quot;Translating from English to French&quot; title=&quot;IMG_0414.PNG&quot; border=&quot;0&quot; width=&quot;400&quot; height=&quot;600&quot; /&gt;

&lt;p&gt;When you launch the app, the camera is activated and you can instantly begin translating.  All you need to do is line up the magnifying glass with the word you want to translate and it will automatically appear at the top of the app.  The word it thinks it detects is displayed on top with the translation underneath.&lt;/p&gt;

&lt;img src=&quot;http://files.bendodson.com/old-weblog/2011/05/IMG_0411.png&quot; alt=&quot;Translation mistakes&quot; title=&quot;IMG_0411.PNG&quot; border=&quot;0&quot; width=&quot;400&quot; height=&quot;600&quot; /&gt;

&lt;p&gt;As you can see from the image above, the camera doesn't always detect words cleanly (more examples can be seen from the history panel in the bottom right corner) but it is very fast at detection so these issues don't interfere too much.  The app isn't designed to work with handwritten fonts but should work with anything in a regular font.  The example document I'm using is a polling card for the upcoming election referendum here in the UK.&lt;/p&gt;

&lt;img src=&quot;http://files.bendodson.com/old-weblog/2011/05/IMG_0416.png&quot; alt=&quot;Language selection&quot; title=&quot;IMG_0416.PNG&quot; border=&quot;0&quot; width=&quot;400&quot; height=&quot;600&quot; /&gt;

&lt;p&gt;To change the language, tap the bar at the bottom of the app which brings up a scrollable view listing an impressive number of languages to convert to and from.  These are all available by default so there is no in-app purchase for language packs as per some other translation apps.&lt;/p&gt;

&lt;img src=&quot;http://files.bendodson.com/old-weblog/2011/05/IMG_0417.png&quot; alt=&quot;Translating from English to German&quot; title=&quot;IMG_0417.PNG&quot; border=&quot;0&quot; width=&quot;400&quot; height=&quot;600&quot; /&gt;

&lt;p&gt;Once a new language is chosen, you can start translating instantly.  I was struck by how fast detection and subsequent translation was and I experienced no problems with the app such as crashing or memory problems.&lt;/p&gt;

&lt;img src=&quot;http://files.bendodson.com/old-weblog/2011/05/IMG_0418.png&quot; alt=&quot;Translation results&quot; title=&quot;IMG_0418.PNG&quot; border=&quot;0&quot; width=&quot;400&quot; height=&quot;600&quot; /&gt;

&lt;p&gt;You can tap the translated words or tap any previous translations listed on the right hand side of the app to go through to a more thorough translation detailing example usage, structure, synonyms, and definitions from the web (including services such as wikipedia and online dictionaries).&lt;/p&gt;

&lt;p&gt;Whilst the translation is good and the app does what it says, I did encounter 2 problems which may stumbling points depending on your usage.&lt;/p&gt;

&lt;p&gt;Firstly, the app only detects single words, not sentences or paragraphs both in camera mode and the manual input mode.  This might be fine for the odd word lookup but isn't terribly useful for something more involved such as a menu or road sign.  Also, without understanding sentences, words in some languages may not make sense (as many languages have words with different meanings depending on the surrounding words).  Whilst understanding full sentences is still difficult for translation algorithms, I do think the app would work better if it could at least do the per-word translation on an entire sentence so you don't have to slowly input each word individually.&lt;/p&gt;

&lt;img src=&quot;http://files.bendodson.com/old-weblog/2011/05/IMG_0424.png&quot; alt=&quot;No translation without network access&quot; title=&quot;IMG_0424.PNG&quot; border=&quot;0&quot; width=&quot;400&quot; height=&quot;600&quot; /&gt;

&lt;p&gt;The second problem is more important from my perspective but is also something that is unlikely to be fixed; you need to have internet access in order to perform translations. This is because the translation engine being used is Google Translate and therefore doesn't have offline access.  The reason this causes problems is that many people travel abroad where data roaming charges are still completely excessive (I was charged £6 per MB whilst I was in the US recently) and therefore switch their data roaming off.  The benefit of a translation app is that you can use it anywhere when you need it (e.g. translating a menu at a restaurant) and you may not have WiFi available - turning on the data roaming for translation could become an expensive habit, particularly if you haven't turned off other apps or push notifications before making the switch.  Whilst the API calls the app makes should be fairly small, I'd be more worried about forgetting to turn off data roaming after I'd used the app.&lt;/p&gt;

&lt;p&gt;Whilst these problems are present in other apps, there are some which manage to solve both of these such as &lt;a href=&quot;http://itunes.apple.com/gb/app/word-lens/id383463868?mt=8&quot;&gt;Word Lens&lt;/a&gt; which gained a lot of publicity when it first launched due to the clever way in which it uses the camera not only to translate, but also to place the translated words back into the original camera image.  It might be a more expense app with translation packs at £5.99 each, but it works offline and can translate whole sentences (in a very cool way).  Unfortunately, Word Lens only works with English and Spanish translations so is not terribly useful if you are going to France or Germany for instance.&lt;/p&gt;

&lt;p&gt;Worldictionary is a clever app with its word recognition and fast translations (depending on network speed) but its lack of sentence recognition and reliance on internet connectivity lets it down.  If you can look past these issues, then I can recommend it as a good translation tool for those times when you need a rough translation or have a need for multiple languages.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://itunes.apple.com/gb/app/worldictionary-instant-translator/id429372600?mt=8&quot;&gt;Worldictionary&lt;/a&gt; is priced at £2.99/$4.99 as is available in the App Store.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; I was given a free copy of this application to review. I tested it on an iPhone 4 running iOS 4.3.2.  If you have an app for iOS that you would like me to review, please &lt;a href=&quot;http://bendodson.com/contact/&quot;&gt;contact me&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>iTunes TV Artwork Script</title>
      <link>http://bendodson.com/weblog/2011/04/13/itunes-tv-artwork-script/index.html</link>
      <pubDate>Wed, 13 Apr 2011 00:00:00 +0100</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2011/04/13/itunes-tv-artwork-script/index.html</guid>
      <description>&lt;p&gt;I have a large amount of TV shows stored in iTunes but not all of them were purchased there, particularly as you can buy a Blu-Ray of many TV shows for a fraction of the price of a Standard Definition download. The only issue I've had is that I lacked artwork for each of these shows. In the past, I'd just screenshot the 200px or so image that showed up in the iTunes store and use that, but since getting an Apple TV (which displays the artwork at a much larger size) I decided I needed a better solution. After a weekend of sorting out my iTunes library, I decided to take a look at the &lt;a href=&quot;http://www.apple.com/itunes/affiliates/resources/documentation/itunes-store-web-service-search-api.html&quot;&gt;iTunes Search API&lt;/a&gt; and see if I couldn't find a way of getting that artwork. They provide a 100x100px thumbnail as part of the API response, but fortunately (with some URL experimentation) I found a way to get the full 600x600px artwork.   
You can &lt;a href=&quot;http://bendodson.com/projects/itunes-tv-artwork/&quot;&gt;find the working version on my projects page&lt;/a&gt; but I thought I'd share the code briefly below so you can see how it's done and adjust it for any other media available on iTunes (e.g. movies, music, apps).&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;php&quot;&gt;&lt;span class=&quot;cp&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$search&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$_GET&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;show&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$search&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;nv&quot;&gt;$url&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;http://ax.itunes.apple.com/WebObjects/MZStoreServices.woa/wa/wsSearch?term=&amp;#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;urlencode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$search&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;&amp;amp;country=us&amp;amp;entity=tvSeason&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;nv&quot;&gt;$obj&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;json_decode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;file_get_contents&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
	&lt;span class=&quot;nv&quot;&gt;$results&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;foreach&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$obj&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;results&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;nv&quot;&gt;$data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
		&lt;span class=&quot;nv&quot;&gt;$data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;url&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;str_replace&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;100x100&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;600x600&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$result&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;artworkUrl100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
		&lt;span class=&quot;nv&quot;&gt;$data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;title&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$result&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;collectionName&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;nv&quot;&gt;$results&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;/pre&gt;

&lt;p&gt;As you can see, it makes a fairly standard API call to the US iTunes store (as that has far more content than any of the others) which returns a lot of information about the particular entity (in this case a TV series).  However, the artwork URL provided is only good for a 100x100px image so I us  a basic &lt;code&gt;str_replace&lt;/code&gt; to change that to 600x600 (the only other size I've found that works is 200x200).  Once that's done, I grab the title and stick it all in an array to loop through later - simple!&lt;/p&gt;
&lt;p&gt;Hopefully this script will be of some use to you - it's certainly made my library look a lot nicer when browsing on an iPad or an Apple TV!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Gamification, Social Validation, Gowalla, and moving on from Wallabee - What I learned at SXSW</title>
      <link>http://bendodson.com/weblog/2011/03/27/gamification-social-validation-gowalla-and-moving-on-from-wallabee-what-i-learned-at-sxsw/index.html</link>
      <pubDate>Sun, 27 Mar 2011 00:00:00 +0000</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2011/03/27/gamification-social-validation-gowalla-and-moving-on-from-wallabee-what-i-learned-at-sxsw/index.html</guid>
      <description>&lt;p&gt;Since childhood, I’ve been a huge fan of maps and the concept of location. I used to spend hours drawing maps of the neighborhood where I lived and reading books and magazines about different countries and places around the world. Much later, I became a web developer and would spend a lot of time playing with the Google Maps APIs and creating mashups with the FireEagle service.  When the iPhone came out, I was hooked; not only for the simplistic UI (I could write an entire blog on how less is more with UI) but by the fact that your location was always in the palm of your hand.  Once the iPhone SDK came out, I switched careers purely because location-based apps were the stuff of my dreams and that’s what I wanted to spend my time on.   
Earlier this month, I headed to Austin for my first experience of SXSW.  Whilst many people (myself included) went for the talks and networking opportunities, I was mainly interested in meeting the people behind Gowalla, a location-based service I’ve spent a lot of time with over the past 3 years.  In Austin, I was staying with a group of friends who had come not for SXSW, but to collect the rare items and pins that would be available through Gowalla.&lt;/p&gt;

&lt;p&gt;The purpose of this blog post is to explain what I’ve learned about the future of location-based services both from talking to Gowalla employees, and watching how people play Gowalla in the real world.&lt;/p&gt;

&lt;h3&gt;Gamification and Social Validation&lt;/h3&gt;

&lt;p&gt;One of the key buzzwords of SXSW 2011 was “gamification” which is loosely defined as:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;The use of game play mechanics for non-game applications, particularly consumer-oriented web and mobile sites, in order to encourage people to adopt the applications&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;In the same way that apps add “tweet this” and “facebook that” buttons in order to tick the box for social media, it seems that the future is based around the idea of adding a game layer purely because other apps have one.  These mechanics tend to be of the badge variety which works by giving the user digital badges for reaching certain goals.  Some go further by giving you physical things (e.g. stickers) rather than digital items.&lt;/p&gt;

&lt;p&gt;In addition to gamification, there is also the proliferation of the “check in” model of thinking.  This is the idea that you can now check in to anything be it a location (Gowalla, Foursquare), TV shows (Miso, Glue), Books (GoodReads), or just about anything else you can think of.  When the models are combined with social networks like Twitter of Facebook, it seems that most applications are generally designed to do 2 things; either tell people what you are doing or show-off to other people about how good you are at a digital task.&lt;/p&gt;

&lt;p&gt;For me, the best talk at SXSW was by&lt;a href=&quot;http://twitter.com/jw&quot;&gt; Josh Williams&lt;/a&gt;, CEO of &lt;a href=&quot;http://gowalla.com/&quot;&gt;Gowalla&lt;/a&gt;, in which he discussed the future of location-based services in a talk entitled “&lt;a href=&quot;http://www.slideshare.net/firewheel/where-are-we-going-sxsw-2011&quot;&gt;Where are we going&lt;/a&gt;”.  The candid presentation talked a lot about where services had gone wrong but was also self-admittedly contradictory (especially when you look at the Gowalla service overall which I’ll come onto later).  However, he had one key slide which I think resonated with everybody in the room:&lt;/p&gt;



&lt;blockquote&gt;&lt;p&gt;Social validation is the primary driver for activity on today’s web&lt;/p&gt;&lt;/blockquote&gt;



&lt;p&gt;This is a profound idea that suggests the reason that people play with game layers, send tweets, check in on apps, and use social networks and services is purely based on egotism; we do things not because we want to, but because we want to be accepted by society. This is not a new idea, but it is one that I think a lot of people have been blind to for a long time.  With one sentence, Williams had made me uninstall a number of apps on my phone and take a fundamental look at the projects I was working on and the people I was interacting with.&lt;/p&gt;

&lt;p&gt;Another key quote from the talk was:&lt;/p&gt;



&lt;blockquote&gt;&lt;p&gt;Game mechanics are subservient to the usefulness of a service&lt;/p&gt;&lt;/blockquote&gt;



&lt;p&gt;Whilst this one didn’t hit me with as much impact as the piece on social validation, it’s something I’ve not been able to stop thinking about over the past few weeks. Social validation is the main reason people use a game mechanic but what is the driver for playing a regular game, watching TV, or reading a book? After thinking on it, I’ve concluded that the driver for offline tasks tends to be story, whilst online we tend to want to  share our story.  By way of example, I might watch Mad Men as I enjoy the plot, but I’ll tweet about it because I want social validation.&lt;/p&gt;

&lt;p&gt;This describes the correlation between offline and social networking well enough, but what about game mechanics? These were created in order to incentivise a story action but tend more often to promote the idea of social validation.  An interesting game mechanic to look at would be something like Xbox Achievements or PS3 trophies. These were designed to extend the life of a game by adding extra challenges that weren’t part of the main storyline yet have now evolved into an exercise in social validation.  People will now play games not because they are interested in the game itself but because they want a higher gamerscore. I’ve seen (and been a part of) this idea myself and it’s only when I think about it that I realise that the best games I’ve played are generally the ones which don’t have achievements. Games like Zelda and Final Fantasy are good because of the story and core mechanic, not because they improve my gamerscore.  I’m not saying that all achievements are bad, but I do feel that a game like Assassins Creed II is detracted from when players are performing tasks such as collecting 100 feathers for the sole reason of improving their gamerscore.&lt;/p&gt;

&lt;p&gt;Whilst console games can have both this social validation aspect and a good storyline, a worrying trend with most new game mechanics and online games is that they don’t have the story portion at all.  For instance, what is the point of Farmville?  There is no ending, there is storyline, it is simply a game based around social validation.  So it is for services like PackRat (made by the same people as Gowalla) in which you can collect items simply for the purpose of showing other people.  Both these games (and others) have an element of a game currency (for purchases of items in the game world) which can be topped up with real money.  You therefore end up actually paying real money to purchase items in a digital world for the sole purpose of showing them off to other people.  I eventually stopped playing PackRat when I came to the realisation that I was spending money and time (sometimes jumping up when new items came out so I could be the first to get one) on a service which actually had no benefit.  I maintain that the reason for this is that there is no ending - users might spend time collecting all the Pokémon on a Nintendo DS as they know there is an ending, but with Farmville, PackRat, et al., the whole thing is continual.&lt;/p&gt;

&lt;h3&gt;Gowalla: A game of two halves&lt;/h3&gt;

&lt;p&gt;So, what of location-based services?  Gowalla has a difficult task ahead of it currently as it is walking a line of two different concepts; the idea of exploring the world and the idea of collecting items.  I believe these can be defined as story and social validation respectively. &lt;/p&gt;

&lt;p&gt;Gowalla have used variations of “explore the world” since they first started and it is one of the key things that drew me to them.  With their beautiful artwork, it was easy to imagine that your travels were like those in the past where travelers would place a sticker on their suitcase from each place they visited.  The concept of a digital passport imitating the real world was exciting and they have done a great job of extending this with featured spots and trips.  More recently, highlights and notes have allowed users to show where there favorite places are both publicly and privately and encourage other people to visit those locations.  One of the most interesting pieces they are working on is in telling the “story” of your travels.  This has begun with them joining your flights together and showing the distance (and connecting flights if applicable) when you check-in at 2 or more airports in a row.  They used this feature to award a special pin for those that had travelled to SXSW when they landed back at their originating airport (so I got mine at Heathrow after travelling back from Austin airport).  Williams has been mentioning for a long time that these flight updates are “just the beginning” and I can envisage a future in which they can build up a digital holiday keepsake for you (complete with photos, highlights, check-ins, and tweets) by using this information.&lt;/p&gt;

&lt;p&gt;However, the other side of Gowalla is one based on a game layer.  Items have long been a sore point to many users (including myself for a time) as they were one of the key features that differentiated Gowalla from other location based services (such as Foursquare).  As most new users were coming from PackRat, it is easy to see why items were such a key part to many peoples experience.  However, like the never-ending gamification I described earlier, there is no ending for items.  Once you have them all, you don’t get anything as a new one might be released next week.  Therefore there is no end and no purpose to collecting them other than to show off to other people for social validation.&lt;/p&gt;

&lt;p&gt;Gowalla have been slowly trying to lessen the importance of items within the game in order to focus on story, but as they have done so the community has been more and more vocal about the changes.  One of the changes was to make it so that checking in to more than 5 places within an hour would trigger a switch preventing you from receiving items for the next 24 hours.  This was at odds with the “collect them all” aspect of items which require checking in all over the place in order to get them but was done in the interest of making people check-in where they are right now rather than checking-in everywhere within 5km (the current distance you are allowed to check-in from your actual location) just to get items.&lt;/p&gt;

&lt;p&gt;Unfortunately, I was privy to many embarrasing moments at SXSW where the Gowalla team were subjected to people complaining about items, check-ins, and the other aspects that I’m sure Gowalla don’t really care about (as they don’t build on the story mechanic).  I saw some of the most childish outbursts I’ve ever seen in my life over something as simple as a digital item and it really put me off items as a whole.&lt;/p&gt;

&lt;p&gt;In my opinion, Gowalla need to cut items lose in order to really grow as a service.  Judging by the complaints on their GetSatisfaction pages, I’d say that the vast majority of complaints are about the game mechanic rather than the overall service and its story elements.  If they were to cut off the game mechanic, Gowalla would lose a lot of users, but they’d be able to focus on the key part of the service; “seeing the world”.  This in turn would build a better product and allow them to regain users who share their vision rather than trying to maintain the careful balance they have at present.&lt;/p&gt;

&lt;p&gt;My current belief is that items are slowly being fashioned into rewards, a feature that was launched at SXSW.  With rewards, some of the digital items you find are actually usable as promotional offers (so you might get a “free taco” item which allows you get a free taco when you check-in at certain locations).  If they removed the non-reward items, they could have a social layer which has a purpose and isn’t tied so intrinsically with the limitations of exploration.  By that, I mean that people would be encouraged to check-in only where they are currently, and by doing so they may receive one of these promotional rewards.  Once a reward is used, it should then be archived as it then serves as a history of the promotions you’ve earned (which are a story in themselves).  By doing this, you no longer have a part of the service which encourages multiple check-ins for items which have no value beyond social validation.&lt;/p&gt;

&lt;p&gt;I have no idea if this is there current plan, but it seems a sensible way forward.&lt;/p&gt;

&lt;h3&gt;Wallabee: A project based on Gowalla items&lt;/h3&gt;

&lt;p&gt;If you’re familiar with my projects, you’ll know of a service I created called &lt;a href=&quot;http://wallab.ee/&quot;&gt;Wallabee&lt;/a&gt;.  It’s a website (and set of apps) that build on the Gowalla API and basically dishes out a lot of information about items in particular.  I originally created it as I wanted an easy way of finding out which types of spots items appeared at.  Items were a fun feature at the start of Gowalla and I would travel to whole new places just to pick up an item - I used to think I was doing this because I wanted items but I eventually realised that I was enjoying having a reason to go to new places and “see the world”. Once I made the site public, it gathered a large following and has grown into various things since.  There are apps, item hunters, tools to show Flickr photos at different spots, and a new guide which introduces players to key Gowalla concepts (as Gowalla itself has no tutorial).  However, the most popular things every time have been things to do with items (which is confirmed by a new feature I built recently called the Item Directory which shows people where every item can be found in real time).&lt;/p&gt;

&lt;p&gt;After SXSW and thinking on both the attitudes of people I’d seen and the talks I’d heard, as well as mulling over everything I’ve said above with regards to social validation, gamification, and the future of Gowalla, I decided that I just didn’t want to do this anymore.  I’ve been working on Wallabee in its various incarnations for two and a half years and it wasn’t until I took a step back that I realised everything I was doing was based on items.  I’m not interested in Gowalla items. I haven’t even been actively trying  to collect them myself for the past year (yet I seem to have got them all just because of my slow check-in rate) so why am I building free apps based around them? I realised that I was doing it not because I wanted to, but because it was what most of the followers I’d gained (by starting with item-based tools) were asking for.&lt;/p&gt;

&lt;p&gt;I’ve therefore decided to stop working on Wallabee and instead focus on building location-based apps that extend the story aspects of travel rather than the gamification aspects.  If you’re a Wallabee user, then you’ll want to&lt;a href=&quot;http://wallab.ee/pouch/2011/03/27/moving-on-from-wallabee/&quot;&gt; read my post on the Wallabee site about how this affects you&lt;/a&gt;, but basically I’m handing the site over to another developer who is interested in the gamification layer and in building upon the brand I’ve created.&lt;/p&gt;

&lt;p&gt;I will still be using the Gowalla API and the Gowalla service as I think it shows great potential and is a genuinely exciting location-based service.  I’ll be doing this under my own name rather than the Wallabee brand, however, and the apps will mostly be of a paid nature.  This begins soon with a completely new app which I’ll be releasing shortly.&lt;/p&gt;

&lt;h3&gt;To the future&lt;/h3&gt;

&lt;p&gt;This blog post ended up being about five times longer than I intended but I hope it gives you an insight into what I think about location-based services moving forward as well as some of the social issues around game mechanics.  To finish, I’d like to take one more quote from Josh Williams talk at SXSW:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Stay true to your vision&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;I lost track of my vision when I started developing tools that I wasn’t using myself.  I’m looking forward to returning to my vision by creating new apps that will help people explore the world around them.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Mobile OS Updates: Android vs iOS</title>
      <link>http://bendodson.com/weblog/2011/02/11/mobile-os-updates-android-vs-ios/index.html</link>
      <pubDate>Fri, 11 Feb 2011 00:00:00 +0000</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2011/02/11/mobile-os-updates-android-vs-ios/index.html</guid>
      <description>&lt;p&gt;Over the last couple of months, I've been using two competing phones day-today; a Nexus S (Android) and an iPhone 4 (iOS).  Whilst there are many differences and similarities, one of the things I want to talk about today is the different ways in which they deal with updates to the core operating system.  System updates are a crucial part of the mobile experience - sometimes they offer major new features but they are usually minor updates to deal with bug fixes.  So how do Apple and Google deliver their system updates?&lt;/p&gt;
&lt;h3&gt;Android&lt;/h3&gt;

&lt;p&gt;The Android platform updates itself via an &quot;over-the-air&quot; system which appears to rely on individual carriers to push out system updates.  Due to the large number of different devices, certain updates will only appear for certain phones and this fragments further by region and carrier.  For example, Android 2.3.3 came out 2 days ago and only runs on the Nexus S at present - whilst a number of customers in the US have received the update, my Nexus S is still refusing to detect an update from 2.3.2 leaving me to conclude that it is waiting for my carrier to push it out.  However, when an update does appear, the process is very slick.  A notification appears to let you know you have an update including details of what this adds and the size (which for minor updates tends to be a couple of MB).  One tap starts the download process and, once complete, the phone reboots and you're up and running.  At no point do you need to plug into a computer or even connect to a wireless network. It's very impressive.  However, the lack of cohesive strategy on when updates will appear and on what devices they will work on causes the whole process to be a bit of a disappointment, especially when you're waiting on a major bug fix or new feature.&lt;/p&gt;

&lt;h3&gt;iOS&lt;/h3&gt;

&lt;p&gt;The iOS update system is very different.  Each update requires you to plug your iPhone into iTunes where an update will then download and sync to the phone.  Each update includes the entire OS, rather than an incremental update, so is typically around 450MB (depending on device).  This takes a long time to download but then takes about the same time again to install onto the device.  The advantage to this process is that if something goes wrong you can restore from a backup immediately (whereas on an Android phone in the wild you'd be stuck without a phone).  Also, when an update is available, it is generally available globally within 2 hours of release and there is a button you can press to check for updates manually.  Apple also post a direct download link on their support boards so it is generally fairly easy to get an update regardless of your location or carrier.  However, the lack of an over-the-air facility and the massive downloads are very tedious.&lt;/p&gt;

&lt;h3&gt;Update Statistics&lt;/h3&gt;

&lt;p&gt;When you look at the two download mechanisms, one would expect that Android users would update their phones more frequently than iOS users, particularly as the update is delivered directly to the device.  However, the lack of support for devices and the requirement for carriers to approve updates means that only 0.8% of all Android users are currently running OS 2.3, with 57.6% on 2.2, 31.4% on 2.1, and the rest on pre 2.* software.  It is difficult to contrast fairly with iOS as Apple don't release breakdown usage stats, but by looking at the usage figures the major apps are publishing you can get an idea.  The number of users running iOS 4.* is around 90% with over 50% on the latest build of iOS 4.2 - there are only 10% running the previous generation family of 3.x and these are most likely users on the original iPhone and iPod Touches that aren't able to upgrade to iOS 4.0&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Android Figures accurate as of Feb 2nd, 2011 (&lt;a href=&quot;http://en.wikipedia.org/wiki/Android_(operating_system)#Usage_share&quot;&gt;from Wikipedia&lt;/a&gt;)&lt;/strong&gt;&lt;br&gt;
Android 2.3 (Gingerbread): 0.8%&lt;br&gt;
Android 2.2 (Froyo): 57.6%&lt;br&gt;
Android 2.0/2.1 (Eclair): 31.4%&lt;br&gt;
Android 1.6 (Donut): 6.3%&lt;br&gt;
Android 1.5 (Cupcake): 3.9%&lt;br&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;iOS Figures based on &quot;Bump&quot; application as of Jan 14th, 2011 (&lt;a href=&quot;http://www.quora.com/What-proportion-of-all-iPhone-owners-use-iOS4-*-today&quot;&gt;from Quora&lt;/a&gt;)&lt;/strong&gt;&lt;br&gt;
iOS 4.2.1: 52.89 %&lt;br&gt;
iOS 4.2: 0.09 %&lt;br&gt;
&lt;br&gt;
iOS 4.1: 27.50 %&lt;br&gt;
&lt;br&gt;
iOS 4.0.2: 3.36 %&lt;br&gt;
iOS 4.0.1: 2.95 %&lt;br&gt;
iOS 4.0: 2.94 %&lt;br&gt;
&lt;br&gt;
iOS 3.2.2: 0.49 %&lt;br&gt;
iOS 3.2.1: 0.07 %&lt;br&gt;
iOS 3.2: 0.10 %&lt;br&gt;
&lt;br&gt;
iOS 3.1.3: 6.43 %&lt;br&gt;
iOS 3.1.2: 2.52 %&lt;br&gt;
iOS 3.1.1: 0.10 %&lt;br&gt;
iOS 3.1: 0.21 %&lt;br&gt;
&lt;br&gt;
iOS 3.0.1: 0.10 %&lt;br&gt;
iOS 3.0: 0.22 %&lt;br&gt;
&lt;br&gt;
iOS 2.2.1: 0.02 %&lt;br&gt;
iOS 2.2: 0.00 %
&lt;/p&gt;

&lt;h3&gt;Conclusions&lt;/h3&gt;

&lt;p&gt;I'm still keenly waiting for my update to Android 2.2.3 as it adds, amongst other things, a new feature which enables the NFC chip in the Nexus S to write to tags as well as read from them (something that should have been there from the start in my opinion).  However, until my carrier pushes it out, I have to wait whilst other developers on US carriers get a head start.  This would be fine for the average user normally, but I fail to understand why Google aren't hosting a manual update?  An over-the-air update is convenient, but if there is a major bug fix then you should be able to download the update manually and do a tethered sync at the same time that Google pushes the update live.&lt;/p&gt;

&lt;p&gt;The iOS system seems more archaic in that the updates are massive and you need to manually update, but the way in which Apple publicise the updates seems to ensure that users are updating.  Whilst the statistics above aren't wholly reliable, it shows a trend that users are aware of iOS updates and willing to plug in and upgrade. From my own anecdotal evidence, I've seen similar high numbers of upgrade take-up with many non-technical people in my family running the latest version of iOS without any help to do it.&lt;/p&gt;

&lt;p&gt;The way that Apple has done this better is that they a) publicise a new release (going to &lt;a href=&quot;http://android.com/&quot;&gt;android.com&lt;/a&gt; shows nothing about 2.3.3 aside from a blog post on the developer board directing you to download the SDK) and b) have a &quot;check for updates&quot; button that you can click when you hear that an update is available.  The Nexus S has a &quot;System Updates&quot; section within &quot;Settings&quot; but this only shows updates you've already been told about rather than forcing an update check.  From searching around the internet this afternoon looking for the update, I found a number of posts extolling the virtues of dialling &lt;strong&gt;*#*#2432546#*#*&lt;/strong&gt; (which is *#*#checkin#*#*) which forces the device to do a checkin with your carrier and should push any updates that are waiting to you.  This is not an update system for the casual user!&lt;/p&gt;

&lt;p&gt;Furthermore, Apple have unified their product line so that a new iOS update is immediately able to run on the iPad, iPod Touch, iPhone, and now the Apple TV.  There are certain devices which are excluded (e.g. the original iPhone and original iPod Touch) but these are well highlighted.  With Android, I have no idea which phones can or can't update and if there are technical limitations for this (as with the iOS updates) or simply the carriers not being bothered.  From &lt;a href=&quot;http://androidspin.com/2011/01/12/breaking-t-mobile-internals-confirm-samsung-is-holding-the-android-world-hostage/&quot;&gt;some reports&lt;/a&gt;, it seems that the carriers are loathe to push out functional updates as they detract away from new products they are selling...&lt;/p&gt;

&lt;p&gt;Overall, I think Apple needs to take some of the improvements in updating that Android has made such as pushing out incremental updates rather than forcing you to redownload the OS, and allowing you to update the OS without connecting to iTunes (even if this is only over Wi-Fi).  However, the major problem with Android is that it is stitched up with mobile carriers, something the iPhone broke away from.  When this extends to critical bug fixes, then it is the end user that suffers.  Apple needs to take some cues from Android in terms of implementation, but Google needs to take back more &quot;openness&quot; from the carriers if they are to provide a sufficient update system.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Review: WorldCard Mobile for Android and iPhone</title>
      <link>http://bendodson.com/weblog/2011/01/23/review-worldcard-mobile-for-android/index.html</link>
      <pubDate>Sun, 23 Jan 2011 00:00:00 +0000</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2011/01/23/review-worldcard-mobile-for-android/index.html</guid>
      <description>&lt;a href=&quot;http://worldcard.penpowerinc.com/product.asp?sn=242&quot;&gt;WorldCard Mobile&lt;/a&gt; is one of many applications that allows you to scan in a business card and have the details automatically loaded into your contacts.  I haven't used one of these kinds of applications in a long time and so I jumped at the chance to test one when a review copy was sent to me.   
&lt;img src=&quot;http://files.bendodson.com/old-weblog/2011/01/menu-300x500.png&quot; alt=&quot;&quot; title=&quot;WorldCard Mobile Menu Screen&quot; width=&quot;300&quot; height=&quot;500&quot; class=&quot;size-medium wp-image-485&quot; /&gt;

The opening screen is fairly straightforward with the option to start scanning either by taking a picture with the camera or using a photo from your library.  There is also an &quot;Exit&quot; button which I disagree with from a UI point of view as that is the point of the physical home button surely?  I'm probably being overly harsh as that kind of thing is prohibited by Apple and so I don't come across it much when looking at iOS apps, but I generally frown upon any duplication of standard controls with your own versions (for example, websites that have &quot;back&quot; buttons - that's what the standard browser &quot;back&quot; button is for!)

Anyway, I had a business card for one of my friends who works in Australia so I decided to give that a try by using the Camera feature.  This loads up a standard camera control and allows you to take your photo.

&lt;img src=&quot;http://files.bendodson.com/old-weblog/2011/01/card-capture-300x500.png&quot; alt=&quot;&quot; title=&quot;WorldCard Mobile - Capture&quot; width=&quot;300&quot; height=&quot;500&quot; class=&quot;size-medium wp-image-486&quot; /&gt;

Once captured, you can zoom into the image, rotate it, and choose the correct language from a choice of seven; English, French, German, Italian, Spanish, Portuguese, and Dutch.  Pressing the &quot;Recognize&quot; button will then fire up the OCR system that ran in under 1 second on my Nexus S.

&lt;img src=&quot;http://files.bendodson.com/old-weblog/2011/01/capture-300x500.png&quot; alt=&quot;&quot; title=&quot;WorldCard Mobile - Captured Information&quot; width=&quot;300&quot; height=&quot;500&quot; class=&quot;size-medium wp-image-487&quot; /&gt;

As you can see, the captured data is incredibly accurate.  The only problem was with the word &quot;Lisa&quot; which came out as &quot;Usa&quot; but that is partially due to the closeness of the letters on the business card and me not taking a picture close enough.  I was particularly impressed with the intelligent way in which it parsed the data enabling it to set the fax numbers correctly as well as building the company name from the logo and footer and correctly picking out the job title.

&lt;img src=&quot;http://files.bendodson.com/old-weblog/2011/01/edit-300x500.png&quot; alt=&quot;&quot; title=&quot;WorldCard Mobile - Edit Contact&quot; width=&quot;300&quot; height=&quot;500&quot; class=&quot;size-medium wp-image-488&quot; /&gt;

Editing any information that wasn't correct is very easy with a standard editing dialogue.  I quickly fixed the name and saved before then pressing the export button.  This sends the contact information into your devices address book.  As I already had contact information for this person (pulled in automatically from FaceBook), it simply updated the existing record with the new work related information without any prompting.

Overall, I'm incredibly impressed with this app and the very fast and accurate OCR software built into it.  If you are frequently given business cards, I would highly recommend it as a quick and efficient way of storing them.

WorldCard Mobile costs $5.99 and is available on the Android MarketPlace.  There are other versions available at a higher price for recognising Japanese, Chinese, and Korean text.  You can find more details at &lt;a href=&quot;http://worldcard.penpowerinc.com/&quot;&gt;http://worldcard.penpowerinc.com/&lt;/a&gt;

&lt;strong&gt;Disclosure:&lt;/strong&gt; I was given a free copy of this application to review. I tested it on a Nexus S running Android 2.3.  If you have an app for iOS or Android that you would like me to review, please &lt;a href=&quot;http://bendodson.com/contact/&quot;&gt;contact me&lt;/a&gt;.

&lt;strong&gt;Update:&lt;/strong&gt; WorldCard were kind enough to give me a review copy of their app for iPhone as well.  The interface is pretty much the same with very similar functionality although I did notice that the iPhone version allowed you to review your imported cards within the app (rather than just exporting them to the address book as on Android).  However, the recognition quality didn't seem to be as impressive as the Android version with several errors being made compared to the one basic error on the Android app.  I'm not sure if this is something to do with the code or with the iPhone hardware (although the tap to focus made me think the iPhone would function better) but for now I'll be using my Nexus S to do any business card recognition.

&lt;img src=&quot;http://files.bendodson.com/old-weblog/2011/01/IMG_0242-333x500.png&quot; alt=&quot;&quot; title=&quot;WorldCard Mobile for iPhone&quot; width=&quot;333&quot; height=&quot;500&quot; /&gt;
</description>
    </item>
    
    <item>
      <title>Enabling any HTML5 Video to work over AirPlay</title>
      <link>http://bendodson.com/weblog/2011/01/13/enabling-any-html5-video-to-work-over-airplay-e-g-vimeo/index.html</link>
      <pubDate>Thu, 13 Jan 2011 00:00:00 +0000</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2011/01/13/enabling-any-html5-video-to-work-over-airplay-e-g-vimeo/index.html</guid>
      <description>&lt;p&gt;It's taken a little while longer than I expected to but I've managed to put together a script to make any HTML 5 video playable through Safari on the iPad.  With the advent of iOS 4.3, Apple are now allowing websites to add a special tag to their video markup in order to enable video streaming (as with the current 4.2 version you only get audio streaming).  However, with one simple JavaScript bookmarklet, you can now enable AirPlay video for any website.   
First of all, you'll need to save the following bookmark - the best way is to save the link below as a bookmark on your computer and then sync it to your iPad via iTunes or MobileMe: &lt;strong&gt;&lt;a href=&quot;javascript:d=document,e=d.createElement('script');e.src='http://bendodson.com/bookmarklets/ios-airplay.js?'+(new%20Date()*1);void(d.body.appendChild(e));&quot;&gt;HTML5 AirPlay Bookmarklet&lt;/a&gt;&lt;/strong&gt;.  Alternatively, bookmark this page on your iPad and then copy the text below:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;javascript&quot;&gt;&lt;span class=&quot;nx&quot;&gt;javascript&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;createElement&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;script&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;http://bendodson.com/bookmarklets/ios-airplay.js?&amp;#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;appendChild&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;You now need to edit the bookmark you saved for this page and paste the code above into the URL (you'll probably want to rename it as well).&lt;/p&gt;

&lt;p&gt;Once the bookmark is saved, you just need to go to any HTML 5 video (such as cnn.com or tvcatchup.com) online and start playing it.  You'll notice if you look at the AirPlay window that you can only stream audio.  If you now load the bookmark, the video should disappear, and then come back with AirPlay now enabled for video.  This short video below will demonstrate the process a little better:&lt;/p&gt;

&lt;iframe src=&quot;http://player.vimeo.com/video/18730809?title=0&amp;amp;byline=0&amp;amp;portrait=0&amp;amp;color=ffffff&quot; width=&quot;500&quot; height=&quot;375&quot; frameborder=&quot;0&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;So how does it work?  To get AirPlay to send a video stream in Safari, you need to add the attribute &lt;code&gt;x-webkit-airplay=&quot;allow&quot;&lt;/code&gt; to the &lt;code&gt;video&lt;/code&gt; tag.  I assumed that by adding this to an existing video via JavaScript then it would automatically work.  However, Apple have been slightly clever and ignore any parameters you add via JavaScript.  So, I instead use JavaScript to add the new attribute before cloning the video, removing it from the DOM, and then re-adding it.  This re-addition to the DOM seems to trigger something in Safari which causes it to re-read the AirPlay attribute and allow you to stream the video.  Please note that this will only work with iOS 4.3 on the iPad with iOS 4.3 on the Apple TV.  If you try and stream to an Apple TV running older software, Safari will crash.&lt;/p&gt;

&lt;p&gt;This is currently in a very rough stage yet so far has been tested and works with vimeo.com as well as native HTML 5 video on websites such as apple.com - it doesn't work with any HTML 5 video wrapped in a custom skin (e.g. the BBC iPlayer) but who knows what will be possible in the future.  If you have any additions or improvements, please &lt;a href=&quot;http://bendodson.com/contact/&quot;&gt;get in touch&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; A few people have contacted me about embedded videos such as the one on this page. Unfortunately, with Vimeo at least, these don't work as they are packaged up in an iFrame rather than being native &lt;code&gt;&amp;lt;video&amp;gt;&lt;/code&gt; content.  JavaScript isn't able to access the contents of an iFrame from a different domain due to the cross-domain security policy.  If videos are embedded natively, then they'll play fine, but for iFrame content you'll need to go to the original website.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; This workaround is still functioning in iOS 4.3 beta 2.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; And it is still working in iOS 4.3 beta 3.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; And finally, this works in the publicly available version of iOS 4.3 - enjoy!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; I've altered the article slightly as vimeo.com is now adding the AirPlay functionality automatically to their website (so I've changed the examples given). I've also added a copy-paste section of code as that may be easier for getting the bookmarklet onto your iPad.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; I've taken a look at using this on iOS 5.0 beta 1 but so far the AirPlay functionality isn't working well. This is more likely an issue with the beta (which is fairly buggy).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; iOS 5 has changed the defaults for how AirPlay works. This means that all online video is now classed as AirPlay enabled (unless the content provider opts out) making this bookmark now redundant.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>iOS 4.3</title>
      <link>http://bendodson.com/weblog/2011/01/12/ios-4-3/index.html</link>
      <pubDate>Wed, 12 Jan 2011 00:00:00 +0000</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2011/01/12/ios-4-3/index.html</guid>
      <description>&lt;p&gt;As I &lt;a href=&quot;http://bendodson.com/weblog/2011/01/11/thoughts-on-the-verizon-iphone-4/&quot;&gt;predicted yesterday&lt;/a&gt;, iOS 4.3 has now become available for developers with the hotspot functionality demoed on the Verizion iPhone 4 now available to all.  It works by replacing the previous &amp;quot;Internet Tethering&amp;quot; functionality with everything being included under one banner.  This means you can now tether your iPhone via Bluetooth, USB, or WiFI (along with 5 other devices).  The carrier support is exactly the same as for internet tethering so if you are already paying for that (or get it for free), then you will be able to use the new hotspot functionality free of charge.&lt;/p&gt;
&lt;img src=&quot;http://files.bendodson.com/old-weblog/2011/01/IMG_0161-333x500.png&quot; alt=&quot;&quot; title=&quot;iOS 4.3 Personal Hotspot&quot; width=&quot;333&quot; height=&quot;500&quot; class=&quot;aligncenter size-medium wp-image-467&quot; /&gt;
&lt;p&gt;Unfortunately, I can't demo the hotspot at the moment as I don't currently pay for tethering.  The reason for this is that my carrier (O2) charges an extra £7.50 per month for an extra 500MB to use for data tethering.  You can't use the data allowance you already have.  This is in stark contrast to Android in which you can use the device as a Wi-Fi hotspot with no charge at all - it just shares your existing connection.  I was rather hoping that Apple would move away from this money-grabbing opportunity for the carriers but it seems not. &lt;/p&gt;
&lt;p&gt;In addition to this change, there is also an update for AirPlay relating specifically to the Apple TV.  As I tweeted previously, you could enable AirPlay video streaming in 3rd party apps due to a private method on the MPMoviePlayerController class.  However, Apple have now made this public with an update for the AppleTV as well.  This means that 3rd party apps can now stream video to the AppleTV which is great news for apps such as MLB (which mean I can stream video from my iPad to my AppleTV - no more baseball games on the iPhone for me!).  Other changes are mainly cosmetic with a slight rearrangement of the settings panel and some new multi-touch gestures for the iPad.  Interestingly, Apple have responded to the controversy around the reassigning of the &quot;orientation lock&quot; button in iOS 4.2 on the iPad by now enabling you to choose whether you want it to act as a silent switch or an orientation lock.&lt;/p&gt;

&lt;p&gt;All of these changes are things I'd predicted but I'm really glad to see Apple have implemented them.  Video streaming over AirPlay and Hotspot on the iPhone are two great new features.  Roll on iOS 5.0!&lt;/p&gt;

&lt;p&gt;If you have any specific questions about iOS 4.3, either get in touch via &lt;a href=&quot;/contact/&quot;&gt;email&lt;/a&gt; or chat to me on &lt;a href=&quot;http://twitter.com/bendodson&quot;&gt;Twitter&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Thoughts on the Verizon iPhone 4</title>
      <link>http://bendodson.com/weblog/2011/01/11/thoughts-on-the-verizon-iphone-4/index.html</link>
      <pubDate>Tue, 11 Jan 2011 00:00:00 +0000</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2011/01/11/thoughts-on-the-verizon-iphone-4/index.html</guid>
      <description>&lt;p&gt;Verizon have &lt;a href=&quot;http://www.verizonwireless.com/b2c/splash/iphone.jsp&quot;&gt;just announced&lt;/a&gt; that they'll be selling a CDMA version of the iPhone 4 from February 10th.  On the face of it, this news is only really exciting to US customers who don't like AT&amp;T isn't it? Well, yes and no.  As an iPhone developer, this news is of great importance to me as more iPhones being sold means more people who can buy apps.  That's a good thing!  However, for everyone else, the Verizon iPhone 4 has some new features that may make it into the current GSM models of the iPhone.  It also points to some interesting changes possibly coming to iOS to combat the increasing functionality that Android offers.   
The iPhone 4 that has been shown today is different to the existing iPhone 4 in two key ways; an antenna redesign and a new &quot;hotspot&quot; feature.&lt;/p&gt;

&lt;h3&gt;Antenna Redesign&lt;/h3&gt;
&lt;img src=&quot;http://files.bendodson.com/old-weblog/2011/01/cdma-vs-gsm.jpg&quot; alt=&quot;&quot; title=&quot;iPhone 4: CDMA vs GSM&quot; width=&quot;600&quot; height=&quot;500&quot; class=&quot;size-full wp-image-456&quot; /&gt;

&lt;p&gt;In the photo I've put together above, the current GSM version of the iPhone 4 is on the left whilst the new CDMA version is on the right.  You can see on the old version that there are gaps for the antenna in the bottom corners of the phone and at the top next to the headphone jack.  On the new version, however, there are a total of 4 antenna breaks with one in each corner.  Not only does it look nicer, but I'm willing to bet it's been redesigned to fix the Antennagate problem that plaqued the iPhone 4 upon its release.  Now that a new case has been designed, it's not beyond reason to think that Apple might silently make any new iPhone 4s they are shipping use this new case design, especially if it improves performance.  Alternatively, I would expect the iPhone 5 to have the same basic design as the iPhone 4 but just have a speed boost internally (similar to the iPhone 3GS to the iPhone 3G) so this new design may be suitable for that.  Time will tell I suppose!&lt;/p&gt;

&lt;h3&gt;Hotspot&lt;/h3&gt;

&lt;p&gt;The most exciting news for most commentators is that the new iPhone 4 has a feature called Hotspot &lt;a href=&quot;http://www.apple.com/pr/library/2011/01/11iphone.html&quot;&gt;&quot;allowing customers to use iPhone 4 to connect up to five Wi-Fi enabled devices&quot;&lt;/a&gt;.  This is something that Android has been doing for a little while and a feature I use frequently on my Nexus S.  With the current iPhone 4, you can tether via USB or Bluetooth but you generally have to pay extra for the privilege (which is a little excessive considering you've already paid for the data).  It hasn't been confirmed or denied by Apple, but I wonder if we might not see this functionality introduced worldwide by adding it to the next version of iOS.  I have long suspected that iOS would get an upgrade to 4.3 at some point in late January or February and so this would fit in well with the launch date of the new Verizon iPhone 4 (in that it could come bundled with iOS 4.3).  Complete conjecture for the time being but it's an interesting idea and shows that Apple is willing to go head to head with Android on features.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; &lt;a href=&quot;http://www.engadget.com/2011/01/11/verizon-iphone-4-will-have-3g-mobile-hotspot/&quot;&gt;Engadget report&lt;/a&gt; that the Verizon iPhone that they got to play with after the announcement was running a bespoke build of iOS 4.2.5 and that the Hotspot functionality is built into iOS as &quot;Personal Hotspot&quot;.  I definitely think this is a contender for inclusion publicly in iOS 4.3&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; &lt;a href=&quot;http://www.macrumors.com/2011/01/11/ios-4-3-to-bring-mobile-hotspots-to-gsm-iphones-pending-carrier-support/&quot;&gt;Mac Rumors&lt;/a&gt; is now reporting that iOS 4.3 will bring hotspot support to the GSM iPhone 4 but activating it will require carrier support (and potentially charges).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; As I predicted, Apple have release iOS 4.3 to developers with the new hotspot functionality in place.  It replaces the existing internet tethering feature so still costs money on some carriers (alas).  For more information, read my &lt;a href=&quot;http://bendodson.com/weblog/2011/01/12/ios-4-3/&quot;&gt;full article on iOS 4.3&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>The AirPlay Alarm Clock: Turning an Apple TV or Airport Express into an Alarm Clock with AppleScript</title>
      <link>http://bendodson.com/weblog/2011/01/10/the-airplay-alarm-clock-turning-an-apple-tv-or-airport-express-into-an-alarm-clock-with-applescript/index.html</link>
      <pubDate>Mon, 10 Jan 2011 00:00:00 +0000</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2011/01/10/the-airplay-alarm-clock-turning-an-apple-tv-or-airport-express-into-an-alarm-clock-with-applescript/index.html</guid>
      <description>&lt;p&gt;I was recently reading through some of my old blog posts when I discovered an article that is still fairly popular about &lt;a href=&quot;http://bendodson.com/weblog/2008/09/08/control-mac-mini-from-iphone-with-waking-sleeping-audio-video/&quot;&gt;controlling a mac mini via an iPhone&lt;/a&gt;.  I had an old mac mini lying around and so installed it in my bedroom as a device which basically acted as an iTunes library and alarm clock.  Times have changed though and I no longer have a mac mini in my bedroom; I have an Apple TV.  With the recent news about iPhone alarm clocks failing to go off (again) and lots of hacking projects with AirPlay to try and stream more than just YouTube videos, I decided to work on something this evening I've been thinking about for a little while; turning my Apple TV into an Alarm Clock.  The basic idea is that at a set time in the morning, the Apple TV will wake itself up automatically and start playing a set playlist from my shared iTunes library.  The first step would be to get audio playlists working, but the ultimate goal would be to have video alarms as well.  Thanks to a bit of AppleScript, I've managed to cook up a basic app to do just that.&lt;/p&gt;

&lt;p&gt;So, how does one go about creating an AirPlay Alarm Clock?  First of all, you will need a mac that is turned on with a shared iTunes library of content. The &quot;turned on&quot; bit can be automated from System Settings i.e. your machine can be asleep but told to wake up 5 minutes before your alarm is due to go off if you want to save energy.  You will also need an AirPlay compatible device - this can be a set of speakers plugged into an Airport Express, one of the new AirPlay compatible iHome speaker systems, or an Apple TV.  Please note that video playback will obviously only work on the Apple TV although you will get the audio from the video if you select an audio-only device.  Once you've got those, you'll need to make a small tweak to your OS X setup: if you go into System Preferences and then Universal Access, you'll need to enable access for assistive devices - this is so AppleScript can make keypresses on your behalf.&lt;/p&gt;

&lt;p&gt;Ok, on to the code:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;applescript&quot;&gt;&lt;span class=&quot;k&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;AppleTVName&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;Bedroom Apple TV&amp;quot;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;PlaylistName&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;Alarm&amp;quot;&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;activate&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;application&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;iTunes&amp;quot;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;delay&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;0.2&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;tell&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;application&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;System Events&amp;quot;&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;tell&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;application&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;iTunes&amp;quot;&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;visible&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;front&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;browser&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;window&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;true&lt;/span&gt;
                &lt;span class=&quot;k&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;the&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;view&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;the&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;front&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;browser&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;window&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;playlist&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;PlaylistName&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;tell&lt;/span&gt;
	&lt;span class=&quot;nb&quot;&gt;delay&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;0.2&lt;/span&gt;

	&lt;span class=&quot;k&quot;&gt;tell&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;window&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;iTunes&amp;quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;application&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;process&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;iTunes&amp;quot;&lt;/span&gt;
		&lt;span class=&quot;nv&quot;&gt;click&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;button&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;window&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;iTunes&amp;quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;application&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;process&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;iTunes&amp;quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;application&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;System Events&amp;quot;&lt;/span&gt;
		&lt;span class=&quot;na&quot;&gt;key code&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;125&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;using&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;command&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;down&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
		&lt;span class=&quot;nb&quot;&gt;delay&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;0.2&lt;/span&gt;
		&lt;span class=&quot;nv&quot;&gt;keystroke&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;return&lt;/span&gt;

		&lt;span class=&quot;nb&quot;&gt;delay&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;0.2&lt;/span&gt;

		&lt;span class=&quot;k&quot;&gt;tell&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;window&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;Multiple Speakers&amp;quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;application&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;process&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;iTunes&amp;quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;application&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;System Events&amp;quot;&lt;/span&gt;
			&lt;span class=&quot;nb&quot;&gt;activate&lt;/span&gt;
			&lt;span class=&quot;nv&quot;&gt;click&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;button&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;
			&lt;span class=&quot;k&quot;&gt;tell&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;table&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;scroll&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;area&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
				&lt;span class=&quot;nb&quot;&gt;activate&lt;/span&gt;
				
				&lt;span class=&quot;k&quot;&gt;repeat&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;count&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;every&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;row&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
					&lt;span class=&quot;k&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;rowcount&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;count&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;rows&lt;/span&gt;
					&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;rowcount&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;then&lt;/span&gt;
						&lt;span class=&quot;k&quot;&gt;tell&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;group&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;row&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;i&lt;/span&gt;
							&lt;span class=&quot;nb&quot;&gt;activate&lt;/span&gt;
							&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;description&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;checkbox&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as &lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;AppleTVName&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;checkbox&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;then&lt;/span&gt;
								&lt;span class=&quot;k&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;checkbox&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
								&lt;span class=&quot;nb&quot;&gt;delay&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;0.5&lt;/span&gt;
							&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt;
						&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;tell&lt;/span&gt;
					&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt;
				&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;repeat&lt;/span&gt;
				
				&lt;span class=&quot;k&quot;&gt;repeat&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;count&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;every&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;row&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
					&lt;span class=&quot;k&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;rowcount&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;count&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;rows&lt;/span&gt;
					&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;rowcount&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;then&lt;/span&gt;
						&lt;span class=&quot;k&quot;&gt;tell&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;group&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;row&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;i&lt;/span&gt;
							&lt;span class=&quot;nb&quot;&gt;activate&lt;/span&gt;
							&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;description&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;checkbox&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as &lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;does not equal&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;AppleTVName&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;checkbox&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;then&lt;/span&gt;
								&lt;span class=&quot;k&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;checkbox&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;
								&lt;span class=&quot;nb&quot;&gt;delay&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;0.2&lt;/span&gt;
							&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt;
						&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;tell&lt;/span&gt;
					&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt;
				&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;repeat&lt;/span&gt;
				
			&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;tell&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;tell&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;tell&lt;/span&gt;

	&lt;span class=&quot;k&quot;&gt;tell&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;window&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;Multiple Speakers&amp;quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;application&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;process&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;iTunes&amp;quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;application&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;System Events&amp;quot;&lt;/span&gt;
		&lt;span class=&quot;nb&quot;&gt;activate&lt;/span&gt;
		&lt;span class=&quot;nv&quot;&gt;click&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;button&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;tell&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;tell&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;tell&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;application&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;iTunes&amp;quot;&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;shuffle&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;playlist&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;PlaylistName&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
	&lt;span class=&quot;nb&quot;&gt;play&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;playlist&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;PlaylistName&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;tell&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;I'll explain all of that in a bit more detail shortly, but for those of you that want to get cracking, you can copy and paste that into the AppleScript Editor that comes free with every copy of OS X.  You'll want to tweak the first two lines so that the variables match the name of your device and your playlist.  Once that is done, you can save the script as an application.  To get the alarm to play automagically in the mornings, you can open up iCal and create a new event (it can be recurring if you want a daily alarm).  In the &quot;alarm&quot; section, there is a little known entry called &quot;run script&quot; which you can use to run an AppleScript at a specified time relative to the alarm.  If you choose the script you saved, then it will automatically run at the allotted time.  Simple!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Warning:&lt;/strong&gt; This script is currently set to shuffle your playlist so that you don't get the same song every morning.  However, if you want to playback video, you have to disable the shuffling as iTunes doesn't like playing shuffled video playlists over AirPlay for some reason.  To do that, you need to edit the 3rd line from the bottom in the AppleScript to say &quot;&lt;code&gt;set shuffle of playlist PlaylistName to 0&lt;/code&gt;&quot;.&lt;/p&gt;

&lt;p&gt;If you're a geeky sort of person, you'll probably want to know how all of that script works.  Here is a quick breakdown of each section:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;applescript&quot;&gt;&lt;span class=&quot;k&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;AppleTVName&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;Bedroom Apple TV&amp;quot;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;PlaylistName&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;Alarm&amp;quot;&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;activate&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;application&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;iTunes&amp;quot;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;delay&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;0.2&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;tell&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;application&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;System Events&amp;quot;&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;tell&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;application&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;iTunes&amp;quot;&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;visible&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;front&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;browser&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;window&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;true&lt;/span&gt;
                &lt;span class=&quot;k&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;the&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;view&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;the&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;front&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;browser&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;window&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;playlist&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;PlaylistName&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;tell&lt;/span&gt;
	&lt;span class=&quot;nb&quot;&gt;delay&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;0.2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;The first step is to setup some variables in order to make it as easy as possible to change later on.  The first is the name of your device (as listed in iTunes) and the second is the name of your chosen playlist.  The next two lines tell iTunes to activate (basically open it if it's closed, or bring it to the front if it's already open) and then a short delay to make sure everything has caught up.  You'll notice the line &quot;delay 0.2&quot; in quite a lot of places in this code.  It is there to delay all activity by 0.2 seconds and is required as AppleScript can sometimes run quicker than the buttons it's pressing - by adding the delays every so often, it ensures that you aren't trying to access windows or menus which haven't yet appeared.  If the script isn't working for some reason and you have an old machine, try increasing the delay timeouts first of all as these are usually the culprit.  The next couple of lines force iTunes to make the main window prominent (in case we have any sub-windows hanging around) and also to display the playlist we want to play prominently.  The first version of this script didn't have that and everything generally worked fine so long as the last screen you looked at on iTunes was a music page.  I left a TV show list open and found it no longer worked (caused an error with the button handling) so I've added this section to ensure you are always on the correct page.&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;applescript&quot;&gt;&lt;span class=&quot;k&quot;&gt;tell&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;window&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;iTunes&amp;quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;application&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;process&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;iTunes&amp;quot;&lt;/span&gt;
	&lt;span class=&quot;nv&quot;&gt;click&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;button&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;window&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;iTunes&amp;quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;application&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;process&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;iTunes&amp;quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;application&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;System Events&amp;quot;&lt;/span&gt;
	&lt;span class=&quot;na&quot;&gt;key code&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;125&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;using&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;command&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;down&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;nb&quot;&gt;delay&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;0.2&lt;/span&gt;
	&lt;span class=&quot;nv&quot;&gt;keystroke&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;return&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;This section controls the little AirPlay button in the bottom right hand corner of iTunes.  You can usually target buttons with their names rather than their index position but the AirPlay button is a special case as it has a different name depending on which device you have selected.  I have 4 different AirPlay devices in my house so rather than writing a big if statement to check for each name and then press accordingly, I instead target the button by it's numerical index.  You can find out the index of UI elements by using the fantastic &lt;a href=&quot;http://pfiddlesoft.com/uibrowser/&quot;&gt;UI Browser&lt;/a&gt; tool - it's a little bit pricey but worth the money if you are planning on doing a lot of AppleScripting.  Once we've told iTunes to click on the button, we use key code 125 (which means the down key) in conjunction with the command button to jump down the entire context list to the &quot;Multiple Speakers...&quot; option.  Originally, I wanted to read the list of devices, iterate through them, and then select the one we wanted but I had a lot of problems getting AppleScript to correctly read the context menu so went for this slightly more longwinded approach instead.  Once the &quot;Multiple Speakers...&quot; option is selected, we hit return to make it open the window.&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;applescript&quot;&gt;&lt;span class=&quot;k&quot;&gt;tell&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;window&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;Multiple Speakers&amp;quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;application&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;process&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;iTunes&amp;quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;application&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;System Events&amp;quot;&lt;/span&gt;
	&lt;span class=&quot;nb&quot;&gt;activate&lt;/span&gt;
	&lt;span class=&quot;nv&quot;&gt;click&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;button&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;tell&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;table&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;scroll&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;area&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
		&lt;span class=&quot;nb&quot;&gt;activate&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;This section is now specifically targeting the &quot;Multiple Speakers&quot; window which we just opened.  The activate command allows us to start interacting with it, and by using UI Browser, we find that button 2 is the maximum volume setting.  I decided to set this manually here (rather than using the existing volume) just in case I had it set really quiet (or muted) for any reason.  This ensures that the music will always come through at it's maximum volume.  The next section lets us select the table listing which shows each device that we are about to iterate through.&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;applescript&quot;&gt;&lt;span class=&quot;k&quot;&gt;repeat&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;count&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;every&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;row&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;rowcount&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;count&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;rows&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;rowcount&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;then&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;tell&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;group&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;row&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;i&lt;/span&gt;
			&lt;span class=&quot;nb&quot;&gt;activate&lt;/span&gt;
			&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;description&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;checkbox&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as &lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;AppleTVName&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;checkbox&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;then&lt;/span&gt;
				&lt;span class=&quot;k&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;checkbox&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
				&lt;span class=&quot;nb&quot;&gt;delay&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;0.5&lt;/span&gt;
			&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;tell&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;repeat&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;repeat&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;count&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;every&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;row&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;rowcount&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;count&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;rows&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;rowcount&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;then&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;tell&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;group&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;row&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;i&lt;/span&gt;
			&lt;span class=&quot;nb&quot;&gt;activate&lt;/span&gt;
			&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;description&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;checkbox&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as &lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;does not equal&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;AppleTVName&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;checkbox&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;then&lt;/span&gt;
				&lt;span class=&quot;k&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;checkbox&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;
				&lt;span class=&quot;nb&quot;&gt;delay&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;0.2&lt;/span&gt;
			&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;tell&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;repeat&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;I'm a big fan of the DRY (don't repeat yourself) principle of coding so you may wonder why there are two loops here which are essentially the same.  The first goes through the list and turns the checkbox on for the device we want to play our alarm through.  The second goes through the same list again, but turns off any devices that aren't our chosen alarm device.  My first thought was to do one loop that went through and turned the checkbox on if the device was correct or off it wasn't.  The problem with that approach is that you can't turn off the Computer audio until you've selected another device.  Therefore, you have to go through once to turn on the chosen device and then through again to turn the others (if they were enabled) off.  A little tedious but this is a bit hacky anyway!  I've updated the delay in the first loop from 0.2 to 0.5 as I found that a 0.2 delay would occasionally not be enough time for an AirPlay speaker to be selected before the next loop comes in and turns of the Computer.  This led to an alert in the script (thus pausing everything not leading to playback) which is obviously not ideal in an alarm clock...&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;applescript&quot;&gt;&lt;span class=&quot;k&quot;&gt;tell&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;window&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;Multiple Speakers&amp;quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;application&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;process&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;iTunes&amp;quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;application&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;System Events&amp;quot;&lt;/span&gt;
	&lt;span class=&quot;nb&quot;&gt;activate&lt;/span&gt;
	&lt;span class=&quot;nv&quot;&gt;click&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;button&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;tell&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Just for the sake of tidiness, this tell will close the &quot;Multiple Speakers&quot; window we opened.&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;applescript&quot;&gt;&lt;span class=&quot;k&quot;&gt;tell&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;application&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;iTunes&amp;quot;&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;shuffle&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;playlist&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;PlaylistName&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
	&lt;span class=&quot;nb&quot;&gt;play&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;playlist&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;PlaylistName&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;tell&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;This final section tells iTunes to shuffle our playlist (remember to turn the shuffle off &amp;mdash; set shuffle of playlist PlaylistName to 0 &amp;mdash; if you are going to send video via AirPlay) and then play it.&lt;/p&gt;

&lt;p&gt;And there you have it! A small piece of AppleScript to enable audio and video alarms over AirPlay.  If you have any comments or suggestions, please &lt;a href=&quot;/contact/&quot;&gt;get in touch&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update [11th Jan 2011]:&lt;/strong&gt; I've amended two sections of the code.  Firstly, I've added a line near the top which ensures that the playlist you want to play is selected and displayed as the main view.  Previous versions worked perfectly when I tested them as I was in the &quot;Music&quot; section of iTunes but if you are in a video section (e.g. left on a TV show page) then there would be an error as it couldn't find the AirPlay button (as the index was different).  The second change is a delay in the looping section has been increased from 0.2 to 0.5 as occasionally it took slightly longer than 0.2 seconds to select an AirPlay speaker. This caused a problem as the script would alert causing everything to pause.  Both lines have been amended in the code at the top of the page and in the analysis afterwards.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update [25th Oct 2011]:&lt;/strong&gt; The button codes have changed in iTunes 10.4 and 10.5 so I've updated the above script so it will continue to work. The key part was changing &lt;code&gt;click button 8 of window &quot;iTunes&quot; of application process&lt;/code&gt; to &lt;code&gt;click button 10 of window &quot;iTunes&quot; of application process&lt;/code&gt;. Thanks to Thomas Engbjerg for letting me know it was broken!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update [25th Jan 2012]:&lt;/strong&gt; I've added this code to &lt;a href=&quot;https://github.com/bendodson/Apple-TV-Alarm-Clock&quot;&gt;GitHub&lt;/a&gt; for easier managing. If something should break in the future (looking at you iTunes 10.6) then a fix will be put up there.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update [15th Mar 2012]:&lt;/strong&gt; iTunes 10.6 did break as expected - needed to add a &lt;code&gt;delay 0.2&lt;/code&gt; before the call to speak with the &lt;code&gt;&quot;Multiple Speakers&quot;&lt;/code&gt; window due to some newly introduced lag. Updated here and on &lt;a href=&quot;https://github.com/bendodson/Apple-TV-Alarm-Clock&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>The CoverSutra Saga</title>
      <link>http://bendodson.com/weblog/2011/01/09/the-coversutra-saga/index.html</link>
      <pubDate>Sun, 09 Jan 2011 00:00:00 +0000</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2011/01/09/the-coversutra-saga/index.html</guid>
      <description>&lt;p&gt;A few people have started asking me for my opinion on the fast-growing story about CoverSutra, a mac application for which the developer promised free updates until version 3.0 several years ago but then switched to be exclusive on the Mac App Store with a new 2.x version which old customers would have to rebuy.  I have mixed opinions about this but it gives me some scope to talk not only about the Mac App Store, but also about selling on the internet in general and the lack of understanding by a large amount of the commenting world.&lt;/p&gt;

&lt;p&gt;Looking at the issue at hand first of all, it is essential that you go to the &lt;a href=&quot;http://www.sophiestication.com/blog/&quot;&gt;Sophiestication Blog&lt;/a&gt; and &lt;a href=&quot;http://www.sophiestication.com/blog/coversutra-2-5/&quot;&gt;read the article&lt;/a&gt; that sparked this all off.  The basic details are that version 2.5 was a new update that was to be exclusive on the App Store yet this reneged on a previous promise (made several years ago apparently) that all updates would be free until version 3.0 - users that bought a version recently would now not be able to upgrade to 2.5 without paying $5 on the App Store.  At first glance, the fault would appear to lie with the developer and, to be fair, that is still my general opinion.  A lot of people have backed the developer purely because of the horrendous abuse that she has suffered on her blog (which I'll come to shortly) but that is to forgive something because of abuse after the fact which, in this case, is actually immaterial.  She promised a free update until version 3.0 and didn't deliver it so in a way people are allowed to be pissed especially when she remarks that &quot;a migration from the previous standalone version is sadly not possible.... however I lowered the price to $4.99 so there's no reason not to pick up a copy for new features&quot;.  This was excaberated by her fanning the flames in the comments by telling everyone to &quot;chill down&quot; and so on.&lt;/p&gt;

&lt;p&gt;As the comments got worse (and needlessly aggressive in tone), it became apparent that a lot of the problem was people not understanding why they couldn't get updates through the Mac App Store and that the developer had forgotten the previous promise that was made.  I'll come to the Mac App Store shortly but the issue of a promise could have been dealt with in a far more dignified way.  Upon being reminded about the promise, she should have instantly made a simple apology and outlined what had happened.  Instead, she told an already riled crowd to &quot;calm down&quot; and made the situation far worse.  In essence, the initial promise should never have been made.  Upon it's revelation, the 2.5 version should have been recompiled to be distributed through the Sparkle system she was using.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;It‘s true that I could have made version 2.5 available through the legacy Sparkle updater. But maintaining two builds, one for the App Store and one with the serial number checks, was too time consuming for me. Precious time better spend on the actual update and my other apps.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;I have to disagree with this assessment.  I agree wholeheartedly that maintaining two distribution channels is difficult and, if I were to launch a mac application tomorrow, I would only choose the Mac App Store.  However, if you have an update system in place, there is not much effort involved to publish an update through it (as that is the essence of the system).  This does not mean she would need to sell version 2.5 on her website, just push an update through her existing system for the old users.  That would have solved all the problems and taken considerably less effort than it's now going to take to &quot;restore sanity&quot; to her users.&lt;/p&gt;

&lt;p&gt;It's very easy at this point to blame the Mac App Store for this issue.  After all, if Apple allowed upgrade pricing then this wouldn't be happening.  I disagree with this also as the Mac App Store is not trying to be the all encompassing place for mac software as is highlighted by their terms of what is and isn't allowed in the store.  They are creating a store for certain kinds of apps sold in the way in which Apple sells its own apps.  iLife for example comes out almost every year but there is no upgrade pricing - it's priced cheap (for mass consumption) and a new version is something worth buying so you pay for it.  You don't pay for the *.x releases mid-cycle (as these are bug fixes and tiny new features) but the next version generally adds a great deal.  You could say &quot;I've been a customer for x years - I &lt;em&gt;deserve&lt;/em&gt; a lower price due to customer loyalty&quot; but I don't think that's true.  This seems to be the same philosophy that Apple are trying to encourage in the Mac App Store, namely price your apps low but customers have to buy again when a new version comes out. Conversely, your version updates had better be good as your customers won't be happy if you put out a new version that they have to pay for again but doesn't add anything good.&lt;/p&gt;

&lt;p&gt;Paying for new versions of things is something that we, as customers, should be used to.  After all, when Sonic the Hedgehog 2 came out on the Mega Drive, we didn't complain that we already owned Sonic the Hedgehog 1 and version 2 only added new levels and a new character so why should we pay full price?  You buy the next version again as it adds new things that you want.  This is exactly the same in desktop apps as it is for mobile apps or computer games.  The pricing actually becomes immaterial compared to the philosophy of &quot;buy new versions of apps&quot;. If your app is priced well, then people will pay for the new version.  If they don't, then you got the money for the old version and you've learned that the features you added in your new version aren't actually as good as you thought they were.  Do some market research, start work on a new version, and hope that they'll pay next time.&lt;/p&gt;

&lt;p&gt;This is something that we need to get used to.  As an app developer myself, it appalls me that people think that having paid $5 for an app they should get free upgrades for life.  That isn't sustainable, economical, or fair to developers.  However, the onus is also on us, the developers, to make each version so good that people will pay for $5 again for each new version.&lt;/p&gt;

&lt;p&gt;So, going back to the CoverSutra story, I agree with the developer on one hand but disagree on the other; I agree that going the Mac App Store route is the best way and that each new version should be charged for separately.  I do disagree however with her going Mac App Store exclusive on updates for her previous customers when she had promised free upgrades for a certain period of time.  She didn't need to make that promise but she did (presumably to make more sales at the time) so those free updates need to happen.&lt;/p&gt;

&lt;p&gt;My final thought on all this is about commenting on the internet in general.  As you may have noticed, my website has recently been redesigned and one of the features I've redeveloped is the blog.  It no longer has a commenting system.  This is by design as I've noticed the deterioration of comments over the last couple of years.  The facelessness of the internet means that people now act in a way that they wouldn't in a normal conversation.  The comments on Sophia's blog are nothing short of sickening regardless of the rights or wrongs of the decision taken and that is exactly one of the reasons why I won't let people comment on my blog anymore.  I've never attracted such aggression before but the fact that it seems to be slowly becoming the norm on the internet troubles me. If people want to reply to my blog posts, they can contact me on Twitter (where I can reply directly knowing that they've heard back from me - commenting systems don't always inform the commentator of a reply), post a reply on their own blog, or email me directly.  That way, they aren't anonymous (leading to more reasonable discourse) and I can reply back to them.&lt;/p&gt;

&lt;p&gt;One of my big hopes for 2011 is that iTunes will add a &quot;reply&quot; feature to commentators so that we don't get the same level of abuse and stupid comments on the reviews of Mac and iPhone apps as that is going downhill currently - many people leave comments on apps saying &quot;this doesn't work&quot; but without the power to reply it's near impossible to let someone know a problem has been fixed.  Most developers do want to help and aren't trying to screw the customer over but with the anonymous reviews and comments left by the countless numbers of people with bad attitudes, it's very easy to stop caring about the customer.  I can't help but think that the whole CoverSutra thing wouldn't have exploded as much as it did if Sophia had comments disabled on her blog...&lt;/p&gt;


</description>
    </item>
    
    <item>
      <title>My take on Microsoft's Keynote at CES 2011</title>
      <link>http://bendodson.com/weblog/2011/01/07/my-take-on-microsofts-keynote-at-ces-2011/index.html</link>
      <pubDate>Fri, 07 Jan 2011 00:00:00 +0000</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2011/01/07/my-take-on-microsofts-keynote-at-ces-2011/index.html</guid>
      <description>&lt;p&gt;Tonight I did two things I didn't think would ever happen; I stayed up until 2:30am to watch Steve Ballmer give a presentation and I installed Silverlight on my Macbook Air.  Why you ask?  As someone in the &quot;mobile development space&quot;, I felt it was my duty to not just focus on Apple's keynotes (fantastic though they are) and instead take a listen to a few other CEO's, especially when they could be announcing something important in the area of tablet PCs.  Last year, Steve Ballmer famously introduced &quot;slates&quot; to the world at a time when Apple hadn't yet launched a tablet and all the rumour blogs were pointing at the possible name for a new device being the iSlate.  It struck me then that by suddenly calling the tablets he was announcing slates (when nobody had previously) that Ballmer was just doing some showboating as he was launching something before Apple.  However, the iPad (I like to imagine Steve Jobs put out the iSlate name purely to fool Ballmer whilst all along knowing he was going to call it the iPad) launched shortly afterwards to international success.  In the year since, no other tablet has gained as much media attention or sales.  The HP slates that Ballmer announced at CES 2010 have conveniently never materialised.  So, I was curious to see if slates would be making a comeback and if we'd actually see an iPad-killer.  As an iPad developer, I thought it best that I see the competition as it happened rather than waiting until morning for the news.  &lt;/p&gt;

&lt;p&gt;Aside from any tablet announcements, I was also curious about what was happening with Windows Phone 7 and any news about upcoming games for the Kinect.  I know very little about Windows Phone 7 (about from the UI looks a bit better than Android's) so any extra knowledge would be an asset.  The Kinect, on the other hand, is a device I've owned since day one and absolutely love - I'm just keen to know what they are bringing to it apart from fitness and dance games.&lt;/p&gt;

&lt;h3&gt;Opening&lt;/h3&gt;
&lt;p&gt;It's 2:30am. I refresh Safari and nothing. 2:35am. Nothing. 2:40am. Nothing.  Finally, at 2:47am, somebody from CES comes out after showing off a video to showcase CES that looks like it was made pre-2000.  It was a seriously bad video with the only indication it was new being that it had a song that's only just been in the charts as a backing track.  It was painful.  The only thing more painful was the guy introducing who seemed to speak corporate bullshit (I have no idea what half his sentences meant) and the odd reference to a book he'd written that he was trying to plug.  This was topped only by his introduction for Steve Ballmer in which he called the Microsoft CEO &quot;focused&quot;.  In any case, the music started and we all expected Steve to come &lt;a href=&quot;http://www.youtube.com/watch?v=wvsboPUjrGc&quot;&gt;bounding out like a maniac as per usual&lt;/a&gt;but he didn't.  I was genuinely surprised to find Steve behaving and sounding a little bit like a normal person throughout!  Anyway, he briefly talks about how successful Microsoft has been in the past year (let's face it, we needed reminding) and how he wanted to talk about Kinect, Windows Phone 7, and then Windows itself.  I'll give you my opinion of each in the same order.&lt;/p&gt;

&lt;h3&gt;Kinect&lt;/h3&gt;

&lt;p&gt;I love the Kinect. It's a fantastic device and some of the homebrew apps that people have written to use it have been &lt;a href=&quot;http://vimeo.com/17095170&quot;&gt;truly inspiring&lt;/a&gt;.  For all that, the launch titles were fairly unimpressive with the most popular games being Kinect Adventures (that comes free with it), Dance Central (dance game from the people behind Rock Band), and Your Shape: Fitness Evolved (which has an amazing UI and gives you the socially awkward power of laughing at anyone who still uses Wii Fit).  However, this isn't gaming for the masses; this is trying to be a Nintendo Wii with an albeit better controller.  I should point out at this point that Steve did put a lot of emphasis into the marketing slogan of &quot;You... are....... the................. controller&quot; as if we haven't heard it a million times already.  Anyway, were we going to find out about some awesome new software for the Kinect.&lt;/p&gt;

&lt;p&gt;Umm... no.&lt;/p&gt;

&lt;p&gt;The first &quot;big&quot; announcement was that the Netflix interface would now be controllable with the Kinect. I already thought it was but then I'm not in the US so I don't get to see any Netflix interface!  Next up was that Hulu would be coming to the Kinect.  Now that is a good announcement, but alas, it's US only as well so not terribly exciting for me personally.  There was some talk about some more ESPN stuff including some very awkward &quot;trash talk&quot; about a college football game and then that was it for the live demo.  And then Steve came back onstage but this time in the form of his Xbox avatar in order to tell us about Avatar Kinect.  When I'd first heard the name Avatar Kinect about 3 hours before the presentation, I assumed it was going to be some amazing Kinect powered tie-in with the 3D film Avatar. How wrong I was!&lt;/p&gt;

&lt;img src=&quot;http://files.bendodson.com/old-weblog/2011/01/Avatar_Kinect_Tailgate_06_web-500x281.jpg&quot; alt=&quot;&quot; title=&quot;Avatar Kinect&quot; width=&quot;500&quot; height=&quot;281&quot; class=&quot;aligncenter size-medium wp-image-431&quot; /&gt;

&lt;p&gt;Avatar Kinect is a free piece of software that will be available in a future Xbox update.  It allows you to use your Xbox Avatar to talk to friends by putting you in a number of different settings with your friends Avatars (e.g. a news desk or a car park) where you can then chat or record movies, etc.  The technology is pretty clever in that it will do lip syncing and animate facial features (Steve showed this off with his eyebrows) but I can't help but feel that you'd use the app once to try it out and then never use it again.  Why would you chat with your friends through your avatar when you have a proper webcam built into the Kinect and the software to use it?  It was hardly earth-shattering news so the Xbox portion of the evening was pretty disappointing.&lt;/p&gt;

&lt;h3&gt;Windows Phone 7&lt;/h3&gt;

&lt;p&gt;As I said earlier, I don't know a huge amount about Windows Phone 7 so I was kind of looking forward to seeing this section to try and understand it a bit better.  The first thing that Steve points out is that the Windows Phone 7 is actually really good, it's just not very popular as people haven't seen it.  We are encouraged that by showing it to people, they really like it and thing it's better than other phones on the market.  This smacks of Project Mojave to me - to those that don't remember, Project Mojave was a Microsoft marketing experiment in which they tried to combat the negative tide of opinion about Windows Vista by putting focus groups together to try the next version of Windows (naming it Windows Mojave) but instead gave them Windows Vista.  This led to lots of video of people saying &quot;this is great&quot; and &quot;so much better than Vista&quot; before then being told the truth.  The end result was supposed to be that Vista is great and people need to use it rather than bitch about it but the actual feeling you got from it was that Microsoft has a real problem with it's marketing department.  This appears to be true of Windows Phone 7 as well if the only reason it isn't the biggest selling phone of the year is because people haven't used it or don't know about it.&lt;/p&gt;

&lt;p&gt;In any case, now was the time to show it off.  So, did they do a Steve Jobs style gradual walkthrough or a nice video to show off it's strengths?  No.  They got a &quot;chief goatherder for two, young, rambunctious kids&quot; who seemed to be on some medical grade drugs to do it.  Words can't describe how off-putting Liz Sloan is so I'm just going to embed the 8 minute segment she did below.  If you can get through 30 seconds without wanting to scream then you did better than me.&lt;/p&gt;

&lt;iframe width=&quot;640&quot; height=&quot;360&quot; src=&quot;http://www.youtube.com/embed/rsl97vZHOJk?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;Firstly, her presentational style is such that I quickly forgot about the phone as I was concentrating on her so much trying to work out just what she was on.  That isn't good for a phone which is described as &quot;a good phone if you show it to someone&quot; as we weren't seeing the phone, just her.  Other things that riled me were that she thinks it's a &quot;great phone for people like us&quot; whilst talking to the audience but she actually means &quot;people like her&quot;.  The audience wasn't made up of busy mums who want to get tasks done on their phone quickly - it was made up of tech nerds who were going to a 4 day conference about technology.  These are the kind of people that want to get lost in their phones every day and never come out.  In addition, her description of copy and paste (a feature which is a long time coming - yes, I know it took a while on the iPhone as well but you don't launch an &quot;iPhone killer&quot; without it) was borderline patronising and nearly every task she did I could do at the same speed on an iPhone or Android phone so I don't follow the supposed speed increase which she was talking about.  The stat of &quot;5500 apps in our store&quot; was also repeated far too much - that isn't a figure to be proud of.&lt;/p&gt;

&lt;p&gt;The best piece for me though was a dig at Google that went all wrong.  Liz tried to point out that Bing on the Windows Phone 7 pushes the most relevant pieces to the top so you don't have to hunt around to find information.  The demonstration given was a search for &quot;Miami Heat&quot; which then showed the score from last night at the top of the search results &quot;instead of a lot of blue links that then brings me to the answer&quot; (read Google Search Results).  I thought this a little odd so I searched for &quot;Miami Heat&quot; in Google and, as I suspected, the scores for the last 3 games were shown right up top.  Liz passionately explains how this breakthrough (*cough*) also worked for things like stocks and weather which I'm pretty sure show up in Google in the same way as well (along with cinema times, maths calculations, and a host of other things).&lt;/p&gt;

&lt;p&gt;All in all, the Windows Phone 7 segment was pretty terrible.  The highlight was probably Steve showing off how Xbox Live works on the phone and the announcement of a pinball game that connects with Fable 3 to give you gold.  This was however quickly marred by a video showing how great games are on Windows Phone 7 that mainly featured iOS games which have been ported...&lt;/p&gt;


&lt;h3&gt;Windows&lt;/h3&gt;

&lt;p&gt;And so we got to the final round; Windows itself.  Unfortunately Microsoft had already announced the biggest thing some 4 hours earlier which was that Windows was now being rebuilt to work on SoC processors (estimated time: 18-24 months) but that didn't stop them giving us another 15 minute demo of what that looks like.  Aside from that, there was very little to say.  A few laptops and tablets were briefly demoed and I'd like to talk about two of them which caught my eye; the &lt;a href=&quot;http://www.acer.com/iconia/&quot;&gt;Acer Iconia&lt;/a&gt; and the &lt;a href=&quot;http://www.microsoft.com/windows/buy/featured/asus.aspx&quot;&gt;ASUS EEE Slate EP121&lt;/a&gt; (just rolls of the tongue that one).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Acer Iconia&lt;/strong&gt; - this new Windows 7 laptop looks a little like a large Nintendo DS due to it's dual screen setup but unlike the DS, both screens are touch-enabled.  The demo looked ok apart from a few UI issues such as tapping the tilted screen (remember Steve Jobs saying how they'd never do this as every time they tested it people hated it?) and having a folder stretch over both screens leading to a big plastic bar half way between your viewing area.  However, the thing that irritated me the most was the gesture to bring up the onscreen keyboard.  Since seeing the demo, I've asked a few people &quot;what do you think Microsoft would choose a suitable gesture for bringing up a keyboard&quot;?  Most people said a swipe up or even a two or three fingered swipe in a direction.  Instead, Microsoft decided that a 10-fingered gesture (must be the world's first) was best - you have to push all 10 of your digits onto the lower screen at the same time to bring up the keyboard.  Without having used the Iconia myself I can't really comment on how it works but I can't imagine that typing on a glass display is going to be particularly good for long usage.  The iPad is great but you wouldn't use it to type an essay and entering any text is really a bit of a chore - I would hate to have that as my main input option on what is supposed to be a fully fledged PC, not just a tablet for light app usage.  Having said that, it's a very different concept and I'm going to be interested to see consumer feedback on the dual-screen approach.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ASUS EEE Slate EP121&lt;/strong&gt; - This was the main tablet that was shown off and is actually a full PC inside a 12.1&quot; tablet form factor. It's running an Intel Core i5 and can have upto 4 gigs of RAM in it.  They seem to have hedged their bets for input methods by bundling it with both a wireless keyboard and a stylus but you can also use normal touch and a virtual keyboard.  The thing that struck me was a) it looks heavy and too bulky to be a convenient tablet and b) the input methods don't look good.  If you have a tablet, you shouldn't need a physical keyboard.  Yes, you can get them for the iPad but why would you?  If you need to do a lot of typing you are probably better off with a real laptop rather than a tablet device.  The demo showed an excel spreadsheet being controlled with touch at one point (with a pinch gesture to zoom) and then using a stylus to edit a spreadsheet.  I can't imagine anything worse than trying to fill in a spreadsheet on a 12.1&quot; tablet with a stylus but there you are. I haven't used it, so again I'm speculating, but I have a feeling that this device is going to get very hot and run out of battery very quickly (they say 3+ hours on their website!).  For $100 less than the asking price (which is $1,099), you could get an 11&quot; MacBook Air with a higher screen resolution, longer battery, far less weight, and a much smaller form factor.  A MacBook Air could also run Windows 7 if that's what you want!&lt;/p&gt;

&lt;h3&gt;Summary&lt;/h3&gt;
&lt;p&gt;The keynote ended with a look at the Microsoft Surface which is now in a smaller form factor, is slightly cheaper,  and has support for 20 fingers in multitouch gestures rather than 10. That was pretty much all I could glean about it!  I do like the Surface but I wish they'd spent as much time as they have on that working on a truly mobile tablet OS rather than trying to shoehorn Windows 7 onto every device.  Windows 7 may be good for some tasks (I don't like it personally) but it is not a suitable OS for a tablet in the same way that OS X wouldn't have worked on a tablet.  Android made a similar decision when they tried to put a mobile phone OS onto a tablet.  Apple made the right choice by making an optimised OS for it and that is why it has succeeded and other tablets have failed (although it will be interesting to see how the new Android 3.0 UI, supposedly optimised for tablets, will work out).&lt;/p&gt;

&lt;p&gt;Overall I was pretty disappointed with the Microsoft Keynote.  Sure there were some interesting ideas being floated with the dual-screen Acer laptop and the Windows for SoC announcement but the majority was just rehashing things that have already been demoed or shown off in the past and irritating people showing off features that most mobile phones now have. Microsoft have a lot of catching up to do in the mobile world and I think this year is going to hit them pretty hard. &lt;/p&gt;





</description>
    </item>
    
    <item>
      <title>Contact Forms</title>
      <link>http://bendodson.com/weblog/2010/11/04/contact-forms/index.html</link>
      <pubDate>Thu, 04 Nov 2010 00:00:00 +0000</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2010/11/04/contact-forms/index.html</guid>
      <description>&lt;p&gt;Over the last 14 years, I have witnessed the internet expanding rapidly and becoming massively commercialised. With this kind of rampant upscaling, there is always a point at which there are enough people using the system that want to exploit it in some way, usually for monetary gain. With the internet, this has been done rather crudely with the invent of &lt;strong&gt;spam email&lt;/strong&gt;. There are large numbers of servers whose primary aim is to crawl the internet searching for an email address. They then generate a list of these email addresses and sell them to companies who will send out mass emails trying to entice people to buy something or other.&lt;/p&gt;

&lt;p&gt;As this problem has increased (apparently over 85% of all emails sent are spam), web developers have panicked and come up with all sorts of stupid methods to try and prevent it. Most developers won’t output their email address in plain text on a website (or with a mailto link) but instead choose to try and hide it by doing something along the lines of “ben [at] bendodson [dot] com”. This is highly inaccessible and is a real pain to try and decipher sometimes – and besides, a human spammer could read it anyway! Other developers will set up a contact form and then protect it by means of a Captcha system or some other horrendously inaccessible device. These systems are incredibly difficult and time-consuming for able-bodied people to use let alone those with poor eye sight or other disabilities. Even so, these systems have become prevalent across the internet and show no signs of slowing down. Some contact forms now ask basic mathematic questions to prove you’re human completely over looking the fact that every one of these systems can eventually be thwarted as spam-bot developers adapt to them.&lt;/p&gt;

&lt;p&gt;The real problem I have with all of these systems is that they impose limits on web users and slow them down. They pass all responsibility to the user and treat them like spam until proven innocent (by means of a test) rather than just accepting that these things happen and using an automated system that can filter spam from real conversation. Therefore, I’ve decided to take a stand against this and publish my email address loud and clear with a link that will open it in your email client of choice. If I get spammed, it really doesn’t bother me – I have a “junk mail” folder which has protected my inbox for a very long time and will continue to do so. Please feel free to &lt;a href='/contact/'&gt;contact me&lt;/a&gt; – I look forward to hearing from you soon!&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Why I built an Item Finder for Gowalla</title>
      <link>http://bendodson.com/weblog/2009/12/05/why-i-built-an-item-finder-for-gowalla/index.html</link>
      <pubDate>Sat, 05 Dec 2009 00:00:00 +0000</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2009/12/05/why-i-built-an-item-finder-for-gowalla/index.html</guid>
      <description>&lt;p&gt;Last Thursday, I expanded my &lt;a href=&quot;http://gowallatools.com/&quot;&gt;Gowalla Tools&lt;/a&gt; website (a companion site for the popular geo-location game &lt;a href=&quot;http://gowalla.com/&quot;&gt;Gowalla&lt;/a&gt;) to include a new feature known as the Item Finder.  It works by displaying a list of spots in any area you choose, and them removing those that don't have items you are missing from your vault.  I always knew that this would be a controversial feature and that I'd need to write a piece explaining why I had built it - now that a few people have complained that it is &quot;changing the core nature of the game&quot;, it is probably an apt time to publish my opinion on why this is not the case.&lt;/p&gt;

&lt;p&gt;Ever since I began work on my Gowalla Tools project, people have consistently been in contact to ask me to make an item finder.  They were frustrated that it seemed so difficult to find existing items in their areas when they were so abundant in other areas.  For example, in the UK it's very difficult to find a &quot;Cowboy Hat&quot; as these are only available in spots marked as &quot;Saloons&quot; (of which we have very few).  However, a few of these rare items have made it to our shores thanks to random items being seeded into new packs (meaning new players have a chance of having a rare item such as this available to them from the start) which are then dropped at locations to make them founded spots.&lt;/p&gt;

&lt;p&gt;In the first version of Gowalla Tools, I added a feature which allowed you to see what items were available at any spot you chose.  This was not exactly game changing as you could work this out yourself on the Gowalla website by seeing what items had been dropped and picked up until you ended up knowing what was there - my site simply did it faster.  When I was initially asked to add a search feature, I was hesitant as I felt it took a lot away from the game and made it simply an item collection game similar to Packrat (which is how the vast majority of players came to find Gowalla) rather than a game about going to places.  I actually felt so strongly about changing the game into item collection that I edited the first draft so that items appeared in a popup window rather than inline - this meant it took a good 3 seconds or so before you could view the items at a spot and thus made it so that you couldn't just click around and see what was there.  Aside from my issues around gameplay, there were technical constraints as searching that many spots would place heavy demand on both mine and Gowalla's servers so I ruled it out.&lt;/p&gt;

&lt;p&gt;It was a month or so later that I suddenly started to hit a brick wall with items.  I was missing around 10 items all of which were proving to be incredibly elusive as they were created mainly for the Texas area (e.g. Longhorn).  I realised I was spending a lot of time on the Gowalla Tools map clicking around trying to find out what items were available in my area and found quite a few items I had been missing that way.  Gowalla also stepped up their game and introduced version 1.3 of their app which allowed you to vault items from within the application - they were starting to take items more seriously so my site needed to do similarly.&lt;/p&gt;

&lt;p&gt;I started to get underway with a brand new site and introduced the &lt;strong&gt;13 days of Gowalla Tools Christmas&lt;/strong&gt; - a daring attempt to build 13 new tools for the site within the 25 days leading up to Christmas.  The first tool was obvious to me; the map needed to be radically overhauled and easier to search and view spots.  I improved the item offering quickly by showing you what items were at a spot and highlighted those items that were missing from your vault.  On day 2, I added the item search.  It didn't work the same way as many people had hoped (e.g. type in &quot;Longhorn&quot; and it'll show you all the spots that exists) due to the technical constraints.  However, it did allow you to load all the spots in your area and then remove all but those that had items you needed.&lt;/p&gt;

&lt;p&gt;Initial feedback was excellent and I had felt that my compromise between ease of use and item searching had been well balanced.  However, I was recently alerted to a &lt;a href=&quot;http://getsatisfaction.com/gowalla/topics/friend_only_spots#reply_1644265&quot;&gt;post&lt;/a&gt; on &lt;a href=&quot;http://getsatisfaction.com/gowalla/&quot;&gt;GetSatisfaction&lt;/a&gt; (and several tweets) that felt that the new feature was game changing for Gowalla and was tantamount to cheating.&lt;/p&gt;

&lt;p&gt;I disagree.&lt;/p&gt;

&lt;p&gt;My main reason for playing Gowalla is nothing to do with items - it's about finding new places and visiting those places.  It's about finding interesting spots in your neighbourhood that you may never have known were there and then going out and visiting them.  In my opinion, items were added in order to lure more people from Packrat and to make it seem more like a game but the key thing is locations.  Yes it could be perceived that the Gowalla Tools Item Finder makes it unfair to those that knew where items were previously who are now unable to get them as somebody else has now found them, but that's all part of the game.  You can't pick up items unless you are checked in at a location so if you don't go there, you can't have it.  If someone else gets there first, then the item is theirs!&lt;/p&gt;

&lt;p&gt;The one thing that has annoyed me from the start about Gowalla is the rights that people have given themselves in terms of &quot;that item is mine&quot; or &quot;I'm going to create that spot so you can't&quot;.  There are no &quot;rules&quot; in Gowalla apart from &quot;first come, first served&quot;.  The claim that this is game changing is ruled out completely by the fact that Gowalla are fully aware of the Gowalla Tools website and support it (with many of their developers retweeting and using the functionality).  I speak with the developers frequently to let them know when I'm releasing new tools that I feel conflict with the core gameplay or could interfere with their servers (e.g. by placing too much demand).  I would of course remove any tool they felt violated these rules and as yet no request has been made - only encouragement  to do more!&lt;/p&gt;

&lt;p&gt;On the positive side, there are a lot of people using the Item Finder in the way I intended.  I received a lot of tweets yesterday from people thanking me as they had found an item at a spot and were now going their specially to get it.  Some people were travelling up to an hour out of their way to get an item and I think that's great!  They were playing the game, going outside to new places rather than waiting and hoping that nobody would know an item they would quite like was there.&lt;/p&gt;

&lt;p&gt;The item Finder does not change the core gameplay of Gowalla in any way - it adds to it by showing you spots that are of interest to you.  There are people who are affected (namely those on the Android platform) but unfortunately that is a shortcoming on Gowalla's part in not implementing the same level of gameplay for all users.  They shouldn't have launched the Android version without all the core game components but this does not mean that Gowalla Tools should be limited.  There are several people on devices that can't play Gowalla who would like to - should we horde items away for them?  Of course not!  Items can still be obtained in the traditional ways and as yet they aren't limited to batches in the same way Packrat items are so I don't see the problem.&lt;/p&gt;

&lt;p&gt;Over the coming weeks I'll be releasing more tools that push forward this key feature of getting out there and discovering new places and todays new tool (Flickr Integration) hopefully expands this more by giving you more visual information about a place before you get there.  I stick firmly by my decision to release the item finder and I hope that the majority of you will agree with me.&lt;/p&gt;

&lt;p&gt;Now get out there and start Gowalla'ing!&lt;/p&gt;

</description>
    </item>
    
    <item>
      <title>The Apple Magic Mouse: Necessary upgrade or expensive luxury?</title>
      <link>http://bendodson.com/weblog/2009/10/31/the-apple-magic-mouse-necessary-upgrade-or-expensive-luxury/index.html</link>
      <pubDate>Sat, 31 Oct 2009 00:00:00 +0000</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2009/10/31/the-apple-magic-mouse-necessary-upgrade-or-expensive-luxury/index.html</guid>
      <description>&lt;p&gt;Apple recently announced the introduction of their latest peripheral, &lt;a href=&quot;http://www.apple.com/uk/magicmouse/&quot;&gt;the Magic Mouse&lt;/a&gt; (so called due to &lt;a href=&quot;http://www.macworld.com/article/143202/2009/10/mightymouse_trademark.html&quot;&gt;trademark problems&lt;/a&gt; with the existing &quot;Mighty Mouse&quot; name).  The new mouse offers the same multitouch features as found in the trackpads of recent MacBooks and of course the iPhone and iPod Touch. But is it any good?&lt;/p&gt;
&lt;h3&gt;Previous Apple Mice&lt;/h3&gt;

&lt;p&gt;The previous model (the &quot;Mighty Mouse&quot;) was a complete disaster in my opinion and the only Apple product apart from the Tiger Xserve that I have never been able to defend (even as a devout fanboy).  The main problem was that the scroll button (or 'nipple') would get clogged with dirt so easily that it would invariably stop working after a couple of weeks heavy usage.  The official Apple solution to this (which has since been pulled from the KnowledgeBase) was to turn it upside down and bang it in your palm!  Whilst it had a couple of benefits in terms of OS X integration (such as activating Exposé by squeezing) these features quite often generated more problems than they solved (such as activating Exposé by accidental squeezing).  So how does the Magic Mouse differ?&lt;/p&gt;

&lt;h3&gt;Design&lt;/h3&gt;

&lt;p&gt;The Magic Mouse has no buttons, no squeezing, and no cable.  Like the unibody MacBooks, it has gone for a simple look using the minimum number of parts; one piece of aluminium and one piece of glass.  It is incredibly short (in terms of height) compared to other mice whilst being slightly longer than others.  With no distinguishing buttons and a symmetrical shape, the only visual aid to placing it the right way round is the standard Apple logo displayed on the top.  In my opinion, the design is beautiful yet simplistic (as you would expect from any recent Apple product) but would look at home in a museum of modern art.  Not many people care about the aesthetics of a mouse (which is strange considering it's prominent location in most homes) but now I've had this on my desk, I'd find it very difficult to go back to something uglier.&lt;/p&gt;

&lt;p&gt;Before you've even got it to your desk you are struck by the beauty of the device.  The packaging is incredibly similar to the new iPods (which makes a lot of sense) but it still amazed me to see just how little packaging was used.&lt;/p&gt;

&lt;img src=&quot;http://farm3.static.flickr.com/2455/4061085886_937419aed9.jpg&quot; alt=&quot;Apple Magic Mouse packaging&quot; /&gt;

&lt;p&gt;It is difficult not to pick up the Magic Mouse in the Apple Store and not be impressed with the way it is packaged.  This is how all packaging should be in the modern world - I'm not talking just about technology (although there is large scope for improvement) but in everything from food to clothing.  Smaller packaging means not only that you can put more product in a store but also that you save fuel from transportation (as you can move more units in the same lorries / boats leading to less trips) and minimise wasteful plastic packaging.  I was impressed when I found out that the mouse came with batteries (very rare these days) but even more impressed when I discovered they were already in the device which was simply turned off.  This saves a huge amount of space and more plastic.&lt;/p&gt;

&lt;h3&gt;Functionality&lt;/h3&gt;

&lt;p&gt;As other commentators have noted, there is no &quot;wow&quot; moment with this mouse.  By this, they mean that the majority of Apple products have that initial euphoria when you use it for the first time (e.g. when you first unlock the iPhone or when you lift the MacBook out of it's stunning packaging) but this mouse doesn't have that.  You just use it.  However, what it does have is a strange sensation roughly after an hours use when you try to go back to using a normal mouse.  You find the scrolling isn't as intuitive and that you've been using the multitouch features without even thinking about it.  It is a very easy mouse to get used to and it is that which provides the &quot;wow&quot; as you realise you have been completely taken in.&lt;/p&gt;

&lt;p&gt;In terms of setup, it's a standard bluetooth mouse so a quick trip to the &quot;mouse&quot; page in Settings will have it set up in know time.  As of the time of writing, you need to download an update via &quot;Software Update&quot; to take advantage of the multitouch gestures but when OS X 10.6.2 is released it will be built into the OS by default.  The only negative here is that the update is 62MB which is a little excessive - this is most likely due to the videos that show you how to use the gestures in a similar way to the videos found on the MacBooks to show you how to use the trackpad.  In any case, setup is quick and painless.&lt;/p&gt;

&lt;p&gt;At present, there are very few actual uses of the multitouch.  Clicking is performed by a physical click (not just tapping as per the trackpads) but there is only one button.  The multitouch comes into play by detecting where your finger is on the surface and then linking that up to whether it is a primary or secondary click - this is very useful if you are left-handed or ambidextrous (as I am) as you can quickly switch the mouse to your other hand and it still feels comfortable thanks to the symmetrical design.  The only other two uses are scrolling (a simple case of moving your finger around on the surface - you can go up, down, left, right, and diagonal which is useful for zooming in photos, etc) and the two finger swipe which lets you go backwards and forwards through browser history and photos.  Apple also point out you can zoom into a page by holding the control button on the keyboard and swiping your finger up and down but this has always been possible by holding control and using a scroll wheel so I wouldn't describe it as a unique function.&lt;/p&gt;

&lt;h3&gt;Criticism&lt;/h3&gt;

&lt;p&gt;There appear to be two main criticisms of this device if you read the forums or the reviews pages on the Apple Store; size and functionality.&lt;/p&gt;

&lt;p&gt;A lot of people have found the size uncomfortable as it's so much shorter than previous mice.  However, I note that most of these reviews were from people going to their local Apple Store and trying it rather than at home.  I had read these reviews and so when I got to the store I made a point of squatting down to try it as the benches in the store are very low (meaning you're not holding the mouse as you normally would).  This made a huge difference to how it sat in my hand and so I think a lot of these reviews just stem from this problem.  I would never buy a mouse that cost this much money without trying it out first but it is important that you try and recreate how you would use it as much as possible.&lt;/p&gt;

&lt;p&gt;The second problem of functionality is much more valid in my mind.  For a multitouch device, this mouse uses a woeful amount of multitouch features.  When it was first announced I was expecting all the features of my trackpad such as pinch, rotating, zooming, 3-4 fingered swiping, and maybe a few extras as well.  Without this option (and the customisation that goes with it) there are just too few buttons for a lot of consumers.  The squeeze buttons on the Mighty Mouse may have been annoying to some but at least it gave you a way to control Exposé from your mouse - something that can save a lot of time over the course of a day.  Likewise with no middle button control you can't get to your dashboard or spaces easily (or use it like a PC mouse for opening new tabs in browsers).&lt;/p&gt;

&lt;p&gt;My theory on this lack of functionality is that Apple know they are going to get negative reviews that focus intently on this issue.  They will therefore release an update in a month or so which fixes it and adds full multitouch support which will then write off all of the negative reviews.  In this way, they are able to choose the negative issue that people will focus on safe in the knowledge they can resolve it later on and make it seem that everybody loves the device.  People who had an issue with the device can't then say &quot;x is bad about it&quot; as their original review will have focused on the multitouch issue as the only negative.  From what I've seen of Apple's marketing machine (one of the best in the world to my mind) and my studies of politics, this is exactly the kind of controlled negativity that I would expect.  I guess we'll see if I'm right in a month or so!&lt;/p&gt;

&lt;h3&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;So is the mouse worth £55 (or $69 - strange currency conversion there...) - at the moment I would say no simply due to the lack of features supported by the multitouch.  If these are corrected in a future update (and I'm confident they will be) then this will be one of the finest mice on the market, but at the moment it feels as if it's full potential is being restricted.  There is no question that this is a beautiful device, but the functionality needs to match the aesthetics before I can fully endorse it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update - 11th Nov 2009:&lt;/strong&gt; I was recommended &lt;a href=&quot;http://blog.boastr.net/?page_id=195&quot;&gt;BetterTouchTool&lt;/a&gt; by &lt;a href=&quot;http://twitter.com/ricklecoat&quot;&gt;@ricklecoat&lt;/a&gt; which is a free app that enables some extra features of the mouse.  For instance, my Magic Mouse now reveals my desktop when I slide two fingers up / down and does Exposé when I tap (yes tap, not click) with three fingers.  Has improved my productivity no end!&lt;/p&gt;

&lt;h3&gt;Gallery&lt;/h3&gt;

&lt;p&gt;I've put together a few shots of the unpacking of the Magic Mouse as well as comparing it with a few of my older mice. Check it out &lt;a href=&quot;http://www.flickr.com/photos/bendodson/sets/72157622701686080/&quot;&gt;on Flickr&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How to pitch an app idea to an iPhone developer</title>
      <link>http://bendodson.com/weblog/2009/10/16/how-to-pitch-an-app-idea-to-an-iphone-developer/index.html</link>
      <pubDate>Fri, 16 Oct 2009 00:00:00 +0100</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2009/10/16/how-to-pitch-an-app-idea-to-an-iphone-developer/index.html</guid>
      <description>&lt;p&gt;Thanks to my appearance on The Gadget Show &lt;a href=&quot;http://bendodson.com/weblog/2009/10/14/social-beacon-developing-an-iphone-app-for-the-gadget-show/&quot;&gt;earlier this week&lt;/a&gt;, I've been inundated with people emailing me with ideas for iPhone applications.  The majority of them have no understanding of the development aspects (which is fair enough) but have ideas for apps they want me to build, usually with payment via the profit made.  I've had quite a few interesting ones come through, but some have been suggested with very little thought or realism applied.  I decided to create this article to show prospective idea senders how an idea should be presented along with a few answers to common questions I've received&lt;/p&gt;
&lt;h3&gt;Research your idea&lt;/h3&gt;
&lt;p&gt;There is nothing worse than replying to 2 or 3 emails in which the sender is being cagey about their &quot;brilliant new idea&quot; only to discover (often after spending time signing, scanning, and sending an NDA) that it is actually an idea for which there  are over 250 apps available on the store.  The key thing before contacting a developer is to make sure that your idea has not been done already.  If it has, then either think of something else or find a unique selling point in your app that will make it stand out from the crowd.&lt;/p&gt;

&lt;h3&gt;Make sure your app is relevant&lt;/h3&gt;

&lt;p&gt;So your idea hasn't been done before?  The App Store has been open for over a year with over 65,000 applications so the next question should be &quot;why hasn't it been done&quot;.  There are three answers to this question: it's impossible, it's not a good idea, or it's unique.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Impossible:&lt;/strong&gt; When I say &quot;impossible&quot;, I mean that you've come up with something that the iPhone SDK won't allow (it may still be a good idea).  For example, you may have an idea to download soundclips off the internet and store them in the iPod library.  A good idea in theory but the iPod library only has read access so you are limited to what you can do.  There are several rules within the iPhone SDK which limit what can be done so be prepared that your idea may not be possible within those confines - there may, however, be workarounds (e.g. in the example above you could build a custom application to play the soundclips you've downloaded).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bad Idea:&lt;/strong&gt; The most common bad ideas I've had sent tend to be duplicating the functionality of an existing website into an iPhone app.  You might have a killer idea on your website and be the market leader in a certain arena.  This does not mean that converting it directly to the iPhone is going to be a good idea.  If your idea is working on a website already, then it is already accessible from an iPhone (provided it's not made in flash) so there is little benefit to making a custom application apart from it'll look slightly better.  It may be that there are a huge number of potential iPhone users who are put off by your website running on the device.  In that case, you should consider making a web app.  This is a way of using standard HTML and CSS to make a website look like an iPhone application but takes no extra knowledge than that of building your regular site.  I've built a few web apps myself and found it to be incredibly easy if you are using something like &lt;a href=&quot;http://code.google.com/p/iphone-universal/&quot;&gt;UiUiKit&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unique:&lt;/strong&gt; You've checked the App Store and found no trace of your idea, you are certain it's possible to do with the features of the device, and it's not a simple port of an existing website into an application. In that case your app is probably a unique endeavour and should definitely be pursued!&lt;/p&gt;

&lt;h3&gt;Know your audience&lt;/h3&gt;

&lt;p&gt;When I've been pitching for web development work in the past, I've often had clients say to me &quot;we should definitely make an iPhone app for this as well&quot; to which I usually reply &quot;why&quot;.  There is an unhealthy obsession at the moment with making applications simply for the fact that it shows you are modern.  However, you can easily spend a large sum of money building an application for a small bit of street cred only to find out that none of your target audience actually use iPhones (or wouldn't use your application anyway).&lt;/p&gt;

&lt;p&gt;If your idea is simply duplicating functionality of your website, then you shouldn't make it an iPhone application (or even a web app) unless more than 20% of your visitors are using an iPhone or you've had a lot of people ask for an app.  You wouldn't suddenly start supporting Internet Explorer 5.5 on the mac again but quite often you'll find more people visiting your website with that than with an iPhone yet people will often overlook simple statistics to try and seem more modern.&lt;/p&gt;

&lt;p&gt;Don't make custom apps or websites for devices or browsers that your users aren't using!&lt;/p&gt;

&lt;h3&gt;Understanding development costs&lt;/h3&gt;

&lt;p&gt;An iPhone app is not an easy thing to build and so, like a house or a website, you are paying for the expertise of the developer you commission to create your application.  If you believe your idea is unique and you are going to make a large profit from it, then you may want to pay your developer for the application in a one-off fee the same way that you would pay a builder or any other tradesman.  However, if you don't have the finance to pay to have your idea built, then some developers will be open to the idea of building the idea for you for free but then taking a percentage of the profit that comes in from selling the app.&lt;/p&gt;

&lt;p&gt;Negotiating for development costs is often very similar to the Dragon's Den program in that you will negotiate in terms of equity (how much of the profit you are willing to share) in order to get an expert to build the application.  However, where this often falls down is with prospective clients offering around 20% equity.  If you come to the table with nothing but an idea (and aren't planning on doing any designing, building, or marketing) then you can't expect to find a developer that will build your app and agree to taking a small percentage.&lt;/p&gt;

&lt;p&gt;In my own case, I prefer to be paid for the application but I will occasionally deal in terms of equity if I think the idea is good enough.  Having said that, I refuse to take less than 50% if I'm expected to build an application from the ground up with no other form of payment - most other developers are the same.&lt;/p&gt;

&lt;p&gt;It is important to note that it is not possible to give a straight up cost for an application before you've heard the idea.  I've received several enquiries of the sort &quot;can you tell me how much it'll cost to get an app built&quot;.  Pricing is generally based on the amount of time required so if you want a basic utility then it will cost a great deal less than a complex 3D game.  Bear in mind that you may be asking your developer to build a website or server software to run your applications (if you plan on using push notifications for example) and so these should be factored into your financial calculations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; with all applications, Apple takes approximately 30% of the sale of each application to cover the costs of the App Store.  This means that for every 59p sale, you keep approximately 42p.  You are paid at the end of each month by Apple but you are paid by territory and if you haven't earned over $150 in that territory then the amount rolls over to the next month that you do.  For example, if you made $100 in one month in the USA, then you are under the $150 threshold.  That rolls over to the next month.  If you then made another $100 you would be over the threshold so at the end of that month you'd be sent $200.  When you are negotiating with an iPhone developer, be sure to clarify if they are talking of their percentage in terms of sales price (before Apple takes it's 30% cut) or profit (after Apple has taken it's cut).&lt;/p&gt;

&lt;h3&gt;Building an app on your own&lt;/h3&gt;

&lt;p&gt;Apple provides all of the tools you need to make an iPhone application via it's developer website at &lt;a href=&quot;http://developer.apple.com/iphone/&quot;&gt;http://developer.apple.com/iphone/&lt;/a&gt; although you will need to be using a mac with an intel processor.  You can't build iPhone applications on windows.&lt;/p&gt;

&lt;p&gt;With the free SDK that Apple provides, you can use all of the features of the iPhone and test them in the iPhone Simulator that is also provided.  You can't, however, run the code on your own device or submit it to the App Store.  To do that, you'll need to get a developer license which costs $99 per year and can be purchased through the developer website above.  Once you have the license, you'll be able to generate provisioning profiles for your apps which will enable it to run on your own device or up to 100 other devices (e.g. friends, colleagues, testers).&lt;/p&gt;

&lt;p&gt;All apps are written in Objective-C so I'd highly recommend you buy a book on the subject.  If you are coming from a web-based background (e.g. PHP, Ruby, JavaScript, .net) then I'd also recommend you start by learning C before moving onto Objective-C.  You may be raring to jump into the SDK and start using things like the accelerometer and location services, but if you don't know how an array or a dictionary works, then you'll never be able to build an app that works well.&lt;/p&gt;

&lt;h3&gt;Getting your apps into the App Store&lt;/h3&gt;

&lt;p&gt;The only things you need are your completed application code (that should have been tested extensively in both the simulator and on actual devices) and a developer license.  Once you have these, you are able to generate the correct certificates to publish your application to the App Store.  You will be asked to supply not only text such as descriptions, app title, and keywords, but also screenshots and a 512x512px image of your application icon for use in Apple's promotional materials so make sure you have these available.&lt;/p&gt;

&lt;p&gt;The actual process for submission has been under a lot of criticism but basically you submit your app and then wait for a while (usually around 14 days - Apple have placed an indicator of queue length on the iTunes submission portal now) to find out if your app has been rejected or accepted.  If it's been rejected then they should supply you with information about what is wrong and how to fix it.  If it's been accepted, then congratulations, your app is ready for prime time!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; a common question seems to be &quot;can I submit an app with your developer license&quot;.  If we were to assume that I built you an iPhone app, then yes I could submit it to the app store using my license saving you $99.  However, this would mean the app appeared under my company name rather than your own and all payments for the app would go into my bank account.  Whilst this is possible, most clients would prefer that their company name is displayed and that all finance goes through them.&lt;/p&gt;

&lt;h3&gt;Copyright and other legalities&lt;/h3&gt;

&lt;p&gt;When Apple checks the application in it's approval process, it does not take into account copyright or any other legalities of that type.  This means that technically you could steal an idea such as &quot;Super Mario Bros&quot;, make a duplicate app, and then submit it.  However, you are still liable for breaches of copyright and so could be sued by the correct copyright holders and have to repay damages.  The basic rule of thumb is don't use copyright images, text, or music, and don't mimic other peoples ideas or intellectual property.&lt;/p&gt;

&lt;h3&gt;Contacting a developer&lt;/h3&gt;

&lt;p&gt;If after reading all of the above you are pleased with your idea and want to get an iPhone developer on board, you will need to contact them with the following pieces of information:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;A detailed explanation of your idea - if you are not comfortable with giving up your idea, then get the developer to sign a Non-Disclosure Agreement (or NDA) which will prevent them from stealing the idea.  It is worth pointing out to the developer that you have already done your research and know that your idea is unique before asking them to sign anything as you will be more likely to get a favourable response.&lt;/li&gt;
&lt;li&gt;What you are looking for - you'll need to detail what you need the developer to do (e.g. build the app, suggest changes, recommend a designer, etc) and also if you are looking to pay outright for the code or enter into a profit-share agreement (and the potential terms of such an agreement).&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;I reply to all emails that I receive but many developers will not get back to you if the two points above are not fulfilled.  The more detail you supply, the more likely it is that a developer will want to work with you and form a professional relationship as it shows that you are serious and have researched your idea rather than being someone interested in simply making a quick bit of cash by coping an existing flash game.&lt;/p&gt;

&lt;h3&gt;Summary&lt;/h3&gt;

&lt;p&gt;I hope that this article has given you a quick insight into how you can make your ideas more appealing to an iPhone developer and answers some of the more common questions about the process. If you have further questions, please feel free to leave them in the comments below or &lt;a href=&quot;http://bendodson.com/weblog/contact/&quot;&gt;contact me&lt;/a&gt;.  I'll be updating this article as and when other common questions come in.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Social Beacon: Developing An iPhone App for "The Gadget Show"</title>
      <link>http://bendodson.com/weblog/2009/10/14/social-beacon-developing-an-iphone-app-for-the-gadget-show/index.html</link>
      <pubDate>Wed, 14 Oct 2009 00:00:00 +0100</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2009/10/14/social-beacon-developing-an-iphone-app-for-the-gadget-show/index.html</guid>
      <description>&lt;p&gt;&lt;strong&gt;You can &lt;a href=&quot;http://fwd.five.tv/gadget-show/videos/challenge/apps-complete&quot;&gt;watch the Gadget Show episode online&lt;/a&gt; and &lt;a href=&quot;http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=326303505&amp;mt=8&quot;&gt;download Social Beacon from the App Store&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A couple of months ago, I was asked if I'd like to appear on Channel Five's &quot;&lt;a href=&quot;http://fwd.five.tv/gadget-show&quot;&gt;The Gadget Show&lt;/a&gt;&quot; to take part in a challenge about iPhone applications with Jason Bradbury and Suzi Perry.  I had only been developing iPhone apps for a short while but decided to enter into the spirit of the challenge by jumping head first into some of the trickier aspects of the iPhone SDK.  The show and results of the challenge &lt;a href=&quot;http://fwd.five.tv/gadget-show/videos/challenge/apps-complete&quot;&gt;aired last night&lt;/a&gt; so I thought it was time for me to do a write up of the application and the process of building it.&lt;/p&gt;
&lt;h3&gt;The Early Stages&lt;/h3&gt;

&lt;p&gt;My day-to-day job involves me working as a freelance PHP developer but I'm a huge Apple fan and have owned every iteration of the iPhone.  It wasn't long before I started toying with the idea of building iPhone apps, but the programming language was different to anything I'd ever done before.  As a PHP developer, I found it very hard initially learning how to code in Objective-C (the coding language for iPhone apps).  However, I purchased a couple of books including the excellent &quot;&lt;a href=&quot;http://www.pragprog.com/titles/amiphd/iphone-sdk-development&quot;&gt;iPhone SDK Development&lt;/a&gt;&quot; and &quot;&lt;a href=&quot;http://www.amazon.co.uk/Learn-Objective-C-Mac-Knaster-Dalrymple/dp/1430218150/ref=sr_1_3?ie=UTF8&amp;s=books&amp;qid=1255475410&amp;sr=1-3&quot;&gt;Learn Objective-C on the Mac&lt;/a&gt;&quot; and it wasn't too long before I became an iPhone developer.&lt;/p&gt;

&lt;p&gt;After making it on to the App Store with &lt;a href=&quot;http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=321813152&amp;mt=8&quot;&gt;Magnetic Flux &amp; Metal Detector&lt;/a&gt; [iTunes Link], I was asked if I'd be interested in making the iPhone Application for &quot;The Gadget Show&quot;.  The initial concept was fairly simple: an application that allowed you to quickly choose from a list of questions to build a sentence which could be sent to your social networks.  I agreed immediately and began working with my friend &lt;a href=&quot;http://www.lizahayes.co.uk&quot;&gt;Liza Hayes&lt;/a&gt; on the design but hadn't realised exactly what I'd let myself in for.&lt;/p&gt;

&lt;p&gt;In order to work as expected, the application would need to access an SQLite database on the device, be able to store custom sentences input by the user to that database, be able to build a sentence based on building an SQL query, and use the networking features of the iPhone to post to both Facebook and Twitter.  I had done a lot of work with Facebook Connect and the Twitter API in my web development work and I knew that Facebook had a custom integration of its API for the iPhone.  Even so, the networking problems were going to be tricky to overcome.  To add to all of this, Jason suggested that he'd like a way to show off the accelerometer in the iPhone, and I was interested in the settings panes and how we could make the app easily customisable.&lt;/p&gt;

&lt;h3&gt;Developing the app&lt;/h3&gt;

&lt;p&gt;The iPhone 3.0 OS had just been released, yet as a registered iPhone developer I was working on iPhone 3.1 so there were enumerable problems in switching my Xcode environment and devices back and forth between the two versions.  This was compounded with problems with Facebook Connect in that it had been written for the 2.1 OS and so was not 100% compatible with 3.0 leading to some caffeine fuelled Googling!&lt;/p&gt;

&lt;p&gt;We had decided that the accelerometer could be used in what Jason called &quot;Fingerless Functionality&quot; whereby you could shake the phone left and right to navigate around the Social Beacon wheel, and then tip the phone up and down to progress backwards and forwards through the option.  A simple shake of the phone would be enough to regenerate a sentence.  These parts were all very straightforward (especially the shake, which can be detected with one line of code in OS 3.0) yet we came to a usability problem once we thought about sending the message.  We couldn't use the shake or the down gesture, as these were used for regenerating the sentence on the final screen, so we needed to find another fingerless input method to post the message.  The answer eventually came in the guise of the microphone: we could detect sound so that blowing into the mic would blow your message to the internet!  Of course, this meant learning yet another aspect of the SDK that I had previously left untouched -- Core Audio -- but I'm always up for a challenge!&lt;/p&gt;

&lt;h3&gt;Distribution and the App Store&lt;/h3&gt;

&lt;p&gt;With various bugs overcome and a final test version working on my device, we were ready to distribute the app via the App Store.  You may have heard some of the horror stories from the App Store -- it can take a very long time and you end up being rejected without reason -- but I have to say that I found the process to work incredibly well.  It took 14 days from submission before Apple got back to us to say that the Application had been rejected due to a bug in the networking code (if you weren't connected to the internet the app would hang, or worse, say that the message had been sent).  They were incredibly helpful and gave a detailed explanation of the problem as well as including some sample code to show how the networking portion could be handled better.  After a couple of hours fixing it up, we resubmitted and the app was available around the world a few days later.&lt;/p&gt;

&lt;p&gt;We were of course competing against Suzi's &quot;&lt;a href=&quot;http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=326437408&amp;mt=8&quot;&gt;Biker Blast-Off!&lt;/a&gt; [iTunes Link]&quot; which was distributed at the same time, but crucially neither app was publicised on either Twitter or any other medium without mentioning the other with the same weight (so we'd invite people to try both apps).  Within 3 days, Social Beacon was in the top 20 free social media applications whilst Biker Blast-Off was climbing up the overall free application charts worldwide and racking up a huge number of downloads.  Interestingly, as both of our apps climbed higher, the reviews became more negative and I realised that this was true of nearly every app in the store.  It seems that even if you are willing to give away a free product which could easily be charged for, people will still rip the idea to pieces (some comments on the game even saying &quot;you'd need to pay me to play this game&quot; - no pleasing some people!).&lt;/p&gt;

&lt;h3&gt;The Aftermath&lt;/h3&gt;
&lt;img src=&quot;http://files.bendodson.com/old-weblog/2009/10/Screen-shot-2009-10-13-at-22.26.33.png&quot; alt=&quot;Jason Bradbury and Ben Dodson&quot; title=&quot;Jason Bradbury and Ben Dodson&quot; width=&quot;511&quot; height=&quot;288&quot; class=&quot;featured&quot; /&gt;
&lt;p&gt;The show was aired last night (and is available to &lt;a href=&quot;http://fwd.five.tv/gadget-show/videos/challenge/apps-complete&quot;&gt;watch online&lt;/a&gt;) and has the full story as well as the final figures and the winner of the challenge, but the story of the apps continues.  Since the show, both applications have now shot back up into the charts with both apps appearing in the top 10 free applications in the UK App Store.  Social Beacon is currently sitting pretty at spot number 4 and I couldn't be happier with it.&lt;/p&gt;

&lt;p&gt;A big thank you to the Gadget Show team (especially &lt;a href=&quot;http://twitter.com/colbyrne&quot;&gt;Colin Byrne&lt;/a&gt;, &lt;a href=&quot;http://twitter.com/ChrisPyUK&quot;&gt;Chris Payne&lt;/a&gt;, and &lt;a href=&quot;http://jasonbradbury.com/&quot;&gt;Jason Bradbury&lt;/a&gt;) and to &lt;a href=&quot;http://www.lizahayes.co.uk/&quot;&gt;Liza Hayes&lt;/a&gt; for her fantastic design work.  It was a great experience and it looks like I'm going to be developing iPhone applications for a long time to come!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Gowalla Tools Web App: Find your missing Gowalla items!</title>
      <link>http://bendodson.com/weblog/2009/10/07/gowalla-tools-web-app-find-your-missing-gowalla-items/index.html</link>
      <pubDate>Wed, 07 Oct 2009 00:00:00 +0100</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2009/10/07/gowalla-tools-web-app-find-your-missing-gowalla-items/index.html</guid>
      <description>&lt;p&gt;For those of you who play the excellent iPhone GPS game &lt;a href=&quot;http://gowalla.com/&quot;&gt;Gowalla&lt;/a&gt;, I've built a handy web app that will allow you to see all of your missing items and where you can find them.  In addition to telling you what type of spot a particular item is likely to appear at, it will also list specific spots if applicable (such as states - some items only appear in Texas for instance) and allow you to use the built-in location awareness of Safari in iPhone 3.0 to show you where the nearest spots of that type are.  It is available today at &lt;a href=&quot;http://gowallatools.com/&quot;&gt;http://gowallatools.com/&lt;/a&gt; and is the first in a series of small utilities I'll be creating to help players.&lt;/p&gt;

&lt;img src=&quot;http://files.bendodson.com/old-weblog/2009/10/IMG_0189.PNG&quot; alt=&quot;Gowalla Tools - Login&quot; title=&quot;Gowalla Tools - Login&quot; width=&quot;320&quot; height=&quot;480&quot; class=&quot;alignnone size-full wp-image-303&quot; /&gt;

&lt;p&gt;The first thing you will see when you open the web app is a prompt for your Gowalla username.  You don't need to login to the service, but it does need to know your username so it can search through your pack effectively (although you can also see your friends' missing items if you want to help them out with any of your own spare items).&lt;/p&gt;

&lt;img src=&quot;http://files.bendodson.com/old-weblog/2009/10/IMG_0188.PNG&quot; alt=&quot;Gowalla Tools - Missing Icons&quot; title=&quot;Gowalla Tools - Missing Icons&quot; width=&quot;320&quot; height=&quot;480&quot; class=&quot;alignnone size-full wp-image-306&quot; /&gt;

&lt;p&gt;You will then be shown all of your items in a list.  Tapping any of these (e.g. &quot;Conference Badge&quot;) will then show you which spots are likely to randomly give you the item in question when you check in.&lt;/p&gt;

&lt;img src=&quot;http://files.bendodson.com/old-weblog/2009/10/IMG_0190.PNG&quot; alt=&quot;Gowalla Tools - Icons Appear At...&quot; title=&quot;Gowalla Tools - Icons Appear At...&quot; width=&quot;320&quot; height=&quot;480&quot; class=&quot;alignnone size-full wp-image-307&quot; /&gt;

&lt;p&gt;The list will sometimes be broken into two sections: spot categories where you have a chance of finding the item on check in, and internal categories or spots.  These internal categories are usually things such as states (e.g. &quot;Texas&quot; has quite a few items) or freebies (which I believe are items randomly dropped by devs) but are often actual spots (e.g. &quot;Alamofire&quot; - the offices of the developers).&lt;/p&gt;

&lt;p&gt;With the standard categories, you can tap them to find spots in your local area (but you'll be prompted to allow the site to use your location - your location information isn't stored, it's just used to determine your nearest spots).&lt;/p&gt;

&lt;img src=&quot;http://files.bendodson.com/old-weblog/2009/10/IMG_0191.PNG&quot; alt=&quot;Gowalla Tools - Location Confirmation&quot; title=&quot;Gowalla Tools - Location Confirmation&quot; width=&quot;320&quot; height=&quot;480&quot; class=&quot;alignnone size-full wp-image-308&quot; /&gt;
&lt;img src=&quot;http://files.bendodson.com/old-weblog/2009/10/IMG_0192.PNG&quot; alt=&quot;Gowalla Tools - Nearest Spots&quot; title=&quot;Gowalla Tools - Nearest Spots&quot; width=&quot;320&quot; height=&quot;480&quot; class=&quot;alignnone size-full wp-image-309&quot; /&gt;

&lt;p&gt;If there are spots in your area, you can tap on them to view the spots information on the Gowalla website.&lt;/p&gt;

&lt;p&gt;If you save the web app to your homescreen (press the '+' symbol in Safari and choose &quot;Save to Homescreen&quot;) then you'll get a pretty custom icon so it looks just like a normal iPhone app (which it may well become one day).  I'll be expanding the service offering as and when I find new things to include :)&lt;/p&gt;

&lt;h2&gt;Feedback&lt;/h2&gt;

&lt;p&gt;The site is in beta mode so there may be a few bugs and tweaks but if you have any feedback, please &lt;a href=&quot;/contact/&quot;&gt;let me know&lt;/a&gt;.  Happy Gowalla'ing!&lt;/p&gt;

&lt;h2&gt;Legal&lt;/h2&gt;

&lt;p&gt;The web app is not owned, maintained, or developed by &lt;a href=&quot;http://alamofire.com/&quot;&gt;Alamofire, Inc.&lt;/a&gt; - Gowalla and all other trademarks and imagery are copyright of Alamofire.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>iPhone 3GS: Review and Speed Test (vs. iPhone 3G)</title>
      <link>http://bendodson.com/weblog/2009/06/19/iphone-3g-s-review-and-speed-test-vs-iphone-3g/index.html</link>
      <pubDate>Fri, 19 Jun 2009 00:00:00 +0100</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2009/06/19/iphone-3g-s-review-and-speed-test-vs-iphone-3g/index.html</guid>
      <description>&lt;p&gt;I was up at 5:30am this morning in order to start queueing for the iPhone 3GS outside my local O2 store - I'm happy to say that I was the first person in the queue and although I had problems in getting a second contract (eventually deciding to buy a PAYG version from the Apple Store) I am now the proud owner of the iPhone 3GS.  In this short post, I hope to review a few of the key features as well as giving you some real world stats from tests I've run to show the differences between the iPhone 3G and the iPhone 3GS.  Please use the comments section if you have any questions!&lt;/p&gt;

&lt;a title=&quot;iPhone 3GS vs iPhone 3G by Ben Dodson, on Flickr&quot; href=&quot;http://www.flickr.com/photos/bendodson/3642559406/&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3577/3642559406_087a27f07c.jpg&quot; alt=&quot;iPhone 3GS vs iPhone 3G&quot; width=&quot;500&quot; height=&quot;333&quot; class=&quot;featured&quot; /&gt;&lt;/a&gt;

&lt;h3&gt;Initial Thoughts&lt;/h3&gt;
&lt;p&gt;My first thought was that the iPhone 3GS somehow felt nicer than the previous models of the iPhone.  I remember upgrading from the original to the 3G and thinking that the new plastic back made it feel more comfy and it seems that again something has been done to the texture to make it seem more solid and comfortable.  Although it looks exactly the same as the 3G, there are a few minor aesthetic details such as the lettering on the back now being the same colour as the Apple logo which makes it stand out a bit more.&lt;/p&gt;

&lt;p&gt;The &quot;oleophobic screen coating&quot; (that's oil resistant to you and me) really does work incredibly well.  With previous iPhones, greasy finger marks on the screen wouldn't go away even if you rubbed them with your t-shirt or trouser leg; they just smeared.  With the new screen coating, one wipe with a t-shirt makes the screen look just like new.  This is a very useful addition to my mind!&lt;/p&gt;

&lt;p&gt;One other detail I noticed straight away is that the screen is a lot brighter.  I had thought it was slightly better (in the same way that Snow Leopard is much clearer than Leopard although this is to do with a switch to the 2.2 gamma standard) but wasn't aware of how much better until I placed it next to my old iPhone 3G - you can see the difference in the photo above.  The key thing here is that both phones were set to the same brightness level so there really is an improvement in the hardware somewhere.&lt;/p&gt;

&lt;h3&gt;New Features&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Compass&lt;/strong&gt; - the new digital compass (or magnetometer if you prefer?) was one of the big talking points of the iPhone 3GS as it allows for far more accurate turn-by-turn navigation.  It also added a sexy new app appropriately named &quot;compass&quot;.  The compass app itself is fairly basic and I felt that the actual readings were quite slow to adjust.  Additionally, making a very small change to the orientation of the phone doesn't always reflect in the compass which is a little frustrating when you are trying to get it to point exactly North.  Having said that, it's good enough to get a basic idea of which way is which.  The real area the compass shines in is in the updated Maps application where pressing the location button re-orientates the map to the direction you are facing.  This is absolutely invaluable when navigating and is a feature I will be using heavily.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Voice Control&lt;/strong&gt; - When it was announced at the WWDC Keynote, I felt that Phil Schiller sounded a bit stupid going on about how this great phone was now able to do voice commands seeing as it was something my Nokia could do 8 years ago.  However, I now realise why he was quite as smug as he was.  It really does work exactly as they demoed it.  After I synced my contacts and music, I tried a few of the commands such as &quot;phone Ben Dodson&quot; (to which it replied &quot;work, home, or mobile?&quot;), &quot;play panic at the disco&quot;, &quot;play more songs like this&quot;, and &quot;what song is this&quot;.  Every name and command I tried worked flawlessly so I was incredibly impressed.  The real power is that with other phones you'd need to add a voice tag for each contact whereas with the iPhone, it just reads the text and interprets your voice accordingly so there is no need for you to record a voice command prior to using it.  The app looks awesome as well!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Camera&lt;/strong&gt; - The new camera app is fantastic.  I can't believe that it's only a 3MP camera as the quality of the images is as good as some phones I've seen with 5 or even 7MP.  The video app is simple to use (as you'd expect) and again the quality is very very good.  It's a shame it doesn't film 720p but the colour balancing and overall quality make up for the relatively small resolution.  The only negative I can find is that video at nighttime is fairly grainy (whereas in daylight it's beautifully smooth) and the camera would really have benefited from having a flash.  I was really hoping the rumours that the Apple logo would act as a flash light were true but it appears that it's not the case... for this model at least!&lt;/p&gt;

&lt;h3&gt;I've got the need, the need for speed!&lt;/h3&gt;
&lt;p&gt;My main reason for buying the iPhone 3GS is that I wanted faster app loading times and generally quicker responses within the apps.  Playing Sonic the Hedgehog on my 3G nearly bought me to tears as it was actually unplayable (I'm sure they only tested it on a 2nd generation iPod Touch...) and I'd always get frustrated playing Tap Tap Revenge 2 when the app would skip a little due to memory running out.  So, speed was a big thing I was interested in.&lt;/p&gt;

&lt;p&gt;I did not imagine it would be as good as it actually is.&lt;/p&gt;

&lt;p&gt;The speed increases I've noticed so far have been nothing short of phenomenal for something that got a 50% speed boost and a doubling of RAM.  Quite often, load times have been reduced by up to 4x and overall app reliability is nothing short of flawless.  Here are a few stats based on some of my most commonly used and intensive apps:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bejeweled 2 - app launch to menu screen&lt;/strong&gt;&lt;br&gt;
3G = 12.1s&lt;br&gt;
3GS = 3.7s&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;iDracula - selecting &quot;grave park - survival&quot; on menu to actual gameplay&lt;/strong&gt;&lt;br&gt;
3G = 21.6s&lt;br&gt;
3GS = 6.5s&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Peggle - app launch to &quot;touch to play&quot; message&lt;/strong&gt;&lt;br&gt;
3G = 25.4s&lt;br&gt;
3GS = 10.2s&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sonic the Hedgehog - app launch to &quot;SEEEGGAAAAA&quot; message&lt;/strong&gt;&lt;br&gt;
3G = 5.9s&lt;br&gt;
3GS = 2.7s&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tap Tap Revenge 2 - app launch to main menu&lt;/strong&gt;&lt;br&gt;
3G = 6.4s&lt;br&gt;
3GS = 3.3s&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tap Tap Revenge 2 - selecting &quot;The Sound of Settling&quot; on &quot;Hard&quot; to start of track&lt;/strong&gt;&lt;br&gt;
3G = 8.9s&lt;br&gt;
3GS = 3.5s&lt;/p&gt;

&lt;p&gt;&lt;em&gt;All apps were tested on the 3.0 OS after an iPhone restart.  They were timed using a stopwatch and each test was run 3 times and then averaged in order to minimise discrepancies.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;Conclusions&lt;/h3&gt;
&lt;p&gt;The speed boost was definitely the biggest thing for me and I have to say that it has exceeded my expectations.  The small range of stats above don't accurately display how snappy everything has become.  Previously, navigating the menus of Tap Tap Revenge 2 always a pause of around a second between each screen whereas now it's instant.  Also, actually playing the game could be incredibly frustrating as I knew I was in time but a memory glitch along the way would cause the tappers to move erratically causing you to miss them even though you hit the area at the right time.  This was verified to me when playing on the 3GS as I got a 100% streak straight away without really trying too hard.  Another game that suffered horribly on the 3G was Sonic the Hedgehog which really shouldn't have been allowed to go on the App Store.  It was probably ok on the 2nd Gen iPod Touch as that had a slightly faster CPU, but on the 3G it was just dismal with stuttering sound, obvious slow down and speed up, and a whole host of other glitches such as unresponsive controls.  On the 3GS, it plays exactly as it always should have done - exactly the same as it did on the Mega Drive.&lt;/p&gt;

&lt;p&gt;I haven't even touched upon areas such as the speed increases in Safari rendering (pages are near instant - truly amazing mobile web browsing), the noticeably smoother animations between apps, or any of the other minor tweaks that make sure that the 3GS not only outperforms the 3G, but actually completely exceeds the speeds that were previously attainable.&lt;/p&gt;

&lt;p&gt;However, there are one or two problems in all of this.  For me, the biggest question mark hangs over how the App Store is going to be managed.  The iPhone 3GS has much better hardware and allows for much better graphics which means that theoretically we should get into a situation where apps are available only for 3GS.  However, it looks as if Apple is going to resist this route and that the 3GS upgrade is purely for across the board speed increases rather than in making more powerful apps.  I can't predict what is going to happen but I fear that there will be a lot of apps made that will only work on the 3GS but they won't be labelled as such in the App Store (in the same way that Sonic the Hedgehog should have been labelled 2nd Gen iPod Touch only).  This leads to a lot of frustration when you are paying £5.99 or so for a game which then won't work on the existing hardware.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So, do I think the 3GS is worth the upgrade?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes.  Yes I do.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>The tale of the "O2 Fail" (starring the iPhone 3GS)</title>
      <link>http://bendodson.com/weblog/2009/06/13/the-tale-of-the-o2-fail-starring-the-iphone-3g-s/index.html</link>
      <pubDate>Sat, 13 Jun 2009 00:00:00 +0100</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2009/06/13/the-tale-of-the-o2-fail-starring-the-iphone-3g-s/index.html</guid>
      <description>&lt;p&gt;Ever since the iPhone 3GS was announced in the Apple WWDC Keynote last week, the internet has been ablaze with criticism about both AT&amp;T and O2 with regards to their upgrade policies to the new phone for existing iPhone 3G customers.  I have battled long and hard on &lt;a href=&quot;http://twitter.com/bendodson&quot;&gt;Twitter&lt;/a&gt; and on the &lt;a href=&quot;http://forum.o2.co.uk/viewforum.php?f=3&quot;&gt;O2 Forums&lt;/a&gt; to try and put across that they have in fact done nothing wrong, it is the public that are misguided, yet this has fallen on relatively deaf ears.  I decided it would be easier to put one whole post together about the &quot;O2 Fail&quot; (or &lt;a href=&quot;http://search.twitter.com/search?q=%23o2fail&quot;&gt;#o2fail&lt;/a&gt; for you Tweeters) and the rational response to it so I could just point people in this direction rather than re-explaining myself over and over!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; I don't work for O2 and never have done.  I used to be on the 3 mobile network in the UK as it was the cheapest before switching to O2 in order to get the iPhone.  I bought the original iPhone about 4 months before the 3G came out (and so paid full price for it which was around £330 plus a £35 contract) and then upgraded to the iPhone 3G by paying £59 and upgrading to the £45 18-month contract.  I will be buying the iPhone 3GS next Friday by taking out a second contract and letting the remaining 6 months on my current contract run out.  Therefore, I have no reason to be supporting O2 as I would benefit greatly if they caved in and let people upgrade for free - the point I'm putting across is that there is good reason why they aren't doing that and people need to understand why that is.&lt;/em&gt;&lt;/p&gt;

&lt;img src=&quot;http://files.bendodson.com/old-weblog/2009/06/o2failtwitter.png&quot; alt=&quot;O2 Fail Twitter&quot; title=&quot;O2 Fail Twitter&quot; width=&quot;298&quot; height=&quot;300&quot; class=&quot;alignnone size-full wp-image-168&quot; /&gt;

&lt;h3&gt;The iPhone 3GS&lt;/h3&gt;
&lt;p&gt;During the &lt;a href=&quot;http://events.apple.com.edgesuite.net/0906paowdnv/event/index.html?internal=ijalrmacu&quot;&gt;WWDC Keynote&lt;/a&gt;, Apple announced that the new model of the iPhone (the iPhone 3GS - the 'S' stands for 'Speed') would be released on the 19th of June in 6 countries at a price of $199 for the 16GB model and $299 for the 32GB model.  Crucially, these were prices on a specific AT&amp;T 24-month tariff for new customers.  Here in the UK, &lt;a href=&quot;http://shop.o2.co.uk/update/paymonth.html&quot;&gt;the prices vary&lt;/a&gt; from 'free' to £280 or so (or even £550 if you choose Pay As You Go).  Again these prices are for new customers only.  So, as was bound to be the case, there are a large number of iPhone 3G customers who want to upgrade to the iPhone 3GS who are being told they have to finish their existing contracts before they can get the new model.  This can be done in two ways; wait until your contract ends or pay to get out of it now.  This very simple issue is the basis for all of &quot;O2 Fail&quot; comments over the past few days.  Let's look at why it has annoyed people so much...&lt;/p&gt;

&lt;h3&gt;&quot;But last time...&quot;&lt;/h3&gt;

&lt;p&gt;When the iPhone 3G as announced, O2 allowed original iPhone customers to terminate their contracts early at no cost and start a brand new contract.  The only cost was that of the phone and was the same cost that applied to new customers.  In my own case, this was around £59 as I moved up to the £45 a month contract (18 months).  The reason O2 did this (when they and other carriers have never done this for a phone before) is because they didn't subsidise the original iPhone.  When you went to the Apple Store or to an O2 store, you paid the full retail price (which was around £330 for the 16GB model).  Therefore, the contract you were on was purely making money based on calltime - that was a pretty sweet deal for O2 and so it was surprising they allowed people to upgrade.&lt;/p&gt;

&lt;p&gt;In any case, most people seem to think that as it happened last time it should happen this time.  They have failed to grasp the crucial word 'subsidy'.  The original iPhone wasn't subsidised, the iPhone 3G was (as is the iPhone 3GS). This means that a large portion of the money you now pay to O2 from your contract goes directly to Apple for the cost of the phone.  It's worth pointing out that this is the same with every other phone on the market with every other carrier (unless you're using Pay As You Go in which case you pay the full price for the phone up front).  So, if O2 were to say at this point &quot;of course you can upgrade under the same conditions as last time&quot; they would lose a HUGE amount of money as not only would they not have made any money on airtime, they would have lost the money on the subsidised phone.&lt;/p&gt;

&lt;h3&gt;What about paying off the remaining subsidy on my phone?&lt;/h3&gt;

&lt;p&gt;There have been a fair number of people asking this question - &quot;why can't I just buy out my subsidy and get a new contract&quot;.  The key problem here is that O2 would still not have made any money as they would have basically given you free airtime for the last 12 months.  If you only pay your subsidised part, then they aren't making money.  This is where the crucial word 'contract' comes into use as you signed an agreement to pay a certain amount of money per month to cover the cost of the phone and the airtime.  &lt;/p&gt;

&lt;h3&gt;But what about customer loyalty!?!&lt;/h3&gt;

&lt;p&gt;The follow up argument to the above is &quot;but they'd make money on the airtime in my new contact&quot;.  So, you've just screwed O2 for the past 12 months by using their network without effectively paying for it and now you want a new contract where they will be able to make their money back?  I don't follow that for one instant as what happens when the next iPhone comes out in 12 months ?  We'll go back to square one with the argument being &quot;they did it the last 2 times, why can't I upgrade now&quot; which means that again O2 will go without being paid for their network usage.&lt;/p&gt;

&lt;h3&gt;Ok, how about they just add my remaining contract to my new contract?&lt;/h3&gt;

&lt;p&gt;This is a slightly harder argument as in a way it makes some sense.  Rather than waiting 6 months for my contract to expire and then upgrading to a new 18 month contract, why can't O2 just let me upgrade now and add an additional 6 months to my new contract?  This would work in theory but the problem is that you'll start getting people on contracts from 18-36 months and I'll guarantee that come next year they'll be the first ones to ask for another extension putting them on 24-42 month contracts and so on.  This is a similar problem to people extending loan terms forever and ever in that there comes a point where they simply aren't going to pay it back.  I don't know the full details but I imagine there are some laws on how many times a contract can be extended as well in order to ensure fair fiscal management but don't quote me on it!&lt;/p&gt;

&lt;h3&gt;Don't they realise we're in the middle of a recession!&lt;/h3&gt;

&lt;p&gt;This is by far the best argument I've seen used - people actually pointing out that due to the &quot;credit crunch&quot;, O2 should be lowering prices so they can get the phone cheaper.  If the recession is really that bad, don't you think it's a little stupid of you to be arguing about getting a slightly faster iPhone?  Surely you should be worrying about the price of basic essentials like food, clothes, and petrol rather than the ability to get a slightly better camera in your smart phone?  And how do you think mobile phone carriers are doing in the economic crisis?  They need to make money as well!&lt;/p&gt;

&lt;h3&gt;The Facebook Group&lt;/h3&gt;

&lt;p&gt;One of my other favourite things during this whole saga has been the Facebook group &lt;a href=&quot;http://www.facebook.com/group.php?gid=90662329515&amp;ref=nf&quot;&gt;I DONT WANT TO PAY TO UPGRADE MY IPHONE!&lt;/a&gt; - I don't think I even need to provide an argument against this.&lt;/p&gt;

&lt;h3&gt;My Point&lt;/h3&gt;

&lt;p&gt;I've spoken about the reasons why these arguments are flawed but my real point is that people don't &quot;need&quot; the iPhone 3GS so I don't understand why so many people are desperate to upgrade.  I'm an iPhone developer and therefore want the new hardware so that I can write better apps that utilize it's hardware, but to everybody else there is very little gain.  Sure you get a slightly better camera, the ability to film video, and a digital compass (as well as a processor and RAM upgrade) but you get far more from the 3.0 upgrade than you do from the hardware upgrade.&lt;/p&gt;

&lt;p&gt;I suppose my real point is that there are things called &quot;contracts&quot; that people have entered into - they are now throwing their toys out of the pram because they can't get the latest shiny object from Apple without paying for it but unfortunately that's just how it is and O2 are not going to change their minds.  Why not?  Because if they did they would lose huge amounts of money.  At this point people decry the greedy networks and the fact that they are going to take their business elsewhere.  The crucial point is that O2 is the only network that can cope with the iPhone properly and they are the only supplier so you either stay with them or you get a Palm Pre, a Google Android, or one of the new Windows Mobile phones from another supplier.  But, I can guarantee that in 12 months when a new model of those phones comes out, the networks won't let you upgrade early for free so you'll be back where you started.... just with a rubbish phone instead!&lt;/p&gt;

&lt;p&gt;The key point is that the iPhone 3GS has not been designed for existing iPhone 3G customers - it has been designed specifically to address the concerns of people who were deciding whether to get one of the other smartphones I mentioned or an iPhone.  They have added MMS, Video, and a better camera - the three major flaws with the iPhone that any undecided customer would count as negatives.  If you're an iPhone 3G user at present, I highly doubt that you are going to stop becoming an iPhone user over this issue as you have already been sold on the idea of the phone and you know that no other phone currently suits your needs.&lt;/p&gt;

&lt;p&gt;Besides, as a network O2 has proved itself to be far better than many other iPhone carriers (*cough* AT&amp;T *cough*).  They are supporting MMS on launch day (including video for those with the 3GS), the push notification system has worked flawlessly so far (I've been beta testing it), and they have internet tethering working as well (which also works very well - I'll be coming back to the price of this later).&lt;/p&gt;

&lt;h3&gt;What can I do?&lt;/h3&gt;

&lt;p&gt;So if you're read this and been swayed over to rational thinking rather than getting involved in the anti-O2 hype, what are your options for upgrading to the iPhone 3GS?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wait.&lt;/strong&gt; I know it's difficult but you don't &lt;em&gt;need&lt;/em&gt; the iPhone 3GS.  If you had a great need for video then you would have bought a different phone in the first place.  If you bought your iPhone 3G on launch day, you should have 6 months of you contract left and this may be reduced to 0 months, 3 months, or 5 months depending on how much you've spent recently - take a look at the &lt;a href=&quot;http://www.o2blueroom.co.uk/o2prioritylist/&quot;&gt;O2 Priority List&lt;/a&gt; for details.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Buy a Pay As You Go iPhone 3GS and sell your old iPhone 3G on eBay (or to a friend, etc).&lt;/strong&gt;  You get the full functionality, get to keep your number, and it'll all work on launch day just by putting your existing SIM card into the new phone.  Visual Voicemail, etc, will work as you'll still be on a contract plan (the hardware between the contract and PAYG phones is the same).  Plus you might even make money this way as the iPhone 3G's are selling for a high price - best to get on their quickly though!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pay off your existing contract.&lt;/strong&gt;  This route is the most expensive but you could pay off your existing contract and take out a new one - the price is generally the number of months remaining times your monthly rate so in my case it was £270 (£45 x 6).  This is the easiest way but the most expensive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Take out a second contract.&lt;/strong&gt;  This is what I'm going to be doing next Friday.  Rather than paying off my contract in one lump sum, I'll keep that contract and my iPhone 3G (I use it for app testing) but I'll just get a new contract with the iPhone 3GS.  This means I'll be paying for 2 contracts for around 6 months but that spreads the cost a bit rather than having one big hit all at once.  Also, you can downgrade your iPhone contract one level after 9 months so I'll be able to move my iPhone 3G down to the £35 plan this month (and the £30 the month after) which will save some money - it also means I have a spare, live phone in case I need it for anything.  This is again an expensive method but it spreads the cost rather than having it all in one hit - however, it may be subject to a second credit check to make sure you can afford two contracts at once.&lt;/p&gt;

&lt;h3&gt;What should O2 do?&lt;/h3&gt;

&lt;p&gt;To my mind, this whole saga could have been avoided if O2 still offered 12 month contracts.  Of course, the main problem is that phones are getting more and more expensive and operators want to keep overall contract prices as low as possible so they look competitive.  I believe it was 3 mobile who were the first to bring in 18 month contracts as they could do so incredibly cheaply - they got a huge market share simply because people didn't realise what they were signing up for.&lt;/p&gt;

&lt;p&gt;So, on the one hand you could have 12 month contracts but charge people a large amount a month so you cover both subsidy and airtime, or you can have 18-24 month contracts which are cheaper but then the customer has to pay out if they want to upgrade to the latest and greatest phone.  Both have their issues and overall the cost is probably the same; the real difference is when you pay it.  Personally, I would like to see mobile operators offer all three services so people can choose straight up if they want 12 months (high price, low lock-in), 18 months (medium price, medium lock-in), or 24 months (low price, high lock-in).  That would avert this whole discussion on upgrading to new phone models!&lt;/p&gt;

&lt;h3&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;So there you have it - O2 haven't done anything wrong, they are simply doing the same as every other provider has done since they were created.  We can shout all we like but they won't back down on this issue as it doesn't make any financial sense for them to do so.  If you are desperate for the iPhone 3GS, then you'll just have to pay for it or wait it out a bit longer.&lt;/p&gt;

&lt;p&gt;Now, if I've convinced you to stop petitioning O2 about iPhone 3GS upgrades, perhaps I can convince you instead to spend your time petitioning them about their ridiculous Internet Tethering charges as that is a fight I believe can be won - £15 for 3GB of transfer is far, far too much and I can't see any justification for it!  So, give up the 3GS battle and instead shout about the tethering charges :)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Mastering phpMyAdmin 3.1 for Effective MySQL Management</title>
      <link>http://bendodson.com/weblog/2009/06/11/mastering-phpmyadmin-3-1-for-effective-mysql-management/index.html</link>
      <pubDate>Thu, 11 Jun 2009 00:00:00 +0100</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2009/06/11/mastering-phpmyadmin-3-1-for-effective-mysql-management/index.html</guid>
      <description>&lt;p&gt;I was recently asked by Packt Publishing to review a copy of their latest book, &lt;a href=&quot;http://www.packtpub.com/mastering-phpmyadmin-3-1-fourth-edition/book/mid/210509nwgp84&quot;&gt;Mastering phpMyAdmin 3.1&lt;/a&gt; which promises to &quot;increase your MySQL productivity and control by discovering the real power of phpMyAdmin 3.1&quot;.  I was a little skeptical at first of a book on phpMyAdmin, the most widely used MySQL admin tool, especially when it arrived at 325 pages! However, there is a huge amount of information that really is very useful to every PHP developer out there whether you are a beginner or an advanced user.&lt;/p&gt;

&lt;a href=&quot;http://www.flickr.com/photos/bendodson/3606999757/&quot; title=&quot;[123/365] Mastering phpMyAdmin 3.1 by Ben Dodson, on Flickr&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3601/3606999757_83df2cf84f.jpg&quot; width=&quot;500&quot; height=&quot;333&quot; alt=&quot;[123/365] Mastering phpMyAdmin 3.1&quot; class=&quot;featured&quot; /&gt;&lt;/a&gt;

&lt;p&gt;Now, most people I've mentioned the book to have scoffed and said something along the lines of &quot;I already know how to use phpMyAdmin&quot;.  Like them, I thought I knew what phpMyAdmin was and what it could do but it turns out there are huge amounts of functionality I never knew existed in MySQL let alone in phpMyAdmin!&lt;/p&gt;

&lt;h3&gt;For the Beginner&lt;/h3&gt;

&lt;p&gt;The book starts off with a very gradual introduction to phpMyAdmin covering everything from basic installation and setup to a detailed explanation of the overall interface.  I was particularly pleased to see an in-depth chapter on security configuration at the beginning of the book which would help any newcomer make sure that their setup is completely secure - usually such chapters are found at the back in the appendices!  The first six chapters follow in a similar vein with very basic information about how to run SQL queries, edit data, change structures, and so on but chapters seven and eight deal with exporting and importing data which is one of the many areas that I have seen developers struggle with in the past.  There is a good explanation of the different methods for importing / exporting including the benefits of certain types over others.  Crucially, there is a section on CSV using LOAD DATA which is something that has always seemed to lack proper explanation to me in the past.&lt;/p&gt;

&lt;p&gt;There then follows a few more chapters which more advanced users can probably skip such as searching, an overview of relational databases, and table / database operations.&lt;/p&gt;

&lt;h3&gt;Advanced Topics&lt;/h3&gt;

&lt;p&gt;I would say that the real meat of the book for experienced PHP developers begins at chapter thirteen  with each further chapter adding useful knowledge.  I've listed the key highlights of these chapters below:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The Multi-Table Query Generator&lt;/strong&gt; - A powerful tool which enables you to fine tune complex queries via a series of forms thus allowing you to specify multiple criteria.  It contains features such as automatic joins which allow you to very easily build up complex queries.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bookmarks&lt;/strong&gt; - A feature I was completely unaware of that allows you to save queries for future use.  This is particularly useful if you happen to be a database administrator that administers purely on a table by table basis within phpMyAdmin and has a number of queries to run.  I always used to have popular queries I'd use stored in a notepad on my OS X Dashboard but no need anymore!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;System Documentation&lt;/strong&gt; - I recently had a need to produce some MySQL documentation so was very happy to read this chapter and find out about the excellent documentation tools available within phpMyAdmin.  This includes not only a basic print view, but also a data dictionary and a relational schema which are all exported as PDFs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MIME-Based Transformations&lt;/strong&gt; - If you're the kind of developer that likes to store images, etc, as BLOB fields.  With transformations, you can make images appear as images within the phpMyAdmin results rather than as indecipherable encoded text.  Very useful!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MySQL 5.0 and 5.1&lt;/strong&gt; - a quick look at the enhancements that MySQL 5 added with things such as views, routines, stored procedures, and very interestingly, triggers (a way to run other MySQL commands when a certain thing happens - e.g. when a table gets updated).  You'd probably want a separate book to cover MySQL 5 if you were planning on doing any development with it, but this chapter gives you a good overview of some of the things you can expect.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MySQL Server Administration&lt;/strong&gt; - The final chapter deals with some of the more fundamental maintenance tasks related to the actual server and improvements that can be made with caching etc as well as a good comparison of the different types of storage engine you can choose.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Summary&lt;/h3&gt;
&lt;p&gt;All in all, I would highly recommend this book to any PHP developer or anybody that is using phpMyAdmin on a regular basis.  It could really have been broken into two books - a beginners and an advanced - but it works well by acting as a reference for those developers that have grown up using phpMyAdmin.  The main thing though is that it taught me a great deal about phpMyAdmin that I didn't realise was even there - just goes to show that even a basic sounding book can have a great deal to offer.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Mastering phpMyAdmin 3.1 is available online from &lt;a href=&quot;http://www.packtpub.com/mastering-phpmyadmin-3-1-fourth-edition/book/mid/210509nwgp84&quot;&gt;Packt Publishing&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>TwitterFollowers PHP Class - A Better Way To Track Followers, Quitters, and Returning Followers on Twitter</title>
      <link>http://bendodson.com/weblog/2009/05/25/twitterfollowers-php-class-a-better-way-to-track-twitter-followers-quitters-and-returning-followers/index.html</link>
      <pubDate>Mon, 25 May 2009 00:00:00 +0100</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2009/05/25/twitterfollowers-php-class-a-better-way-to-track-twitter-followers-quitters-and-returning-followers/index.html</guid>
      <description>&lt;p&gt;Over the past few months, there have been a number of web apps that have popped up with the task of feeding your ego (or indeed deflating it) by telling you exactly who is following you on Twitter and giving you pretty graphs to show you how your followers are increasing - some of them even go so far as to estimate how many followers you are likely to have in a weeks time!  However, the key thing for me that is missing from Twitter is the ability to see who has stopped following you and also those people that stopped but are now following you again as you don't get email alerts from Twitter for these two things.  This is a useful piece of information to have as it will let you know when people drop off and whether they are important (e.g. friends who don't care what you are talking about thus suggesting you should stop talking crap) or not (e.g. spam bots).&lt;/p&gt;
&lt;p&gt;I did a bit of research and the only real web app to fulfill this need that I could find was the beautifully designed &lt;a href=&quot;http://useqwitter.com/&quot;&gt;Qwitter&lt;/a&gt;.  However, the problem with Qwitter is that it only gives you the details for one person with the idea being that you say &quot;tell me when this username stops following me&quot; - it's a little bit stalkerish in my opinion!  Like any PHP developer, I decided that I could build my own little system to give me my Twitter ego boost and so have come up with the class below which you can all now take and use as you see fit.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Turns out I was wrong about Qwitter as the username you put in to follow is supposed to be yours, not the person you want to watch when they leave you.  They need to do better copywriting! In any case, the class below serves as a good demo of the public Twitter data and allows you to extend it the way you want.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This won't work straight out of the box - I've put in a few comments which say &quot;SQL Required&quot;.  This is because you may well have your own schema (although I do provide one) and you may have your own framework or DB connection functions (I know I do).  Once you've done those, just substitute the constants for your own details and it should all work&lt;/p&gt;

&lt;h3&gt;TwitterFollowers.class.php&lt;/h3&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;php&quot;&gt;&lt;span class=&quot;cp&quot;&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class=&quot;sd&quot;&gt;/**&lt;/span&gt;
&lt;span class=&quot;sd&quot;&gt; * Crawls Twitter Followers and sends an email alert to show you who has started following, stopped following, and started re-following&lt;/span&gt;
&lt;span class=&quot;sd&quot;&gt; *&lt;/span&gt;
&lt;span class=&quot;sd&quot;&gt; * @author Ben Dodson&lt;/span&gt;
&lt;span class=&quot;sd&quot;&gt; **/&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;TwitterFollowers&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;c1&quot;&gt;// define constants&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;username&lt;/span&gt;	&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;bendodson&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;email&lt;/span&gt; 	&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;ben@bendodson.com&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;subject&lt;/span&gt;	&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Twitter Updates&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;from&lt;/span&gt;	&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;TwitterBot &amp;lt;twitter@bendodson.com&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
	
	&lt;span class=&quot;c1&quot;&gt;// define internal variables&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;protected&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$actualFollowers&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;protected&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$internalFollowers&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;protected&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$followerChanges&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;protected&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$now&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
	
	&lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;__construct&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;now&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;Y-m-d H:i:s&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
		
		&lt;span class=&quot;nv&quot;&gt;$json&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;file_get_contents&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;http://twitter.com/followers/ids/&amp;#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;username&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;.json&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
		&lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;actualFollowers&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;json_decode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$json&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
		&lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;internalFollowers&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getInternalFollowers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
		
		&lt;span class=&quot;k&quot;&gt;foreach&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;actualFollowers&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$actualFollower&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;in_array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$actualFollower&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;internalFollowers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
				&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getTweeter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$actualFollower&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
					&lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;followerChanges&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;returning follower&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;][]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$actualFollower&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
					&lt;span class=&quot;cm&quot;&gt;/*&lt;/span&gt;
&lt;span class=&quot;cm&quot;&gt;					--SQL REQUIRED--&lt;/span&gt;
&lt;span class=&quot;cm&quot;&gt;					UPDATE TwitterFollowers SET start = $this-&amp;gt;now, end = NULL WHERE id = $actualFollower&lt;/span&gt;
&lt;span class=&quot;cm&quot;&gt;					*/&lt;/span&gt;
				&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
					&lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;followerChanges&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;new follower&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;][]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$actualFollower&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
					&lt;span class=&quot;cm&quot;&gt;/*&lt;/span&gt;
&lt;span class=&quot;cm&quot;&gt;					--SQL REQUIRED--&lt;/span&gt;
&lt;span class=&quot;cm&quot;&gt;					INSERT INTO TwitterFollowers (id) VALUES ($actualFollower)&lt;/span&gt;
&lt;span class=&quot;cm&quot;&gt;					*/&lt;/span&gt;
				&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
			&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
		
		&lt;span class=&quot;k&quot;&gt;foreach&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;internalFollowers&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$internalFollower&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;in_array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$internalFollower&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;actualFollowers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
				&lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;followerChanges&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;stopped following&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;][]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$internalFollower&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
				&lt;span class=&quot;cm&quot;&gt;/*&lt;/span&gt;
&lt;span class=&quot;cm&quot;&gt;				--SQL REQUIRED--&lt;/span&gt;
&lt;span class=&quot;cm&quot;&gt;				UPDATE TwitterFollowers SET end = $this-&amp;gt;now WHERE id = $internalFollower&lt;/span&gt;
&lt;span class=&quot;cm&quot;&gt;				*/&lt;/span&gt;
			&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
		
		&lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;sendEmail&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;	
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	
	&lt;span class=&quot;k&quot;&gt;protected&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getInternalFollowers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;nv&quot;&gt;$data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
		&lt;span class=&quot;nv&quot;&gt;$raw&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; 
		&lt;span class=&quot;cm&quot;&gt;/*&lt;/span&gt;
&lt;span class=&quot;cm&quot;&gt;		--SQL REQUIRED--&lt;/span&gt;
&lt;span class=&quot;cm&quot;&gt;		SELECT id FROM TwitterFollowers WHERE end IS NULL&lt;/span&gt;
&lt;span class=&quot;cm&quot;&gt;		*/&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;foreach&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$raw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;nv&quot;&gt;$data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

	&lt;span class=&quot;k&quot;&gt;protected&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getTweeter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt;
		&lt;span class=&quot;cm&quot;&gt;/*&lt;/span&gt;
&lt;span class=&quot;cm&quot;&gt;		--SQL REQUIRED--&lt;/span&gt;
&lt;span class=&quot;cm&quot;&gt;		SELET * FROM TwitterFollowers WHERE id = $id LIMIT 1&lt;/span&gt;
&lt;span class=&quot;cm&quot;&gt;		*/&lt;/span&gt;		
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	
	&lt;span class=&quot;k&quot;&gt;protected&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getTweeterDetails&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;nv&quot;&gt;$json&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;file_get_contents&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;http://twitter.com/users/show/&amp;#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;.json&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
		&lt;span class=&quot;nv&quot;&gt;$tweeter&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;json_decode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$json&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$tweeter&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39; (&amp;#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$tweeter&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;screen_name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;)&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	
	&lt;span class=&quot;k&quot;&gt;protected&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;sendEmail&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;nv&quot;&gt;$to&lt;/span&gt;      &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;email&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;nv&quot;&gt;$subject&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;subject&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;nv&quot;&gt;$headers&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;From: &amp;#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\r\n&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Reply-To: &amp;#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

		&lt;span class=&quot;nv&quot;&gt;$message&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Hi,&amp;#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\r\n\r\n&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;nv&quot;&gt;$message&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Here are your Twitter Updates:&amp;#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\r\n&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
		
		&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;followerChanges&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;k&quot;&gt;foreach&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;followerChanges&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$changeType&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$change&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
				&lt;span class=&quot;nv&quot;&gt;$message&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\r\n&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;--&amp;#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;strtoupper&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$changeType&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;--&amp;#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\r\n\r\n&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
				&lt;span class=&quot;k&quot;&gt;foreach&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$change&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$tweeter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
					&lt;span class=&quot;nv&quot;&gt;$message&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;*&amp;#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getTweeterDetails&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$tweeter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\r\n&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
				&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
			&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;nv&quot;&gt;$message&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\r\n&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;--NO UPDATES FOUND--&amp;#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\r\n&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
		
		&lt;span class=&quot;nb&quot;&gt;mail&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$to&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$subject&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$message&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$headers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;cp&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;h3&gt;MySQL Database Schema&lt;/h3&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;sql&quot;&gt;&lt;span class=&quot;k&quot;&gt;CREATE&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;TABLE&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IF&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;EXISTS&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;TwitterFollowers&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;NULL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;timestamp&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;NULL&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;CURRENT_TIMESTAMP&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;timestamp&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;NULL&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;NULL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;PRIMARY&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;KEY&lt;/span&gt;  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ENGINE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;MyISAM&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;DEFAULT&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CHARSET&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;latin1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;h3&gt;How does it work?&lt;/h3&gt;

&lt;p&gt;First of all, you will need to substitute the SQL sections for your own particular schema and database functions.  Once you've done that, alter the class constants so that they are your own username and the email address you want to send your updates to.  Finally, set up a CRON job so that it runs at a certain point every day.  I currently have mine set to run at 9am every morning but I may well change it to run every time I post a tweet as then I'd be able to see which tweet had made people start or stop following me.&lt;/p&gt;

&lt;p&gt;The script works by checking the publicly accessible JSON feed of your followers and getting all of their IDs.  I say it's publicly accessible, but I don't think it is if you have protected your updates which will of course cause problems!  Once it has all of the IDs, it checks this against the IDs stored in your database - if there aren't any then everyone will show up as following you on the first run.  If it finds an ID in your database that isn't in your JSON string then you've been dumped!  Conversely, if it finds an ID in the JSON string but not in the DB then, congratulations, you've got a new follower.  The final instance is if it finds an ID in the JSON string that is in the DB but has an end datetime assigned to it.  This means the person was following you, stopped, and has now decided to re-follow you.&lt;/p&gt;

&lt;p&gt;The whole lot then gets packaged up and emailed to you with each section broken down so you can read it clearly.  In order to do this, it looks up each ID that goes into the email against that persons publicly available Twitter information to give you both their &quot;real name&quot; and &quot;username&quot;.&lt;/p&gt;

&lt;h3&gt;Known Problems&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;I don't think it will work if you have your updates set to hidden.&lt;/li&gt;
&lt;li&gt;If one of your followers gets banned from Twitter, then their name won't show up in the email (it will just be blank)&lt;/li&gt;
&lt;li&gt;This script won't work if you have more than 5000 followers - this is because that is the maximum result set from the JSON string.  You'd need to add paging information to get more than 5000 although this would be fairly easily.  Alas I don't have that many followers to be able to test that out!&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;So now you can easily (if you know PHP) get updates on all your Twitter followers and non-followers.  Feel free to use all the above code and modify to your hearts content - if you found it to be useful, then please leave a comment below.  Oh, and I couldn't possibly write a post about Twitter without reminding you that you can follow me &lt;a href=&quot;http://twitter.com/bendodson/&quot;&gt;@bendodson&lt;/a&gt; ;)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Getting Xbox Live Achievements Data: Part 2 - The AppleScript Solution</title>
      <link>http://bendodson.com/weblog/2009/05/19/getting-xbox-live-achievements-data-part-2-the-applescript-solution/index.html</link>
      <pubDate>Tue, 19 May 2009 00:00:00 +0100</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2009/05/19/getting-xbox-live-achievements-data-part-2-the-applescript-solution/index.html</guid>
      <description>&lt;p&gt;Following on from the &lt;a href=&quot;http://bendodson.com/weblog/2009/05/12/getting-xbox-live-achievements-with-php-part-1-the-problems/&quot;&gt;first of this series of tutorials&lt;/a&gt; on how to extract Xbox Live achievement data using PHP and AppleScript, I thought I would use this second part to look at the AppleScript that powers one side of the system I've put together.  In the next part, I'll be explaining the PHP class I've built, and in the fourth part (the last of the series) I'll be showing you how the two talk together and how you can use the collected data with other APIs such as Facebook Connect.&lt;/p&gt;

&lt;p&gt;So, let's have a look at some code!&lt;/p&gt;

&lt;h3&gt;XboxLive AppleScript&lt;/h3&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;applescript&quot;&gt;&lt;span class=&quot;k&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;urlFilePath&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;http://externals.bendodson.com/weblog/XboxLive/urls.txt&amp;quot;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;dataFilePath&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;server:XboxLive:data.txt&amp;quot;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;toCrawl&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;&amp;quot;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;dataFile&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;open for access&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;file&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;dataFilePath&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;write&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;permission&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;set eof&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;dataFile&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;close access&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;dataFile&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;tell&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;application&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;Safari&amp;quot;&lt;/span&gt;
	&lt;span class=&quot;nb&quot;&gt;open location&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;urlFilePath&lt;/span&gt;
	&lt;span class=&quot;nb&quot;&gt;delay&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
	&lt;span class=&quot;nv&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;JavaScript&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;window.location.reload()&amp;quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;the&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;front&lt;/span&gt;
	&lt;span class=&quot;nb&quot;&gt;delay&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;try&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;toCrawl&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;the&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;text&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;the&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;front&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;try&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;tell&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;length&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;toCrawl&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;then&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;tell&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;application&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;Safari&amp;quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;open location&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;toCrawl&lt;/span&gt;
	&lt;span class=&quot;nb&quot;&gt;delay&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;15&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;tell&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;application&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;Safari&amp;quot;&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;sourceCode&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;the&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;source&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;front&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;document&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as &lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;string&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;dataFile&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;open for access&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;file&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;dataFilePath&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;write&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;permission&lt;/span&gt;
		&lt;span class=&quot;nb&quot;&gt;write&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;sourceCode&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;dataFile&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;starting&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;at&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;eof&lt;/span&gt;
		&lt;span class=&quot;nb&quot;&gt;close access&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;dataFile&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;tell&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;tell&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;application&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;Safari&amp;quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;close&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;every&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;window&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;This is the first time I've used AppleScript for anything other than just playing around and I have to say that as a language it's incredibly good.  Just by reading through the above, you'll probably be able to work out what's going on even if you've never seen any type of programming code in the past.  Even so, I'll go through each section and explain what it does along with the reasons why I decided to do it in this particular way rather than some of the other ways I could have chosen.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; All of this AppleScript is completely self-taught from searching around on the internet.  I was going to buy the book &lt;a href=&quot;http://www.amazon.co.uk/AppleScript-Missing-Manual-Adam-Goldstein/dp/0596008503/ref=sr_11_1?ie=UTF8&amp;qid=1242776373&amp;sr=11-1&quot;&gt;AppleScript: The Missing Manual&lt;/a&gt; but I was able to read all the sections I needed on &lt;a href=&quot;http://books.google.com/books?id=-ynfWvkwzpwC&quot;&gt;Google Books&lt;/a&gt; which was convenient - I'll probably buy the book anyway to brush up on a few other areas.  If you are an AppleScript guru and you know a way to optimize my code, please use the comments section below so others can learn and so I can update it.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Before we get on to looking at the code, it might be worth briefly recapping how everything will work.  My server will check the XboxLive API in order to see if my gamerscore has increased.  If it has, then it saves the URL of the achievements page for my most recently played game (which it can't itself read due you needing to login to Xbox Live with javascript enabled - something cURL can't do!) in a text file on the server.  My mac mini at home then runs the above AppleScript in order to retrieve the saved URL, open it in Safari, and save the HTML in it's own text file that is available via the internet.  My server will then check this text file, parse the HTML, and save the achievements to a database.&lt;/p&gt;

&lt;h3&gt;How does it all work?&lt;/h3&gt;

&lt;p&gt;Now we've got that out of the way, let's look at that AppleScript in more detail:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;applescript&quot;&gt;&lt;span class=&quot;k&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;urlFilePath&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;http://externals.bendodson.com/weblog/XboxLive/urls.txt&amp;quot;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;dataFilePath&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;server:XboxLive:data.txt&amp;quot;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;toCrawl&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;These three lines of code are used to define variables which we will use later on in the code.  The first one, &lt;code&gt;urlFilePath&lt;/code&gt;, is the URL of the text file on my server that will tell our script what URL we need to retrieve the HTML from.  You'll see how we populate that text file with my XboxLive php class which will be discussed in part three of this four part series.  The second variable, &lt;code&gt;dataFilePath&lt;/code&gt;, is interesting as it contains the path to the file we are going to save the HTML to on the local machine.  So why the strange syntax?  This is referred to as Finder syntax and is a way for AppleScript to reference a particular section within Finder, in this case a text file.  It is essentially the same as &quot;/server/XboxLive/data.txt&quot; which we could have used - the difference is that we would have had to have converted that into the Finder syntax in order to use some of the file editing commands we'll use later so I thought it best just to save it correctly at the beginning.&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;applescript&quot;&gt;&lt;span class=&quot;k&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;dataFile&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;open for access&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;file&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;dataFilePath&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;write&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;permission&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;set eof&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;dataFile&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;close access&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;dataFile&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;These three lines are again fairly easy to follow.  We set a variable of &lt;code&gt;dataFile&lt;/code&gt; to be the handler of the file declared in the path of &lt;code&gt;dataFilePath&lt;/code&gt;.  Note that we have specifically mentioned we want to use write permissions as the default is just to use read permissions.  The next line sets the eof or &quot;end of file&quot; within the handler to 0 whilst the following line tidies up by closing the file handler (which isn't strictly necessary but good practice).  The reason for setting &lt;code&gt;eof&lt;/code&gt; to 0 is that we want to delete the contents of the file before we put anything else in later.  This is practical for the simple reason that we don't want our PHP script on the server to parse a load of data in the text file (or even download it) if it's something it has already read as that would be a waste of processing power and bandwidth.&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;applescript&quot;&gt;&lt;span class=&quot;k&quot;&gt;tell&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;application&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;Safari&amp;quot;&lt;/span&gt;
	&lt;span class=&quot;nb&quot;&gt;open location&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;urlFilePath&lt;/span&gt;
	&lt;span class=&quot;nb&quot;&gt;delay&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
	&lt;span class=&quot;nv&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;JavaScript&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;window.location.reload()&amp;quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;the&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;front&lt;/span&gt;
	&lt;span class=&quot;nb&quot;&gt;delay&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;try&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;toCrawl&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;the&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;text&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;the&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;front&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;try&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;tell&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Now we get to the first real section of the code that deals with our problem.  In these lines, the application Safari is made to open the text file on the server that may contain the URLs, refresh that page using JavaScript, and then attempt to set the variable &lt;code&gt;toCrawl&lt;/code&gt; to the text of the file.  Before we even examine this in depth, you may be wondering something along the lines of &quot;why don't you download the file or read it with FTP rather than opening it in Safari&quot; and this would be sensible.  My initial thoughts on how to get the text on the server into a variable in my AppleScript was to access the file via FTP.  OS X has very basic FTP support (read only unfortunately) that can be mounted through Finder and then accessed using the Finder syntax we used earlier on.  I had originally written some AppleScript that would run in the startup process of the mac mini which would mount the drive.  Then, this AppleScript read the file in using &lt;code&gt;open for access file urlFilePath&lt;/code&gt; and set the variable that way.  It all worked perfectly until the server changed the contents of the URL text file.  No matter what I did, the text file came back the same as it had when first fetched and it was that that I realised that the FTP built into Finder is fundamentally flawed as everything is cached.  If you don't edit the file through Finder (e.g. by using a mac application that saves it again through Finder) then it will never know it's updated and thus can't be used in this scenario.&lt;/p&gt;

&lt;p&gt;With that out of the way, let's look at my workaround.  The first and last lines are the opening and closing of a &lt;code&gt;tell&lt;/code&gt;; a way to get an application to do what we want.  In this instance we are going to tell Safari to open the URL saved in the variable &lt;code&gt;urlFilePath&lt;/code&gt; and then delay for one second.  This delay is needed as Safari may take this long to open the URL.  Without the delay, we may be in danger of running code on a page that hasn't loaded.  In the next line, we tell JavaScript to reload the document before waiting another second for this to complete.  This refresh is necessary to clear any caching of the document.  The final section is used to set the variable &lt;code&gt;toCrawl&lt;/code&gt; to the contents of the browser window.  You may wonder why there is a &lt;code&gt;try&lt;/code&gt; statement wrapped around it?  This is because if the text file was empty and you tried to get &lt;code&gt;the text of the front document&lt;/code&gt;, the script would error.  To get around that, we initially set the variable (in the very first block of code if you remember?) and then use &lt;code&gt;try&lt;/code&gt; to reset the variable only if no error would be caused in doing so.  Very useful!&lt;/p&gt;

&lt;p&gt;By the end of this block of code, we will have a variable which will either contain a URL if the text file on the server had one, or it will be empty, meaning that the server is not requesting any HTML.  Let's move on to the next section:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;applescript&quot;&gt;&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;length&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;toCrawl&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;then&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;tell&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;application&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;Safari&amp;quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;open location&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;toCrawl&lt;/span&gt;
	&lt;span class=&quot;nb&quot;&gt;delay&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;15&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;tell&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;application&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;Safari&amp;quot;&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;sourceCode&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;the&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;source&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;front&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;document&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as &lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;string&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;dataFile&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;open for access&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;file&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;dataFilePath&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;write&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;permission&lt;/span&gt;
		&lt;span class=&quot;nb&quot;&gt;write&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;sourceCode&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;dataFile&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;starting&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;at&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;eof&lt;/span&gt;
		&lt;span class=&quot;nb&quot;&gt;close access&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;dataFile&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;tell&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;This is the core piece of functionality that I was trying to achieve all in this block of 11 lines.  This script will open a URL in Safari, and then save the source code of the loaded page in a text file.  You'll notice that the first and last lines are an &lt;code&gt;if&lt;/code&gt; statement relating to the length of the &lt;code&gt;toCrawl&lt;/code&gt; variable.  I don't unlock achievements every 5 minutes of the day and so, more often than not, the &lt;code&gt;toCrawl&lt;/code&gt; variable will be empty.  If it is, then we want to completely ignore the next section of code as there is no reason whatsoever to run it!&lt;/p&gt;

&lt;p&gt;The next line is a one line &lt;code&gt;tell&lt;/code&gt; to make Safari open the URL we saved which is then followed by a 15 second delay.  You'll notice this is a lot longer than the 1 second delays earlier.  The reason for this is that, in the first case, it was a simple text file with around 100 characters in it and so loaded incredibly quickly.  This URL, conversely, will be a very large page (around the 100kb mark) that may go through a series of 5 redirects depending on how recently the page was accessed.  This is because after 15 minutes of inactivity, the site forces you back to the login page but I have a cookie stored that will then automatically log me back in.  It just takes a few seconds to go through the process of all the redirects to get to the actual page hence the long time delay.&lt;/p&gt;

&lt;p&gt;The last section is a simple expansion of the code we used at the beginning.  We tell Safari to set a variable of &lt;code&gt;sourceCode&lt;/code&gt; to be the source of the page that's open - we also tell it to be forced as a string in case there are any casting issues.  Next, we open the &lt;code&gt;dataFilePath&lt;/code&gt; and set a handler of &lt;code&gt;dataFile&lt;/code&gt; so that we can then write the &lt;code&gt;sourceCode&lt;/code&gt; variable into the file starting at the end of the file (which we all know is masquerading as the beginning of the file also as we set it earlier on... keep up!) before tidying up after ourselves and closing access to the handler.  Easy!&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;applescript&quot;&gt;&lt;span class=&quot;k&quot;&gt;tell&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;application&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;Safari&amp;quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;close&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;every&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;window&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;In the very final line of code, we tell Safari to close all of it's windows in preparation for the next iteration.  This may not seem terribly important, but trust me, if you neglect to put it in and then unlock 10 achievements, you'll find your mac now has 20 open Safari windows!&lt;/p&gt;

&lt;h3&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;So that's all there is to this section - a large chunk of AppleScript and a rationale as to why I had to open Safari to get at a text document rather than doing it a slightly more simple way via FTP (due to massive caching issues).  I hope this post has introduced some of you to AppleScript which I have found to be a rather powerful tool when it comes to mac development.  It's very easy to understand and is a great way of transitioning from a web-based language to a desktop-based one especially as you can save AppleScript as a standard mac application.&lt;/p&gt;

&lt;p&gt;Join me again for part three of this four part series when I'll be looking at this from the other angle; the PHP server that needs to parse the HTML we have gathered using this AppleScript.  To make sure you don't miss a section, you can &lt;a href=&quot;http://bendodson.com/weblog/feed/&quot;&gt;subscribe to the RSS Feed&lt;/a&gt; or &lt;a href=&quot;http://twitter.com/bendodson/&quot;&gt;follow me on Twitter&lt;/a&gt;.  Please feel free to leave any comments or suggestions on this page.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>iPhone 3.0 "push" Notification Testing with AP News</title>
      <link>http://bendodson.com/weblog/2009/05/18/iphone-30-push-notification-testing-with-ap-news/index.html</link>
      <pubDate>Mon, 18 May 2009 00:00:00 +0100</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2009/05/18/iphone-30-push-notification-testing-with-ap-news/index.html</guid>
      <description>&lt;p&gt;As a member of the iPhone Developer Network, I received an email from Apple today inviting me to &quot;test the Apple Push Notification service&quot; by downloading a new version of the Associated Press app.  They'd given me a special code to use in iTunes that would redeem into a download of the app but unfortunately the code only works in the US Store.  Furthermore, trying to switch to the US Store didn't work as my account is tied to the UK Store.  I was going to give up but then I had an idea on how to get around this problem.  Here's how I did it:&lt;/p&gt;

&lt;h3&gt;Creating a new account&lt;/h3&gt;

&lt;p&gt;When you use the &quot;redeem&quot; section of iTunes, you type in your code and if you're not logged in already it prompts you to.  However, you can also register at this stage so I decided to set myself up a nice new US account.  You have to link a credit card or payment method to your account and I initially tried to do this but it blocked me as the payment method wasn't based in the US (either using a credit card or paypal).  However, as I was redeeming a code, they have to give you the option of registering without a credit card as it might be you've given a $25 gift card to your nephew or something like that.  Therefore, all I had to do was choose &quot;no payment method&quot; and then fill out the rest of the form.  Email was easy as I run my own domain so just created a dummy email account, and faking an address is made very easy thanks to reverse geocoding.  I simply went to &lt;a href=&quot;http://getlatlon.com/&quot;&gt;getlatlon.com&lt;/a&gt;, picked a random place in Florida, and then used a reverse geo-coding app to convert that lat lon into a street address.  Easy!&lt;/p&gt;

&lt;h3&gt;The app&lt;/h3&gt;

&lt;p&gt;Now that the account was created, my code was automatically redeemed and the app downloaded to my machine.  It synced across to my iPhone with no problems and is now running happily.  I've attached some screenshots below:&lt;/p&gt;

&lt;img src=&quot;http://files.bendodson.com/old-weblog/2009/05/img_0010.png&quot; alt=&quot;Push Notification Prompt&quot; title=&quot;Push Notification Prompt&quot; width=&quot;320&quot; height=&quot;480&quot; /&gt;
&lt;img src=&quot;http://files.bendodson.com/old-weblog/2009/05/img_0011.png&quot; alt=&quot;Settings&quot; title=&quot;Settings&quot; width=&quot;320&quot; height=&quot;480&quot; /&gt;
&lt;img src=&quot;http://files.bendodson.com/old-weblog/2009/05/img_0012.png&quot; alt=&quot;Notification Settings&quot; title=&quot;Notification Settings&quot; width=&quot;320&quot; height=&quot;480&quot; /&gt;
&lt;img src=&quot;http://files.bendodson.com/old-weblog/2009/05/img_0013.png&quot; alt=&quot;AP News Notification Settings&quot; title=&quot;AP News Notification Settings&quot; width=&quot;320&quot; height=&quot;480&quot; /&gt;
&lt;p&gt;So as you can see, the app triggers a new &quot;notifications&quot; panel where you can enable or disable individual apps and the alerts that they are allowed to send you.  I haven't yet received any notifications but will update photos and any additional functionality as and when it happens.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Just received my first push notification!  I remember during the last Apple Keynote (the launch of the 3.0 beta) that the reason push hadn't been introduced before is because it's a complex system that has to be set up differently for every mobile provider.  After an hour with no updates, I had begun to think that O2 wasn't set up but it would appear that they are!&lt;/p&gt;

&lt;img src=&quot;http://files.bendodson.com/old-weblog/2009/05/img_0014.png&quot; alt=&quot;AP News Push Notification&quot; title=&quot;AP News Push Notification&quot; width=&quot;320&quot; height=&quot;480&quot; /&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; Technically, this should fall under the iPhone Developer NDA.  However, ever since iPhone Beta 3.0 was released to the development community, every Mac blog has published photos and detailed information without any kind of reproach from Apple so I feel that there is no problem in publishing these photos.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    
    <item>
      <title>Duplicate Messages Bug Fixed on TubeUpdates.com</title>
      <link>http://bendodson.com/weblog/2009/05/17/duplicate-messages-bug-fixed-on-tubeupdatescom/index.html</link>
      <pubDate>Sun, 17 May 2009 00:00:00 +0100</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2009/05/17/duplicate-messages-bug-fixed-on-tubeupdatescom/index.html</guid>
      <description>&lt;p&gt;As you may already know, I run a website called &lt;a href=&quot;http://tubeupdates.com&quot;&gt;TubeUpdates.com&lt;/a&gt; which provides a RESTful API for the &lt;a href=&quot;http://www.tfl.gov.uk&quot;&gt;TFL Underground&lt;/a&gt; network so you can build apps that utilize that data.  Unlike some other services or XML files that try to provide this data, my API scrapes all of the pages on the TFL site in order to give out the specific messages for each line e.g. rather than having &quot;Minor Delays&quot; you'll be given an array of each message from their site about the delays such as &quot;Sunday 17 May, suspended between Liverpool Street and Leytonstone. Two rail replacement bus services operate.&quot; which is obviously a lot more useful.&lt;/p&gt;

&lt;p&gt;However, as my script relies on screen scraping, problems do occur when TFL decide to change their HTML or site structure which has happened recently.  Previously, every tube line had it's own page with it's messages listed on it but now there is &lt;a href=&quot;http://www.tfl.gov.uk/tfl/livetravelnews/realtime/tube/default.html&quot;&gt;one single page&lt;/a&gt; with all of them shown and hidden with javascript.  This meant that for a short period, my API was posting out the messages for every single line with each line returned (so if you wanted to look at circle line messages, you would in fact get every line).&lt;/p&gt;

&lt;p&gt;This has now been fixed and actually makes the service slightly better for me as it now means I can crawl just 3 pages rather than the 14 I was crawling before (thus better for both bandwidth and CPU cycles).  I have a number of functions set up to report when TFL change their site structure as the usual problem is that a site redesign changes class names or markup in such a way that the API just breaks.  However, in this case none of these warnings kicked in as it was getting the data correctly and all seemed to be ok.&lt;/p&gt;

&lt;p&gt;So, a big thank you to those of you that emailed in to report the bug!  If you have any questions about the Tube Updates API, then please &lt;a href=&quot;http://tubeupdates.com/&quot;&gt;check out the site&lt;/a&gt; or &lt;a href=&quot;http://bendodson.com/contact/&quot;&gt;drop me an email&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Getting Xbox Live Achievements Data: Part 1 - The PHP Problems</title>
      <link>http://bendodson.com/weblog/2009/05/12/getting-xbox-live-achievements-with-php-part-1-the-problems/index.html</link>
      <pubDate>Tue, 12 May 2009 00:00:00 +0100</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2009/05/12/getting-xbox-live-achievements-with-php-part-1-the-problems/index.html</guid>
      <description>&lt;p&gt;Those of you with an Xbox 360 (or indeed some &quot;Games for Windows&quot; titles) will know all to well about the achievements system prevalent in every game.  For those that don't know, every gamer has a profile which has a gamerscore.  This score goes up by completing certain tasks within each game as laid down by the developer.  This could be something you would do anyway such as &quot;finish the game&quot; or something random such as &quot;destory 10 cars in 10 seconds&quot;.  Every full game can give out 1000 gamerpoints (1250 with expansion packs) and an Xbox Arcade title can give out 200.  These points are somewhat of a geek badge of honour for most Xbox gamers who will try and do everything to get the full 1000 in each of their games - there are also those that want to increase the number as quickly as possible so you can find numerous guides online for the easiest way to get 1000 points (it seems Avatar is still the best way giving you the full 1000 with about 3 minutes of gameplay!)&lt;/p&gt;

&lt;p&gt;When I was trying to compete with my ex-boss over the number of gamerpoints we each had (I lost by the way), I found that there was no public API from Microsoft to allow you to get at the Xbox Live data.  There was however an internal API and one Microsoft associate had set up a restful API so that you could publicly call the internal one.  This worked well enough for the basic site I put together to compare two gamerscores but I've been wanting to do more with the API for some time.&lt;/p&gt;

&lt;p&gt;My overall idea is that I'll be able to type in my userid and then have my server poll Xbox Live at a certain time and then update my Facebook Wall when I unlock new achievements.  The message would be something along the lines of &quot;Ben just completed the 'Fuzz Off' achievement in Banjo Kazooie: N&amp;B and earned 20G&quot; and would have the correct 32x32px image for the achievement.  I initially thought that this would be fairly easy but I was unfortunately very wrong!  In this series, I'm going to show you the problems I encountered as well as the final (rather complex) workaround I'm creating in order to get it all to work!  If you've got any questions, please leave a comment or &lt;a href=&quot;http://bendodson.com/weblog/contact/&quot;&gt;get in touch&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Attempt #1: Using the API&lt;/h3&gt;

&lt;p&gt;When I first sat down to work on this project, my initial thoughts were &quot;I can just reuse the public API I used for my gamerscore comparison site - there's bound to be an achievement section in the returned data&quot;.  After eagerly re-downloading all the code, I discovered that although there was some achievement data, it was nowhere near as detailed as the information that I would need.  The problem was that the API only shows you your recently played games and how many achievements you have unlocked in each one as well as the overall number of points you have earned for that game.  Theoretically, I could check the API every few minutes and compare the number of points with a local copy in order to work out when a new achievement had been unlocked but I'd only be able to say that an achievement had been unlocked in a certain game worth a number of points.  To make things even trickier, if I unlocked more than one achievement within the timeframe of the API check, then the results would be wrong (e.g. it might say I'd unlocked one achievement worth 45G when in fact I'd done two; one for 20G and one for 25G).  This would become even more complex if I unlocked an achievement, then switched games and unlocked one in that game before the API had been called.  In short, the public API, useful though it can be, was not going to work for this.&lt;/p&gt;

&lt;h3&gt;Attempt #2: Screen Scraping&lt;/h3&gt;

&lt;p&gt;So now we move to option two; screen scraping.  This is the process of getting the server to request pages from a website as if it were a browser and then just ripping the content out of the HTML.  It's messier than an API as it relies on the websites HTML not changing and it's also a lot more processor intensive (as you're parsing an entire XHTML page - possibly marked up invalidly - rather than a nice small XML or JSON file).  I've done lots of screen scraping in the past, both for my &lt;a href=&quot;http://tubeupdates.com/&quot;&gt;Tube Updates API&lt;/a&gt; and for the &lt;a href=&quot;http://packrattools.com/tracker/&quot;&gt;Packrat Market Tracker&lt;/a&gt; (a tracking system for a Facebook game), so I didn't think it would be too much hassle.  But then I hadn't banked on Microsoft...&lt;/p&gt;

&lt;p&gt;The first hurdle is that although my Xbox Live data is set to be shown publicly, you still have to be logged in with a Windows Live account to view it.  This is annoying because it means my script is going to have to log in to Windows Live in order to get the HTML of my achievements listings.  The second hurdle is that there is no single page listing my latest unlocked achievements - the main profile page shows my last played game (and it's last unlocked achievements) but that's no good as they are not in order and it might be that I've switched games after unlocking something so the last achievement on the profile page may not be the last achievement I've unlocked.  This isn't such a big problem as there are pages for each game so I'll just have to crawl each of my recently played games pages and get the achievements on each one but it's slightly more hassle than having one page of latest achievements (as it means I have to make several requests thus increasing bandwidth and script run time).&lt;/p&gt;

&lt;h3&gt;Logging In to Windows Live&lt;/h3&gt;

&lt;p&gt;Generally, logging into a site is quite easy using cURL.  You need to work out where the form is posting to, put all of the data to be posted in an array, and then make a cURL request that sends that array to that URL.  You will also need to enable both a cookie file and a cookie jar (a basic text file that is used for all of the cookies during the requests) as you will probably only want to login once and then have each future request know that you are already logged in as this will save on overall requests per execution of the task.&lt;/p&gt;

&lt;p&gt;The Windows Live login, on the other hand, is an entirely different kettle of fish!  The URL you are posting to changes on each request as do the variables that you are posting.  This means we need to make a request to the login page first of all and extract all of the data from the hidden input fields as well as the action attribute of the form.  We can then go about posting that data (along with our email address and password) to the URL we just extracted.  This POST goes through a HTTPS connection though, so we need to modify our cURL request further in order to ensure that SSL certificates are just accepted without question.  Our overall cURL request, with all of these options, will look roughly like this:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;php&quot;&gt;&lt;span class=&quot;cp&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// set up cURL request - the $url would be the action URL that you&amp;#39;re POSTing to&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$curl&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;curl_init&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// make sure the script follows all redirects and sets each one as the referer of the next request&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;curl_setopt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$curl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;CURLOPT_AUTOREFERER&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;curl_setopt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$curl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;CURLOPT_RETURNTRANSFER&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;curl_setopt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$curl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;CURLOPT_FOLLOWLOCATION&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;curl_setopt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$curl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;CURLOPT_HEADER&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// ssl options - don&amp;#39;t verify each certificate, just accept it&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;curl_setopt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$curl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;CURLOPT_SSL_VERIFYHOST&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;curl_setopt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$curl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;CURLOPT_SSL_VERIFYPEER&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// fake the user-agent so the site thinks we are a browser, in this case Safari 3.2.1&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;curl_setopt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$curl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;CURLOPT_USERAGENT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-us) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// tell cURL to use a text file for all cookies used in the request - $cookie should be a path to a txt file with 755 permissions&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;curl_setopt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$curl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;CURLOPT_COOKIEFILE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$cookie&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;curl_setopt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$curl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;CURLOPT_COOKIEJAR&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$cookie&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// post options - the data that is going to be sent to the server.  $post should be an array with key=&amp;gt;var pairs of each piece to be sent&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;foreach&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$key&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$var&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;nv&quot;&gt;$postfields&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$key&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;=&amp;#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;urlencode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$var&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;&amp;amp;&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;curl_setopt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$curl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;CURLOPT_POST&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;curl_setopt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$curl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;CURLOPT_POSTFIELDS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$postfields&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// make the request and save the result as $response - then close the request&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$response&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;curl_exec&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$curl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;curl_close&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$curl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;I had thought that this would be the end of it and that the returned data would be the first page after logging into Windows Live.  Instead, I got nothing.  Absolutely nothing.  No matter what settings I tinkered with or parts of the code I changed, it was just returning blank.  It was then that I noticed the rather unpleasant JavaScript files on the page and some suspicious &amp;lt;noscript&amp;gt; code at the top of the page.  If you load the login page without JavaScript in a normal browser, then the code in the &amp;lt;noscript&amp;gt; section gets read which has a meta redirect to send you to a page telling you that you must have JavaScript enabled!  I hadn't noticed this previously as my cURL request doesn't understand HTML, it was just returning it as a big lump so I was able to get all of the variables, etc, out without being redirected as I would be in a normal browser.&lt;/p&gt;

&lt;p&gt;I didn't think too much of this as obviously the page worked without JavaScript - it must just be a rudimentary way to make people upgrade their browser (although it didn't actually give you any advice - very bad usability!).  But no, the login does require JavaScript as when you submit the form a huge amount of obfuscated code does some crazy code-fu to the POST request and encrypts it all before sending thus making JavaScript a requirement to log in to Windows Live.  To my mind, this has obviously been done to prevent people from screen scraping their sites such as Hotmail but it really is a pain!&lt;/p&gt;

&lt;h3&gt;The AppleScript Idea&lt;/h3&gt;

&lt;p&gt;It was about 3am by the time I'd realised that screen scraping wasn't going to work and I'd been playing with the code for around 5-6 hours so was pretty annoyed with it.  So today I sat down and listed all of the obstacles so I could work out a way round them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The data from the API wasn't good enough so couldn't be used&lt;/li&gt;
&lt;li&gt;Although I could screen scrape the Xbox Live profile page / game pages, I couldn't get to them as needed to be logged in to Windows Live&lt;/li&gt;
&lt;li&gt;I couldn't log in to Windows Live without JavaScript&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After writing this down and having a think, I realised that I have a static IP address and a mac mini which is always turned on and connected to the internet.  I also realised that all my server needed to parse the Xbox Live pages was the HTML itself - it didn't necessarily have to come from a cURL request or even from my server.  After this 'mini' enlightenment I set about writing a plan that would allow me to get around the Windows Live login using a combination of a server running some PHP and cURL requests and a mac mini running some AppleScript.  It will work roughly like this...&lt;/p&gt;

&lt;p&gt;The server will store a record of all of my game achievements in a MySQL database.  It will therefore know my gamerscore and be able to compare it to the gamerscore found using the API.  Every five minutes it will check this and if it notices a difference in the numbers, it will know that I have earned an achievement and thus needs the HTML that alluded me yesterday.  It knows the URL it needs so it will log this in a text file on the server that will be publicly available via a URL.&lt;/p&gt;

&lt;p&gt;Meanwhile, the Mac Mini will use AppleScript to check the URL list on the server every five minutes.  If it finds a URL, it knows that the server needs some HTML so it will oblige by loading the URL in Safari (which will be set to be permanently logged in to Windows Live thanks to authenticating and choosing &quot;save my email address and password&quot; which stores a cookie) and then getting the source of the page and dumping it in a text file on the Mac Mini.&lt;/p&gt;

&lt;p&gt;The text file on the Mac Mini (with the HTML we need) will be available to my server thanks to my Static IP and so when the next CRON job on the server runs, it will see that it wanted some HTML (based on their being some URLs in its own text file) and so will check the text file on the Mac Mini and thus get the HTML it needs.  It can then parse this, work out the new achievements and log them in the database accordingly.  It will then clear the URL list (so that the mac mini doesn't try and do an update when it doesn't need to) and then continue on it's cycle by checking if the gamerscore is equal to the (now updated) database.&lt;/p&gt;

&lt;h3&gt;The Next Step&lt;/h3&gt;

&lt;p&gt;So, after a failed evenings development, I have now come up with a solid plan to get around several key hurdles.  I'll be posting part two of this series shortly once I have built the application and it will have all of the source code included for those of you that want to replicate a similar system.  In the mean time, I hope this post will show you that problems do pop up in application development and that they can be resolved easily by writing out a list of each hurdle before formulating a plan to get around them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Part two of this tutorial is &lt;a href=&quot;http://bendodson.com/weblog/2009/05/19/getting-xbox-live-achievements-data-part-2-the-applescript-solution/&quot;&gt;now available&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Designing for the Social Web</title>
      <link>http://bendodson.com/weblog/2009/05/08/designing-for-the-social-web/index.html</link>
      <pubDate>Fri, 08 May 2009 00:00:00 +0100</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2009/05/08/designing-for-the-social-web/index.html</guid>
      <description>&lt;p&gt;A couple of weeks ago, I went to the &lt;a href=&quot;http://www.meetup.com/londonwebstandards/&quot;&gt;London Web Standards Meetup&lt;/a&gt; where we discussed the book &quot;&lt;a href=&quot;http://www.amazon.co.uk/Designing-Social-Voices-That-Matter/dp/0321534921&quot;&gt;Designing for the Social Web&lt;/a&gt;&quot; by Joshua Porter.  The organiser of the event, &lt;a href=&quot;http://twitter.com/otrops&quot;&gt;Jeff Van Campen&lt;/a&gt;, very kindly managed to get a couple of the books for us for free on the basis that we wrote up a review of the book on our respective blogs.&lt;/p&gt;

&lt;a href=&quot;http://www.flickr.com/photos/bendodson/3394810309/&quot; title=&quot;[54/365] Designing for the Social Web by Ben Dodson, on Flickr&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3588/3394810309_19db8a7dbb.jpg&quot; width=&quot;500&quot; height=&quot;333&quot; alt=&quot;[54/365] Designing for the Social Web&quot; class=&quot;featured&quot; /&gt;&lt;/a&gt;

&lt;p&gt;On the whole, I found the book to be very good although it was rather simple and basically consisted of a similar message to the excellent book &quot;&lt;a href=&quot;http://www.amazon.co.uk/Dont-Make-Me-Think-Usability/dp/0321344758&quot;&gt;Don't Make Me Think&lt;/a&gt; by Steve Krug - that is to say, &quot;use some common sense&quot;!&lt;/p&gt;

&lt;p&gt;The book is broken down into 8 chapters with each one becoming slightly shorter and slightly more off topic.&lt;/p&gt;

&lt;h3&gt;1. The Rise of the Social Web&lt;/h3&gt;

&lt;p&gt;This opening chapter really sets the scene by explaining what is meant by the term &quot;social web&quot; and investigating the move from one-way communication to two-way and then many-way communication.  Joshua also looks at something he calls &quot;The Amazon Effect&quot;; the behavioural trait that people will quite often use Amazon for product research even if they have no intention of purchasing there.  He also investigates something that I come across more and more these days; &quot;The Paradox of Choice&quot;.  This is a term given to the problem of having so much choice in front of us that in the end we actually do nothing as we spend all of our time comparing.  Whilst not offering any solutions to this problem, it is worth noting that it is present in order to stop the more content happy of us trying to offer every single solution to a user when oftentimes it's better just to give them one or two - this again enforces the idea of keeping things simple.&lt;/p&gt;

&lt;p&gt;The chapter goes on to look at how &quot;social software is accelerating&quot; and how at some point the entire internet will be taken over by the social movement.  I have a few issues with the figures bandied about at this point (and indeed in many other similar books).  The most frequently used statistic is from Technorati in that there are &quot;120,000 blogs being added every day&quot; thus somehow showing that the very face of the internet is changing.  To my mind, this is nonsense as for every new blog being added to the blogosphere, there are probably a good few that are just fading into non-existent as their owners fail to update them or their accounts get closed down.  Whilst I do appreciate that the take up of social media is indeed growing, it is nowhere near the levels that people would have us believe.&lt;/p&gt;

&lt;h3&gt;2. A Framework for Social Web Design&lt;/h3&gt;

&lt;p&gt;This is another excellent chapter that focuses on the bane of all agency-bound developers; feature creep.  This is one of the key problems in current web application development as people think that more features means more users and thus a better application.  This is of course completely wrong and many would do well to remember the old maxim &quot;quality not quantity&quot;.  Joshua looks at a wide range of social network sites such as YouTube, Digg, Delicious, Twitter, etc, in order to point out what their key function is and therefore highlight that the most successful social apps are those that stick to what they know.&lt;/p&gt;

&lt;p&gt;There is, however, a rather peculiar section regarding giving social objects a URL.  Apparently, Flickr was initially a flash application and it wasn't until people had their own page to show off their photos that Flickr really began to grow.  The issue here is that a lot of emphasis is placed on having a URL and that this is the main reason that Flickr grew whereas in actual fact it was just the idea that somebody could have their own profile page and their core model went away from flash application to a real web application that probably increased their user base.  I'm not contending that social objects should have their own URL but rather that this is fairly obvious and that it probably wasn't the defining feature that turned Flickr around.&lt;/p&gt;

&lt;h3&gt;3. Authentic Conversations&lt;/h3&gt;

&lt;p&gt;This is the point in the book that I began to notice that it was slipping away from it's titled purpose of &quot;design&quot; and instead looking at very general good business practice.  The entire contents of this chapter can be summarised by &quot;respect your customers and talk to them&quot;.  There is quite a large section about the &quot;Dell Hell&quot; situation from 2005 and how Dell had basically received complaints and not responded to them.  To make it worse, a blogger created a website to publicise this and they still came back and said nothing giving them a very bad image.  Joshua's dichotomy of this is to show an incident in which the technical editor of the book posted a message on her blog about a problem she had experienced with Plaxo and that they had then commented on her blog to try and help resolve her problem.  In it's way, it is a good example as it shows a company commenting on an issue on somebody elses blog in order to correct them.  What isn't pointed out is that the original poster should have just contacted their help desk (or in fact read the instructions in the first place) rather than writing a rant on her blog which the company had to find and then correct her.  However, this is probably very realistic of most online conversations as there is always a group of people (especially prevelant on YouTube comments) who will just shout loudly when anything changes.  This is exemplified later in Chapter 5 with Facebook.  In my opinion, the response from Plaxo wasn't particularly good either as it was far too formal a response (felt a bit auto-generated) and they had performed some rudimentary anti-spam protection on their email address (listing it as &quot;privacy @t plaxo.com&quot; rather than just putting &quot;privacy@plaxo.com&quot;).  If the person complaining couldn't read the simple instructions on the task she was performing or search for the technical support when she had a problem, it is probably fairly likely that she'll just copy and paste what is there and then write a follow up article entitled &quot;They never reply to my emails - they just send bounces!&quot;.&lt;/p&gt;

&lt;p&gt;The chapter does move into a few interesting articles of PR situations that have gone very wrong such as Dreamhost calling an overcharge to their customers of $7.5million a &quot;teensy eensy weensy little billing error&quot; and a good section on how to apologise correctly.  However, this isn't dealing with design and isn't what I expected to find inside this book.  It's welcome advise but I would consider it to fall under &quot;common sense&quot; or some sort of management category rather than the encompassing role of &quot;design&quot; as the title suggests.&lt;/p&gt;

&lt;h3&gt;4. Design for Sign-up&lt;/h3&gt;

&lt;p&gt;Now we get back to intended idea of the book (&quot;design&quot;) and approach how to get people over the all important hurdle of signing up to your website.  I particularly like this section as it reinforces one of the first eye-opening pieces of knowledge I received about writing copy for the web; keep it very short and very simple.  This method was taught to me many years ago as such:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Most people will write copy for the web as if they were writing for a broadsheet newspaper such as The Times or The Telegraph whereas it should be written as if for a tabloid such as The Sun or The Daily Mirror.  Notice how tabloids tend to &lt;strong&gt;highlight key phrases&lt;/strong&gt; and keep sentences short.  The first thing you should do with any copy you write for the internet is delete 50% of it.  Then, once you think it's the right size, remove another 50%.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;This obviously doesn't apply to articles or blog posts but is a key tactic for writing easily digestible content for homepages or sign up forms.  This chapter espouses this view by forcing people to state very clearly who, what, where, when, why, and how.  With these key questions in mind, you can make your inviting text all the more succinct and likely to generate conversions.&lt;/p&gt;

&lt;p&gt;The other half of this chapter details how to &quot;reduce sign-up friction&quot; which basically boils down to making your registration form as small as possible.  One thing that is missing here which should definitely have been mentioned is the removal of captcha forms and human readable tests.  There is no reason at all why companies should still be using these ridiculously outdated methods of spam prevention.  They are inaccessible (I have trouble reading a large number of them) and time consuming yet more to the point they are completely useless as a spam bot can be fooled easily by simply having a hidden field named something enticing like &quot;email&quot; and then have your script check to see if it's full.  If it is, you'll know it was a spam bot as there is no way for a human to fill it in.  To prevent humans submitting applications over and over, use an automated system such as Akismet (which I use for spam prevention on this blog) or just impose an IP limit so you can't have more than one registration from the same address every 15 minutes.  This will slow down spammers enough that they won't bother but won't interfere too much with those on shared networks, etc.&lt;/p&gt;

&lt;h3&gt;5. Design for Ongoing Participation&lt;/h3&gt;

&lt;p&gt;This is another good chapter as it focuses a lot on the psychology of users and essentially on the mass insecurity they have and the need for them to be able to create their own little home on your site.  Any social network these days has to have a profile page and again I find it strange that this needs reiterating as this is surely a given.&lt;/p&gt;

&lt;p&gt;There are one or two good points made about encouraging efficacy (a way of giving active users a boost in reputation) and in giving people solid control over privacy options (something that Facebook neglected initially to the general outcry of the public) but these things really are fairly obvious to anybody intent on creating a social network. I think this chapter could have offered a bit more constructive advice and maybe a few more case studies of sites doing the right and wrong things in order to make it as good as some of the previous chapters.&lt;/p&gt;

&lt;h3&gt;6. Design for the Collective Intelligence&lt;/h3&gt;

&lt;p&gt;Collective Intelligence is a term used to describe how social applications can be shaped by the users of the system in order to make it work as they would like it and promote content that they would like to use.  This is highlighted by the real world example of Digg which obviously works based on the idea of collaboration and in voting on particular pieces of content to move them up and down the social chain.  &lt;/p&gt;

&lt;p&gt;There is an excellent section on &quot;leverage points&quot; which goes into detail on how your social application will have many points at which the users can control something and how this can be managed correctly e.g. how a homepage of content voted on by users is displayed, what happens when somebody votes, etc. but I would contend that this is all fairly obvious to anybody who has used a social application before.&lt;/p&gt;

&lt;h3&gt;7. Design for Sharing&lt;/h3&gt;

&lt;p&gt;Sharing on the internet has supposedly boomed with the invent of networks such as StumbleUpon, Delicious, and Digg yet I am a firm believer that social network badges and sharing forms don't actually get used by the majority of users.  This is also true of RSS feeds as I've &lt;a href=&quot;http://bendodson.com/weblog/2008/07/21/does-anybody-really-use-rss-feeds/&quot;&gt;mentioned in a previous blog posting&lt;/a&gt; as these are still mainly the domain of geekier users of the net. It is true that most websites around at the moment have these social badges or sharing forms but I don't think it is true of most social applications that people are going to be building.  If you look at the title of the book, you are almost expecting to be taught how to make the next Delicious, not on how to integrate it.  There are few social networks that have badges for other social networks on them as they are all very precious about their own traffic (although this has changed to a certain degree with Facebook Connect).  This chapter is focusing on entirely the wrong angle as most social apps don't make sharing easy - blogs certainly do, but apps don't.&lt;/p&gt;

&lt;p&gt;The one part that interested me was the criticism of too many social network badges which has become a phenomenon of the growth of social networks.  As there are so many to choose from, how do you keep all your bases covered?  More and more blogs are moving over to systems such as &lt;a href=&quot;http://www.addthis.com/&quot;&gt;AddThis&lt;/a&gt; which do show all of the badges in a hidden button overlay but again this is still rather clunky and doesn't generate much conversion as people are overwhelmed by choice (as discussed in Chapter One).  Having said that, I have written a jQuery plugin called &lt;a href=&quot;http://labs.bendodson.com/weblog/jtardis/&quot; title=&quot;Access browser history with JavaScript&quot;&gt;jTardis&lt;/a&gt; which allows you to show only social networks that the user subscribes to thanks to some javascript trickery but I'll be blogging on this in more detail in the future!&lt;/p&gt;

&lt;p&gt;One of the things that frustrated me about this chapter was the fact that the sharing forms that Joshua had designed and used as good examples were in fact really bad!  All of the examples look like they had fallen out of the pre-dot com era of web design and didn't really show the basic simplicity of sending a page to someone else.  He does note that most people tend to copy and paste the URL and just email.  However, writing a form or widget to do this is not difficult yet he seems to have not done it particularly well - I'm sure there are better examples he could have used.&lt;/p&gt;

&lt;b&gt;8. The Funnel Analysis&lt;/b&gt;

&lt;p&gt;The final chapter is one that to my mind is far too short and doesn't really have a place in this book at all.  It is a chapter designed to show how you can monitor the statistics of your social network via funnel analysis - a basic way of monitoring where people drop off from your site (e.g. are they falling at registration signup or at registration confirmation?).  This is all very well and good but the chapter is far too short when you consider there are books of many hundreds of pages that still only scratch the surface of site analytics.  There are also numbers used to show what small percentages of people actually sign up to certain sites but these are totally irrelevant as the apps involved aren't mentioned and every app is different so your figures could be differ greatly.  They may as well have been made up!&lt;/p&gt;

&lt;p&gt;I also found this chapter to be a little strange as I read the final sentence about how funnel analysis helps to illustrate that people do drop off as they progress through the site, and then turned the page to immediately drop off... into the index.  The book was over with no summary, no recapping of the key points (remember the &quot;writing for a tabloid&quot; I &lt;strong&gt;highlighted&lt;/strong&gt; earlier?).   There was just a feeling of &quot;oh, it's finished&quot;.&lt;/p&gt;

&lt;h3&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;Overall the book is fairly good and does highlight a few interesting ideas.  However it strays far too much from it's key focus of &quot;designing for the social web&quot; and thus fails to meet one of the key things it espouses; keeping your application simple by basing it around a single piece of functionality.  The book was supposed to be about design and specifically on how to build great social web apps, yet too often the conversation moved to general business ideas such as &quot;talk to your customers&quot; or looking at how to analyse your web stats when it should instead have focused on the key components in a social app and how they work.  To an extent this does happen (particularly in chapter 4) yet I don't feel it happened enough.&lt;/p&gt;

&lt;p&gt;If you haven't used a great many social applications and are interested in a broad overview rather than a detailed analysis of the social web, then this book might be worth the £28.99 list price.  However, if you are looking to build the next great web app and are already an avid user of the social web, then this is probably one you can afford to miss as it will just be covering well-trodden ground.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Poor Usability on the Web - Part 1: Online Banking</title>
      <link>http://bendodson.com/weblog/2009/04/28/poor-usability-on-the-web-part-1-online-banking/index.html</link>
      <pubDate>Tue, 28 Apr 2009 00:00:00 +0100</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2009/04/28/poor-usability-on-the-web-part-1-online-banking/index.html</guid>
      <description>&lt;p&gt;For some reason, I get frustrated really easily on the internet when I come across something that doesn't work intuitively.  It seems that the majority of people are desensitised to the various hurdles of thought on both the internet and computers in general (e.g. pressing &quot;Start&quot; in windows to get to the &quot;Shut Down&quot; option) yet more and more I find myself getting annoyed that people can't get the most basic things right on the internet.  Now that I'm working as a web consultant, I'm hoping to be able to get a lot of clients to just look at the systems and sites they have created and apply a bit more common sense to them in the way popularised by the excellent &quot;&lt;a href=&quot;http://www.amazon.co.uk/Dont-Make-Think-Usability-Circle-Com/dp/0789723107&quot;&gt;Don't Make Me Think&lt;/a&gt;&quot; by Steve Krug.  This is a view extended by Joshua Porter's &quot;&lt;a href=&quot;http://www.amazon.co.uk/Designing-Social-Voices-That-Matter/dp/0321534921&quot;&gt;Designing for the Social Web&lt;/a&gt;&quot; (which I shall be reviewing here shortly) although that is geared slightly more towards customer service and social networks than the all encompassing issue of usability and best practice.&lt;/p&gt;

&lt;p&gt;So, for my first real post on &lt;a href=&quot;http://bendodson.com/weblog/&quot;&gt;my new website&lt;/a&gt; I thought I'd perform a basic usability study of the online banking system from the &lt;a href=&quot;http://www.rbs.co.uk/&quot;&gt;Royal Bank of Scotland&lt;/a&gt;; a website that frustrates me every time I want to check my bank balance online.&lt;/p&gt;

&lt;img src=&quot;http://files.bendodson.com/old-weblog/2009/04/homepage-1024x718.png&quot; alt=&quot;The RBS Homepage&quot; title=&quot;RBS Homepage&quot; width=&quot;640&quot; height=&quot;448&quot; class=&quot;size-large wp-image-62&quot; /&gt;

&lt;p&gt;I'm using the &lt;a href=&quot;http://www.apple.com/safari/&quot;&gt;Safari 4 Beta&lt;/a&gt; on a MacBook for the purpose of this demonstration and wanted to demonstrate that the RBS homepage (above) loads absolutely fine in this configuration.  However, as soon as you click on the &quot;Log In&quot; button on the right hand side, you get this page:&lt;/p&gt;

&lt;img src=&quot;http://files.bendodson.com/old-weblog/2009/04/unsupported-640x449.png&quot; alt=&quot;Unsupported browser on RBS Digital Banking&quot; title=&quot;RBS Unsupported Browser&quot; width=&quot;640&quot; height=&quot;449&quot; class=&quot;size-large wp-image-71&quot; /&gt;

&lt;p&gt;To be fair, the unsupported browser thing isn't a problem for me as Safari 4 has a very useful 'Develop' menu in the toolbar that lets me choose a different user-agent so I can pretend it's Safari 3.2.1 (which I'll do shortly to let me into the banking).  What does annoy me is that there is no reason for them to detect your browser as the site isn't any different depending on your browser.  At the very least, if the browser isn't supported (for some sort of CSS hacking rules perhaps?) it should load up a plain text version rather than just lock you out completely.  It really adds insult to injury seeing as by changing the user-agent, the site works absolutely fine.  Now I'm not suggesting that they should be updating their site every time a new browser comes out to avoid this message.  On the contrary, I'm suggesting that they should completely abolish the specific browser sniffing and just detect browsers (by functionality rather than name) which definitely don't work (e.g. IE 5.5 or Netscape 4) and offer them a textual fallback.&lt;/p&gt;

&lt;p&gt;Other usability problems with this page include a &quot;Log Out&quot; button when you haven't logged in yet, and a &quot;Restart Log In&quot; button which just reloads the page.  On the plus side, they do have a link to &quot;&lt;a href=&quot;http://www.rbs.co.uk/personal/online-banking.ashx&quot;&gt;Information on supported browsers&lt;/a&gt;&quot; but this rapidly turns to a negative as there is absolutely no information there at all on supported browsers - the problem isn't even acknowledged!  At the very least there should be a list of supported browsers with links so you can upgrade, etc, but to have a link which goes to no meaningful information is just ridiculous.&lt;/p&gt;

&lt;p&gt;Anyway, if we happen to be using a supported browser (or if we spoof our user-agent as I have to do), then we'll move on to the next page; the first stage of actually logging in.&lt;/p&gt;

&lt;img src=&quot;http://files.bendodson.com/old-weblog/2009/04/login-640x449.png&quot; alt=&quot;RBS Login: Entering your customer number&quot; title=&quot;RBS Login&quot; width=&quot;640&quot; height=&quot;449&quot; class=&quot;size-large wp-image-75&quot; /&gt;

&lt;p&gt;Now this page in itself isn't too bad.  Yes you have to enter a 10 digit number decided by the bank rather than an email address or an easy-to-remember username and it's only one field when it could in fact have been added to the previous page (e.g. enter number and then begin log in as &lt;a href=&quot;http://www.hsbc.co.uk/1/2/HSBCINTEGRATION/CAM10;jsessionid=0000jNdUUpybSyihihLj-yc9J_m:11j71ffl3?IDV_URL=hsbc.MyHSBC_pib&quot;&gt;HSBC&lt;/a&gt; does it) but compared to the other pages it's fairly acceptable.  The only thing I would change is minimising the amount of text and enlarging the 'Next' button - it doesn't need to be small and hidden away at the bottom of the page!&lt;/p&gt;

&lt;p&gt;We now come on to my favourite page; security clearance.&lt;/p&gt;

&lt;img src=&quot;http://files.bendodson.com/old-weblog/2009/04/security-640x449.png&quot; alt=&quot;RBS Login: Entering security details&quot; title=&quot;RBS Login Security Page&quot; width=&quot;640&quot; height=&quot;449&quot; class=&quot;size-large wp-image-78&quot; /&gt;

&lt;p&gt;For me, this page is where all notion of web standards, accessibility, and best practice fall apart.  Before I begin, I would like to say that I understand fully the need to break up a security number and only enter certain digits for authorisation - it's obviously to stop anything like keyloggers or people watching you type as they'll only get a portion of the password and the next time you come to login you'll be asked to enter a different part.  I don't have a problem with that.  I do, however, have a problem with being asked to enter parts of my password in a completely random order.  Is there any particular reason why I have to enter 1st digit, 4th digit, then 2nd digit?  It makes every attempt a brain-teaser in itself as I have to conciously remember the security code, count up the number of digits, and then do it twice more to work out the order.  More often than not I'll be saying it under my breath in order to keep it in my fairly poor short-term memory so anybody near me would get the code anyway!&lt;/p&gt;

&lt;p&gt;To make it even worse, once you've typed a digit, some javascript runs that automatically moves your cursor to the next input box.  I have never liked this convention as it falls against best practice and expected behaviour.  Nobody expects it to automatically move you to the next box as there are few websites that do it - it's not the default action on input forms.  The only time I have ever been able to see an acceptable use for this is when entering in a product key or something similar e.g. a long (over 20 characters) string of randomly generated text that has been broken apart into smaller chunks of 4 or 5 to make it easier for humans to transcribe.  That is the only situation that people expect the behaviour as it is the only place that the majority will have seen it happen before (although one could argue that my description of a product key could equally apply to a telephone number and I wouldn't dispute that).  However, for a single digit number that is masked by an asterix, it is completely unneccessary and confusing.  The part that really gets me though is that if you mistype, you can't tab back and delete it as you'll be automatically moved forward to the next input.  You either have to press &lt;kbd&gt;shift + tab&lt;/kbd&gt; and then &lt;kbd&gt;backspace&lt;/kbd&gt; incredibly quickly or disable javascript.  I'm quite quick on a keyboard thanks to a lifetime of being sat behind one but I can imagine that this is incredibly frustrating for a user who doesn't know what's going on or is a little slower at typing!&lt;/p&gt;

&lt;p&gt;Speaking of slow typers or disabled users, we come to the &quot;Users with Special Needs&quot; section.  This seems to have been bolted on to the end of the login process almost as an afterthought or simple nod to the fact that people may have accessibility issues preventing them from accessing the system.  Rather than disabling the javascript or making the buttons bigger, the &quot;Users with Special Needs&quot; checkbox simply serves to disable the automatic refreshing of the page when the security timer expires.  Like most online services of a secure nature, the website will lock you out if you're inactive for a certain period of time.  In the case of the RBS banking system, this is done with JavaScript and you are physically kicked out of the system rather than getting an error when you navigate to a page after the timeout.  I've no idea why disabling this feature falls under &quot;special needs&quot; but there we go!&lt;/p&gt;

&lt;p&gt;So, if you managed to decipher your password, enter it correctly first time, and scrolled down and squinted to find the next button, you will move to your welcome screen where you can get the basic overview of your accounts, right?  Wrong!&lt;/p&gt;

&lt;p&gt;Occasionally a screen will appear with something in capitals along the lines of *WARNING* WATCH OUT FOR PHISHING ATTACKS - WE DON'T EMAIL YOU.  I don't really mind these as they don't happen all of the time and it's good to know that the bank is trying to protect it's customers by reminding them of common sense.  It does have a ridiculously small 'next' button under-the-fold (similar to the other pages) but it's not a regular occurrence so not a major gripe for me.  This next screen which does show up every time is though&amp;hellip;&lt;/p&gt;

&lt;img src=&quot;http://files.bendodson.com/old-weblog/2009/04/final-628x600.png&quot; alt=&quot;RBS Login: The confirmation page&quot; title=&quot;RBS Login Final Page&quot; width=&quot;628&quot; height=&quot;600&quot; class=&quot;size-large wp-image-82&quot; /&gt;

&lt;p&gt;This page has been designed for the sole purpose of getting people to keep their information up to date as well as advertising new products / services.  There is absolutely no benefit to the user as far as I can tell.  If we look at the first part, it tells the user when they last logged in, part of their address, and their email address.  Knowing when you last logged in might be useful as that way you can see if someone else has logged in than wasn't you - however, in reality most people don't remember exactly when they last logged in and I would assume that the vast majority of people don't even read that sentence.  The address section is completely redundant as it only shows a small section and again people are unlikely to read it.  If you move house, you are quite obviously going to change your bank details and I don't think a reminder every time you log in to your internet banking is necessary.  The final section about your email address is again redundant as the bank never emails it's customers.  Why?  There are too many phishing attacks in this day and age so the majority of emails from banks look like spam!  Besides, what are they going to email you?  Probably just adverts for other services such as advanced bank accounts and mortgages.&lt;/p&gt;

&lt;p&gt;Everything below-the-fold (including the next button again!) is just advertising space.  In this screenshot, they are advertising paperless billing (which you probably already know about if you're using online banking) and the misleading &quot;Even safer online banking&quot; which is advertising for it's free security suite which basically tells you that you're connected to the banks website and not another website.  It only works on 32-bit windows running either IE or Firefox and won't work with screen readers.  Whilst this 'advertising' is inevitable, it does not need to be shown every time the user logs in especially not on the confirmation of login page!  It's also ironic that they choose to advertise their free software to make you more secure after you've logged in rather than at the start of the journey (where they do mention it but in much smaller writing rather than the large banner ad they use here).&lt;/p&gt;

&lt;p&gt;Once you have clicked the next button, you are finally taken into the online banking system and you can get on with whatever task you need to perform such as checking your balance or making a payment (which requires an external card reader and a whole lot of hassle, but that's a rant for another day!)&lt;/p&gt;

&lt;h3&gt;Summary&lt;/h3&gt;

&lt;p&gt;As I've tried to point out above, there are numerous accessibility and usability problems in the above scenario of logging into a mainstream online banking system.  As a brief recount, I need to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to homepage&lt;/li&gt;
&lt;li&gt;Fake my user-agent&lt;/li&gt;
&lt;li&gt;Type in my 10-digit 'customer number'&lt;/li&gt;
&lt;li&gt;Fill out random digits from both a security number and password (in a random order)&lt;/li&gt;
&lt;li&gt;Occassionally see a notices page&lt;/li&gt;
&lt;li&gt;View a reminder of my last login, part of my address, and email address as well as bank service advertising&lt;/li&gt;
&lt;li&gt;Finally get to my online banking overview&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That weighs in at an astonishing &lt;strong&gt;6 pages&lt;/strong&gt; just to login to my account!  That doesn't include going back to the start if you happen to mistype some of the details or if you get trapped in the &quot;ever advancing javascript inputs of doom&quot; (patent pending).&lt;/p&gt;

&lt;h3&gt;Recommendations&lt;/h3&gt;

&lt;p&gt;There are several basic steps that RBS can take to rectify the process of logging onto their online banking system.&lt;/p&gt;

&lt;p&gt;Firstly, they need to remove the browser sniffing and instead take up the practice of graceful degradation, that is to say show the best way of doing it and then fall back to more simple methods if the browser is too old.  There is no good reason why the latest browsers (which are by virtue more secure) should not be allowed access to the site.&lt;/p&gt;

&lt;p&gt;Next, the javascript 'enhancements' need to be completely removed not only due to accessibility concerns but also because they break traditional UI design and user expectation.  This goes for both the self-advancing input boxes and the automatic logout - you shouldn't need to tick a box to say that you don't want to be redirected from a site with JavaScript.&lt;/p&gt;

&lt;p&gt;Finally, the entire process can be minimised down to 2 pages.  This is done by adding the 'customer number' input next to the initial 'Log In' box on the RBS homepage, and then having a single page to have both the two security checks (no random ordering of input boxes please!) and details of their antivirus package.  Once you've passed security, you should be taken to the overview page where you can then at the top of the page have a small section about when you last logged in and then use sidebars for advertising of services such as 'paperless billing' or reminding customers to keep their address details up to date.&lt;/p&gt;

&lt;p&gt;With these three simple steps, the headaches for all customers can be removed, and the process would become easy-to-use rather than a constant struggle!&lt;/p&gt;

&lt;p&gt;I'd be interested to know of anyone's views on accessibility and usability with regards to online banking systems - please use the comments box below or &lt;a href=&quot;http://bendodson.com/weblog/contact/&quot;&gt;contact me&lt;/a&gt;.  You can also let me know if there are any particular sites that have glaring usability issues that you'd like me to investigate in the future.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>London Underground Tube Updates API is live!</title>
      <link>http://bendodson.com/weblog/2009/04/26/london-underground-tube-updates-api-is-live/index.html</link>
      <pubDate>Sun, 26 Apr 2009 00:00:00 +0100</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2009/04/26/london-underground-tube-updates-api-is-live/index.html</guid>
      <description>&lt;p&gt;I &lt;a href=&quot;http://bendodson.com/weblog/2008/03/16/rss-feed-of-the-london-underground-tube-status/&quot;&gt;posted an article&lt;/a&gt; just over a year ago about an RSS feed of the London Underground Tube Status that I'd created by scraping the &lt;a href=&quot;http://www.tfl.gov.uk/&quot;&gt;TFL website&lt;/a&gt;.  I was overwhelmed not only by the response via comments and emails, but also by the sheer number of people using it (my apache access logs increased by 7GB per month!) that I decided to make a full blown API so that it would be easier for developers like me to create great mashups using data that should always have been publicly accessible.&lt;/p&gt;

&lt;p&gt;I'm happy to announce that after a good test run at the &lt;a href=&quot;http://rewiredstate.org/&quot;&gt;Rewired State&lt;/a&gt; event a couple of weeks ago, the Tube Updates API is now live and ready to be used at &lt;a href=&quot;http://tubeupdates.com/&quot; title=&quot;An API for TFL London Underground Tube Update data&quot;&gt;tubeupdates.com/&lt;/a&gt; - You can request updates from any line (including the Docklands Light Railway) in either JSON or XML format and everything is structured to give you as much information as possible e.g. station closures, why there are 'minor delays', etc.&lt;/p&gt;

&lt;p&gt;But that's not all!  I am caching the data (and have been since 1st Jan 2009) so you can also go back in time and look at the underground system at any point in time!  I wrote a rather rudimentary &lt;a href=&quot;http://tubeupdates.com/stats/&quot;&gt;stats analyser&lt;/a&gt; for my &lt;a href=&quot;http://rewiredstate.org/projects/tfl-statistics&quot;&gt;Rewired State project&lt;/a&gt; which shows you the basic reliability over the past couple of months but that is just a taster of what you can do with the information now available.&lt;/p&gt;

&lt;p&gt;I'll be releasing new versions of the RSS feed shortly so that non-developer types can still access the data - I'll be announcing those &lt;a href=&quot;http://bendodson.com/weblog/&quot;&gt;on this blog&lt;/a&gt; and on &lt;a href=&quot;http://twitter.com/bendodson/&quot;&gt;my twitter feed&lt;/a&gt; once they are ready in the next few days.  In the mean time, please play around with the API.  There are no real usage terms but I'd love to know how you are using it so please &lt;a href=&quot;http://bendodson.com/weblog/contact/&quot;&gt;get in touch&lt;/a&gt; if you make use of it!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;For those that come to this site regularly, you may have noticed that it's undergone a major overhaul!  I've done a complete redesign (looks best in Safari) and replaced the blog engine with Wordpress so I should be blogging a lot more frequently.  I'm also about to become a full time freelance PHP developer and web consultant but I'll be posting more details about that soon!!&lt;/em&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Updates coming soon to London Underground RSS Feed</title>
      <link>http://bendodson.com/weblog/2008/12/09/updates-coming-soon-to-london-underground-rss-feed/index.html</link>
      <pubDate>Tue, 09 Dec 2008 00:00:00 +0000</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2008/12/09/updates-coming-soon-to-london-underground-rss-feed/index.html</guid>
      <description>&lt;p&gt;I've had a large number of emails over the last week or so about my &lt;a href=&quot;http://bendodson.com/weblog/2008/03/16/rss-feed-of-the-london-underground-tube-status/&quot;&gt;RSS Feed that displays the latest updates from the London Underground&lt;/a&gt; asking for more data or for a slightly different service.  I hadn't realised how many people were using the feed (which I put up as a tutorial on how to site scrape and to demonstrate the lack of tools on the new TFL site) until my server nearly died as the access logs had ballooned to 7GB!&lt;/p&gt;
&lt;p&gt;So, I'm pleased to say that I'm working on some major updates which will provide not only the current RSS feed but also a full REST API and dedicated site so you can get more data and more flexibility into your applications.&lt;/p&gt;
&lt;p&gt;I should have everything ready in the next few days so sign up to my &lt;a href=&quot;/rss.xml&quot;&gt;RSS feed&lt;/a&gt; to be notified when the new service goes live!  If you have any suggestions, please &lt;a href=&quot;/contact/&quot;&gt;contact me&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    
    <item>
      <title>iPhone 2.1 Firmware Update Released - Fast? Stable? Fixed?</title>
      <link>http://bendodson.com/weblog/2008/09/14/iphone-2-1-firmware-update-released-fast-stable-fixed/index.html</link>
      <pubDate>Sun, 14 Sep 2008 00:00:00 +0100</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2008/09/14/iphone-2-1-firmware-update-released-fast-stable-fixed/index.html</guid>
      <description>&lt;p&gt;So the firmware that all iPhone users have been waiting for has finally arrived. Even before it&amp;#x27;s announcement at &lt;a href=&quot;http://events.apple.com.edgesuite.net/0809dt4bs89/event/index.html&quot; rel=&quot;external&quot;&gt;Apple&amp;#x27;s &amp;quot;Let&amp;#x27;s Rock&amp;quot; event&lt;/a&gt;, speculation was rife about what would be included. Many people wanted new features such as copy &amp;amp; paste and MMS support (it&amp;#x27;s never going to happen!) whereas others be-cried the fact that their beloved iPhone just didn&amp;#x27;t work that well due to app crashes, slow typing, and painfully long backups.&lt;/p&gt;
&lt;p&gt;However, Steve Jobs finally announced that firmware 2.1 would be with us on Friday 12th September and would be a bug-fix only release. He claimed that the phone would be faster, backup time would be &amp;quot;dramatically reduced&amp;quot;, would have a &amp;quot;decrease in call set-up failures and call drops&amp;quot;, &amp;quot;faster installation of 3rd party applications&amp;quot;, would fix a lot of app crashing bugs, and would have &amp;quot;improved performance in text messaging&amp;quot;. There are 2 new features as far as I can see which are Genius playlist creation which came with iTunes 8 and a secure wipe of the phone in the event that the keypad lock is entered incorrectly too many times.&lt;/p&gt;&lt;p&gt;So does the update live up to all of the promises listed above? Well, yes it does on this occasion! The whole experience of using the phone is back to how it was with version 1.1.4 in that it&amp;#x27;s fast, responsive, and doesn&amp;#x27;t crash every few minutes. I&amp;#x27;ll go over a few of the key improvements i&amp;#x27;ve seen from my own use over the last few days:&lt;/p&gt;&lt;h3&gt;Application Installation / Crashes&lt;/h3&gt;&lt;p&gt;I regularly install and uninstall apps on to my iPhone as I love trying out the latest new things to come along. However, in the past it would take an absolute age to install anything on the phone - in fact I gave up doing it via the App Store on the iPhone itself as that usually didn&amp;#x27;t work (or would take an hour or so by which point the battery was dead) and so had resorted to sideloading apps via iTunes. This still could take a good 10 minutes or so though which wasn&amp;#x27;t really acceptable. Once the apps were on, they would frequently crash or hang - several times I had to do a hard reset of the phone (hold the home button and power button down together for about 10 seconds). Amusingly, I only learnt about the hard reset after the 3rd time my iPhone crashed (screen wouldn&amp;#x27;t come on) and I thought the only way to fix it was to do a restore via iTunes.&lt;/p&gt;&lt;p&gt;Anyway, this is all water under the bridge now as I managed to get 26 applications installed via iTunes in less than 5 minutes and have installed several apps via the App Store on the iPhone itself in a couple of minutes. A vast improvement! Additionally, I haven&amp;#x27;t had a single app crash on me yet which is also much improved on previous performance. Apps seem to be quitting correctly and quickly as well. For instance, in the past if I closed down &amp;quot;&lt;a href=&quot;http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=284972147&amp;amp;mt=8&quot; rel=&quot;external&quot;&gt;Tap Tap Revenge&lt;/a&gt;&amp;quot; by pressing the home button, the app would disappear and the home screen would appear but the music would keep playing for another 5-10 seconds or so. Now it just quits as it should have done in the first place.&lt;/p&gt;&lt;h3&gt;Location Services&lt;/h3&gt;&lt;p&gt;I hadn&amp;#x27;t seen it reported widely but my location service was incredibly patchy. If I was in my house or at work, then pressing the &amp;quot;locate me&amp;quot; button would just lead to a little blue spinning circle which would never find me. I put this down to the iPhone 3G saying &amp;quot;I&amp;#x27;ve got GPS - Use it even though it&amp;#x27;ll never work in this building&amp;quot; - there appeared to be no fallback to cell tower triangulation. This is fixed now though as within 2 seconds of pressing the button in my living room, I had been located to within 50m or so. GPS also seems to be a little faster outside but again it does a cell tower triangulation instantly before it even bothers with the GPS locater. &lt;/p&gt;&lt;p&gt;Now it just needs a decent turn-by-turn GPS app to make it really good - I managed to fake this the other day whilst I was lost in Manchester by loading up Google Maps and making it do directions from my current location to my destination. This all showed up fine and then I literally scrolled across the map as the little GPS dot moved. This worked absolutely fine but I couldn&amp;#x27;t help but think it would have worked a whole lot better if when the blue dot got near the edge of the screen then the map scrolled automatically!&lt;/p&gt;&lt;h3&gt;SMS Typing&lt;/h3&gt;&lt;p&gt;By far the most annoying bug was that after a little bit of use, going to type an SMS message became painfully slow. The keyboard just had a huge amount of lag for no reason! I eventually found a fix for this which was to quit the SMS app, then open it again and delete a character - it would then go back to full speed. No need for this now though as I&amp;#x27;ve had no laggy text messages in the last few days!&lt;/p&gt;&lt;h3&gt;iTunes Backup&lt;/h3&gt;&lt;p&gt;Whether this is a fix in the firmware or for iTunes 8 I&amp;#x27;m not sure but the iPhone now backs up in about 10 seconds. I have seen the same iPhone (with less apps and music) take an hour and a half to backup before now so this really is very impressive! I had previously disabled my backups by using the following command in Terminal (make sure iTunes is turned off)&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;text&quot;&gt;defaults write com.apple.iTunes DeviceBackupsDisabled -bool true
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;This stops the iPhone doing a backup when it&amp;#x27;s connected to iTunes. However, I&amp;#x27;ve now amended this to:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;text&quot;&gt;defaults write com.apple.iTunes DeviceBackupsDisabled -bool false
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Now my backups are back up and running and are incredibly fast so I&amp;#x27;ll be leaving it on for the time being (although hopefully there won&amp;#x27;t be a need for a restore).&lt;/p&gt;&lt;p&gt;On a separate note, I&amp;#x27;m again not sure if this is an iPhone 2.1 update or an iTunes 8 update but when you are looking at your iPhone through iTunes, it actually shows how much space is used up by Apps rather than sticking them under the category of Other. Very helpful!&lt;/p&gt;&lt;h3&gt;Passcode Locking / Secure Wipe&lt;/h3&gt;&lt;p&gt;Talking about doing backups leads me nicely into a new feature of iPhone 2.1 - the ability to have your iPhone wipe itself if someone enters in the passcode incorrectly more than 10 times. This in response to the controversy surrounding Apple when it turned out that you could &lt;a href=&quot;http://www.macrumors.com/2008/08/27/iphone-passcode-flaw-already-addressed-for-future-firmware-update/&quot; rel=&quot;external&quot;&gt;bypass the passcode&lt;/a&gt; if you had a certain setting enabled. Now most people commented that no-one used the passcode and I agreed with them as I had never had it enabled before. However, now there is a secure wipe option, I have put it back on so that if someone steals my phone I know my data is safe. If they enter the code in wrong more than 10 times then my iPhone will just wipe itself similar to the Exchange Remote Wipe feature. My only bug bear with the process is that 10 times is a long time. I&amp;#x27;d like to be able to change that number to 3 - I&amp;#x27;m not going to enter it in wrong that many times (and if I do then my fast backup process as detailed above means I can restore it fairly quickly). One &lt;a href=&quot;http://forums.macrumors.com/showthread.php?t=561173#post_message_6215873&quot; rel=&quot;external&quot;&gt;commentator&lt;/a&gt; said they&amp;#x27;d like it changed so it wipes if you get it wrong the first time making each unlock a little like an episode of 24!&lt;/p&gt;&lt;h3&gt;Genius Playlists&lt;/h3&gt;&lt;p&gt;I haven&amp;#x27;t had much experience of this on my iPhone as I only have a small portion of my library loaded on to it, but it appears to work in the same way as genius within iTunes 8. The idea is that every time you sync, your library is sent up to the Apple Genius &amp;quot;cloud&amp;quot; where it is analysed and compared with other peoples libraries. it can then recommend you music in your library that goes with other music in your library leading to a nice playlist that blends together quite well. It&amp;#x27;s essentially the same as recommendations from last.fm but seems to work quite well. It should get better as more and more people use it as the cloud will have more data to analyse. The only improvement I can see to this (which is a long shot and won&amp;#x27;t ever happen) is if there was a way to get the tracks to mix into each other as you went between them in a playlist. I listen to a lot of dance music and it would be great if genius was clever enough to do a DJ style mix between them. There was an application on Dragons Den a few years ago that did that but I&amp;#x27;m not sure what happened to it!&lt;/p&gt;&lt;h3&gt;Summary&lt;/h3&gt;&lt;p&gt;So the new firmware is a vast improvement and offers a few little extras as well such as secure wipe and Genius playlists. The other thing I&amp;#x27;ve noticed is that the icons for the different networks you are on (e.g. GPRS, Edge, 3G) have been changed slightly - Why I don&amp;#x27;t know but they do look a little clearer!&lt;/p&gt;&lt;p&gt;If you don&amp;#x27;t have it already, then upgrade to both &lt;a href=&quot;http://www.apple.com/iphone/softwareupdate/&quot; rel=&quot;external&quot;&gt;iPhone 2.1&lt;/a&gt; and &lt;a href=&quot;http://www.apple.com/itunes/overview/&quot; rel=&quot;external&quot;&gt;iTunes 8&lt;/a&gt; - you&amp;#x27;ll be glad you did!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How to control a Mac Mini from your iPhone including waking, sleeping, and audio / video</title>
      <link>http://bendodson.com/weblog/2008/09/08/control-mac-mini-from-iphone-with-waking-sleeping-audio-video/index.html</link>
      <pubDate>Mon, 08 Sep 2008 00:00:00 +0100</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2008/09/08/control-mac-mini-from-iphone-with-waking-sleeping-audio-video/index.html</guid>
      <description>&lt;p&gt;I was recently cleaning through the &quot;technology cupboard&quot; in my flat (every geek has one - it's a place where all the useless electronics we've collected over the years live) when I came across an idea for creating a home entertainment system for my bedroom.  The main driver for this was a forgotten Mac Mini (512MB of RAM and an old G4 processor) which I realised could hold all of my music on its 40GB hard drive and send it wirelessly to all of my other equipment.&lt;/p&gt;

&lt;p&gt;The problem I have is that at present I have 3 computers at home and 1 at work (plus my iPhone 3G) which all have a complete copy of all of my music files (around 20GB - obviously the iPhone doesn't have all of that as it doesn't fit but that's a separate issue) - the downside to this is that when I update one machine the others are then out of sync.  My original plan was to have the mac mini hold everything and then the other computers would use it's hard drive over my network as the master copy.  That way if I added music to the mac mini, the others would all be in sync.  I have since completely given up on this idea as I needed to a) access music on my laptop all the time and b) access music on my work iMac without having to leave everything on at home and broadcast through a static IP (which would also have been a little slow especially when I skip through lots of tracks - I'm very picky at what I listen to).&lt;/p&gt;

&lt;p&gt;However, since I started writing this article there have been &lt;a href=&quot;http://forums.macrumors.com/showthread.php?t=557826&quot; rel=&quot;external&quot;&gt;rumours flying around&lt;/a&gt; about the 9th September &quot;Lets Rock&quot; event being staged by Apple.  Several sources are touting that iTunes 8 is going to be released and will have an option to stream your music wirelessly to other machines (or an iPhone) through the internet.  Let's hope this is true!&lt;/p&gt;

&lt;p&gt;With the initial problem left alone for now, I decided to think on another problem I have.  If I want to listen to music in my bedroom, then I have to bring my laptop in and listen to it from there.  This isn't a huge difficulty but the sound quality isn't great and I don't like using my laptop in my bedroom (mainly because I try to keep some separation between work / computer based activities from other things I enjoy like reading and writing - the ideal separation is a physical one so I don't use my computer in my bedroom at all).  I could buy a cheap hi-fi system but then it wouldn't be connected to my iTunes library.  Alternatively I could get an iPhone dock but they are quite expensive (due to the magnetic shielding) and also I can't fit all my music on there so it wasn't really an option.  At this point I'd like to point out that yes I could have used &lt;a href=&quot;http://www.apple.com/uk/airportexpress/&quot; rel=&quot;external&quot;&gt;AirTunes&lt;/a&gt; (plugging a hi-fi unit into the 3mm audio jack on an Airport Express in order to pick up a shared iTunes library) but that would require me leaving the laptop on in the other room.  Not a great hardship but I'd have to get out of bed to turn it off (which would be a hardship).&lt;/p&gt;

&lt;p&gt;After a bit of thought and a look at the components I had, I worked out that I could put the mac mini under my bed with a wireless card and some speakers and then play music through it using the &lt;a href=&quot;http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=284417350&amp;mt=8&quot; rel=&quot;external&quot;&gt;Apple Remote application&lt;/a&gt; available from the App Store for iPhone.  I could also install a VNC client so that I could control the mac mini remotely if necessary (in the case of copying music onto it, installing updates, etc).  Perfect.&lt;/p&gt;

&lt;p&gt;I'm quite pedantic however and so the above solution wasn't yet 100% perfect.  The main problem I had was that the mac mini would need to be on 24 hours a day when I'd only be using it for around an hour a day at most. This doesn't bother me from an environmental perspective (I'm not into &quot;green&quot;) but did bother me from the point of view that I'd be paying for electricity I wasn't using (around 45-50W an hour I believe which would be around 16p a day - that works out at nearly &amp;pound;60 a year for nothing!) and that the components would be wearing down from overuse.  It would probably become a little unstable as well and I'd worry it would burst into flames or something!  So, the mac mini needed to be put to sleep and needed to be woken up.  I could do this by pressing the power button but it's under my bed and I can't be bothered with the movement involved.  Thus a solution had to be created that would let me wake it and put it to sleep remotely with my iPhone being the obvious candidate for this as it was already choosing the songs being played.&lt;/p&gt;

&lt;h3&gt;Challenge One - Make the mac go to sleep remotely&lt;/h3&gt;

&lt;p&gt;Waking up a machine is easy with Wake-on-LAN (as we'll see shortly) but there seems to be no easy way to put one to sleep.  My initial ideas of having an inactivity timer were quickly discarded as I realised that either the machine wouldn't go to sleep if music was left playing or it might go to sleep too quickly.  A better solution was needed and I eventually came across a terminal command which will make your mac sleep:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;applescript&quot;&gt;&lt;span class=&quot;nv&quot;&gt;osascript&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;e&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;tell&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;application&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;System Events&amp;quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;sleep&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;&amp;#39;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;You can try the above in Terminal and watch in awe as your mac succumbs to tiredness.  So this is all well and good but can only be run on the machine which you want to put to sleep; it can't be done remotely.&lt;/p&gt;

&lt;p&gt;A solution to the problem comes in the form of the Apache2 web server that comes installed by default on all OS X Leopard installations.  If I could set the mac mini up as a server, knock up a bit of PHP to pass the sleep command directly to the machine, and then broadcast the IP so that the command could be run via Safari on the iPhone, then I would be on to a winner!  This is exactly what I ended up doing and the instructions are below for your delectation.&lt;/p&gt;

&lt;p&gt;First of all we need to activate the Apache2 web server in Leopard.  To do this, go to &quot;System Preferences&quot; and then to the &quot;Sharing&quot; icon.  If you tick the &quot;Web Sharing&quot; checkbox, then the server will come to life and will be enabled whenever you start the machine.  You can check this has worked by going to &lt;a href=&quot;http://localhost/&quot; rel=&quot;external&quot;&gt;http://localhost/&lt;/a&gt; on the machine and checking you get an apache default installation message.  Now this is done, we need to set our Computer Name for easy access to this page from anywhere on our home network.  The setting for this is also in the &quot;Sharing&quot; control panel and so I set mine to mini.  This allows the web server to be reached by any computer on the network by going to &lt;a href=&quot;http://mini.local/&quot; rel=&quot;external&quot;&gt;http://mini.local/&lt;/a&gt; - try it yourself by changing it to whatever name you want (the URL to access your computer will be shown on the same screen).&lt;/p&gt;

&lt;p&gt;Now that we can connect to the web server, we need to get PHP up and running and write our script.  PHP 5 doesn't come enabled by default so we have to do this by opening up terminal and typing the code below.  I am assuming at this point that you have the excellent &lt;a href=&quot;http://macromates.com/&quot; rel=&quot;external&quot;&gt;TextMate&lt;/a&gt; installed which is accessed from the 'mate' command in Terminal.  If you don't have it, either install it or substitute 'mate' for some other text editor command like 'pico' or 'vi'.&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;text&quot;&gt;sudo mate /etc/apache2/httpd.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;You may need to type in your administrative password if prompted.  Now you have the Apache2 configuration file open, scroll down to somewhere around line 114 where you will find the line:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;text&quot;&gt;# LoadModule php5_module libexec/apache2/libphp5.so
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;You'll need to uncomment this (by removing the proceeding hash) and then save the file.  Once this is done, you'll need to restart Apache in order for your changes to be made available.  You do this with the command:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;text&quot;&gt;sudo apachectl graceful
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;You can use 'restart' in place of 'graceful' to do a full restart, but a graceful restart won't kick off anyone that is currently using your server.  This isn't going to matter here but it's a good habit to get into in case you ever need to restart an apache server in the future.&lt;/p&gt;

&lt;p&gt;You now have PHP5 installed and ready to go so lets write the PHP script that is going to power our sleep command.  You'll need to go to your Apache DocumentRoot (which by default is in a folder called Sites in your home folder) and delete any files that are in there.  Now create a new file called &quot;index.php&quot; with the following code in it:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;php&quot;&gt;&lt;span class=&quot;x&quot;&gt;&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Strict//EN&amp;quot;&lt;/span&gt;
&lt;span class=&quot;x&quot;&gt;    &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&amp;quot;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;x&quot;&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
&lt;span class=&quot;x&quot;&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
&lt;span class=&quot;x&quot;&gt;    &amp;lt;meta http-equiv=&amp;quot;Content-type&amp;quot; content=&amp;quot;text/html; charset=utf-8&amp;quot;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;x&quot;&gt;    &amp;lt;title&amp;gt;Mac Mini Sleeping App&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;span class=&quot;x&quot;&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class=&quot;x&quot;&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
&lt;span class=&quot;x&quot;&gt;    &amp;lt;h1&amp;gt;Goodnight...&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;span class=&quot;x&quot;&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class=&quot;x&quot;&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;exec&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;./sleep.scpt&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;exit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;All this code is doing is outputting a message that says &quot;goodnight&quot; and then executes an applescript file (in this case sleep.scpt) which contains the code from earlier:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;applescript&quot;&gt;&lt;span class=&quot;nv&quot;&gt;osascript&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;e&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;tell&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;application&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;System Events&amp;quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;sleep&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;I find it's easier to include a file in this way rather than typing the command into a function such as &lt;a href=&quot;http://uk3.php.net/passthru&quot; rel=&quot;external&quot;&gt;passthru()&lt;/a&gt; as it allows for easier control over quotes, etc.  The &lt;a href=&quot;http://uk3.php.net/manual/en/function.exec.php&quot; rel=&quot;external&quot;&gt;exec()&lt;/a&gt; command used in the above is pretty much telling PHP to type the command we used earlier into Terminal.  Unfortunately this won't actually do anything at present (at least it shouldn't do) as the Apache webserver is not authorised by default to perform such important system commands as are available through exec().  To do this we need to go back to the Apache2 config file and set the user and group of the web server to be the same as that of the user of the machine.  Now this is a calculated security risk as it means any scripts on the server can have full access to your machine and thus compromise it.  However, this is for personal home use and no-one will be able to access it unless they are on your network let alone run scripts on it so I think it's ok.  Let's set the permissions by opening up the config file:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;text&quot;&gt;sudo mate /etc/apache2/httpd.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Now go to around line 126 and amend the User to your own username and Group to 'staff'.  In my case this was:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;text&quot;&gt;User ben
Group staff
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Yours will differ (unless you're called ben) but you can find out what yours is by going to your home folder - the name of the folder is the name of your user.&lt;/p&gt;

&lt;p&gt;Now restart the apache server (remember our graceful command from earlier?) and try out your site.  You should find that your mac goes fast to sleep.  Success!  Simply go to the URL with safari on your iPhone, tap the '+' icon, and then choose &quot;save to home screen&quot; in order to set it up as a web app.  If you want a fancy icon, then stick a square PNG named &quot;apple-touch-icon.png&quot; in the same folder as the index.php file and you'll notice that it appears on your home screen when you bookmark the page.&lt;/p&gt;

&lt;h3&gt;Challenge Two - Wake the mac up&lt;/h3&gt;

&lt;p&gt;Ok, you now have a sleeping mac that you want to wake up.  Most computers have a little feature built in to them called Wake-on-LAN.  The idea is that when the computer is asleep, the ethernet port is actually still active and listening for data.  If a certain command is sent (referred to as a &quot;magic packet&quot;) then the ethernet card will tell the rest of the computer to wake up.  This is exactly what we need but unfortunately will not work over a wireless connection (as a wireless card doesn't stay awake when the computer is asleep).  If you have connected your mac to an ethernet connection then you can ignore the next few steps, but for me a long cable wasn't really an option.  I therefore came across a solution that would allow me to pretend I was on ethernet; wireless bridging.&lt;/p&gt;

&lt;p&gt;The idea behind wireless bridging is fairly simple.  Rather than having an ethernet cable from your router to your computer, you instead have 2 wireless routers that are connected via ethernet to each machine (or modem) which then act like an ethernet link between the two.  Now I already had an &lt;a href=&quot;http://www.apple.com/uk/airportextreme/&quot; rel=&quot;external&quot;&gt;Airport Extreme&lt;/a&gt; which was broadcasting my network / internet wirelessly and so all I needed was another router on the other end.  After a bit of headscratching with a BT router that was lying around, I decided the best way to proceed was to pop to the Apple Store and buy an &lt;a href=&quot;http://www.apple.com/uk/airportexpress/&quot; rel=&quot;external&quot;&gt;Airport Express&lt;/a&gt;.  The Airport Express is plugged into a standard power socket and then broadcasts a wireless signal.  On it's base it has 3 inputs; ethernet, USB, and 3mm Audio.  Usually the Airport Express is connected to a wired modem via ethernet so it can quickly and easily broadcast internet to the rest of your house however you can also plug in a printer to share that to wireless devices or plug in a standard hi-fi unit in order to utilise the AirTunes feature I mentioned earlier.&lt;/p&gt;

&lt;p&gt;I instead used it's network bridging service in order to connect it to the mac mini via ethernet and then extend the wireless network created by my Airport Extreme.  This is fairly easy to do from the Airport Utility - I won't go into the exact process here as it is mimicked in &lt;a href=&quot;http://www.macosxhints.com/article.php?story=20040927125820995&quot; rel=&quot;external&quot;&gt;several other places&lt;/a&gt;, but the end result that the Airport Express connects to the wireless network created by the Airport Extreme and sends this to the mac mini via ethernet.  This means that we can now send a Wake-on-LAN command as both the Airport Extreme and Airport Express are &quot;always on&quot; allowing the packet to go through the bridge, down the ethernet cable, and straight into the ethernet port.  Simple!&lt;/p&gt;

&lt;p&gt;Now we just need to find a way to send the magic packet from the iPhone.  The application &lt;a href=&quot;http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=286568674&amp;mt=8&quot; rel=&quot;external&quot;&gt;iWOL&lt;/a&gt; allows us to do this easily and has a very quick setup.  Simply type in a name to reference the machine and the MAC address of the ethernet card (this can be found by going to &quot;System Preferences&quot;-&gt;&quot;Network&quot; and selecting your ethernet card.  Now click on &quot;advanced&quot; and then on the &quot;Ethernet&quot; tab.  Your MAC Address is the &quot;Ethernet ID&quot;).  Now enable &quot;LAN Broadcast&quot; mode and you should be good to go.  Once your computer is asleep, open up iWol and you should be able to wake it up at the press of a button.&lt;/p&gt;

&lt;h3&gt;Further Enhancements&lt;/h3&gt;

&lt;p&gt;At present, my setup is working in the same way as detailed in the steps above.  I am in the process of making the sleeping web app slightly tidier with a fancy interface and icon, etc, and this will be available for download from my site shortly - the working title is &quot;Rohypnol&quot;&amp;hellip;&lt;/p&gt;

&lt;p&gt;In addition to the above steps, I have installed a freeware application called &lt;a href=&quot;http://www.robbiehanson.com/alarmclock/index.html&quot; rel=&quot;external&quot;&gt;Alarm Clock 2&lt;/a&gt; on the mac mini which allows me to use it as an alarm clock.  Various options are available including a &quot;wake from sleep&quot; mode which is perfect for this project.  I now have a special playlist on my mac mini which starts off quietly and over 5 minutes gently increases in volume.  Nothing says wake up in the morning like &lt;a href=&quot;http://www.youtube.com/watch?v=oHg5SJYRHA0&quot; rel=&quot;external&quot;&gt;Rick Rollin'&lt;/a&gt; music&amp;hellip;&lt;/p&gt;

&lt;p&gt;In order to control the mac mini better, I also installed a freeware VNC server called &lt;a href=&quot;http://sourceforge.net/projects/osxvnc/&quot; rel=&quot;external&quot;&gt;Vine Server&lt;/a&gt; that allows me to control the machine remotely. I won't go into the finer details of VNC setup as this has also been covered in detail &lt;a href=&quot;http://www.xawk.com/apple-htpc-step01-setup-and-vnc.html&quot; rel=&quot;external&quot;&gt;elsewhere on the net&lt;/a&gt;.  I will however mention the excellent &lt;a href=&quot;http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=284984448&amp;amp;mt=8&quot; rel=&quot;external&quot;&gt;VNC Lite&lt;/a&gt; app for iPhone which allows you to access VNC controlled machines.  It's easy to use and very intuitive - it's also free!&lt;/p&gt;

&lt;p&gt;In the future I plan to make some improvements to this system by plugging in a monitor which can then sit on the end of the bed allowing me to watch movies and tv shows downloaded through iTunes as well as DVDs etc but this is an upgrade for another day.  For now I'm quite happy with the setup which was achieved relatively easily and cheaply as I had all the components to hand.  I probably wouldn't recommend it if you were going to buy all the parts as the whole system would cost about &amp;pound;500 but as a small project it's worked very well.  Now I just have to wait to see what iTunes 8 will add to this setup&amp;hellip;&lt;/p&gt;

&lt;p&gt;If you have any questions or comments, then please use the comments box below or &lt;a href=&quot;http://bendodson.com/contact/&quot;&gt;contact me&lt;/a&gt;!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Twitter stops sending SMS to UK / Europe / Australia</title>
      <link>http://bendodson.com/weblog/2008/08/17/twitter-stops-sending-sms-to-uk-europe-australia/index.html</link>
      <pubDate>Sun, 17 Aug 2008 00:00:00 +0100</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2008/08/17/twitter-stops-sending-sms-to-uk-europe-australia/index.html</guid>
      <description>&lt;p&gt;Undoubtedly the biggest web app of 2007 was &lt;a href=&quot;http://twitter.com/&quot; rel=&quot;external&quot;&gt;Twitter&lt;/a&gt;, the simple web app that allowed you to send a text message and have that sent for free to anyone that followed you.  Combined with a simple API, useful web apps could be created to send you txts when your train was going to be delayed or when you got a new email, etc.  However, this has all stopped in the UK, Europe, and Australia for the time being as Twitter has finally turned off the ability to send messages (although you can still update your status by sending a txt).  The full details are below in an email that was received by those registered with the service in affected areas and also on the &lt;a href=&quot;http://blog.twitter.com/2008/08/changes-for-some-sms-usersgood-and-bad.html&quot; rel=&quot;external&quot;&gt;twitter blog&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;I'm sending you this note because you registered a mobile device to work with Twitter over our UK number. I wanted to let you know that we are making some changes to the way SMS works on Twitter. There is some good news and some bad news.&lt;p&gt;
&lt;p&gt;I'll start with the bad news. Beginning today, Twitter is no longer delivering outbound SMS over our UK number. If you enjoy receiving updates from Twitter via +44 762 480 1423, we are recommending that you explore some suggested alternatives.&lt;/p&gt;
&lt;p&gt;Note: You will still be able to UPDATE over our UK number.&lt;/p&gt;
&lt;p&gt;Before I go into more detail, here's a bit of good news: Twitter will be introducing several new, local SMS numbers in countries throughout Europe in the coming weeks and months. These new numbers will make Twittering more accessible for you if you've been using SMS to send long-distance updates from outside the UK.&lt;/p&gt;
&lt;p&gt;Why are we making these changes?&lt;/p&gt;
&lt;p&gt;Mobile operators in most of the world charge users to send updates. When you send one message to Twitter and we send it to ten followers, you aren't charged ten times--that's because we've been footing the bill. When we launched our free SMS service to the world, we set the clock ticking. As the service grew in popularity, so too would the price.&lt;/p&gt;
&lt;p&gt;Our challenge during this window of time was to establish relationships with mobile operators around the world such that our SMS services could become sustainable from a cost perspective.&lt;/p&gt;
&lt;p&gt;We achieved this goal in Canada, India, and the United States. We can provide full incoming and outgoing SMS service without passing along operator fees in these countries.&lt;/p&gt;
&lt;p&gt;We took a risk hoping to bring more nations onboard and more mobile operators around to our way of thinking but we've arrived at a point where the responsible thing to do is slow our costs and take a different approach. Since you probably don't live in Canada, India, or the US, we recommend receiving your Twitter
updates via one of the following methods.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://m.twitter.com&quot; rel=&quot;external&quot;&gt;m.twitter.com&lt;/a&gt; works on browser-enabled phones&lt;br /&gt;
&lt;a href=&quot;http://m.slandr.net&quot; rel=&quot;external&quot;&gt;m.slandr.net&lt;/a&gt; works on browser-enabled phones&lt;br /&gt;
&lt;a href=&quot;http://twittermail.com&quot; rel=&quot;external&quot;&gt;TwitterMail.com&lt;/a&gt; works on email-enabled phones&lt;br /&gt;
&lt;a href=&quot;http://bit.ly/12bw4R&quot; rel=&quot;external&quot;&gt;Cellity [http://bit.ly/12bw4R]&lt;/a&gt; works on java-enabled phones&lt;br /&gt;
&lt;a href=&quot;http://bit.ly/MFAfJ&quot; rel=&quot;external&quot;&gt;TwitterBerry [http://bit.ly/MFAfJ]&lt;/a&gt; works on BlackBerry phones&lt;br /&gt;
&lt;a href=&quot;http://bit.ly/1WxjwQ&quot; rel=&quot;external&quot;&gt;Twitterific [http://bit.ly/1WxjwQ]&lt;/a&gt; works on iPhones&lt;/p&gt;
&lt;p&gt;Twitter SMS by The Numbers&lt;/p&gt;
&lt;p&gt;It pains us to take this measure. However, we need to avoid placing undue burden on our company and our service. Even with a limit of 250 messages received per week, it could cost Twitter about $1,000 per user, per year to send SMS outside of Canada, India, or the US. It makes more sense for us to establish fair billing arrangements with mobile operators than it does to pass these high fees on to our users.&lt;/p&gt;
&lt;p&gt;Twitter will continue to negotiate with mobile operators in Europe, Asia, China, and The Americas to forge relationships that benefit all our users. Our goal is to provide full, two-way service with Twitter via SMS to every nation in a way that is sustainable from a cost perspective. Talks with mobile companies around the world continue. In the meantime, more local numbers for updating via SMS are on the way. We'll keep you posted.&lt;/p&gt;
&lt;p&gt;Thank you for your attention,&lt;br /&gt;
Biz Stone, Co-founder&lt;br /&gt;
Twitter, Inc.&lt;br /&gt;
&lt;a href=&quot;http://twitter.com/biz&quot; rel=&quot;external&quot;&gt;http://twitter.com/biz&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Now this has upset a LOT of users (especially in Australia) but is the general outcry from the web community really justified?  As Twitter themselves say, it could cost them nearly $1000 per user per year to send txts and with 2.2 million users that ain't cheap.  It has always been a mystery to me as to how Twitter makes money and how they are able to send all these txts for free so it comes as no surprise that they have finally stopped doing it.&lt;/p&gt;

&lt;p&gt;But what about the alternatives?  I'm using a mac and an iPhone so I've gone for the obvious choice of &lt;a href=&quot;http://iconfactory.com/software/twitterrific&quot; rel=&quot;external&quot;&gt;Twitteriffic&lt;/a&gt; on both which does a pretty good job.  On my mac, I get a little chirpy noise and a popup when I get a tweet which works a lot better than an SMS in a lot of ways and this is similar on the iPhone.  The only downside is that the iPhone doesn't support 3rd party apps running in the background so at present you have to open the app to see if there are any updates which is a bit of a pain.  However, this is due to change with iPhone Firmware 2.1 which is hopefully going to be with us some time in September.&lt;/p&gt;

&lt;p&gt;Once the ability to receive twitters from Twitteriffic seamlessly occurs, I think it will prove a lot more successful than the txt message route.  Firstly, because it will cost nothing to reply (whereas previously it was very easy to reply to a twitter from a txt and thus get charged for it) and secondly because new features can be added to the service.  Twitteriffic already supports location awareness on the iPhone so people can see where I am twittering from - a small improvement but an improvement none the less.&lt;/p&gt;

&lt;p&gt;In response to everybody shouting at Twitter about this issue, why don't they instead complain about the mobile phone companies who are so greedy in the affected countries that they refuse to do a deal with Twitter?  It comes as no surprise to me that in the UK the cellular networks refused to budge on pricing but that is no fault of Twitter who have been paying so much over the last year and a half to make a great service at absolutely no cost to the end user (not even adding advertising to tweets which would seem an obvious money making route).&lt;/p&gt;

&lt;p&gt;So in answer to &lt;em&gt;&quot;is Twitter now dead&quot;&lt;/em&gt; I would say no!  There are still several uses for it (e.g. I use it to keep a &lt;a href=&quot;http://bendodson.com/weblog&quot;&gt;micro blog on my homepage&lt;/a&gt;) and with several applications for all types of phones it is still easy to stay updated.  It will become really useful for me however when Apple release the next iPhone update with push technology - then it will be as if nothing had even changed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Amusingly it looks like someone is already trying to cash in on the lack of SMS from Twitter around most of the world.  Apparently &lt;a href=&quot;http://www.tweetSMS.com/&quot; rel=&quot;external&quot;&gt;tweetSMS&lt;/a&gt; will &quot;send you individual, hourly or daily updates from all (or just some) of your friends&quot; for a &quot;very small fee&quot;.  We'll see how small that fee is when they launch I suppose&amp;hellip;&lt;/p&gt; 

</description>
    </item>
    
    <item>
      <title>Kampyle - An easy way to get web user feedback</title>
      <link>http://bendodson.com/weblog/2008/08/04/kampyle-an-easy-way-to-get-web-user-feedback/index.html</link>
      <pubDate>Mon, 04 Aug 2008 00:00:00 +0100</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2008/08/04/kampyle-an-easy-way-to-get-web-user-feedback/index.html</guid>
      <description>&lt;p&gt;&lt;a href=&quot;http://www.kampyle.com/&quot; rel=&quot;external&quot;&gt;Kampyle&lt;/a&gt; is an easy to set-up javascript widget that gives users the opportunity to comment on your site either for the purposes of a bug report or simply to say &quot;you have a nice site&quot;.  On clicking the feedback icon, a new window opens that gives the user various different options on how to comment on the site.  The default options are Bug, Site Content, Suggestion, Compliment, and Other. Each of these has several sub-options such as &quot;browser issues&quot; or &quot;feature request&quot; which are all completely customisable by the website owner.  The user can then fill in a bit of text to describe the problem or suggestion, etc, and can choose from 5 different emoticons to say how they feel about the website in general.  All of this information is then logged in your account at the Kampyle website for you to look over at your leisure - they can also email daily reports to you so that you can stay on top of all your adoring fans or pissed off IE6 users.&lt;/p&gt;

&lt;p&gt;I've installed Kampyle on my site (using a custom icon as their default choices are pretty bad - animated gif anyone?) and I've already had quite a few pieces of feedback.  The great thing is that I've been able to fix a few bugs people have alerted me to and then have Kampyle email them back to let them know that the issue has been resolved.&lt;/p&gt;

&lt;p&gt;Kampyle is pretty good as it is, but the thing that is putting Kampyle on the map is their recent &lt;a href=&quot;http://www.kampyle.com/blog/?p=53&quot; rel=&quot;external&quot;&gt;integration with Google Analytics&lt;/a&gt; which means you can see all of your feedback stats within your Google Analytics account.  The way they have done this is particularly clever - You need to download the &lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/748&quot; rel=&quot;external&quot;&gt;Grease Monkey Firefox Extension&lt;/a&gt; and install the &lt;a href=&quot;https://www.kampyle.com/zlib_off/kampyle.user.js&quot; rel=&quot;external&quot;&gt;Kampyle Grease Monkey script&lt;/a&gt;, but then when you go to your Google Analytics account you'll see the Kampyle stats showing up in their own dashboard widgets.  Pretty clever really.  This was a major incentive for me as it means I can now see all of my stats in one place rather than having multiple accounts across the internet.&lt;/p&gt;

&lt;p&gt;So, if you'd like to leave any feedback on the site just click on the &quot;Leave Feedback&quot; banner in the bottom right hand corner!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Stop! Bug found in "Stop! Hammertime!" Firefox Extension on Windows XP / Vista</title>
      <link>http://bendodson.com/weblog/2008/07/21/stop-bug-found-in-stop-hammertime-firefox-extension-on-windows-xp-vista/index.html</link>
      <pubDate>Mon, 21 Jul 2008 00:00:00 +0100</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2008/07/21/stop-bug-found-in-stop-hammertime-firefox-extension-on-windows-xp-vista/index.html</guid>
      <description>&lt;p&gt;I've had a few reports from people saying that the latest version of the Stop! Hammertime! firefox extension hasn't been working properly on Windows XP and Windows Vista.  A new version will be coming soon but here is a fix for the time being.&lt;/p&gt;

&lt;p&gt;The problem that people are reporting is that when you go to the preferences section for the extension and try to change the stop button to the custom hammertime button, it won't let you press the &quot;ok&quot; button to proceed with the change.  It is currently only affecting Firefox 3 on Windows XP and Windows Vista but I'll be making a patch to fix it shortly.  For the time being, if you can't live without a hammertime button (despite the fact the stop button still works and plays the sound), then you can follow the steps below to get it working.&lt;/p&gt;

&lt;p&gt;First of all, you need to type &quot;about:config&quot; in the address bar of the browser.  This allows you access some of the internal preferences and config settings of firefox and all of your installed extensions.  You will most likely get a &quot;here be dragons&quot; warning but you can skip this - you do know what you're doing right?&lt;/p&gt;

&lt;p&gt;You will then need to use the filter option to locate the Stop! Hammertime! preferences.  You can do this by typing &quot;hammertime&quot; in the filter box - this should give you one result which by default is set to &quot;false&quot;.  You need to double click to change it to &quot;true&quot;.&lt;/p&gt;

&lt;p&gt;Once you've done this, simply restart firefox and the new hammertime button will be there for you to enjoy!  To change it back to the stop button, simply follow the steps above but make sure the hammertime config entry is set to &quot;false&quot;.&lt;/p&gt;

&lt;p&gt;An update will hopefully be available in the next fews days so that you won't have to perform the above to switch between the two, but this should do for the time being.  Alternatively you can buy an Apple Mac or install Linux!&lt;/p&gt;

&lt;p&gt;In other Stop! Hammertime! news, it seems that the copyright holders for the song &quot;U Can't Touch This&quot; have noticed it's popularity and are attempting to cash in on it.  I recently had an email from the &lt;a href=&quot;http://www.icgcopyright.com/icg/&quot; rel=&quot;external&quot;&gt;Integrated Copyright Group (ICG)&lt;/a&gt; informing me that I'd need to purchase a license in order to play the 2 second sound clip in the firefox extension otherwise I would be in breach of copyright.  After a few back and forths we came to the conclusion that they could send a &quot;cease and desist&quot; letter from their lawyers but that the extension wasn't being removed (and I wasn't paying for a license).  So, we'll see what happens - expect updates on this shortly!!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>iPhone 3G, Apps, MobileMe, and iPhone specific sites</title>
      <link>http://bendodson.com/weblog/2008/07/21/iphone3g-apps-mobileme-and-iphone-specific-sites/index.html</link>
      <pubDate>Mon, 21 Jul 2008 00:00:00 +0100</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2008/07/21/iphone3g-apps-mobileme-and-iphone-specific-sites/index.html</guid>
      <description>&lt;p&gt;So, you've probably heard of the iPhone (unless you've been living under a rock in Redmond) - Apple's debut outing into the mobile phone arena, and what a debut it has been!  The interface is easy to use, the build quality is good, and it has a number of interesting features (e.g. visual voicemail) which make up for it's huge lacking of the most basic features (e.g. MMS).  I've been using one for the past 3 months but have just recently upgraded to the iPhone 3G after &lt;a href=&quot;http://flickr.com/photos/bendodson/2665427230/&quot; rel=&quot;external&quot;&gt;queueing for a couple of hours outside the Fleet Street branch of O2&lt;/a&gt; on launch day.  But what are the new features and have they really improved the &quot;jesus phone&quot;?&lt;/p&gt;

&lt;p&gt;Well the most talked about features that have been added are 3G support (which allows for faster data transfer) and GPS (pin-point location service).  The difference in speed between 3G and Edge is not that noticeable on most websites I've found, but when using applications like maps or mail it is an absolute godsend.  Having said that, although pages take about the same amount of time to load, they seem to render a lot quicker (e.g. the screen stays white for a long period of time before suddenly filling up with content incredibly quickly).  GPS was the main thing I was looking forward to and it seems to be a bit hit and miss.  Sometimes I can enable it and it will have my exact location within about 4 seconds whereas other times it just never gets a lock.  What makes this so annoying is that it doesn't seem to use cell tower triangulation or wireless networks to get a rough approximation of my location as the old iPhone did. It just keeps hoping it will see a GPS satellite.  I had been hoping that there would be an app that would automatically send my current location to a service such as &lt;a href=&quot;http://fireeagle.yahoo.net/&quot; rel=&quot;external&quot;&gt;Fire Eagle&lt;/a&gt; at regular intervals so that I could make some cool location mashups but with the current support it seems unlikely that it would work. Oh, and these 2 features drain the battery like you would not believe!  Fortunately I don't move too far outdoors so I'm always near a healthy electric supply!&lt;/p&gt;

&lt;p&gt;The other differences between the iPhone and the iPhone 3G are very small but have actually meant more to me so far than 3G or GPS.  The first is that the back is no longer metal but plastic.  At first I thought this would be absolutely terrible but it actually makes the phone feel a lot more comfortable.  Also, all of the buttons (such as the silent switch and power button) are all brushed metal so they feel a lot more reliable and well built.  The other big improvement is that the sound quality is much improved on both the internal and external speaker.  I can actually use the loudspeaker now whereas before it just sounded like a normal phone with the volume turned up a bit (very muffled).&lt;/p&gt;

&lt;p&gt;The main enhancement has definitely been the introduction of iPhone 2.0, the much anticipated software upgrade available to both the old iPhone and the iPod Touch.  With the software you can now have Exchange mail, contact searching, and run 3rd party applications on the device.  It is this that seems to have become the main reason people want an iPhone 3G although to be honest I probably could have kept the old iPhone that I paid a ridiculous sum of money for only 3-4 months ago!  I have several apps installed now including services for Twitter, Flickr, Last.fm, and Facebook, a VNC client, a lightsabre, a &lt;a href=&quot;http://tapulous.com/taptap/&quot; rel=&quot;external&quot;&gt;Guitar Hero style tapping game&lt;/a&gt;, Super Monkey Ball, and a mobile version of &lt;a href=&quot;http://culturedcode.com/things/&quot; rel=&quot;external&quot;&gt;Things&lt;/a&gt; (which doesn't sync yet but &lt;a href=&quot;http://culturedcode.com/things/forums/read.php?6,4239&quot; rel=&quot;external&quot;&gt;they promised a free upgrade&lt;/a&gt; that will).  I'll be posting some updates over the coming days about various exciting apps that have arrived or are hopefully coming soon.  At the moment there is a real gap for an MSN Messenger client as I haven't found one yet but they seem to be adding 10-20 apps per day so there should be one in the near future.&lt;/p&gt;

&lt;p&gt;Another interesting development which Apple have introduced is &lt;a href=&quot;http://www.apple.com/mobileme/&quot; rel=&quot;external&quot;&gt;MobileMe&lt;/a&gt; which is supposedly &quot;Exchange for the rest of us&quot;.  It also has some of the best functioning &quot;Web 2.0&quot; apps that I have ever seen at &lt;a href=&quot;http://www.me.com&quot; rel=&quot;external&quot;&gt;me.com&lt;/a&gt;.  The idea is that all of your email, contacts, and calendar entries are stored online in a &quot;cloud&quot; and are then automatically pushed to your phone and computers.  Now this seemed great for me as I'm always updating things on the phone and then either having to plug it into my mac or update it on there manually.  I have both a MacBook and an iMac so it becomes a hassle trying to sync them all so it seemed like a very good idea.  Unfortunately the launch has been marred by huge problems over the launch weekend (e.g. it didn't work), some pissed off customers who didn't agree with Apple's marketing of the push system (e.g. showing a MacBook making a change that replicates instantly on the &quot;cloud&quot; but in reality it's a 15 minute automated sync rather than the push capability used by the phone), and also with a small error in which they took &amp;pound;121 off your credit card instead of $1 to authorise the payments.  However, all of this aside, MobileMe is absolutely great!  I add items to my calendar on my mac and they then show up on my iPhone.  I take a picture of someone on my iPhone and add it to their section in my address book and sure enough the photo is displayed on my MacBook the next time they email me.  It all works incredibly well but then it should do for &amp;pound;59 per year!&lt;/p&gt;

&lt;p&gt;My final thoughts on the whole iPhone thing revolve around iPhone specific sites.  That is to say taking a normal website (e.g. facebook) and then having it detect if you are using an iPhone or not and then displaying specific content or styling for that device.  Now normally I would be against such practices (remember IE4?) but in this case I have to say &quot;why not&quot;?  The iPhone has completely redefined mobile internet (in my opinion and doubtless many others) and has a unique interface and styling that are begging to be exploited.  The Facebook site is probably the best example for the way in which it seamlessly detects the iPhone and then displays a site that has been completely optimised for it (and styled to make it look like a native app).  Now that there is the opportunity to run apps natively on the iPhone I'm sure a number of these sites will disappear but for those of us that can't write objective-C (and I can't say I have a great desire to start learning it) then it is the closest way we can get to writing apps for the iPhone.  I am going to be making some sites specifically for the iPhone as well as some of my own personal systems which I'll be able to now access remotely and do some cool stuff with.  This debate is currently waging on the &lt;a href=&quot;http://webstandardsgroup.org/&quot; rel=&quot;external&quot;&gt;Web Standards Group&lt;/a&gt; Mailing List so I'd urge anyone with an opinion to sign up and discuss it there.  Alternatively you can put your thoughts on this issue here by using the comment box below.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Does anybody really use RSS Feeds?</title>
      <link>http://bendodson.com/weblog/2008/07/21/does-anybody-really-use-rss-feeds/index.html</link>
      <pubDate>Mon, 21 Jul 2008 00:00:00 +0100</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2008/07/21/does-anybody-really-use-rss-feeds/index.html</guid>
      <description>&lt;p&gt;I've been using RSS feeds for several years now and find them incredibly useful for keeping up to date with blogs and news sites.  However, today I was talking to another web developer who said that he hates RSS feeds and would much rather have email updates when a site gets updated rather than having to add an RSS feed to his email client.&lt;/p&gt;

&lt;p&gt;Now I wouldn't find this strange coming from a lot of people as I can understand that a lot of people have no idea about RSS and would get confused trying to work out what an aggregator is.  But from a web developer?  Come on!  If the people that develop websites with RSS can't even be bothered to use it then what chance is there of the general populous using it?&lt;/p&gt;

&lt;p&gt;I use mac mail to manage all of my RSS feeds and find that it does a fairly good job - everything gets synced over to my iPhone as well so I can keep up to date when I'm on the train etc.  I also have a few RSS feeds on my &lt;a href=&quot;http://www.google.com/ig&quot; rel=&quot;external&quot;&gt;iGoogle homepage&lt;/a&gt; so I can see the latest &lt;a href=&quot;http://xkcd.com/&quot; rel=&quot;external&quot;&gt;xkcd&lt;/a&gt; or &lt;a href=&quot;http://www.dilbert.com/&quot; rel=&quot;external&quot;&gt;dilbert&lt;/a&gt; strip whilst I'm pretending to work.  Now I'm fairly sure you can set Outlook up to receive RSS feeds - so why doesn't this developer do that?  Apparently, if Windows were to crash (unlikely but stay with me on this) then he would lose all of the RSS feeds he was tracking and therefore have to add them again so it's not worth doing.  &quot;You could use &lt;a href=&quot;http://www.google.com/help/reader/tour.html&quot; rel=&quot;external&quot;&gt;Google Reader&lt;/a&gt; or any other number of online aggregators&quot; say I.  &quot;Too much effort&quot; says he.  I give up.&lt;/p&gt;

&lt;p&gt;So, in the next day or so there will be a &quot;sign up&quot; button on this site so that those of you who can't be bothered with RSS can get email alerts when a new message is posted.  I've also set up a twitter account which will be syndicating the posts on this site as and when they happen - the account to follow is &lt;a href=&quot;http://twitter.com/bendodson_com/&quot; title=&quot;Stay up to date with bendodson.com/weblog on Twitter&quot; rel=&quot;external&quot;&gt;bendodson_com&lt;/a&gt;.  Oh, and for those of you that have moved into the 21st century, here is the &lt;a href=&quot;http://bendodson.com/weblog/rss.xml&quot; rel=&quot;external&quot;&gt;good old RSS feed&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Website upgrades finally completed</title>
      <link>http://bendodson.com/weblog/2008/07/19/website-upgrades-finally-completed/index.html</link>
      <pubDate>Sat, 19 Jul 2008 00:00:00 +0100</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2008/07/19/website-upgrades-finally-completed/index.html</guid>
      <description>&lt;p&gt;Some of the more regular visitors amongst you may have noticed that for the past month or so, &lt;a href=&quot;http://bendodson.com/weblog/&quot; title=&quot;PHP Developer Ben Dodson&quot;&gt;bendodson.com/weblog&lt;/a&gt; has been in a mild state of flux - I'm happy to say that everything is now completed and working fully!&lt;/p&gt;

&lt;p&gt;I hurried the uploading of the new design as I had some spare time at &lt;a href=&quot;http://flickr.com/photos/bendodson/sets/72157605753188176/&quot; title=&quot;Mashed 08 at Alexandra Palace&quot; rel=&quot;external&quot;&gt;Mashed&lt;/a&gt; and thought it would be a good idea to get the new site up and running in any state.  Then, the knowledge that my site might not be working would spur me on to fixing it.  A good theory, but apparently not good in practice.&lt;/p&gt;

&lt;p&gt;There were several bugs in IE6 (there always are), the site was taking too long to load, and the contact form didn't work at all.&lt;/p&gt;

&lt;p&gt;But now, the site has been optimised to a grade A level (according to &lt;a href=&quot;http://developer.yahoo.com/yslow/&quot; rel=&quot;external&quot;&gt;YSlow&lt;/a&gt;), the IE6 bugs have been fixed, and email now works from my server so the contact form is working again!&lt;/p&gt;

&lt;p&gt;I'll be continuing to make little tweaks and upgrades here and there, but I'll also be returning to the blogging scene and keeping the site regularly updated with various development news.  As a taster, I have recently been playing with a new iPhone 3G, fire eagle, a montage making script that uses flickr, and Google Optimizer (although not all at the same time) so stay tuned!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>New website goes live!</title>
      <link>http://bendodson.com/weblog/2008/06/21/new-website-goes-live/index.html</link>
      <pubDate>Sat, 21 Jun 2008 00:00:00 +0100</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2008/06/21/new-website-goes-live/index.html</guid>
      <description>&lt;p&gt;I've finally got around to giving the site a visual refresh which can now be viewed here at &lt;a href=&quot;http://bendodson.com/weblog/&quot;&gt;bendodson.com/weblog&lt;/a&gt; - There are a few bugs (mainly IE6) to iron out but on the whole it should be working!&lt;/p&gt;

&lt;p&gt;The site was redesigned by &lt;a href=&quot;http://lizahayes.co.uk&quot; rel=&quot;external&quot;&gt;Liza Hayes&lt;/a&gt; who took her inspiration mainly from Doctor Who!  I've been building it slowly over the past few months, but I'm currently at &lt;a href=&quot;http://upcoming.yahoo.com/event/472718&quot; rel=&quot;external&quot;&gt;Mashed&lt;/a&gt; so decided whilst I had the time dedicated to coding I really should get on and finish it!&lt;/p&gt;
&lt;p&gt;There will be various updates to the site over the next few days so keep posted!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>RSS Feed of the London Underground Tube Status</title>
      <link>http://bendodson.com/weblog/2008/03/16/rss-feed-of-the-london-underground-tube-status/index.html</link>
      <pubDate>Sun, 16 Mar 2008 00:00:00 +0000</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2008/03/16/rss-feed-of-the-london-underground-tube-status/index.html</guid>
      <description>&lt;p&gt;&lt;strong&gt;Please note that this page is now outdated - for any updates to the London Underground, you should use my dedicated &lt;a href=&quot;http://tubeupdates.com/&quot;&gt;Tube Status API and RSS feeds&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I've been spending some time making an RSS feed of the London Underground tube status as I've been working on a few projects that could use one.  You would think that &lt;a href=&quot;http://www.tfl.gov.uk&quot; rel=&quot;external&quot;&gt;Transport for Londons&lt;/a&gt; nice web 2.0 style website would provide this basic requirement but alas they don't.  There are a few developers out there who have written some scraping scripts to convert this information, but most of them no longer work as they haven't been updated to work with the new site.&lt;/p&gt;

&lt;p&gt;Previously I have used the script at &lt;a href=&quot;http://conor.net/code/tube/&quot; rel=&quot;external&quot;&gt;conor.net&lt;/a&gt; to power any projects requiring a tube RSS feed but this went down a few weeks ago when I was in the middle of some crucial testing. So, like any other crazy developer would, I decided to write my own PHP scraping script that would generate me a nice RSS feed to basically tell me TFL had messed up my journey home!&lt;/p&gt;

&lt;p&gt;For those of you just looking for an RSS feed of the London Underground tube delays, you can find it at &lt;a href=&quot;http://tubeupdates.com/rss/&quot; rel=&quot;external&quot;&gt;http://tubeupdates.com/rss/&lt;/a&gt; - This is automatically updated every minute and will email me if anything goes wrong so I can fix it!  If you are going to use it for any projects, please &lt;a href=&quot;http://bendodson.com/contact/&quot;&gt;let me know&lt;/a&gt; so that I can monitor bandwidth, etc.  If you are interested in how it works, then the code that powers this is below - feel free to use and modify it for your own projects:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;php&quot;&gt;&lt;span class=&quot;cp&quot;&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// This file should be run on a CRON job every 5 minutes.&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// The server will need to be able to write to this folder in order to create the XML file.&lt;/span&gt;

&lt;span class=&quot;nv&quot;&gt;$array&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;s1&quot;&gt;&amp;#39;bakerloo&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;s1&quot;&gt;&amp;#39;central&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;s1&quot;&gt;&amp;#39;circle&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;s1&quot;&gt;&amp;#39;district&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;s1&quot;&gt;&amp;#39;east london&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;s1&quot;&gt;&amp;#39;hammersmith &amp;amp; city&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;s1&quot;&gt;&amp;#39;jubilee&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;s1&quot;&gt;&amp;#39;metropolitan&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;s1&quot;&gt;&amp;#39;northern&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;s1&quot;&gt;&amp;#39;piccadilly&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;s1&quot;&gt;&amp;#39;victoria&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;s1&quot;&gt;&amp;#39;waterloo &amp;amp; city&amp;#39;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;foreach&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$array&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$ref&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;$id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;str_replace&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$ref&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;$id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;str_replace&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;&amp;amp;&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;and&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

    &lt;span class=&quot;nv&quot;&gt;$lines&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;][&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;$lines&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;][&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;ucwords&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$ref&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;$lines&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;][&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;url&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; 
        &lt;span class=&quot;s1&quot;&gt;&amp;#39;http://www.tfl.gov.uk/tfl/livetravelnews/realtime/tube/tube-&amp;#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;-now.html&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;foreach&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$lines&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$line&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;$file&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;file_get_contents&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$line&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;url&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]);&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;$needle&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;strtoupper&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$line&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;ref&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39; LINE:&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;$pos&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;strpos&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$file&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$needle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$pos&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!==&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nv&quot;&gt;$pos&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;strlen&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$needle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;nv&quot;&gt;$end&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;strpos&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$file&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;&amp;lt;/div&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$pos&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
         &lt;span class=&quot;nv&quot;&gt;$status&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;strip_tags&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;substr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$file&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$pos&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$end&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$pos&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)));&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nv&quot;&gt;$status&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;A good service is currently running.&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    
    &lt;span class=&quot;nv&quot;&gt;$lines&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;][&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;status&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$status&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nv&quot;&gt;$now&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;r&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;nv&quot;&gt;$xml&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;lt;&amp;lt;&amp;lt;XML&lt;/span&gt;

&lt;span class=&quot;s&quot;&gt;&amp;lt;rss version=&amp;quot;2.0&amp;quot;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;    &amp;lt;channel&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;        &amp;lt;title&amp;gt;London Tube Updates&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;        &amp;lt;link&amp;gt;http://www.tfl.gov.uk/tfl/livetravelnews/realtime/tube/default.html&amp;lt;/link&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;        &amp;lt;description&amp;gt;The latest London Underground tube update information&amp;lt;/description&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;        &amp;lt;language&amp;gt;en&amp;lt;/language&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;        &amp;lt;pubDate&amp;gt;$now&amp;lt;/pubDate&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;        &amp;lt;lastBuildDate&amp;gt;$now&amp;lt;/lastBuildDate&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;        &amp;lt;docs&amp;gt;http://tube.bendodson.com/weblog/&amp;lt;/docs&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;        &amp;lt;webMaster&amp;gt;ben@bendodson.com (Ben Dodson)&amp;lt;/webMaster&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;        &amp;lt;generator&amp;gt;PHP script by Ben Dodson&amp;lt;/generator&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;        &amp;lt;ttl&amp;gt;5&amp;lt;/ttl&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;        &amp;lt;image&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;            &amp;lt;title&amp;gt;Transport for London&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;            &amp;lt;url&amp;gt;http://www.tfl.gov.uk/tfl-global/images/roundel.gif&amp;lt;/url&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;            &amp;lt;link&amp;gt;http://www.tfl.gov.uk/&amp;lt;/link&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;            &amp;lt;width&amp;gt;52&amp;lt;/width&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;            &amp;lt;height&amp;gt;44&amp;lt;/height&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;            &amp;lt;description&amp;gt;Transport for London Logo&amp;lt;/description&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;        &amp;lt;/image&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;XML;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;foreach&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$lines&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$line&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;$xml&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;&amp;lt;item&amp;gt;&amp;#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\r\n&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;$xml&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;&amp;lt;title&amp;gt;&amp;#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;htmlentities&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;ucwords&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$line&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]))&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;&amp;lt;/title&amp;gt;&amp;#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\r\n&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;$xml&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;&amp;lt;link&amp;gt;&amp;#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$line&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;url&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;&amp;lt;/link&amp;gt;&amp;#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\r\n&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;$xml&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;&amp;lt;description&amp;gt;&amp;#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;htmlentities&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$line&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;status&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;&amp;lt;/description&amp;gt;&amp;#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\r\n&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;$xml&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;&amp;lt;/item&amp;gt;&amp;#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\r\n&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        
&lt;span class=&quot;nv&quot;&gt;$xml&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;&amp;lt;/channel&amp;gt;&amp;#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\r\n&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$xml&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;&amp;lt;/rss&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;file_put_contents&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;rss.xml&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$xml&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;cp&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;As I mentioned earlier, I am working on a few projects that utilise this script and I shall be making those available shortly.  However, for a sneak peek, you can check out &lt;a href=&quot;http://tubeupdates.com/&quot; rel=&quot;external&quot;&gt;Tube Updates&lt;/a&gt;, an API for any developer that would like to make use of this data.  There are still a few improvements to be made but you get the general idea!&lt;/p&gt;

</description>
    </item>
    
    <item>
      <title>Firefox extensions updated for Beta 3 compatibility</title>
      <link>http://bendodson.com/weblog/2008/03/01/firefox-extensions-updated-for-beta-3-compatibility/index.html</link>
      <pubDate>Sat, 01 Mar 2008 00:00:00 +0000</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2008/03/01/firefox-extensions-updated-for-beta-3-compatibility/index.html</guid>
      <description>&lt;p&gt;I've spent some time updating my firefox extensions so that all of them work with &lt;a href=&quot;http://www.mozilla.com/en-US/firefox/all-beta.html&quot; rel=&quot;external&quot;&gt;Firefox 3 Beta 3&lt;/a&gt;. At present they can only be downloaded from this site as it takes the Mozilla Addons team a few days to approve updates.  My &lt;a href=&quot;http://bendodson.com/weblog/extensions/&quot;&gt;extensions page&lt;/a&gt; is now back up and running though and contains details on all 3 of my Firefox Extensions (Font Finder, Stop! Hammertime!, and STOP in the name of love) as well as download links for the new releases.&lt;/p&gt;

&lt;p&gt;I won't be making any further updates to the stop buttons (apart from making them work with future version of Firefox) but I will be continuing development on Font Finder which could benefit from a visual overhaul as well as a clipboard function!  I'll be updating on here when it happens so sign up to the &lt;a href=&quot;http://bendodson.com/weblog/rss.xml&quot;&gt;RSS feed&lt;/a&gt; for the latest news!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Google extended encoding made easy!</title>
      <link>http://bendodson.com/weblog/2008/02/28/google-extended-encoding-made-easy/index.html</link>
      <pubDate>Thu, 28 Feb 2008 00:00:00 +0000</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2008/02/28/google-extended-encoding-made-easy/index.html</guid>
      <description>&lt;p&gt;I've been having a play around with &lt;a href=&quot;http://code.google.com/apis/chart&quot; rel=&quot;external&quot;&gt;Google Charts&lt;/a&gt; recently but came across a problem with the range of values that can be used. With &lt;a href=&quot;http://code.google.com/apis/chart/#simple&quot; rel=&quot;external&quot;&gt;simple encoding&lt;/a&gt;, you can only have values between 0 and 64, and with &lt;a href=&quot;http://code.google.com/apis/chart/#text&quot; rel=&quot;external&quot;&gt;text encoding&lt;/a&gt; only values between 0 to 100.  This is annoying when dealing with things such as tracking website hits or weight when values are typically much higher.&lt;/p&gt;

&lt;p&gt;I played around with some functions to try and factorise the numbers so that they would be in the range of 0 to 100 but this didn't go so well so I decided to tackle Google's &lt;a href=&quot;http://code.google.com/apis/chart/#extended&quot; rel=&quot;external&quot;&gt;extended encoding&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This is a system of encoding that basically takes a pair of alphanumeric characters and translates them into a number between 0 and 4095 (much better!).  So for example, B9 translates to 125 and .a would translate to 4058.  However, although this has a much larger range, it's a bit harder to get your head around and so what is needed is a simple function (or two) to convert to and from the extended encoding.  Predictably, I have said PHP functions here:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;php&quot;&gt;&lt;span class=&quot;cp&quot;&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;array_to_extended_encoding&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;$characters&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-.&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;nv&quot;&gt;$encoding&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;foreach&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$array&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nv&quot;&gt;$first&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;floor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$value&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;64&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;nv&quot;&gt;$second&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$value&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;64&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;nv&quot;&gt;$encoding&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$characters&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$first&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$characters&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$second&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$encoding&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;cp&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;php&quot;&gt;&lt;span class=&quot;cp&quot;&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;extended_encoding_to_array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;$characters&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-.&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;  

    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;strlen&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$characters&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nv&quot;&gt;$first&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$characters&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;64&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;strlen&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$characters&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nv&quot;&gt;$second&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$characters&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;nv&quot;&gt;$pairs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;str_split&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;foreach&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$pairs&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$pair&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nv&quot;&gt;$value&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$first&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$pair&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]];&lt;/span&gt;
        &lt;span class=&quot;nv&quot;&gt;$value&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$second&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$pair&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]];&lt;/span&gt;
        &lt;span class=&quot;nv&quot;&gt;$values&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$values&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;cp&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;They work fairly simply by taking advantage of PHP's casting methods in that a string can be interpreted as an array.&lt;/p&gt;

&lt;p&gt;In the first function, &lt;code&gt;array_to_extended_encoding()&lt;/code&gt;, an array of numbers should be passed e.g. &lt;code&gt;array(250,39,400,1904,2)&lt;/code&gt;.  The function first lists all of the extended encoding characters in order as one string named &lt;code&gt;$characters&lt;/code&gt;.  It then loops through our array of numbers, and creates two variables; &lt;code&gt;$first&lt;/code&gt; and &lt;code&gt;$second&lt;/code&gt;.  In &lt;code&gt;$first&lt;/code&gt;, we store the number from our array divided by 64 and rounded down using the &lt;a href=&quot;http://www.php.net/floor&quot; rel=&quot;external&quot;&gt;&lt;code&gt;floor()&lt;/code&gt;&lt;/a&gt; function.  For &lt;code&gt;$second&lt;/code&gt;, we use the modulus operator (&lt;code&gt;%&lt;/code&gt;) to find the remainder once the number from the array is divided by 64.  We then take both &lt;code&gt;$first&lt;/code&gt; and &lt;code&gt;$second&lt;/code&gt; and work out the encoding by looking up the numbers from within the &lt;code&gt;$characters&lt;/code&gt; cast as an array.  This gives us 2 characters which make up the extended encoding for the number.  We keep extending the value of &lt;code&gt;$encoding&lt;/code&gt; until we end up with a string representing the full extended encoding of the array passed to the function.&lt;/p&gt;

&lt;p&gt;The second function, &lt;code&gt;extended_encoding_to_array()&lt;/code&gt;, is slightly more advanced.  It accepts a string as its only parameter which should be an extended encoding (e.g. &lt;code&gt;$encoding = 'AA..B9aC'&lt;/code&gt;).  We first list all of the characters in a string as we did for our previous function, but then we create two arrays which will contain all of the numbers we need to decode the extended encoding.  In &lt;code&gt;$first&lt;/code&gt;, we create an array of each character in the &lt;code&gt;$characters&lt;/code&gt; string as a number multiplied by 64 (so the letter b would be 64 as it is signified by number 1 in the array multiplied by 64).  Within &lt;code&gt;$second&lt;/code&gt; we perform a similar operation but instead just assign the number of the character rather than multiplying it by 64.  This gives us two arrays, with keys relating to each character that can be used as an encoding and values as the numerical equivalent.  It is now a simple case of splitting the string that was passed to the function into chunks of 2 characters using &lt;a href=&quot;http://www.php.net/str_split&quot; rel=&quot;external&quot;&gt;&lt;code&gt;str_split()&lt;/code&gt;&lt;/a&gt; and looping through the returned array setting the value of each character within the pair from the arrays we created.  We then add the two returned numbers together to give us the decoded figure and add it to an array which will be returned by the function.&lt;/p&gt;

&lt;p&gt;Simple?  It has certainly made things a lot easier for the functions I'm writing for a PHP wrapper for Google Charts and hopefully it will help somebody else as well.   If you have any questions or comments, please &lt;a href=&quot;http://bendodson.com/weblog/contact/&quot;&gt;get in touch&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Firefox Extensions page will be right back!</title>
      <link>http://bendodson.com/weblog/2008/02/26/firefox-extensions-page-will-brb/index.html</link>
      <pubDate>Tue, 26 Feb 2008 00:00:00 +0000</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2008/02/26/firefox-extensions-page-will-brb/index.html</guid>
      <description>&lt;p&gt;As some of you may have noticed, the new site design has caused the Firefox Extensions page to go awry.  This will return shortly (along with a few new extensions) but for the time being you are better to go the Mozilla Addons site to download the extensions.&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Stop! Hammertime&lt;/strong&gt; - &lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/974&quot; rel=&quot;external&quot;&gt;https://addons.mozilla.org/en-US/firefox/addon/974&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;Font Finder&lt;/strong&gt; - &lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/4415&quot; rel=&quot;external&quot;&gt;https://addons.mozilla.org/en-US/firefox/addon/4415&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;Stop in the Name of Love&lt;/strong&gt; - &lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/3771&quot; rel=&quot;external&quot;&gt;https://addons.mozilla.org/en-US/firefox/addon/3771&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update: &lt;/strong&gt; The extensions page is now up and running again and can be viewed at &lt;a href=&quot;http://bendodson.com/weblog/extensions/&quot;&gt;http://bendodson.com/weblog/extensions/&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>phpMyOpenID Beta Testers Required!</title>
      <link>http://bendodson.com/weblog/2008/02/25/phpmyopenid-beta-testers-required/index.html</link>
      <pubDate>Mon, 25 Feb 2008 00:00:00 +0000</pubDate>
      <author>ben@bendodson.com (Ben Dodson)</author>
      <guid>http://bendodson.com/weblog/2008/02/25/phpmyopenid-beta-testers-required/index.html</guid>
      <description>&lt;p&gt;I've finally got around to adding full multi-user support for my &lt;a href=&quot;http://labs.bendodson.com/weblog/phpmyopenid/&quot;&gt;phpMyOpenID&lt;/a&gt; script and I'm now looking for some beta testers to help find any bugs that are lurking around.&lt;/p&gt;
</description>
    </item>
    

  </channel> 
</rss>
