<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description>I’m Nick, by day a mobile software engineer in London. Mainly I work on iOS and Objective-C, with some dabbling in Android. My views here are my own, not my employer’s.</description><title>clever/you - thoughts about mobile</title><generator>Tumblr (3.0; @clever-you)</generator><link>http://cleveryou.net/</link><item><title>Smartphones &amp; Lighting Consoles</title><description>&lt;p&gt;Before I started this whole programming lark, I used to work in theatres designing, rigging, and programming lighting. Just as we&amp;#8217;ve seen smartphones bring rapid developments to the mobile space, the same technology (touch interfaces and embedded technology) has brought a lot of change to lighting.&lt;/p&gt;

&lt;p&gt;For example, here&amp;#8217;s a couple of desks I used to program on &lt;strong&gt;a lot&lt;/strong&gt; - an ETC Express and a Strand 300.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/535f77bb8048832ebb64e54766ea7111/tumblr_inline_mmrczjhUef1qz4rgp.jpg" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/277866688693c46a47b054f5860cb291/tumblr_inline_mmrcztLdQN1qz4rgp.jpg" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;They have a couple of things in common: lots (and lots) of buttons and faders, and a user interface that is a little&amp;#8230;functional (think ASCII and DOS).&lt;/p&gt;

&lt;p&gt;But here&amp;#8217;s the latest and greatest in lighting control - the ETC Eos Ti:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/06d68672bed1d5202d42cd3b0854c171/tumblr_inline_mmrd3go3Mu1qz4rgp.jpg" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;&amp;#8230;what&amp;#8217;s changed? Well, a lot fewer faders for one thing. And there&amp;#8217;s the two giant touch-screens up top (think two iPads glued into a lighting console). Oh, and the secondary touch-screen used as a color palette amongst other things on the right hand side. The rise of tablets and touch interfaces has brought benefits far beyond the world of mobile.&lt;/p&gt;</description><link>http://cleveryou.net/post/50372552316</link><guid>http://cleveryou.net/post/50372552316</guid><pubDate>Mon, 13 May 2013 23:31:01 +0100</pubDate><category>mobile</category><category>touchscreen</category><category>lighting</category></item><item><title>ITV, Samsung, and Exclusivity Deals</title><description>&lt;p&gt;For a very long time, I used a Samsung Galaxy S2 as my Android phone (I engineer iOS apps, but it&amp;#8217;s good to know what&amp;#8217;s going on the world outside Cupertino). Unhappy with the long, long waits for software updates from Samsung, I switched a few months ago to the Nexus 4.&lt;/p&gt;

&lt;p&gt;Being produced by Google, the Nexus 4 is &lt;em&gt;the&lt;/em&gt; flagship Android device - so naturally you&amp;#8217;d expect it to be an advertisement for all things Android. Unless, that is, you want to watch ITV on it.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/48ff249430d0ab2ef9cc78e751e87ae3/tumblr_inline_mmqizoV6F81qz4rgp.png" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;For the benefit of those not in the UK, ITV is one of the largest TV networks in the country. Last week, they made a change to their Android app: for the next few months, at the very least, it is exclusive to Samsung devices. Here&amp;#8217;s what ITV had to say:&lt;/p&gt;

&lt;p&gt;&amp;gt; The fragmentation of the Android ecosystem is well known. Therefore, as a commercial broadcaster, it makes sense for us to partner with the leading manufacturer of Android devices to further increase our technical knowledge of the operating system.&lt;/p&gt;

&lt;p&gt;This makes little sense: the Nexus 4, for example, is the &lt;a href="http://source.android.com/source/building-devices.html"&gt;recommended device&lt;/a&gt; for the development of the Android OS itself. If I was developing an Android app and wanted to maximise compatibility I&amp;#8217;d probably target the reference device as standard.&lt;/p&gt;

&lt;p&gt;Although ITV frame this as a technical decision, we should probably be realistic - maybe Samsung provided financial or development support to maintain some level of exclusivity. Either way, I personally don&amp;#8217;t see an benefit for either party.&lt;/p&gt;

&lt;h3&gt;Why it&amp;#8217;s not great for Samsung&lt;/h3&gt;

&lt;p&gt;Personally, I don&amp;#8217;t see Samsung getting their money&amp;#8217;s worth here. Are people going to buy Samsung handsets so they can download the ITV Player app? Presumably not, because the exclusivity period ends in a few months. People will buy Samsung handsets because Samsung spend far more money than anybody else advertising them. And, as other people have noted, it doesn&amp;#8217;t do Samsung many favours with regards to their Google relationship.&lt;/p&gt;

&lt;h3&gt;Why it&amp;#8217;s not great for ITV&lt;/h3&gt;

&lt;p&gt;The ITV Player app isn&amp;#8217;t exactly doing very well on the store:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/9cc7b0969605d5495832834eda21ec20/tumblr_inline_mmqixrvF1a1qz4rgp.png" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;&amp;#8230;if you are going to limit it to select handsets on the basis that you want a more stable experience then you&amp;#8217;d better have made some improvements. Unfortunately, this doesn&amp;#8217;t seem to be the case judging from the reviews. Additionally, many existing users who are running older versions of the player on non-Samsung devices are providing one-star reviews expressing their displeasure.&lt;/p&gt;

&lt;p&gt;It comes down to this: exclusivity deals are not, in of themselves, a bad thing (although &lt;a href="http://www.trustedreviews.com/opinions/samsung-is-hurting-android"&gt;Trusted Reviews has a great article&lt;/a&gt; that offers a counterpoint to this). They can provide cash-limited companies with money to develop interesting and exciting apps. But turning a previously &lt;em&gt;widely available&lt;/em&gt; app into an exclusive deal: that&amp;#8217;s not so good. Users don&amp;#8217;t like it, and I don&amp;#8217;t see the benefit for brands&amp;#8230;especially if your disgruntled, locked out users start giving you bad press.&lt;/p&gt;</description><link>http://cleveryou.net/post/50336155393</link><guid>http://cleveryou.net/post/50336155393</guid><pubDate>Mon, 13 May 2013 12:39:00 +0100</pubDate><category>android</category><category>google play</category><category>apps</category><category>itv</category></item><item><title>A Guide to BaaS</title><description>&lt;h3 id="introduction"&gt;Introduction&lt;/h3&gt;

&lt;p&gt;Some of my most popular posts are those about mobile backend providers Parse and StackMob. It’s been a few months since I last looked at them, and since then much has changed - so I’ve decided to take a comprehensive look at both the large and small players in the mobile backend space.&lt;/p&gt;

&lt;h3 id="whatisbaas"&gt;What is BaaS?&lt;/h3&gt;

&lt;p&gt;BaaS stands for &lt;em&gt;backend as a service&lt;/em&gt;, and is used to describe a company that provides a way for front-end developers to ‘plug in’ to cloud storage, user management, push messaging, and the like without having to write and support their own server architectures.&lt;/p&gt;

&lt;p&gt;If you’ve read some of my other blog posts you’ll know I’m a fan of BaaS. It’s not for everyone - large apps with millions of users, in particular, will of course benefit from their own internal systems - but if you’re starting out and need a quick and efficient data storage system that works across multiple platforms you can’t go wrong with BaaS.&lt;/p&gt;

&lt;p&gt;The BaaS industry has come to be quite closely associated with mobile, partly because many companies sprung up in response to a need by native application developers for secure, reliable data management systems. There’s nothing to stop you using a BaaS provider to power your desktop web apps, but I’ll be mainly focusing on mobile here since that’s my field of interest.&lt;/p&gt;

&lt;h3 id="baasproviders"&gt;BaaS Providers&lt;/h3&gt;

&lt;p&gt;Wikipedia lists some fifteen different BaaS providers - some large, and some very tiny. There are two main players in the market, the &lt;a href="http://cleveryou.net/post/49003678297/parse-facebook-what-now"&gt;Facebook bound&lt;/a&gt; &lt;a href="http://www.parse.com"&gt;Parse&lt;/a&gt;, and &lt;a href="http://www.stackmob.com"&gt;StackMob&lt;/a&gt;. In addition, a number of smaller players are all vying for your business. &lt;/p&gt;

&lt;p&gt;I’ve chosen to look at five different BaaS platforms and compare their strengths and weaknesses. Each provider has a brief review, followed by a pricing comparison and some general recommendations for what to look out for. Hopefully you’ll find it useful - and I’m always happy to answer questions either &lt;a href="http://cleveryou.net/ask"&gt;through Tumblr&lt;/a&gt; or &lt;a href="https://twitter.com/objclxt"&gt;Twitter (@objclxt)&lt;/a&gt;. You can either read on, or jump to the provider you’re interested in:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;a href="#parse"&gt;Parse&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#stackmob"&gt;StackMob&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#kinvey"&gt;Kinvey&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#fatfractal"&gt;FatFractal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#quickblox"&gt;QuickBlox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#helios"&gt;Helios&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;

&lt;div style="background-color: #eeeeee; border-color: #aaaaaa; border-style: solid; border-width: 1px; padding: 5px 10px 5px 10px; margin: 5px 5px 20px 5px"&gt;
&lt;div style="float: right"&gt;&lt;img src="http://media.tumblr.com/f1bb2bd5a0169d8f35af70174a8ade70/tumblr_inline_mmh9ug8Nil1qz4rgp.jpg" alt="image"/&gt;&lt;/div&gt;

&lt;h1 id="parse"&gt;&lt;a href="http://www.parse.com"&gt;Parse&lt;/a&gt;&lt;/h1&gt;

&lt;p&gt;Although not the oldest in the game, &lt;a href="http://www.parse.com"&gt;Parse&lt;/a&gt; is probably by far the most well known BaaS provider, if only due to it’s &lt;a href="https://developers.facebook.com/blog/post/2013/04/25/welcoming-parse-to-facebook/"&gt;acquisition by Facebook&lt;/a&gt; last week.&lt;/p&gt;

&lt;h4 id="features"&gt;Features&lt;/h4&gt;

&lt;p&gt;As standard, Parse offers support for data synchronisation, push notifications, social integration, and custom code via server-deployed JavaScript. Parse has official client libraries for iOS, OS X, Android, JS, Windows 8 (desktop and phone), and .net. There are also many third party libraries available for languages such as Ruby, PHP, Python, Go, and the like. Currently, Parse’s first-party libraries are all closed source, which is a shame (hopefully this will change under Facebook). Parse is also well known for its excellent documentation, which includes complete sample applications and walk-throughs.&lt;/p&gt;

&lt;p&gt;Server-side code is supported through Parse’s &lt;a href="https://parse.com/docs/cloud_code_guide"&gt;Cloud Code&lt;/a&gt; feature, which is JavaScript based. In addition to your own custom code, you can also plug into third-party &lt;a href="https://parse.com/docs/cloud_modules_guide"&gt;modules&lt;/a&gt; to directly integrate with services such as SendGrid, Stripe, Twilio, Mailgun, and the like. Parse also recently added support for &lt;a href="https://parse.com/products/hosting"&gt;static hosting&lt;/a&gt;, which allows static and JS based pages to be served up quickly and easily.&lt;/p&gt;

&lt;h4 id="pricing"&gt;Pricing&lt;/h4&gt;

&lt;p&gt;Parse charges on a per-API request model, plus storage. Anything below 1 million requests is free, which for many low-usage projects will be more than sufficient. Their standard ‘pro’ plan provides 15 million API requests, 15 million push notifications, and 10GB of storage for $199 per month. Enterprise plans are also available with dedicated SLAs and the like. &lt;/p&gt;

&lt;p&gt;To put that in some perspective, 15 million API calls a month lets you support 50,000 active users at 300 calls per month.&lt;/p&gt;

&lt;h4 id="whousesit"&gt;Who Uses It?&lt;/h4&gt;

&lt;p&gt;I do! Also, a number of large brands and agencies, including IDEO, Cisco, Hipmunk, BBDO, and Deloitte (it should come as no surprise that agencies tend to be big users of BaaS - they often lack backend expertise at scale, and many of their apps are for short-lived campaigns).&lt;/p&gt;

&lt;h4 id="pros"&gt;Pros&lt;/h4&gt;

&lt;ul&gt;&lt;li&gt;Acquired and backed by Facebook (…or a con, depending on your viewpoint)&lt;/li&gt;
&lt;li&gt;Wide range of well supported SDKs&lt;/li&gt;
&lt;li&gt;Excellent documentation&lt;/li&gt;
&lt;/ul&gt;&lt;h4 id="cons"&gt;Cons&lt;/h4&gt;

&lt;ul&gt;&lt;li&gt;Acquired and backed by Facebook (…or a pro, depending on your viewpoint)&lt;/li&gt;
&lt;li&gt;Client libraries are closed source&lt;/li&gt;
&lt;li&gt;Custom ‘cloud’ code somewhat limiting compared to other providers
&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;

&lt;div style="background-color: #eeeeee; border-color: #aaaaaa; border-style: solid; border-width: 1px; padding: 5px 10px 5px 10px; margin: 5px 5px 20px 5px"&gt;
&lt;div style="float: right"&gt;&lt;img src="http://media.tumblr.com/cb78c73bb13ea84b55e454bba3b7fff4/tumblr_inline_mmh9tjcIlt1qz4rgp.png" alt="image"/&gt;&lt;/div&gt;

&lt;h1 id="stackmob"&gt;&lt;a href="http://www.stackmob.com"&gt;Stackmob&lt;/a&gt;&lt;/h1&gt;

&lt;p&gt;&lt;a href="http://www.stackmob.com"&gt;Stackmob&lt;/a&gt; has been in the BaaS business for a while, and along with Parse are one of the bigger players in the space. They aggresively compete, to the point where StackMob posted a “&lt;a href="https://www.stackmob.com/parse/"&gt;migrate from Parse tutorial&lt;/a&gt;” the day after Parse’s acquisition.&lt;/p&gt;

&lt;h5&gt;Features&lt;/h5&gt;

&lt;p&gt;Stackmob offer broadly the same feature-set as Parse, but with a few additions such as distinct production / development environments, API versioning, and a more comphrehensive custom code framework that supports server-side Java or Scala. Many of these advanced features are made available on a modular basis in the StackMob marketplace (but more on that below). Both the Android and iOS client libraries are open source, and available on GitHub.&lt;/p&gt;

&lt;h5&gt;Pricing&lt;/h5&gt;

&lt;p&gt;StackMob recently changed their pricing model from a usage based to a more generous ‘freemium’ model. Basic API access is both free and unlimited, but additional functionality can be ‘unlocked’ through the StackMob marketplace (if you’ve used Heroku this marketplace model will be familiar to you).&lt;/p&gt;

&lt;p&gt;The downside of this is that depending on what you need this can end up being very expensive. For example, let’s say we want to support custom code and 5 million push messages a month. Both of these features are included in Parse’s Pro package, but with StackMob you’ll need to purchase each module separately. This ends up costing $399 for the push and $199 for the custom code, or a total of nearly $600. That’s &lt;strong&gt;three times as expensive&lt;/strong&gt; as Parse for broadly equivalent functionality.&lt;/p&gt;

&lt;p&gt;As a result, using StackMob could require some careful planning to make sure you only use the modules you absolutely require. Don’t forget to think about your future requirements when pricing up or you might have a very expensive surprise!&lt;/p&gt;

&lt;h5&gt;Who Uses It?&lt;/h5&gt;

&lt;p&gt;According to StackMob’s rather limited case studies page, the platform is used by Atari, ShopKeeper, and Meexo, amongst others. &lt;/p&gt;

&lt;h5&gt;Pros&lt;/h5&gt;

&lt;ul&gt;&lt;li&gt;Unlimted API calls as standard&lt;/li&gt;
&lt;li&gt;Open source client libraries&lt;/li&gt;
&lt;li&gt;Good documentation&lt;/li&gt;
&lt;/ul&gt;&lt;h5&gt;Cons&lt;/h5&gt;

&lt;ul&gt;&lt;li&gt;Free plan has unlimited API calls, but missing functionality such as HTML5 hosting&lt;/li&gt;
&lt;li&gt;Paid modules quickly add up
&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;

&lt;div style="background-color: #eeeeee; border-color: #aaaaaa; border-style: solid; border-width: 1px; padding: 5px 10px 5px 10px; margin: 5px 5px 20px 5px"&gt;
&lt;div style="float: right"&gt;&lt;img src="http://media.tumblr.com/f1066d7a458868c73361cd5bdf92557d/tumblr_inline_mmh9srLspQ1qz4rgp.png" alt="image"/&gt;&lt;/div&gt;

&lt;h1 id="kinvey"&gt;&lt;a href="http://kinvey.com"&gt;Kinvey&lt;/a&gt;&lt;/h1&gt;

&lt;p&gt;Based out of Boston (woo), &lt;a href="http://kinvey.com"&gt;Kinvey&lt;/a&gt; have been around for a couple of years with their BaaS offering. They were recently selected as a Facebook Technology Partner.&lt;/p&gt;

&lt;h5&gt;Features&lt;/h5&gt;

&lt;p&gt;Kinvey offers the usual plethora of data storage, user management, push notifications, and social integrations. They also offer versioned APIs and usage analytics. Additionally, Kinvey’s enterprise plans support existing authentication systems such as LDAP or OAuth, along with data links into products such as Salesforce CRM.&lt;/p&gt;

&lt;h5&gt;Pricing&lt;/h5&gt;

&lt;p&gt;Kinvey bases their pricing on the number of active users. An ‘active user’ is defined as one that has made an API request that month. I’m not the biggest fan of this model, because it can makes apps with large numbers of users but with small backend requirements rather expensive. Kinvey do offer API pricing as an alternative, but you’ll need to get in touch with them directly to discuss further.&lt;/p&gt;

&lt;h5&gt;Who Uses It?&lt;/h5&gt;

&lt;p&gt;A number of marketing agencies use Kinvey, presumably on behalf of their clients, as well as Johnson &amp;amp; Johnson. &lt;/p&gt;

&lt;h5&gt;Pros&lt;/h5&gt;

&lt;ul&gt;&lt;li&gt;Enterprise-level features such as LDAP, Orcale, Salesforce, and OAuth support (for those on enterprise plans)&lt;/li&gt;
&lt;li&gt;Agencies can benefit from Kinvey’s referral program&lt;/li&gt;
&lt;/ul&gt;&lt;h5&gt;Cons&lt;/h5&gt;

&lt;ul&gt;&lt;li&gt;Default ‘active user’ pricing model not suitable for all apps&lt;/li&gt;
&lt;li&gt;No ‘custom code’ support a la Parse or StackMob, although backend business logic is supported&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;

&lt;div style="background-color: #eeeeee; border-color: #aaaaaa; border-style: solid; border-width: 1px; padding: 5px 10px 5px 10px; margin: 5px 5px 20px 5px"&gt;
&lt;div style="float: right"&gt;&lt;img src="http://media.tumblr.com/090249797cf0885eec617f9f5f3fff16/tumblr_inline_mmh9pxJHUq1qz4rgp.png" alt="image"/&gt;&lt;/div&gt;

&lt;h1 id="fatfractal"&gt;&lt;a href="http://fatfractal.com"&gt;FatFractal&lt;/a&gt;&lt;/h1&gt;

&lt;p&gt;&lt;a href="http://fatfractal.com"&gt;FatFractal&lt;/a&gt; also seem very responsive to customer requests and feedback - I actually got in touch to ask whether they supported bulk data export whilst writing this post, and they implemented it into their system overnight. &lt;/p&gt;

&lt;h5&gt;Pricing&lt;/h5&gt;

&lt;p&gt;Currently, FatFractal provide up to 3 million requests and 5GB of storage free of charge whilst in public beta. Their gold plan provides 12 million API requests and 15GB of storage for $200 per month. You should, however, be aware that unlike other providers, FatFractal charge for outgoing bandwidth overages. The gold plan include 12GB of outgoing bandwidth, and it’s $0.15/GB after that. I doubt for most people this would be a problem, but if you’re building an app that’s going to require significant bandwidth (video sharing, perhaps) you’ll need to take this into account.&lt;/p&gt;

&lt;h5&gt;Who Uses It?&lt;/h5&gt;

&lt;p&gt;In FatFractal’s defence, they are still in beta and have a limited client list as a result. They have a number of testimonials from smaller developers and agencies, and list a couple of minor apps in production.&lt;/p&gt;

&lt;h5&gt;Pros&lt;/h5&gt;

&lt;ul&gt;&lt;li&gt;Responsive customer service, and quick to reply to feedback&lt;/li&gt;
&lt;li&gt;Very developer-centric business, which may appeal to some&lt;/li&gt;
&lt;/ul&gt;&lt;h5&gt;Cons&lt;/h5&gt;

&lt;ul&gt;&lt;li&gt;A smaller player in the business&lt;/li&gt;
&lt;li&gt;At the time of writing, still in beta&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;

&lt;div style="background-color: #eeeeee; border-color: #aaaaaa; border-style: solid; border-width: 1px; padding: 5px 10px 5px 10px; margin: 5px 5px 20px 5px"&gt;
&lt;div style="float: right"&gt;&lt;img src="http://media.tumblr.com/eb11c00b6a5b78801a56950047c1da3d/tumblr_inline_mmh9se2b6n1qz4rgp.png" alt="image"/&gt;&lt;/div&gt;

&lt;h1 id="quickblox"&gt;&lt;a href="http://quickblox.com"&gt;QuickBlox&lt;/a&gt;&lt;/h1&gt;

&lt;p&gt;&lt;a href="http://quickblox.com"&gt;QuickBlox’s&lt;/a&gt; unique selling point is its discrete ‘modules’, such as video and text chat, leaderboards, and the like. More experienced developers may find this restricting.&lt;/p&gt;

&lt;h5&gt;Pricing&lt;/h5&gt;

&lt;p&gt;QuickBlox’s pricing is probably best described as ‘opaque’. Their free tier offers unlimited API calls, and a 10GB traffic/storage limit. If you exceed this limit you’re offered three options - switching to an enterprise account (which requires a sales call for a quote), paying the hosting costs your app is consuming plus a 10% management fee (which, again, requires a sales call to get a quote), or cross-promotion sponsorship (…yep, that needs a sales call too).&lt;/p&gt;

&lt;p&gt;It is a shame that QuickBlox are not willing to put any pricing information above their free tier on their site.&lt;/p&gt;

&lt;h5&gt;Who Uses It?&lt;/h5&gt;

&lt;p&gt;A variety of small apps, mainly being developed by marketing agencies, including the Official Dane Cook App(?) and a fan app for Liverpool FC.&lt;/p&gt;

&lt;h5&gt;Pros&lt;/h5&gt;

&lt;ul&gt;&lt;li&gt;Modular approach may be appealing to novice developers&lt;/li&gt;
&lt;/ul&gt;&lt;h5&gt;Cons&lt;/h5&gt;

&lt;ul&gt;&lt;li&gt;Must call their sales team to get any pricing information
&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;

&lt;div style="background-color: #eeeeee; border-color: #aaaaaa; border-style: solid; border-width: 1px; padding: 5px 10px 5px 10px; margin: 5px 5px 20px 5px"&gt;
&lt;div style="float: right"&gt;&lt;img src="http://media.tumblr.com/2337cedf0b0e4ca5906d3184a4fbd32b/tumblr_inline_mmh9rkbBfH1qz4rgp.png" alt="image"/&gt;&lt;/div&gt;

&lt;h1 id="helios"&gt;&lt;a href="http://helios.io/"&gt;Helios&lt;/a&gt;&lt;/h1&gt;

&lt;p&gt;&lt;a href="http://helios.io/"&gt;Helios&lt;/a&gt; is Heroku’s answer to the rise of ‘all in one’ BaaS providers. It’s an open-source backend framework that you can deploy directly to Heroku, or your own hardware if you prefer. It’s written by the highly respected &lt;a href="http://github.com/mattt"&gt;Mattt Thompson&lt;/a&gt;, and combines data synchronization, push notification, in-app purchase, analytics, and passbook management into a single attractive GUI. There’s no single client library - rather, a collection of existing libraries such as &lt;code&gt;AFIncrementalStore&lt;/code&gt; that integrate into the backend system.&lt;/p&gt;

&lt;h5&gt;Pricing&lt;/h5&gt;

&lt;p&gt;As an open-source framework, Helios is completely free. You’ll need to pay for hosting though - either on your own hardware, or through a provider such as Amazon Web Services or Heroku. Since Helios is backed by Heroku I’m going to use that as a benchmark for pricing - a basic setup with a production database and several dynos will be around $120 per month.&lt;/p&gt;

&lt;h5&gt;Who Uses It?&lt;/h5&gt;

&lt;p&gt;Many popular apps use Helios’s discrete client libraries - I’m not aware of any apps currently using Helios itself.&lt;/p&gt;

&lt;h5&gt;Pros&lt;/h5&gt;

&lt;ul&gt;&lt;li&gt;It’s free!&lt;/li&gt;
&lt;li&gt;Totally open source, with hosting flexibility&lt;/li&gt;
&lt;li&gt;Created by one of the best mobile developers out there&lt;/li&gt;
&lt;/ul&gt;&lt;h5&gt;Cons&lt;/h5&gt;

&lt;ul&gt;&lt;li&gt;OK, not &lt;em&gt;really&lt;/em&gt; BaaS as you’re going to have to manage it!&lt;/li&gt;
&lt;li&gt;Currently best suited to iOS apps only&lt;/li&gt;
&lt;li&gt;If you’re not comfortable with basic server admin this isn’t for you
&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;

&lt;h1 id="costcomparison"&gt;Cost Comparison&lt;/h1&gt;

&lt;p&gt;I’ve tried to break down both the free tier limits and the price you might expect to pay for ‘typical’ use with each provider.
I’ve defined ‘typical use’ as an app with 40,000 active users, 12 million API calls per month (or 300 per user), and 500,000 push notifications. &lt;/p&gt;

&lt;table style="text-align: center; border='1' cellspacing=50"&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;
        &lt;th&gt;&lt;strong&gt;Parse&lt;/strong&gt;&lt;/th&gt;
        &lt;th&gt;&lt;strong&gt;StackMob&lt;/strong&gt;&lt;/th&gt;
        &lt;th&gt;&lt;strong&gt;FatFractal&lt;/strong&gt;&lt;/th&gt;
        &lt;th&gt;&lt;strong&gt;Kinvey&lt;/strong&gt;&lt;/th&gt;
        &lt;th&gt;&lt;strong&gt;QuickBlox&lt;/strong&gt;&lt;/th&gt;
    &lt;/tr&gt;&lt;tr&gt;&lt;td style="text-align:left; min-width:100px"&gt;Free Tier Limit&lt;/td&gt;
        &lt;td style="min-width:100px"&gt;1m calls&lt;/td&gt;
        &lt;td style="min-width:100px"&gt;&amp;#8216;unlimited&amp;#8217; *&lt;/td&gt;
        &lt;td style="min-width:100px"&gt;1m calls (whilst in beta)&lt;/td&gt;
        &lt;td style="min-width:100px"&gt;100 app users&lt;/td&gt;
        &lt;td style="min-width:100px"&gt;10GB traffic&lt;/td&gt;
    &lt;/tr&gt;&lt;tr&gt;&lt;td style="text-align:left"&gt;&amp;#8216;Typical&amp;#8217; use&lt;/td&gt;
        &lt;td&gt;$199&lt;/td&gt;
        &lt;td&gt;$399+ *&lt;/td&gt;
        &lt;td&gt;$200&lt;/td&gt;
        &lt;td&gt;$293&lt;/td&gt;
        &lt;td&gt;Unknown&lt;/td&gt;
    &lt;/tr&gt;&lt;/table&gt;&lt;p&gt;
&lt;small&gt;* StackMob’s free tier has unlimited calls, but additional functionality that is free with other providers (such as HTML5 hosting or custom code) may cost extra. I have included StackMob’s Push module ($399) in estimating typical cost, but other modules such as custom code will add on to this figure.&lt;/small&gt;&lt;/p&gt;

&lt;h1 id="conclusion"&gt;Conclusion&lt;/h1&gt;

&lt;p&gt;&lt;a href="http://fatfractal.com"&gt;FatFractal&lt;/a&gt; seems to be quite developer focused and led, whereas &lt;a href="http://quickblox.com"&gt;QuickBlox&lt;/a&gt; seem to be going after marketing agencies and judging by their lack of clear pricing information aren’t particularly interested in the indie space. I think &lt;a href="http://kinvey.com"&gt;Kinvey&lt;/a&gt; have a pretty exciting product, and their focus on enterprise integrations mean those building internal B2B apps may want to consider them. &lt;/p&gt;

&lt;p&gt;I was initially very excited with &lt;a href="http://www.stackmob.com"&gt;StackMob’s&lt;/a&gt; new pricing structure, but the modular model they’re going for means it becomes very expensive to match Parse’s $199 plan functionality. Once you’ve added collaboration, push messaging, custom code, and hosting into StackMob’s package it becomes a very expensive proposition. &lt;/p&gt;

&lt;p&gt;Finally, of course, there’s &lt;a href="http://www.parse.com"&gt;Parse&lt;/a&gt;. If you harbour negative feelings torwards Facebook you might have already made up your mind - personally, I’ve been really impressed with the speed at which Parse have added to their product, and I enjoy working with their client libraries. Who knows exactly what Facebook will do with Parse long term, but post-acquisition they’re still adding new features such as HTML5 hosting.&lt;/p&gt;

&lt;p&gt;Don’t forget, the usability of the client libraries is just as important as the features and pricing. You’ll be working with your chosen provider’s APIs and SDK &lt;em&gt;a lot&lt;/em&gt; - you want the experience to be pleasurable. I recommend taking a look at sample code, and maybe trying out the various libraries yourself.&lt;/p&gt;</description><link>http://cleveryou.net/post/49935565463</link><guid>http://cleveryou.net/post/49935565463</guid><pubDate>Wed, 08 May 2013 15:53:00 +0100</pubDate><category>parse</category><category>stackmob</category><category>baas</category><category>backend</category><category>backend development</category><category>Mobile Development</category><category>ios</category><category>heroku</category></item><item><title>Hi Nick,  I am considering using Parse for a project and I read your post evaluating backends.  You seem to really love Parse and have really looked at the other platforms too. Basically my biggest concern is getting started with Parse and finding out half way through that I can't finish my app.  What is your experience with scale on Parse?  It seems like you can also do a lot with StackMob but what about Parse makes it your top choice?  I have to say I am not a dev...</title><description>&lt;p&gt;This is a good question - I use Parse for large-scale apps with 500,000+ user accounts, and I haven’t noticed or had any reports of poor performance. Parse do limit you to around 40 API calls per second on their Pro plan, although that’s more than enough for most use cases. If you architect your app smartly you can always reduce the number of calls you need to make.&lt;/p&gt;

&lt;p&gt;In terms of architecture, both Parse and StackMob are pretty solid. To be honest, Parse and StackMob are pretty comparable, and it’s more personal preference than anything else that means I use Parse. StackMob have changed their pricing structure quite a bit since I last compared them though - I am writing a very long comparison of a number of BaaS providers to get on the blog later this month.&lt;/p&gt;

&lt;p&gt;The issue you’re more likely to run in to, on both Parse and StackMob, is that you’ve designed your app to manipulate data in some way that isn’t very easy to do on a BaaS platform (versus having direct access to your own database). But if you go in up-front knowing that you’re only really able to get at your data via a REST API / client libraries (vs stored procedures, direct DB access, etc) you’ll probably be fine.&lt;/p&gt;

&lt;p&gt;Hope that helps you out!&lt;/p&gt;</description><link>http://cleveryou.net/post/49584698515</link><guid>http://cleveryou.net/post/49584698515</guid><pubDate>Sat, 04 May 2013 12:13:37 +0100</pubDate></item><item><title>Parse / Facebook: What Now?</title><description>&lt;p&gt;&lt;img src="http://media.tumblr.com/0567559a8dfb04798a22b5f498a233b2/tumblr_inline_mlx0gfCfXz1qz4rgp.png" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;You&amp;#8217;ve probably read that this week &lt;a href="http://techcrunch.com/2013/04/25/facebook-parse/"&gt;Facebook acquired Parse&lt;/a&gt;, the mobile BaaS service. I&amp;#8217;ve been using Parse for quite a well in production, and if you&amp;#8217;ve read any of my previous posts you&amp;#8217;ll know I quite like the service (see &lt;a href="http://cleveryou.net/post/33510547981/important-note-since-i-wrote-this-stackmob-have"&gt;here&lt;/a&gt;, &lt;a href="http://cleveryou.net/post/22718728512/parse-stackmob-some-thoughts"&gt;here&lt;/a&gt;, and &lt;a href="http://cleveryou.net/post/17831460939/i-parse"&gt;here&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;So what now? Does Facebook acquiring Parse change anything? Well, if you go by the press releases, no - it doesn&amp;#8217;t. But perhaps there&amp;#8217;s more too it than that. What should you be doing if you&amp;#8217;re either an existing customer (like me), or someone who&amp;#8217;s been thinking of using the service? Here&amp;#8217;s my own thoughts on the subject.&lt;/p&gt;

&lt;h3&gt;You Already Use Parse&lt;/h3&gt;

&lt;p&gt;A lot of what you do next is going to depend on your own gut feeling. Some people have quite a visceral reaction to Facebook - I&amp;#8217;m not one of them. What I &lt;em&gt;will&lt;/em&gt; say is that the last time Facebook bought something I used (&lt;a href="http://face.com/"&gt;face.com&lt;/a&gt;) they ended up shutting down the APIs. But Parse is considerably bigger, and more importantly is used by some sizable customers. I personally don&amp;#8217;t see Facebook cutting them off - and I suspect new customers will be welcomed for some time as well.&lt;/p&gt;

&lt;p&gt;The bottom line is this: whenever you use &lt;em&gt;any&lt;/em&gt; third-party provider to manage critical infrastructure in your apps you&amp;#8217;d better have an escape plan. Companies get acquired, go bust, or retire products all the time. This isn&amp;#8217;t an issue unique to Parse. If you&amp;#8217;re not planning for the worst you&amp;#8217;re sowing the seeds for a big headache in the future.&lt;/p&gt;

&lt;p&gt;Parse already offer a mass-export feature that gives you all your data in JSON. You can use this, along with the Parse APIs, to migrate over to another provider fairly easily (although some scripting on your part may be required). One provider (Stackmob, who I&amp;#8217;ve reviewed here before) even have a semi-automatic &lt;a href="https://developer.stackmob.com/parse/migration"&gt;migration tool available&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;You&amp;#8217;re Deciding on a BaaS Provider&lt;/h3&gt;

&lt;p&gt;Again, this is going depend on how you feel about Facebook. If you&amp;#8217;re not a fan, you&amp;#8217;ve probably already made your choice. Here&amp;#8217;s my two cents: even if Parse keep supporting existing customers, it&amp;#8217;s almost certain that at some point in the future the product is going to change in a fairly significant way. I don&amp;#8217;t see Facebook gaining any value from running Parse as an entirely separate entity.&lt;/p&gt;

&lt;p&gt;I really like Parse as a product - I&amp;#8217;ve used it in several production apps. Would I use it now? I&amp;#8217;m not sure. I don&amp;#8217;t necessarily think any of the competitors out there (&lt;a href="http://www.stackmob.com"&gt;Stackmob&lt;/a&gt;, &lt;a href="http://www.appcelerator.com/cloud/"&gt;Appcelerator&lt;/a&gt;, &lt;a href="http://www.kinvey.com"&gt;Kinvey&lt;/a&gt;, &lt;a href="http://www.fatfractal.com"&gt;Fat Fractal&lt;/a&gt;, to name a few) are any more secure. If anything, financially speaking Parse is now top of the pile.&lt;/p&gt;

&lt;h3&gt;So&amp;#8230;what?&lt;/h3&gt;

&lt;p&gt;I appreciate I haven&amp;#8217;t really provided many direct answers. One thing this should really re-inforce, regardless of your &lt;em&gt;BaaS&lt;/em&gt; provider, is that you need a back-up plan. To help with that I&amp;#8217;ll be posting a new backend-as-a-service comparison in the coming weeks, updated to take into account all the recent changes in the marketplace.&lt;/p&gt;</description><link>http://cleveryou.net/post/49003678297</link><guid>http://cleveryou.net/post/49003678297</guid><pubDate>Sat, 27 Apr 2013 14:18:00 +0100</pubDate><category>parse</category><category>baas</category><category>StackMob</category><category>facebook</category><category>ios</category><category>backend</category><category>backend development</category></item><item><title>Mantle: Easy JSON Models in Objective-C</title><description>&lt;p&gt;OK, so it&amp;#8217;s not a very exciting topic - but still, it can often be a pain to convert JSON into Objective-C objects. There&amp;#8217;s a lot of boilerplate code, and you invariably end up with something like this:&lt;/p&gt;

&lt;script src="https://gist.github.com/objclxt/5460647.js" type="text/javascript"&gt;&lt;/script&gt;&lt;p&gt;&amp;#8230;and that&amp;#8217;s just to decode from JSON. If you need to subsequently archive your object back to JSON you&amp;#8217;ll end up with &lt;em&gt;even more&lt;/em&gt; brittle and lengthy code, thanks to &lt;code&gt;encodeWithCoder&lt;/code&gt; and its counterparts. Finally, you&amp;#8217;d better hope your JSON never changes, because in the example above if there&amp;#8217;s no &lt;code&gt;url&lt;/code&gt; field in the dictionary an exception is going to get thrown.&lt;/p&gt;

&lt;p&gt;I had to deal with this problem recently - I was working with a quite complex JSON API, and I needed something to help me manage my models. Fortunately, Github have open-sourced a framework used in their own Mac application called &lt;em&gt;&lt;a href="https://github.com/github/Mantle"&gt;Mantle&lt;/a&gt;&lt;/em&gt;. Mantle aims to simplify the process of working with JSON in Objective-C, particularly in places where something like Core Data might be overkill. It works without &lt;code&gt;NSCoder&lt;/code&gt;, and uses &lt;code&gt;@property&lt;/code&gt; declarations to provide default implementations.&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s an implementation of the &lt;code&gt;Article&lt;/code&gt; example above, but rewritten to use Mantle:&lt;/p&gt;

&lt;script src="https://gist.github.com/objclxt/5459985.js" type="text/javascript"&gt;&lt;/script&gt;&lt;p&gt;A really simple &lt;code&gt;JSONKeyPathsByPropertyKey&lt;/code&gt; method maps JSON to properties, and reversible transformers allow things like dates, URLs, or other custom formats to be both encoded and decoded easily. The value transformers also handle missing or nil fields, meaning you don&amp;#8217;t have to worry about exceptions.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m really enjoying using Mantle, and it&amp;#8217;s made my code cleaner to read and easier to maintain. The source for Mantle, along with pretty comprehensive documentation, is &lt;a href="https://github.com/github/Mantle"&gt;available on GitHub&lt;/a&gt;, and you can use it in your own projects via the &lt;a href="http://cocoapods.org/?q=mantle"&gt;ever reliable CocoaPods&lt;/a&gt;.&lt;/p&gt;</description><link>http://cleveryou.net/post/48857236903</link><guid>http://cleveryou.net/post/48857236903</guid><pubDate>Thu, 25 Apr 2013 16:38:00 +0100</pubDate><category>github</category><category>mantle</category><category>iOS SDK</category><category>ios</category><category>ios 6</category><category>json</category></item><item><title>iOS Debugging: Three Timesaving Tools</title><description>&lt;blockquote&gt;
  &lt;p&gt;Debugging is twice as hard as writing the code in the first place&lt;br/&gt;&lt;small&gt;&lt;strong&gt;Brian Kernighan&lt;/strong&gt; &lt;em&gt;- The Elements of Programming Style&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Debugging your own code may be a chore, but debugging somebody else&amp;#8217;s can be downright painful. A particularly bad experience last week reminded me that debugging is as much a skill as writing code itself - and just like programming, there are lots of tools that can make it both easier and even enjoyable.&lt;/p&gt;

&lt;p&gt;Here are three really useful tools that I use when debugging iOS applications.&lt;/p&gt;

&lt;h3&gt;Technical Note 2239&lt;/h3&gt;

&lt;p&gt;Hidden away on Apple&amp;#8217;s developer site is &lt;a href="http://developer.apple.com/library/ios/#technotes/tn2239/"&gt;Technical Note 2239&lt;/a&gt;, or &lt;em&gt;iOS Debugging Magic&lt;/em&gt;. It&amp;#8217;s packed full of tips and tricks to help the frustrated iOS debugger get to grips with XCode. Unfortunately, it&amp;#8217;s also slightly out of date, written for iOS 4.1, XCode 3, and GDB (rather than the newer LLDB debugger now standard for iOS development).&lt;/p&gt;

&lt;p&gt;Still, it&amp;#8217;s still broadly applicable, and it&amp;#8217;s the &lt;em&gt;only place&lt;/em&gt; on Apple&amp;#8217;s site where &lt;code&gt;recursiveDescription&lt;/code&gt;, a category extension on &lt;code&gt;UIView&lt;/code&gt; that lets you print out a view&amp;#8217;s complete hierarchy, is documented. This alone justifies its existence:&lt;/p&gt;

&lt;script src="https://gist.github.com/objclxt/5361836.js" type="text/javascript"&gt;&lt;/script&gt;&lt;h3&gt;DCIntrospect&lt;/h3&gt;

&lt;p&gt;Command line debugging is extremely powerful, but as many web developers will tell you being able to visually debug can be just as useful. Although Apple provide some tools to do this (such as the &lt;a href="http://developer.apple.com/library/ios/#documentation/developertools/Conceptual/InstrumentsUserGuide/MeasuringGraphicsPerformanceinYouriOSDevice/MeasuringGraphicsPerformanceinYouriOSDevice.html"&gt;Core Animation Instrument&lt;/a&gt;), a number of third party options are available to help with layout problems.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/domesticcatsoftware/DCIntrospect"&gt;DCIntrospect&lt;/a&gt; is one such popular library - designed to be used with the iOS simulator, it enables a number of keyboard shortcuts to allow dynamic manipulation of views.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/75738967f770f64319af229a8322d199/tumblr_inline_mlcf68NPYY1qz4rgp.png" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;Installation is particularly straightforward, so DCIntrospect is a good option if you need to quickly debug more complex view hierarchy or display problems.&lt;/p&gt;

&lt;h3&gt;PonyDebugger&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/square/PonyDebugger"&gt;PonyDebugger&lt;/a&gt; is one of the more complex iOS debugging tools - it requires both a client on device and a server on your development machine - but it&amp;#8217;s arguably worth it in the long run. Once installed, you can remotely debug network traffic, Core Data, and view hierarchies using Chrome&amp;#8217;s Developer Tools. It&amp;#8217;s maintained by the good people at &lt;a href="https://squareup.com/"&gt;Square&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The networking traffic tools in PonyDebugger supplement, rather than replace, a traditional proxy. Because networking traffic is forwarded rather than sniffed traffic sent over HTTPS/SSL is viewable without needing any special certificates. The Core Data browser is also a nice touch, and is directly integrated into the traditional Chrome dev tools &amp;#8216;resources&amp;#8217; tab. One particularly nice feature of PonyDebugger is its ability to convert an app&amp;#8217;s view hierarchy into a HTML-like format that can be immediately edited, just as you would a normal web site within Chrome&amp;#8217;s developer tools.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/3bec6d4ede6963b26f4ce1bac0f55fd0/tumblr_inline_mlcf4g4lbY1qz4rgp.png" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;All of these features do come at a cost, namely a somewhat complex installation - I&amp;#8217;d recommend using &lt;a href="http://cocoapods.org/?q=pony"&gt;CocoaPods&lt;/a&gt; to handle the client library. You should take care for both DCIntrospect and PonyDebugger to only enable them in your debug builds, as you definitely don&amp;#8217;t want either library to end up in your production code.&lt;/p&gt;</description><link>http://cleveryou.net/post/48112815247</link><guid>http://cleveryou.net/post/48112815247</guid><pubDate>Tue, 16 Apr 2013 11:31:00 +0100</pubDate><category>iOS SDK</category><category>debugging</category><category>cocoa</category><category>ios</category><category>iphone development</category><category>xcode</category><category>cocoapods</category></item><item><title>Helios: A New iOS Open Source Backend</title><description>&lt;p&gt;If you&amp;#8217;ve read my previous posts you&amp;#8217;ll know I&amp;#8217;m a big fan of Parse and other Backend-as-a-Service providers. However, they&amp;#8217;re not for everybody - especially if you need control of your own servers, or aren&amp;#8217;t comfortable with out-sourcing your application&amp;#8217;s data to a third-party.&lt;/p&gt;

&lt;p&gt;With that in mind, I&amp;#8217;m really excited about &lt;a href="http://helios.io"&gt;Helios&lt;/a&gt;, from Heroku and Mattt Thompson. Helios provides data synchronisation, push notifications, passbook, in app purchase, and analytics support &amp;#8216;out of the box&amp;#8217;. It&amp;#8217;s open source, and - importantly - instantly deployable to Heroku (naturally). This means developers who are not willing or able to manage a full backend server stack can quickly get a full mobile backend platform running on a managed provider or hardware of their own.&lt;/p&gt;

&lt;p&gt;Full source code and documentation &lt;a href="https://github.com/helios-framework/helios"&gt;is available on GitHub&lt;/a&gt;, and it integrates well with many standard libraries such as &lt;code&gt;AFIncrementalStore&lt;/code&gt;. It&amp;#8217;s good to see Heroku moving into the mobile backend space, and I&amp;#8217;m sure there will be a number of Helios backed app in the iTunes Store soon.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/b0353ac848e04b3c4b794da9b2150828/tumblr_inline_mko9qfWf2m1qz4rgp.jpg" alt=""/&gt;&lt;br/&gt;&lt;small&gt;Helios, the God of the Sun. Not the mobile backend.&lt;/small&gt;&lt;/p&gt;</description><link>http://cleveryou.net/post/47011904234</link><guid>http://cleveryou.net/post/47011904234</guid><pubDate>Wed, 03 Apr 2013 10:18:29 +0100</pubDate></item><item><title>State Preservation &amp; Restoration</title><description>&lt;p&gt;One of the new features in iOS 6 that hasn&amp;#8217;t exactly been shouted out from the rooftops is &lt;em&gt;state preservation&lt;/em&gt;, probably because on paper it&amp;#8217;s far from exciting. However, having implemented it into an app I&amp;#8217;ve realised there are some great benefits - not least of which is making your users happier.&lt;/p&gt;

&lt;h4&gt;What it does&lt;/h4&gt;

&lt;p&gt;State preservation is designed to solve the problem of app termination. The majority of iOS users don&amp;#8217;t know the difference between application &lt;em&gt;backgrounding&lt;/em&gt; and application &lt;em&gt;termination&lt;/em&gt;. Anecdotally, many people who test the apps I work on are unaware that removing apps from the &amp;#8216;recent apps&amp;#8217; list terminates them completely.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/dea6f25dd3711390cb25f43cab6a95f9/tumblr_inline_mjuqh04Y1p1qz4rgp.png" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;This can result in quite a confusing and frustrating experience: sometimes coming into an app will take you back to where you were last, and at others you&amp;#8217;ll be back to square one.  Some developers had attempted to solve this by keeping track of the current app state and attempting to restore it upon relaunch. Inevitably this led to a number of different approaches, some good and some bad.&lt;/p&gt;

&lt;p&gt;The good news is that iOS 6 now offers state preservation &lt;em&gt;out of the box&lt;/em&gt;, and enabling it is a simple two step process:&lt;/p&gt;

&lt;h4&gt;How to enable it&lt;/h4&gt;

&lt;h5&gt;Step 1: Label your Controllers&lt;/h5&gt;

&lt;p&gt;To keep track of a user&amp;#8217;s journey through an app you need to provide &lt;em&gt;restoration identifiers&lt;/em&gt; for your view controllers. You can identify as many or as few controllers as you wish, but only controllers with restoration identifiers present will automatically instantiated and navigated to by iOS upon launch.&lt;/p&gt;

&lt;p&gt;If you&amp;#8217;re working with XIBs you can add identifiers within Interface Builder - and with Storyboards it&amp;#8217;s even easier (since Storyboards already track a user&amp;#8217;s progress through an app). In code you can simply set the &lt;code&gt;restorationIdentifier&lt;/code&gt; property.&lt;/p&gt;

&lt;h5&gt;Step 2: Opt In to Restoration and Preservation&lt;/h5&gt;

&lt;p&gt;Currently, state preservation is &amp;#8216;opt in&amp;#8217;. To opt in you need to implement three methods in your application delegate, described below:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;- (BOOL)application:shouldRestoreApplicationState:&lt;/code&gt;&lt;br/&gt;
Sometimes you might not want iOS to automatically restore the user&amp;#8217;s state: perhaps your app has had a major UI update, and the area of the app your user was last in no longer exists. You should return &lt;code&gt;YES&lt;/code&gt; to enable restoration.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;- (BOOL)application:shouldSaveApplicationState:&lt;/code&gt;&lt;br/&gt;
As above, except this method is called when you application is terminated. Again, return &lt;code&gt;YES&lt;/code&gt; to allow iOS to save the most recent state information.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;- (BOOL)application:willFinishLaunchingWithOptions:&lt;/code&gt;&lt;br/&gt;
To support state restoration a new launching method has been introduced that complements the more traditional &lt;code&gt;didFinishLaunching&lt;/code&gt;. &lt;code&gt;willFinish&lt;/code&gt; is called &lt;em&gt;before&lt;/em&gt; the state is restored, and &lt;code&gt;didFinish&lt;/code&gt; is called &lt;em&gt;afterwards&lt;/em&gt;. You&amp;#8217;ll probably therefore want to split your launching code across these two methods: code that is required for your app to run should go in &lt;code&gt;willFinish&lt;/code&gt;. Final completion code should go in &lt;code&gt;didFinishLaunching&lt;/code&gt;. What counts as &amp;#8216;final completion code&amp;#8217;? Things like checking whether a user is logged in, where you might want to display a modal login page rather than your app itself, for example.&lt;/p&gt;

&lt;h4&gt;Backwards Compatibility&lt;/h4&gt;

&lt;p&gt;If you&amp;#8217;d like to support iOS 4 and 5 users (where state preservation is not supported) you&amp;#8217;ll need to watch out for a few things. Firstly, be sure to test that restoration identifiers are supported using &lt;code&gt;respondsToSelector&lt;/code&gt; (if you&amp;#8217;re using IB you can skip this step):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;if ([self respondsToSelector:@selector(restorationIdentifier)]) {
        self.restorationIdentifier = @"Home Controller";
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;However, a more serious issue is how to deal with the new &lt;code&gt;willFinishLaunchingWithOptions&lt;/code&gt; method, which is only available on iOS 6, into which you&amp;#8217;ve moved most of your launching logic. You &lt;em&gt;could&lt;/em&gt; put your launch code into both &lt;code&gt;willFinish&lt;/code&gt; and &lt;code&gt;didFinishLaunching&lt;/code&gt; and conditionally test the current version of iOS, but this is unnecessary duplication.&lt;/p&gt;

&lt;p&gt;Instead, you can use this great little trick which Apple recommend in their WWDC videos:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [self commonLaunchInitialization:launchOptions];

    // Code that must execute in didFinishLaunching whether state restoration is enabled or not
    return YES;
}

- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [self commonLaunchInitialization:launchOptions];
    return YES;
}

- (void)commonLaunchInitialization:(NSDictionary *)launchOptions {
    static dispatch_once_t pred;
    dispatch_once(&amp;amp;amp;pred, ^{
    // Your launch code here
});
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If you are not familiar with Grand Central Dispatch you&amp;#8217;re probably wondering what this code does. The &lt;code&gt;dispatch_once&lt;/code&gt; GCD call is a clever method that is typically used when doing singleton work: it will execute it&amp;#8217;s code block &lt;em&gt;once only&lt;/em&gt;, and no nothing for any subsequent calls. This allows us to guarantee our launch logic will only be executed once, even though we&amp;#8217;re calling &lt;code&gt;commonLaunchInitialization&lt;/code&gt; in both &lt;code&gt;didLaunch&lt;/code&gt; and &lt;code&gt;willLaunch&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;A Note on Testing&lt;/h4&gt;

&lt;p&gt;For reasons that will become quickly apparent, there are a few &amp;#8216;gotchas&amp;#8217; involved with testing state restoration. Confusingly, terminating an app from the app switching pane &lt;strong&gt;disables&lt;/strong&gt; restoration. Why? To prevent a mis-behaving or broken app from keeping a user stuck inside a loop. Perhaps the app has some terrible networking code that keeps the user locked inside a loading screen - resuming to that state would not be beneficial. Similarly, as you might expect state will not be resumed if your app didn&amp;#8217;t terminate cleanly (i.e, it crashed).&lt;/p&gt;

&lt;p&gt;So how do you test app switching? Well, when attached to the debugger you will want to &lt;em&gt;exit to the home screen&lt;/em&gt; (by pressing the home button) and then terminate the app from Xcode (by hitting the &amp;#8216;Stop&amp;#8217; button).&lt;/p&gt;</description><link>http://cleveryou.net/post/45665221561</link><guid>http://cleveryou.net/post/45665221561</guid><pubDate>Mon, 18 Mar 2013 10:32:00 +0000</pubDate><category>ios</category><category>ios6</category><category>Mobile Development</category><category>state preservation</category><category>ios sdk</category><category>iphone development</category></item><item><title>As seen around the office…ironically, the CD is the...</title><description>&lt;img src="http://25.media.tumblr.com/def135b705adde6f2175302c2f06dd0a/tumblr_mji8xtJYpc1r5evako1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;As seen around the office…ironically, the CD is the BlackBerry 10 Dev Kit…&lt;/p&gt;</description><link>http://cleveryou.net/post/45115801044</link><guid>http://cleveryou.net/post/45115801044</guid><pubDate>Mon, 11 Mar 2013 16:39:29 +0000</pubDate><category>android</category></item><item><title>Samsung Wallet: Meh</title><description>&lt;p&gt;Over at Mobile World Congress this week, Samsung was busy announcing it&amp;#8217;s new &lt;a href="http://developer.samsung.com/samsung-wallet-api"&gt;Samsung Wallet&lt;/a&gt;. Unfortunately, it&amp;#8217;s pretty clear that Samsung rushed this out the door: there&amp;#8217;s vast amounts of functionality missing, the developer documentation is poor, and unlike Microsoft or Google&amp;#8217;s efforts it just feels a little half hearted.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/0eb1ecf9e83f43bf63237ac4248c0e42/tumblr_inline_miz9g9GIBh1qz4rgp.jpg" alt=""/&gt;&lt;/p&gt;

&lt;h3&gt;App Only&lt;/h3&gt;

&lt;p&gt;Apple Passbook lets you distribute your passes in three ways: through a native app, through a web site, or via e-mail. The advantage of this approach is that brands without a presence on the app store can still offer consumers passbook enabled tickets, cards, and vouchers.&lt;/p&gt;

&lt;p&gt;However, Samsung Wallet &lt;em&gt;only&lt;/em&gt; supports distributing passes through a native app. To get technical, this is because to get a pass into Samsung Wallet you need to use &lt;em&gt;intents&lt;/em&gt;, which allow apps to call actions within other apps.&lt;/p&gt;

&lt;h3&gt;No NFC&lt;/h3&gt;

&lt;p&gt;For better or for worse, Apple have chosen not to put NFC into their phones. Samsung, however, haven&amp;#8217;t only put NFC into many of their Android devices, they&amp;#8217;ve made it a unique selling point, spending millions of dollars on TV commercials waxing lyrical about &lt;a href="http://www.samsung.com/global/galaxys3/sbeam.html"&gt;S Beam sharing&lt;/a&gt;. So to not have Samsung Wallet support NFC is more than a glaring omission - it&amp;#8217;s embarrassing.&lt;/p&gt;

&lt;p&gt;Samsung&amp;#8217;s stated reason for not supporting NFC doesn&amp;#8217;t really ring true either - apparently, retailers don&amp;#8217;t have NFC hardware. Except for all those contactless card readers in CVS, Walgreens, Boots, and the like.&lt;/p&gt;

&lt;h3&gt;1D Barcodes&lt;/h3&gt;

&lt;p&gt;1D barcodes are &amp;#8216;old school&amp;#8217; barcodes, like this:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/0df9fada00f5c1c07c11a58e4624295a/tumblr_inline_mixie1bGoW1qz4rgp.jpg" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;Apple Passbook doesn&amp;#8217;t support them - Samsung Wallet does. Now, you might think that this was a point in favour of Samsung Wallet, but it&amp;#8217;s not. I think it&amp;#8217;s a big mistake. When Passbook was in developer beta, it too supported 1D barcodes. Apple removed support before releasing it to the public.&lt;/p&gt;

&lt;p&gt;The reason for not supporting 1D barcodes involves how barcodes themselves are scanned. When barcodes were first released, scanners used lasers to detect the codes. The laser light bounces off the white bars of the code, and is absorbed by the black bars. By detecting the laser light bounced back you can read the barcode. This is fine when your barcodes are printed on card or paper - but when your barcode is being displayed on a piece of &lt;em&gt;reflective glass&lt;/em&gt; you&amp;#8217;ve got a big problem.&lt;/p&gt;

&lt;p&gt;Although some retailers have upgraded their point-of-sale systems to more modern, optical scanners (that can also scan QR and other 2D barcodes), many are still using lasers. Trying to scan a 1D barcode on a phone with a laser will result in failure a lot of the time. Users will either blame the shop themselves (bad), or the handset manufacturer (even worse, from Apple or Samsung&amp;#8217;s point of view).&lt;/p&gt;

&lt;p&gt;Basically, expect a &lt;em&gt;lot&lt;/em&gt; of angry tweets along the lines of &amp;#8220;the Samsung Wallet app is terrible, nobody can scan barcodes off it&amp;#8221; for retailers who choose the &amp;#8216;easy&amp;#8217; path of 1D barcodes.&lt;/p&gt;

&lt;h3&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;I don&amp;#8217;t want this post to come off sounding as if I dislike Samsung - on the contrary, until upgrading to the Nexus 4 my primary Android device for a Galaxy S2, which I got along with very well. But I find many of Samsung&amp;#8217;s &amp;#8216;own brand&amp;#8217; applications to be generally sloppy, with little thought put into long-term sustainability.&lt;/p&gt;

&lt;p&gt;As it stands, the developer documentation for Samsung Wallet is poor, and the way vouchers are requested/generated is confusing and ill thought out. I wonder whether Samsung will truly see mass-adoption in the same way brands have flocked to Passbook. It&amp;#8217;s a shame, because I suspect given another month or so Samsung could have had a product that was far more professional and better received by the community at large.&lt;/p&gt;</description><link>http://cleveryou.net/post/44287108166</link><guid>http://cleveryou.net/post/44287108166</guid><pubDate>Fri, 01 Mar 2013 10:36:00 +0000</pubDate></item><item><title>New Computing Curriculum for England</title><description>&lt;p&gt;The way computing is taught throughout schools in England is going to drastically change from next year - and, importantly, the proposed new curriculum is under public consultation. The consultation runs until April 16th, and anyone with an interest in computing education in the UK should consider reading through the proposals and contributing his or her thoughts.&lt;/p&gt;

&lt;p&gt;The good news is the new Computing Curriculum &lt;a href="https://media.education.gov.uk/assets/files/pdf/c/computing%2004-02-13_001.pdf"&gt;is a quick, four page read&lt;/a&gt;. The bad news is that &lt;em&gt;responding&lt;/em&gt; to it is something of a bureaucratic nightmare - but more on that later.&lt;/p&gt;

&lt;p&gt;One of the biggest changes (outside of the overdue renaming of the subject from &amp;#8216;ICT&amp;#8217; to &amp;#8216;Computing&amp;#8217;) is making programming of some sort &lt;em&gt;mandatory&lt;/em&gt; for all students. The UK has, for the time being, &lt;a href="http://www.forbes.com/sites/anthonykosner/2013/02/14/can-obama-convince-high-schools-to-teach-kids-to-code/"&gt;got the jump&lt;/a&gt; on the USA. Let&amp;#8217;s take a look at exactly what sort of coding is being suggested for the relevant age groups:&lt;/p&gt;

&lt;h5&gt;Key Stage 1 (5-7 years old)&lt;/h5&gt;

&lt;p&gt;By age seven, children should be able to &amp;#8220;understand what algorithms are&amp;#8221;, &amp;#8220;write and test simple programs&amp;#8221;, and &amp;#8220;use logical reasoning to predict the behaviour of simple programs&amp;#8221;.&lt;/p&gt;

&lt;p&gt;The curriculum doesn&amp;#8217;t prescribe &lt;em&gt;how&lt;/em&gt; exactly this should be taught, and with what platform or software. The general expectation is that environments such as &lt;a href="http://scratch.mit.edu"&gt;Scratch&lt;/a&gt; will be used.&lt;/p&gt;

&lt;h5&gt;Key Stage 2 (7-11)&lt;/h5&gt;

&lt;p&gt;By the end of their primary education, children should be taught how to &amp;#8220;use sequence, selection, and repetition&amp;#8221; in their programming projects, and be familiar with variables. They are also expected to demonstrate a basic understanding of algorithms, and how to test and diagnose errors in their programs.&lt;/p&gt;

&lt;p&gt;Again, there&amp;#8217;s no prescribed toolset, and Scratch would be more than able to fulfil all the curriculum requirements.&lt;/p&gt;

&lt;h5&gt;Key Stage 3 (11-14)&lt;/h5&gt;

&lt;p&gt;In secondary school students should continue to program, in &amp;#8220;two or more programming languages, &lt;em&gt;one of which is textual&lt;/em&gt;&amp;#8221; (emphasis mine). They should also be fully versed in boolean logic, data structures such as arrays, and &amp;#8220;use procedures to write modular programs&amp;#8221;. More interestingly, students will be explicitly required to &amp;#8220;understand at least two key algorithms for each of sorting and searching&amp;#8221;.&lt;/p&gt;

&lt;h3&gt;How To Respond&lt;/h3&gt;

&lt;p&gt;Having &lt;a href="https://media.education.gov.uk/assets/files/pdf/c/computing%2004-02-13_001.pdf"&gt;read the curriculum in full&lt;/a&gt; you&amp;#8217;ll probably have some comments to make. Unfortunately, the Department for Education have had to take their e-consultations tool offline, &amp;#8220;due to technical problems&amp;#8221;. It has been replaced with a thirteen page Word document which you must then upload via a rather confusing web form. It could be worse. It could also be a &lt;em&gt;lot&lt;/em&gt; better.&lt;/p&gt;

&lt;p&gt;So with that in mind, here&amp;#8217;s how to respond in three &amp;#8216;easy&amp;#8217; steps:&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;&lt;p&gt;Download &lt;a href="https://media.education.gov.uk/assets/files/docx/n/responseform.docx"&gt;this Word document&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;To respond specifically to the new Computing curriculum fill out &lt;em&gt;Sections 3, 4, and 7&lt;/em&gt;. Section 14 can be used for any additional comments, and you may also want to fill in Section 15, which provides feedback on the rather convoluted consultation process itself.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Once you&amp;#8217;ve finished filling in the Word doc you can [upload it here] (make sure you indicate you&amp;#8217;re responding to &amp;#8220;&lt;em&gt;Reform of the National Curriculum in England&lt;/em&gt;&amp;#8221;), or e-mail it to &lt;a href="mailto:NationalCurriculum.CONSULTATION@education.gsi.gov.uk"&gt;NationalCurriculum.CONSULTATION@education.gsi.gov.uk&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;It&amp;#8217;s that simple! I highly encourage you to take half an hour out of your day to respond - you have until April 13th, and the more people who comment the better.&lt;/p&gt;</description><link>http://cleveryou.net/post/43844461203</link><guid>http://cleveryou.net/post/43844461203</guid><pubDate>Sat, 23 Feb 2013 23:55:17 +0000</pubDate><category>computing</category><category>Education</category><category>national curriculum</category><category>schools</category><category>coding</category></item><item><title>Link Time: Objective-C Blocks Quiz</title><description>&lt;a href="http://blog.parse.com/2013/02/05/objective-c-blocks-quiz/"&gt;Link Time: Objective-C Blocks Quiz&lt;/a&gt;: &lt;p&gt;Parse have just posted a nice ‘know your Objective-C blocks’ quiz. I am sure this has &lt;em&gt;nothing&lt;/em&gt; to do with the recent stability improvements in the Parse SDK (90% of my crash reports used to come in from Parse, but one of their recent SDK updates took that figure down to 0%)!&lt;/p&gt;

&lt;p&gt;Don’t forget that even if you are using ARC there are some potential memory leak / circular reference problems with blocks that you can stumble in to as well!&lt;/p&gt;</description><link>http://cleveryou.net/post/42386379884</link><guid>http://cleveryou.net/post/42386379884</guid><pubDate>Tue, 05 Feb 2013 23:40:00 +0000</pubDate></item><item><title>Oops: Snapchat Flaw Leaks Personal Data</title><description>&lt;p&gt;Snapchat has been &lt;a href="http://mashable.com/2013/01/11/parents-snapchat/"&gt;getting&lt;/a&gt; a &lt;a href="http://www.businessinsider.com/sexting-app-snapchat-is-the-consumer-startup-most-likely-to-sell-for-huge-pile-of-money-in-2013-2013-1"&gt;lot of press&lt;/a&gt; recently, so I decided to take a look at the app. In doing so, I came across a security vulnerability that allowed anyone to obtain a Snapchat user&amp;#8217;s cellphone number and e-mail address without their consent. This is a serious security issue, as many Snapchat usernames are publicly available.&lt;/p&gt;

&lt;h1&gt;The Problem&lt;/h1&gt;

&lt;p&gt;Snapchat lets you find out if any friends who might have you in their contacts are using the service. To do this it needs your phone-number: on Android, this is obtained automatically. On iOS, however, you need to verify your number by sending a SMS to Snapchat with a unique code (partly to prevent abuse, but mainly because unlike Android, iOS does not allow system access to the device&amp;#8217;s phone number). The Snapchat app makes a web service call to discover whether this SMS verification has succeeded or not. The call looks like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;POST &lt;a href="https://feelinsonice.appspot.com/ph/settings"&gt;https://feelinsonice.appspot.com/ph/settings&lt;/a&gt;
username=john.smith
timestamp=1357768038866
req_token=13f413fwrf4[…]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The &lt;code&gt;req_token&lt;/code&gt; is a little strange (it&amp;#8217;s an obfuscation of two separate hashes), but fundamentally it contains the user&amp;#8217;s authorisation details. If you&amp;#8217;re interested you can find out more about how the req_token &lt;a href="https://github.com/tlack/snaphax"&gt;is generated here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In response to that call you receive the following back:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{
    "message": "+16175551212",
    "param": "[base64 encoded username]",
    "action": "[base64 e-mail (optional)]",
    "logged": true
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This information is used to display a user&amp;#8217;s account information inside the app. Notice that the phone number for the requested user is returned. Normally the supplied &lt;code&gt;req_token&lt;/code&gt; would be checked and compared with the supplied username to ensure a user&amp;#8217;s private information wasn&amp;#8217;t being handed out freely.&lt;/p&gt;

&lt;p&gt;Unfortunately a bug in Snapchat&amp;#8217;s backend system meant this call wasn&amp;#8217;t being authenticated - by changing the username parameter of the POST request it was possible to retrieve &lt;em&gt;any user&amp;#8217;s phone number&lt;/em&gt;. The &lt;code&gt;req_token&lt;/code&gt; simply isn&amp;#8217;t checked or even looked at: given a username the system blindly returns a phone number.&lt;/p&gt;

&lt;p&gt;As a good number of Snapchat users are using the service anonymously this is a very serious vulnerability. Many people have even posted their Snapchat usernames in reviews, tweets, or tumblrs. Depending on what you are doing in Snapchat you may not want other users to identify you. However, by taking advantage of this vulnerability anyone could easily find out a Snapchat user&amp;#8217;s phone number and e-mail.&lt;/p&gt;

&lt;h1&gt;Disclosure&lt;/h1&gt;

&lt;p&gt;I disclosed this vulnerability to Snapchat shortly after discovering it, on Tuesday January 9th 2013. Snapchat were very responsive, and the issue was patched in less than twenty-four hours. I have confirmed that it is now fixed, and you can no longer abuse the call to obtain users&amp;#8217; personal information.&lt;/p&gt;

&lt;h1&gt;Conclusion&lt;/h1&gt;

&lt;p&gt;Security issues are to be expected with any large app or web service with millions of users. However, this error was very basic and shouldn&amp;#8217;t have happened. That said, Snapchat were very receptive to disclosure, and it was patched almost immediately. Snapchat has grown exceptionally quickly, which I suspect has exacerbated some of their recent security problems.&lt;/p&gt;

&lt;p&gt;Snapchat&amp;#8217;s API is on occasion quite strange, and as security blogger &lt;a href="http://adamcaudill.com/2012/12/31/revisiting-snapchat-api-and-security/"&gt;Adam Caudill has pointed out out&lt;/a&gt; relies quite a bit on security through obscurity. I agree with Adam that Snapchat should consider using some of their recent funding to externally audit their systems and reduce the risk of this sort of thing happening in the future.&lt;/p&gt;</description><link>http://cleveryou.net/post/40537133131</link><guid>http://cleveryou.net/post/40537133131</guid><pubDate>Mon, 14 Jan 2013 20:12:00 +0000</pubDate><category>snapchat</category><category>security</category><category>ios</category><category>app</category><category>PII</category></item><item><title>Collection Views</title><description>&lt;h4&gt;Making Life Easier Since 2012™&lt;/h4&gt;

&lt;p&gt;One of the great things about Cocoa / iOS development is also one of its downsides: you don&amp;#8217;t need to know exactly what&amp;#8217;s going on behind the scenes. Judging from some of the questions that come up on StackOverflow with surprising regularity, a sizeable number of users don&amp;#8217;t realise that a &lt;code&gt;UITableView&lt;/code&gt; is actually recycling views and cells to conserve memory.&lt;/p&gt;

&lt;p&gt;This introduces a lot of problems when developers come to implementing things like galleries. Almost every other day there&amp;#8217;s a question along the lines of &lt;em&gt;&amp;#8220;I put ten images into a scroll view and my phone crashed, what&amp;#8217;s going on?&amp;#8221;&lt;/em&gt;. Inevitably it&amp;#8217;s down to memory simply running out. Until iOS 6 you were faced with several far from ideal options to fix this: write your own recycling system, use one of several open-source options (of varying quality), or hack a &lt;code&gt;UITableView&lt;/code&gt; to pieces.&lt;/p&gt;

&lt;p&gt;Collection views change that, in a good way. Some people describe them as &amp;#8220;gallery views&amp;#8221;, but that&amp;#8217;s actually not the case - &lt;a href="http://developer.apple.com/library/ios/#documentation/uikit/reference/UICollectionView_class/Reference/Reference.html"&gt;&lt;code&gt;UICollectionView&lt;/code&gt;&lt;/a&gt; goes deeper than that. Unlike a table view, the &lt;em&gt;display&lt;/em&gt; logic (how your items are laid out on the screen) is totally decoupled from the &lt;em&gt;recycling&lt;/em&gt; logic. A collection view is paired up with a layout class that describes where and how elements should be positioned.&lt;/p&gt;

&lt;p&gt;The most common layout - a gallery - is provided through the built-in &lt;a href="http://developer.apple.com/library/ios/#Documentation/UIKit/Reference/UICollectionViewFlowLayout_class/Reference/Reference.html"&gt;&lt;code&gt;UICollectionViewFlowLayout&lt;/code&gt;&lt;/a&gt; class, but by substituting your own layouts you are free to display your items however you want: cover flow, 3D-like layouts, circular layouts, pile layouts (à la Mail) - they&amp;#8217;re all easily achieved by switching out the layout class.&lt;/p&gt;

&lt;h4&gt;Version Parity&lt;/h4&gt;

&lt;p&gt;There is, of course, a downside to all these benefits: collection views are only available on iOS 6. To be honest, for many people this shouldn&amp;#8217;t be a problem. Some of the apps I work on show over 80% of users running iOS 6, and that&amp;#8217;s only two months after it was released.&lt;/p&gt;

&lt;p&gt;However, there&amp;#8217;s good news for those looking to implement flow and gallery layouts - &lt;a href="http://petersteinberger.com/"&gt;Peter Steinberger&lt;/a&gt; has &lt;a href="https://github.com/steipete/PSTCollectionView"&gt;put together a great drop-in replacement class&lt;/a&gt; for iOS 4.3-5 that has a 100% compatible collection view API.&lt;/p&gt;

&lt;h4&gt;Stop Writing Custom Galleries&lt;/h4&gt;

&lt;p&gt;The upshot of this is it would be absolutely crazy to implement your own recycling gallery view from scratch, even if you have to sub-class a collection view or write your own layout to get the effect you want. Setting aside the fact that in the vast majority of cases using a collection view will save development cost and time, you&amp;#8217;re also backed by code that&amp;#8217;s received far more testing time than your custom written class ever will.&lt;/p&gt;

&lt;p&gt;The take away lesson: collection views are a fantastic addition to iOS, and you should be using them wherever possible in your apps rather than custom or third-party code. Learn to love them, and you will be rewarded.&lt;/p&gt;</description><link>http://cleveryou.net/post/36281082015</link><guid>http://cleveryou.net/post/36281082015</guid><pubDate>Thu, 22 Nov 2012 13:38:17 +0000</pubDate><category>mobile development</category><category>ios 6</category><category>ios</category><category>iphone sdk</category><category>ios sdk</category><category>UICollectionView</category><category>collection views</category><category>UITableView</category><category>iphone</category></item><item><title>John Browett Leaves Apple (Yay!)</title><description>&lt;a href="http://www.bbc.co.uk/news/business-20132843"&gt;John Browett Leaves Apple (Yay!)&lt;/a&gt;: &lt;p&gt;John Browett, the man previously in charge of such fantastic retail experiences as Dixons and Currys, has left his role as head of Apple Retail after only six months. Well, the press release says ‘left’, but I suspect is was far from voluntary. I wouldn’t say &lt;a href="http://cleveryou.net/post/16865783099/apples-new-retail-czar"&gt;I told you so&lt;/a&gt;, but…&lt;/p&gt;

&lt;p&gt;Scott Forstall is also on the way out, which on the whole I think is a positive move. For some reason I always generally dislike Scott Forstall when he’s speaking at Apple events, and if the internet rumour mill is to be believed there was a fair amount of tension between his team and the industrial design team. I think it’s safe to say that Jony Ive being in charge of both industrial design and software user experience can only be a good thing.&lt;/p&gt;</description><link>http://cleveryou.net/post/34601917794</link><guid>http://cleveryou.net/post/34601917794</guid><pubDate>Tue, 30 Oct 2012 00:00:25 +0000</pubDate><category>Apple</category><category>john browett</category><category>scott forstall</category></item><item><title>

(Update 27/4/12: since I wrote this, Parse have been acquired by Facebook. I&amp;#8217;ve blogged...</title><description>&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_mbpzoikDrF1r2nlhm.jpg" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;(&lt;em&gt;Update 27/4/12&lt;/em&gt;: since I wrote this, Parse have been acquired by Facebook. I&amp;#8217;ve blogged &lt;a href="http://cleveryou.net/post/49003678297/parse-facebook-what-now"&gt;about this here&lt;/a&gt;. StackMob have also changed their pricing policies, making a lot more of their services free to use. I&amp;#8217;m writing an update to this post right now taking all of this into account!)&lt;/p&gt;

&lt;h1&gt;Parse Vs Stackmob - Round II&lt;/h1&gt;

&lt;p&gt;Parse and Stackmob are the pre-made pastry of the mobile development world: if your app needs a backend system to persist data you &lt;em&gt;could&lt;/em&gt; build it yourself, manage the hosting, and support it. Similarly, if you&amp;#8217;re looking to make a pie you &lt;em&gt;could&lt;/em&gt; make the puff pastry yourself, a time-consuming process that isn&amp;#8217;t exactly straightforward…or you could just go into the store and buy it pre-made off the shelf.&lt;/p&gt;

&lt;p&gt;So if you&amp;#8217;re a seasoned Objective-C developer but have no clue how to develop a robust, reliable back-end solution for your app you might want to consider finding something to do the heavy lifting for you. This is where &lt;em&gt;Parse&lt;/em&gt; and &lt;em&gt;StackMob&lt;/em&gt;, two popular &amp;#8216;backend-as-a-service&amp;#8217; (or &lt;em&gt;BaaS&lt;/em&gt;) providers come in.&lt;/p&gt;

&lt;p&gt;A while back I &lt;a href="http://www.cleveryou.net/post/22718728512"&gt;compared both StackMob and Parse&lt;/a&gt; - in the five months since I wrote that post a lot has changed, so it&amp;#8217;s time for another Parse vs Stackmob shoot-out! As always, I&amp;#8217;m approaching both providers with iOS in mind, since that&amp;#8217;s my background - however, most of what I&amp;#8217;m looking at applies to iOS, Android, and mobile web alike.&lt;/p&gt;

&lt;p&gt;If you&amp;#8217;re still a little confused about this whole &amp;#8216;backend as a service&amp;#8217; thing you might want to read &lt;a href="http://www.cleveryou.net/post/22718728512"&gt;my original comparison&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Parse: What&amp;#8217;s New&lt;/h3&gt;

&lt;p&gt;In the last five months Parse has matured &lt;em&gt;a lot&lt;/em&gt; - here&amp;#8217;s some of the major improvements and additions:&lt;/p&gt;

&lt;h4&gt;Cloud Code&lt;/h4&gt;

&lt;p&gt;One of Stackmob&amp;#8217;s biggest advantages was the ability to deploy and run code server-side code without requiring an intermediary host. This is one of those features that you&amp;#8217;ll inevitably require at some point on your project, even if you don&amp;#8217;t realise it yet. Custom server-side logic might be used for advanced validation, or triggering other actions.&lt;/p&gt;

&lt;p&gt;With &lt;em&gt;&lt;a href="http://blog.parse.com/2012/09/11/welcoming-cloud-code-to-the-parse-family/"&gt;Cloud Code&lt;/a&gt;&lt;/em&gt;, Parse has taken a big step forward towards that goal: you can now create your own endpoints and hook into existing calls easily. That said, there are a couple of downsides:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;Stackmob supports Java and Scala, whereas Parse only support JavaScript (in fairness, this is only a downside if you&amp;#8217;re unwilling to pick up JS)&lt;/li&gt;
&lt;li&gt;You can only use Parse&amp;#8217;s Javascript SDK - nothing else&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;What does this mean? Well, you couldn&amp;#8217;t create a piece of cloud code that called out an API on another system, for example. Hopefully this limitation will be removed soon. Another drawback of Cloud Code is the lack of a staging or development environment: whilst you could set up another application within Parse to test your Cloud Code it is far from ideal.&lt;/p&gt;

&lt;h5&gt;Other Additions&lt;/h5&gt;

&lt;p&gt;Parse has always had &lt;a href="https://www.parse.com/docs/"&gt;great documentation&lt;/a&gt; - this has been supplemented with a StackExchange like &lt;a href="https://www.parse.com/questions"&gt;user questions&lt;/a&gt; section, which whilst at times slightly confusing (perhaps I&amp;#8217;m being dense, but I couldn&amp;#8217;t find a way to view all the questions I&amp;#8217;d asked) is a welcome new feature. Other improvements include:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;In-app purchase wrappers for iOS&lt;/li&gt;
&lt;li&gt;Drastically improved JS SDK (for web apps)&lt;/li&gt;
&lt;li&gt;Better control over push messaging (SDK only: the web interface is still a bit simplistic)&lt;/li&gt;
&lt;li&gt;New &lt;code&gt;PFImageView&lt;/code&gt; classes for iOS to assist with remote image loading, as well as new Parse-integrated view controllers (great for hackathons, maybe less useful for a highly customised app build)&lt;/li&gt;
&lt;/ul&gt;&lt;h3&gt;StackMob&lt;/h3&gt;

&lt;p&gt;StackMob has also been busy making improvements:&lt;/p&gt;

&lt;h5&gt;Better SDKs&lt;/h5&gt;

&lt;p&gt;StackMob have radically re-thought their iOS SDK, and it&amp;#8217;s heavily inspired by Core Data. In fact, you&amp;#8217;ll basically be using Core Data to interface with StackMob. It&amp;#8217;s a great way of doing things, although if you&amp;#8217;ve got no experience with Core Data you might prefer the simple abstraction that the Parse SDK provides. With this new Core Data model comes background updating of objects, which is greatly appreciated.&lt;/p&gt;

&lt;p&gt;As before, here&amp;#8217;s the code you need to create an object, set a value, and update it:&lt;/p&gt;

&lt;h6&gt;Parse&lt;/h6&gt;

&lt;pre&gt;&lt;code&gt;PFObject *score = [PBObject objectWithClassName:@"Score"];
[score setObject:[NSNumber numberWithInt:1337] forKey:@"score"];
[score saveEventually];
&lt;/code&gt;&lt;/pre&gt;

&lt;h6&gt;StackMob&lt;/h6&gt;

&lt;pre&gt;&lt;code&gt;NSManagedObject *score = [NSEntityDescription insertNewObjectForEntityForName:@"Score" 
                                                       inManagedObjectContext:self.managedObjectContext];
[score setValue:[NSNumber numberWithInt:1337] forKey:@"score"];
[self.managedObjectContext save:nil]; // You'd normally do some error checking here
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If you&amp;#8217;re familiar with Core Data you&amp;#8217;ll see straight away that StackMob is tightly integrated.&lt;/p&gt;

&lt;p&gt;As always, StackMob&amp;#8217;s SDKs are all open source, unlike Parse. This may or may not be of value to you - neither Parse nor StackMob&amp;#8217;s SDKs are not without their bugs, and being able to dive into the source instead of waiting for a fix could save you valuable time.&lt;/p&gt;

&lt;h5&gt;Other Additions&lt;/h5&gt;

&lt;p&gt;The past five months have also brought some other incremental improvements to the StackMob platform, including:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;Custom domains for hosted HTML&lt;/li&gt;
&lt;li&gt;User roles and permissions&lt;/li&gt;
&lt;li&gt;Push improvements (both SDK side and server side)&lt;/li&gt;
&lt;li&gt;OAuth 2 support&lt;/li&gt;
&lt;/ul&gt;&lt;h1&gt;Summary&lt;/h1&gt;

&lt;p&gt;If you were hoping for a decisive result you&amp;#8217;ll be disappointed to know that yet again there&amp;#8217;s no right answer as to which platform is &amp;#8216;best&amp;#8217;. Your choice will very much depend upon what&amp;#8217;s important to you and your apps.&lt;/p&gt;

&lt;p&gt;As before, on &lt;strong&gt;price&lt;/strong&gt; Parse is the clear winner. Inexperienced developers will also appreciate the &lt;strong&gt;simplicity&lt;/strong&gt; of Parse&amp;#8217;s SDKs, but there&amp;#8217;s no doubting the fact that StackMob&amp;#8217;s Core Data powered iOS SDK is very powerful.&lt;/p&gt;

&lt;p&gt;If you&amp;#8217;re an indie developer, going to a hackathon, or looking for something to power your weekend project you&amp;#8217;ll &lt;em&gt;love&lt;/em&gt; Parse. Enterprise and commercial developers may be attracted to StackMob&amp;#8217;s advanced server-side code functionality, and the distinct development/production environments on offer.&lt;/p&gt;

&lt;p&gt;Regardless, I&amp;#8217;d recommend trying both providers and coming to a decision based on what you&amp;#8217;re more comfortable coding with and what features work best for you - with free tiers available there&amp;#8217;s little reason not to.&lt;/p&gt;</description><link>http://cleveryou.net/post/33510547981</link><guid>http://cleveryou.net/post/33510547981</guid><pubDate>Sat, 13 Oct 2012 19:49:00 +0100</pubDate><category>parse</category><category>stackmob</category><category>baas</category><category>backend</category><category>mobile</category><category>mobile development</category></item><item><title>"It definitely looks sound. I haven’t tested it because […] English law takes a fairly..."</title><description>““It definitely looks sound. I haven’t tested it because […] English law takes a fairly backwards view of doing this sort of thing, even with the best of intentions.”&lt;br/&gt;&lt;br/&gt; - &lt;em&gt;&lt;p&gt;That’s me, &lt;a href="http://www.theregister.co.uk/2012/09/05/menshn_password_reset_vuln/"&gt;interviewed in El Reg&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Did you know that the &lt;a href="http://en.wikipedia.org/wiki/Computer_Misuse_Act_1990"&gt;Computer Misuse Act&lt;/a&gt; makes it illegal to carry out any sort of XSS malarky, even if it’s a known problem or you’re trying to alert a company to the poor state of their web security?&lt;/p&gt;

&lt;p&gt;More companies should consider running White Hat programs and rewarding those who discover issues with their site: consider following &lt;a href="http://www.google.com/about/company/halloffame.html"&gt;Google&lt;/a&gt; or &lt;a href="https://www.facebook.com/whitehat"&gt;Facebook’s&lt;/a&gt; lead.&lt;/p&gt;&lt;/em&gt;</description><link>http://cleveryou.net/post/32414795498</link><guid>http://cleveryou.net/post/32414795498</guid><pubDate>Thu, 27 Sep 2012 22:39:20 +0100</pubDate><category>white hat</category><category>the register</category><category>menshn.com</category><category>XSS</category><category>computer misuse act</category></item><item><title>Grant Shapps MP &amp; Spam</title><description>&lt;p&gt;The Guardian &lt;a href="http://www.guardian.co.uk/politics/2012/sep/02/grant-shapps-google-howtocorp-adsense?newsfeed=true"&gt;reported today&lt;/a&gt; about Grant Shapps, the Minister of State for Housing and Planning in the UK, who&amp;#8217;s also  tipped to be the new chairman of the Conservative Party. In other words, someone pretty high up in government.&lt;/p&gt;

&lt;p&gt;It turns out that Grant had a little side business, called &lt;em&gt;How To Corp Ltd&lt;/em&gt; - nothing necessarily wrong with that, except How To Corp appears to have been selling a number of supposed &amp;#8216;SEO&amp;#8217; products that violate Google&amp;#8217;s code of practice.&lt;/p&gt;

&lt;p&gt;This has naturally caused quite a stir on Twitter. Some people, however, have questioned whether Grant has actually done anything wrong:&lt;/p&gt;

&lt;blockquote class="twitter-tweet" data-in-reply-to="242558450045947905"&gt;&lt;p&gt;&lt;a href="https://twitter.com/dukecorky"&gt;&lt;s&gt;@&lt;/s&gt;&lt;b&gt;dukecorky&lt;/b&gt;&lt;/a&gt; &lt;a href="https://twitter.com/johnprescott"&gt;&lt;s&gt;@&lt;/s&gt;&lt;b&gt;johnprescott&lt;/b&gt;&lt;/a&gt; &lt;a href="https://twitter.com/grantshapps"&gt;&lt;s&gt;@&lt;/s&gt;&lt;b&gt;grantshapps&lt;/b&gt;&lt;/a&gt; &lt;a href="https://twitter.com/saggydaddy"&gt;&lt;s&gt;@&lt;/s&gt;&lt;b&gt;saggydaddy&lt;/b&gt;&lt;/a&gt; Where is the scam and how is it leeching? Real what? Any laws or MP rules broken?&lt;/p&gt;— Mike Broadbent (@CarrotHead) &lt;a href="https://twitter.com/CarrotHead/status/242567038680326145" data-datetime="2012-09-03T10:17:43+00:00"&gt;September 3, 2012&lt;/a&gt;&lt;/blockquote&gt;

&lt;script src="//platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;&lt;p&gt;Fair enough - after all, breaking the Google Code of Practice is pretty small fry compared to some of the things MPs have got up to in the past.&lt;/p&gt;

&lt;p&gt;However, I was curious: most people selling SEO software have to promote it somehow. And usually it&amp;#8217;s promoted using spam. Was Grant Shapps a spammer? Spamming is a much more serious accusation, something everyone hates. Of course, finding out whether How To Corp had been spamming in the past would be difficult: spammers tend, for obvious reasons, to hide their tracks.&lt;/p&gt;

&lt;p&gt;Except in this case - because Grant Shapps made a little slip up. A slip up that would seem to suggest that during 2004&amp;#160;&lt;em&gt;How To Corp Ltd&lt;/em&gt; was a legitimate e-mail spammer.&lt;/p&gt;

&lt;h5&gt;An Important Note&lt;/h5&gt;

&lt;p&gt;One thing before I go on: I don&amp;#8217;t have anything against Grant Shapps. I want to make this clear, because politics and Twitter tends to bring out the worst in people. Let&amp;#8217;s be realistic here: many MPs from &lt;em&gt;all&lt;/em&gt; parties have done and will do lots of dodgy things. Grant Shapps may be an excellent MP - I don&amp;#8217;t know. You might, however, feel that how Grant Shapps ran his limited companies in the past is relevant to his current work.&lt;/p&gt;

&lt;h3&gt;2004&lt;/h3&gt;

&lt;p&gt;Our tale begins in 2004. Grant Shapps was at the time running two businesses: &lt;em&gt;How To Corp Ltd&lt;/em&gt;, and &lt;em&gt;PrintHouse Corporation&lt;/em&gt;. Since becoming a MP he resigned from both, but &lt;a href="http://www.theyworkforyou.com/mp/grant_shapps/welwyn_hatfield#register"&gt;maintains some shares in PrintHouse&lt;/a&gt;. His wife is currently listed as the director of How To Corp.&lt;/p&gt;

&lt;p&gt;At some point in 2004, &lt;em&gt;How To Corp&lt;/em&gt; ran a bulk e-mail campaign that was reported as spam through the &lt;a href="http://www.spamcop.net/"&gt;SpamCop&lt;/a&gt; service. This was a bit of a problem, because both PrintHouse and HowToCorp ran their websites off the same server. Legitimate PrintHouse e-mails were getting marked as spam.&lt;/p&gt;

&lt;p&gt;It appears as if at the time both the PrintHouse and How To Corp websites were running off the same server. This meant e-mails being sent from &lt;em&gt;printhouse.co.uk&lt;/em&gt; kept getting blocked by SpamCop - a bit of a problem for Grant. So how did he deal with it?&lt;/p&gt;

&lt;p&gt;This is where things get interesting - what follows is a &lt;a href="http://forum.spamcop.net/forums/lofiversion/index.php/t1029.html"&gt;post Grant Shapps made to the SpamCop forums on April 13&amp;#160;2004&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Just started using SpamCop on several different accounts over the weekend and generally 
  happy, but&amp;#8230;&lt;/p&gt;
  
  &lt;p&gt;Today I reported some spam that was in my held folder and it appears that following that
  event my own email was somehow blocked. In other words, if I mail myself, it goes straight 
  to my held mail folder.&lt;/p&gt;
  
  &lt;p&gt;So I took a look at the message source of my own message in the Held folder and it appears 
  to have a reference to someone else&amp;#8217;s server, which is the one being blocked. Nothing to do 
  with my own server as far as I&amp;#8217;m aware.&lt;/p&gt;
  
  &lt;p&gt;So is it possible to block yourself in error?&lt;/p&gt;
  
  &lt;p&gt;Here&amp;#8217;s the message header and the offending IP address appears to be: 213.166.65.2 whilst my
  mailserver IP is 212.23.23.125 and is not on any block lists.&lt;/p&gt;
  
  &lt;p&gt;So what do I do from here??&lt;/p&gt;
  
  &lt;p&gt;Grant.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Return-Path: &amp;lt;michael[at]howtocorp.com&amp;gt; 
Delivered-To: spamcop-net-grant[at]spamcop.net 
Received: (qmail 19231 invoked from network); 13 Apr 2004 16:21:26 -0000 
Received: from unknown (192.168.1.101) 
by blade4.cesmail.net with QMQP; 13 Apr 2004 16:21:26 -0000 
Received: from dsl-212-23-23-125.zen.co.uk (HELO mailgate.printhouse.co.uk) (212.23.23.125) 
by mailgate.cesmail.net with SMTP; 13 Apr 2004 16:21:25 -0000 
Received: from mailgate.printhouse.co.uk (mailgate.printhouse.co.uk [213.166.65.2]) by  
mailgate.printhouse.co.uk (NTMail 7.02.3037/NY9765.00.9ea0b33f) with ESMTP id ejifeaaa for  
grant[at]spamcop.net; Tue, 13 Apr 2004 17:20:33 +0100 
Received: from [212.23.3.141] by mailgate.printhouse.co.uk (NTMail 7.02.3037/NY9765.00.9ea0b33f) with ESMTP id ejifeaaa 
 for grant[at]printhouse.co.uk; Tue, 13 Apr 2004 17:20:33 +0100 
Received: from [212.23.23.120] (helo=grant) 
by heisenberg.zen.co.uk with esmtp (Exim 4.30) 
id 1BDQcs-0005rA-9S 
for grant[at]printhouse.co.uk; Tue, 13 Apr 2004 16:19:06 +0000 
Message-ID: &amp;lt;024201c42173$0ab33990$781717d4[at]grant&amp;gt; 
Reply-To: "Michael Green" &amp;lt;michael[at]howtocorp.com&amp;gt; 
From: "Michael Green" &amp;lt;michael[at]howtocorp.com&amp;gt; 
To: &amp;lt;grant[at]printhouse.co.uk&amp;gt; 
Subject:  
Date: Tue, 13 Apr 2004 17:19:05 +0100
Organization: How To Corp 
MIME-Version: 1.0 
Content-Type: text/plain; 
charset="iso-8859-1" 
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you&amp;#8217;re not technical the last part of his post probably doesn&amp;#8217;t make much sense - what&amp;#8217;s going on here?&lt;/p&gt;

&lt;p&gt;Well, Grant claims he reported some spam which somehow resulted in his own e-mail getting blocked. Except the spam he&amp;#8217;s &amp;#8216;reporting&amp;#8217; appears to originate from someone with the email address &lt;code&gt;michael@howtocorp.com&lt;/code&gt; - which, thanks to The Guardian, we know is Grant Shapp&amp;#8217;s &lt;em&gt;own e-mail address&lt;/em&gt; under his alias &amp;#8216;Michael Green&amp;#8217;.&lt;/p&gt;

&lt;p&gt;Of course, it&amp;#8217;s rather unlikely that Grant would report &lt;em&gt;his own emails&lt;/em&gt; as spam. What almost certainly happened is somebody else reported emails coming from &lt;em&gt;howtocorp.com&lt;/em&gt; as spam, which then caused SpamCop to block &lt;em&gt;printhouse.co.uk&lt;/em&gt; emails as well. Grant then had to convince SpamCop to let his Print House emails through whilst not being found out as the owner of the &lt;em&gt;howtocorp.com&lt;/em&gt; domain.&lt;/p&gt;

&lt;p&gt;Some forum members picked this up - &lt;a href="http://forum.spamcop.net/forums/lofiversion/index.php/t1029.html"&gt;one poster wrote&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I&amp;#8217;m having a bit of a struggle working out your &amp;#8220;not associated with me&amp;#8221; e-mail server statements. You say this sample is &amp;#8220;an e-mail
  to myself. If so, please explain why the address of grant[at]printhouse.co.uk is not associated with the server called 
  mailgate.printhouse.co.uk &amp;#8230;. there sure seems to be some small connection there.&lt;/p&gt;
  
  &lt;p&gt;Query bl.spamcop.net - 213.166.65.2
  DNS error: 213.166.65.2 has no reverse dns
  213.166.65.2 listed in bl.spamcop.net (127.0.0.2)
  Been reported as a source of spam about 100 times&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Grant then tries to claim the hundred of so reports of spam from &lt;em&gt;howtocorp.com&lt;/em&gt; all came from him:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Yes, those 100 times were all me reporting that IP for spam I received&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;…this seems a little unlikely. Why would Grant report email from &lt;em&gt;howtocorp.com&lt;/em&gt;, a domain he &lt;em&gt;owned&lt;/em&gt;, as spam? I&amp;#8217;ll let you decide.&lt;/p&gt;

&lt;h3&gt;Conclusion&lt;/h3&gt;

&lt;ul&gt;&lt;li&gt;In 2004 SpamCop received over a hundred reports of spamming from &lt;em&gt;howtocorp.com&lt;/em&gt;, a company run at the time by Grant Shapps &lt;/li&gt;
&lt;li&gt;As a result, e-mails being sent from &lt;em&gt;printhouse.co.uk&lt;/em&gt; (a company run at the time by Grant Shapps) were also blocked&lt;/li&gt;
&lt;li&gt;Grant Shapps then tried to get SpamCop to reverse the block by claiming he had nothing to do with &lt;em&gt;howtocorp.com&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;If &lt;em&gt;howtocorp.com&lt;/em&gt; were genuinely sending unsolicited marketing e-mails they would have been committing an offence under the &lt;a href="http://www.legislation.gov.uk/uksi/2003/2426/contents/made"&gt;Privacy and Electronic Communications Regulations 2003&lt;/a&gt;, which only allows e-mail marketing to be sent where individuals have agreed to receive them&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Perhaps &lt;em&gt;howtocorp.com&lt;/em&gt; didn&amp;#8217;t spam, and had a genuine relationship with everyone it emailed in 2004. On the other hand, over a hundred people didn&amp;#8217;t think so, and reported the company to spam prevention services. I&amp;#8217;ll leave it at that.&lt;/p&gt;</description><link>http://cleveryou.net/post/30793174088</link><guid>http://cleveryou.net/post/30793174088</guid><pubDate>Mon, 03 Sep 2012 12:38:00 +0100</pubDate><category>grant shaps</category><category>spam</category></item><item><title>PINs and Needles</title><description>&lt;p&gt;It&amp;#8217;s well known that the more complex your password the more secure you will be. Exactly &lt;em&gt;how&lt;/em&gt; to achieve that complexity is a matter of some debate, but at least we can all agree that &lt;code&gt;1234&lt;/code&gt; isn&amp;#8217;t going to cut it as your Gmail password.&lt;/p&gt;

&lt;p&gt;Alongside complexity sits enforcement: some providers, like Google, simply require a minimum password length. Others are stricter: Apple&amp;#8217;s list of requirements is too long to reproduce here, but includes such gems as &lt;em&gt;&amp;#8220;passwords must not contain more than 3 consecutive identical characters&amp;#8221;&lt;/em&gt; and &lt;em&gt;&amp;#8220;passwords must have at least one capital letter&amp;#8221;&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Despite all this complexity enforcement, many users &lt;em&gt;do&lt;/em&gt; indirectly use &lt;code&gt;1234&lt;/code&gt; to access not just their Gmail, but their social networks, photos, text messages, and more. I am of course talking about the &lt;em&gt;PIN&lt;/em&gt;, unchanged since its debut thirty-five years ago, and often the only thing protecting a cellphone.&lt;/p&gt;

&lt;h3&gt;A Short Historical Detour&lt;/h3&gt;

&lt;p&gt;The modern PIN was invented by a Scot - either &lt;a href="http://en.wikipedia.org/wiki/John_Shepherd-Barron"&gt;John Shepherd-Baron&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/James_Goodfellow"&gt;James Goodfellow&lt;/a&gt; depending on your sources, who both claim some credit to inventing the modern day ATM. Shepherd-Baron&amp;#8217;s machine required users to authenticate themselves with a four digit numeric code. Why four digits? Shepherd-Baron claimed his wife vetoed a six digit PIN, as four digits &lt;a href="http://www.washingtonpost.com/wp-dyn/content/article/2010/05/20/AR2010052005119.html"&gt;was the most she could remember&lt;/a&gt;&lt;sup id="fnref:p29406437746-barclays"&gt;&lt;a href="#fn:p29406437746-barclays" rel="footnote"&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m8pb20kfzb1r2nlhm.jpg" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;Even though &lt;a href="http://en.wikipedia.org/wiki/ISO_9564"&gt;ISO 9564&lt;/a&gt; (the international standard for ATM systems) specifies PINs of up to 12 digits should be supported, the overwhelming majority of users and banks have stuck with Shepherd-Baron&amp;#8217;s original suggestion of 4 digits.&lt;/p&gt;

&lt;p&gt;But what does this have to do with phones? Twenty years ago, when SIM cards were actually the size of credit cards, making calls on the go could be an expensive business - your monthly plan was much more likely to come with 50, rather than 500, minutes. A way was needed to secure a phone and prevent someone running up a huge bill on a phone without the subscriber&amp;#8217;s knowledge. A PIN was deemed to be the best option - after all, users were familiar with them from banking - and in 1992 in was mandated that phones should support a four digit security code.&lt;/p&gt;

&lt;p&gt;What&amp;#8217;s important to note is that at this point PINs didn&amp;#8217;t really protect any data outside of an address book: phones made calls, and that was that. As time went on, more and more personal information made its way onto mobile, until we ended up with our phones basically containing carbon copies of our entire lives: our calendars, e-mails, social networks, photos, and more.&lt;/p&gt;

&lt;h3&gt;PIN Locking&lt;/h3&gt;

&lt;p&gt;Because a four digit PIN is self evidently not very secure (with only 9,999 combinations to try) both ATMs and mobile phones will lock users out after &lt;code&gt;n&lt;/code&gt; number of incorrect attempts. Smartphones can even be setup to erase the entire devices after a set number of tries.&lt;/p&gt;

&lt;p&gt;If you have had the misfortune of locking yourself out of your phone you&amp;#8217;ll know you typically need to obtain a &lt;em&gt;PUK&lt;/em&gt; (&amp;#8216;PIN Unlocked Key&amp;#8217;) from your mobile operator. Here we see the first problem with PIN codes: you only need to read about &lt;a href="http://www.wired.com/gadgetlab/2012/08/apple-amazon-mat-honan-hacking/"&gt;Mat Honan&amp;#8217;s recent experience&lt;/a&gt; to see that it&amp;#8217;s not out of the question for an impostor to convince a customer service rep they&amp;#8217;re you.&lt;/p&gt;

&lt;p&gt;In fact, this is exactly what News Corporation did in the &lt;a href="http://en.wikipedia.org/wiki/News_International_phone_hacking_scandal"&gt;recent phone hacking scandal&lt;/a&gt; - by ringing up telcos and pretending to be subscribers, &lt;em&gt;News of the World&lt;/em&gt; employees were able to convince telcos to release PIN codes to them, allowing unfettered access to voicemail accounts.&lt;/p&gt;

&lt;h3&gt;PIN Breaking&lt;/h3&gt;

&lt;p&gt;Whilst a four digit PIN is undeniably very insecure, there is of course one thing I&amp;#8217;ve omitted - to make any use of it you&amp;#8217;re going to need physical access to the phone in question.Still, this doesn&amp;#8217;t offer us much hope, given how often phones can be misplaced, left at a desk, or stolen. Let&amp;#8217;s assume we have access to the phone we want: how can we get into it?&lt;/p&gt;

&lt;h4&gt;Guess&lt;/h4&gt;

&lt;p&gt;Guessing is a risky gamble if you&amp;#8217;re entering the codes directly onto the phone, as you may well be locked out. However, it&amp;#8217;s not quite as risky as you might think - a &lt;a href="http://www.cl.cam.ac.uk/~jcb82/doc/BPA12-FC-banking_pin_security.pdf"&gt;University of Cambridge research paper&lt;/a&gt; suggests a significant minority use highly guessable PINs such as &lt;code&gt;1234&lt;/code&gt; or their birthdate/year. Still, guessing is a very clumsy approach.&lt;/p&gt;

&lt;h4&gt;Brute Force&lt;/h4&gt;

&lt;p&gt;Given that a phone will typically lock you out after several incorrect attempts you may think you don&amp;#8217;t have to worry about brute force. This was certainly true in the past - for a long time, PINs were stored directly on the SIM card. However, smartphones now typically store the PIN in flash memory - once you&amp;#8217;ve imaged the phone onto another computer you can carry out an &lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/Dictionary_attack"&gt;offline dictionary attack&lt;/a&gt;&lt;/em&gt;, given you as many attempts as you require.&lt;/p&gt;

&lt;p&gt;Because a four digit PIN is so short, brute-forcing it is extremely straightforward. How straightforward? Here are some of Apple&amp;#8217;s own estimates on how long it would take to crack an iOS 5 device with varying passcode complexities:&lt;/p&gt;

&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Complexity&lt;/th&gt;
  &lt;th&gt;Time&lt;/th&gt;
&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;4 Digit PIN&lt;/td&gt;
  &lt;td&gt;13 minutes&lt;sup id="fnref:p29406437746-apple"&gt;&lt;a href="#fn:p29406437746-apple" rel="footnote"&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;9 Digit PIN&lt;/td&gt;
  &lt;td&gt;2.5 years[^apple]&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;6 character password&lt;/td&gt;
  &lt;td&gt;5.5 years[^apple]&lt;/td&gt;
&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Android is not immune either - several forensic houses have &lt;a href="http://forensics.spreitzenbarth.de/2012/02/28/cracking-pin-and-password-locks-on-android/"&gt;documented brute force approaches&lt;/a&gt; that can &lt;a href="http://www.ccl-forensics.com/Law-Enforcement-News/cracking-android-pins-and-passwords.html"&gt;break ten digit PINs&lt;/a&gt; in an hour or so. The only&lt;/p&gt;

&lt;h4&gt;Social Engineering&lt;/h4&gt;

&lt;p&gt;Whilst not limited to just PINs, the fact users have certain expectations around PINs and phone locking means some very simply social engineering tricks can work exceptionally well. Users are not conditioned to treat phone PINs in the same way as their banking PINs - banks have spent considerable sums of money educating users to &amp;#8216;shield&amp;#8217; their PINs by covering up keypads.&lt;/p&gt;

&lt;p&gt;Phones can also be swapped out with identical devices that display &amp;#8216;dummy&amp;#8217; lock screens - customs apps that look and behave like a traditional look screen but with one major difference. Rather than unlocking the phone, these apps will transmit the PIN being entered by the user back to you. It&amp;#8217;s also going to display an &amp;#8216;incorrect PIN&amp;#8217; error regardless of what the user entered, and after three attempts it will &amp;#8216;lock&amp;#8217; the phone.&lt;/p&gt;

&lt;h3&gt;So?&lt;/h3&gt;

&lt;p&gt;You may well wonder whether you need to care about any of this. You might never let your phone out of your sight, and the idea that somebody might go to the trouble of duplicating your phone to get access to your PIN may seem laughable.&lt;/p&gt;

&lt;p&gt;On the other hand, at this very moment several highly paid executives of News Corporation are &lt;a href="http://www.guardian.co.uk/uk/2012/may/15/rebekah-brooks-charged-perverting-course-justice"&gt;awaiting trial for perjury and conspiracy to pervert the course of justice&lt;/a&gt;, all relating to offences involving breaking into services protected by four digit PINs. Many of victims were not celebrities, but ordinary people who for whatever reason found themselves in the news.&lt;/p&gt;

&lt;h4&gt;We&amp;#8217;re Stuck in a Hole&lt;/h4&gt;

&lt;p&gt;Unfortunately, the PIN isn&amp;#8217;t going away. Why? Because an expectation has been established: PINs are quick and easy to enter, and allow access to your phone in seconds. Apple is more than happy for you to use an alpha-numeric password, but wave goodbye to your 9-button keypad and hello to a full QWERTY keyboard.&lt;/p&gt;

&lt;p&gt;Not to say that manufacturers aren&amp;#8217;t trying different things: Google have introduced facial recognition lock screens for Android, although their &lt;a href="http://www.androidpolice.com/2011/11/16/still-not-convinced-that-face-unlock-is-easily-fooled-by-a-photo-heres-another-video-showing-face-programming-and-photo-unlocking-from-start-to-end/"&gt;effectiveness is dubious&lt;/a&gt; at best (Jellybean now has an &lt;a href="http://www.androidpolice.com/2012/06/29/jelly-beans-face-unlock-asks-you-to-blink-for-the-camera-locks-out-after-several-failed-attempts/"&gt;option to require &amp;#8216;eye blinking&amp;#8217;&lt;/a&gt; whilst unlocking, which perhaps tells you how badly the first iteration worked when presented with a photo).&lt;/p&gt;

&lt;p&gt;So what can we do to improve PIN security? Whilst users requiring the highest levels of security may well accept using a highly complex password instead, I suspect the average smartphone owner will not. Biometrics are one potential avenue, but without custom hardware such as fingerprint readers the technology simply isn&amp;#8217;t there yet.&lt;/p&gt;

&lt;p&gt;One thing is certain: until we part ways with the PIN we&amp;#8217;ll continue to live in the strange situation whereby your e-mails, social networks, and other sensitive accounts will require a complex password to view through a desktop, but allow total unfettered access with a simple four digit code on your phone.&lt;/p&gt;

&lt;div class="footnotes"&gt;
&lt;hr&gt;&lt;ol&gt;&lt;li id="fn:p29406437746-barclays"&gt;
&lt;p&gt;This sounds a little too apocryphal for its own good in my opinion. &lt;a href="#fnref:p29406437746-barclays" rev="footnote"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn:p29406437746-apple"&gt;
&lt;p&gt;&lt;a href="http://images.apple.com/ipad/business/docs/iOS_Security_May12.pdf"&gt;iOS Security White Paper, Apple Inc, May 2012&lt;/a&gt;, working under the assumption of 80ms per attempt &lt;a href="#fnref:p29406437746-apple" rev="footnote"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;/ol&gt;&lt;/div&gt;</description><link>http://cleveryou.net/post/29406437746</link><guid>http://cleveryou.net/post/29406437746</guid><pubDate>Tue, 14 Aug 2012 14:17:47 +0100</pubDate><category>PIN</category><category>security</category><category>iphone</category><category>password</category></item></channel></rss>
