Spider by Tom Royal on Flickr
Spider by Tom Royal on Flickr
Dubrovnik by Tom Royal on Flickr
Dubrovnik by Tom Royal on Flickr
Dubrovnik by Tom Royal on Flickr
Dubrovnik by Tom Royal on Flickr
Dubrovnik by Tom Royal on Flickr
Dubrovnik by Tom Royal on Flickr
Dubrovnik by Tom Royal on Flickr
Dubrovnik by Tom Royal on Flickr

You're using a very old version of Internet Explorer which can't show the photos that should be in this box. Please consider upgrading to a newer version of IE or an alternative such as Firefox. Thanks.

How To: Make a 3DS grip from an old GameCube pad

May 8th, 2013

When the 3DS was first released, I was a bit nonplussed. I mean, the 3D worked just fine, but at the European launch it cost a fortune, there were few good games, and the system was made in an inexplicable turquoisey colour. In the last few months, though, it's all changed. There's now a lower price (especially for the older, smaller one – just £130), better firmware, and a handful of great games: I've been whiling away daily commutes on Virtue's Last Reward (visual novel, bonkers translation), Tales of the Abyss (exactly what you'd expect from any Tales game), and now Fire Emblem Awakening (addictive as hell, great translation).

But with that, a new problem: hand cramp. If you have big hands, playing the 3DS for anything longer than 30 minutes at a stretch can really begin to hurt. What it needs is a big grip like, say, a Gamecube pad.


So, here's how to make one in about ten minutes. You'll need an old Gamecube pad (please, not a Wavebird), a hacksaw and either a Nintendo tri-point screwdriver (for those who like to do things properly) or a power drill and glue (for me). The TLDR version: hacksaw it in half.


Step one: gut the pad. If you have the screwdriver, unscrew it carefully and remove the insides. If not, drill out all the screws and pull it apart. And voila, one empty pad.


Step two: saw the top in half. I found that cutting straight across exactly through the middle of the D pad suits my hands. Before doing anything else, look at the top (cable exit) side of the bottom half: there are some raised sections. I sanded these down a bit to flatten them off and provide a better rest for the console.



Step 3: screw, or glue, the bottom halves of the handles back into place. And that's it. I was going to add a way to mount the console in place, but actually once you pick the thing up, the two sit quite happily together in your hands.

Stuff the App Store needs to do..

March 23rd, 2013

The iOS App Store really is a brilliant thing. I first learned to program way before internet access was widely available, so the options for sharing my first creations (in STOS Basic, on the Atari ST), amounted to 3.5in floppy disks – today, if you can code something you can easily distribute it to a global audience of millions. It. Is. Brilliant.

But let's not pretend that the whole affair is flawless. Over the past year or two of working with apps I've been mentally compiling a wishlist of 'Stuff the App Store really, really should do better' – I don't expect Apple to care, but since I'm waiting for a 6GB file to download over domestic broadband, here it is. If nothing else, it could be interesting to look back in another two years and see which, if any, have changed.

Free with In-App-Purchases

The whole reason this list popped back into my head today is the news that, finally, Apple seems to be making small inroads to fixing this long time issue. Many developers – my company, and my personal business, included – make use of a model where a free app can be used to offer paid-for content. My work is making magazine apps where the reader, and some articles, are free but others are paid for. My personal apps offer a limited amount of function for free, with a payment unlocking more.

Neither are entirely free, and I'd never claim otherwise, but the App Store marks them with a big 'Free' button, and that annoys some customers who feel they are being misled. It's bad for them, bad for us (ONE STAR), and not exactly beneficial for Apple. It seems that the company is now marking these apps with a note on the web store view – I really hope it can find a way ('Free App'?) to do so in the main store.

Sort out International Subscriptions

The Subscription concept used in Apple's Newsstand is, well, odd. For one there's the fact that subscriptions are mandatory for Newsstand, and the 'Mandatory Free Subscription' concept that allows free-issue publishers to work around that. But more importantly, the in-app subscriptions do not support geography.

By way of example: say I sell a magazine called Unicorns Monthly. People in, say, Narnia buy auto-renewing subscriptions. I then have to remove the app from sale in Narnia (legal letter from an angry lion) – a process Apple makes very simple. What I can't do is stop the in-app subscriptions of my customers there, so they will continue to be billed. They'll keep getting issues for a while, but if a mandatory update is needed it'll be unavialable to them, and they are left with recurring payments for a product they can't use.

It's bonkers. If an app binary is no longer for sale in a given territory, why not make the IAP subscriptions off-sale in that area, too – that would allow app publishers to wind down support properly.

Buy, buy, sell, sell

Here's a big one: you can't move any app from one account to another if the publisher is bought or sold. This isn't just a magazine thing, but it becomes an even bigger pain in the backside when the apps have subscriptions attached. My team produced four magazine apps with significant readerships – when we set up as an independent company, there was no way to take those apps with us.

The best you can do is set up a new app and close the old one, but then there are hundreds or thousands of customers – many of whom you may not even be able to contact, because Apple subscribers have to opt-in to share even an email address – who have paid for a product that disappears. There are strategies for mitigating this problem (essentially, batch importing known users into a separate authentication service for the new app, and notifying old app users of the process), but it's a horror.

Moving apps between accounts must be a pain for Apple. But I'd pay for the service. Big companies would pay a lot.

No API for data

A minor thing, but there's still no official API for getting app sales data – instead you can use the web interface, third party tools (I like AppViz), or set up CRON jobs to run shell scripts that use a Java autoingestion class provided by Apple (I like that too, because I'm a geek). A proper API, though, would allow for more and better analysis tools.


And here's the big one. The current app review mechanism allows angry people to quickly lash out at a developer – sometimes with good reason, sometimes not – and, because happy customers are seldom as vocal as mad ones, pushes developers towards 'Why not rate this app' nag screens in order to get positive feedback on the board. In many cases, angry reviewers could be made happy with just one sentence explaining that, yes, they *can* do what they want, by tapping button X, or whatever – but the developer has no way to contact them.

It's a tough one to fix, of course, but here's my two cents: developers should be able to 'answer' any review, positive or negative, in up to 150 characters. This response would be sent, by email, to the reviewer. After this response, the reviewer would be offered the opportunity to change their review rating. Meanwhile, when an App Store user chooses to download another app, they could be offered the chance – while waiting – to quickly star-rate their last purchases.

Sound fair?

1970s Braun Flip Clock

February 17th, 2013


For reasons unclear, I've coveted a flip clock for some time – and last week I found, via ebay, this unused spare mechanism. Originally made for a Braun Phase II 4924 alarm clock (designed by Dietrich Lubs, circa 1972), it had sat in a spare parts container since then.

The mechanism is rather lovely, with slowly rotating gears, a clever cam mechanism for the alarm and a small light. Sadly it runs from 240V AC, so leaving it open wasn't an option – hence the inexpertly constructed perspex box. Now it sits flipping away under the anglepoise on my desk.

About that EDL Newtown tweet

December 16th, 2012

A note before anything else: I'm no fan of the EDL. I'd be happy to see them disappear entirely from the UK's political discourse, because I think they add nothing of any benefit. But I firmly believe that facts, and fact-checking, are important. So, here's something we should discuss.

The other night, screengrabs started circulating of a pretty disgusting tweet from the EDL about the Newtown attack. The EDL claims that it was faked, and a video was posted online in support of its veracity. Here's a grab:

The video shows a tweet ID of 241922092158143412 in the address bar. If you try to call up that tweet, either via the web or the API, you'll get a not found error.

But here's the thing: tweet IDs are not random or sequential – they're generated by a tool called Snowflake, based on a timestamp. So, in theory, you could decode an ID back to a timestamp. And there's code, here (created by @NGalbreath),that allows you to do just that.

So I decoded the ID. You can see the results here.

The first decode is a test, using my own tweet here. You'll note that the decoded time is two hours out, but with the correct date – I'm assuming this is a time zone issue, as my server is not in the UK.

The second decode is tweet ID 241922092158143412. You'll note that it's from September sometime.

So, this suggests to me one of three possibilities:

A) I've read the tweet ID incorrectly – as I did, in fact, the first time I tried. If so, please let me know (though I see that the Bartholemew's Notes blog has read the same ID), or

B) Either the Snowflake to UTC converter, or my implementation of it, is incorrect*, or

C) The tweet was faked

I'd be very pleased if somebody could reassure me that the correct answer is either 1 or 2, because we really shouldn't have to resort to option 3 when it comes to idiots like the EDL.

* Geeks – I used: echo(gmdate('Y-m-d H:i:s', (snowflake2utc(241922092158143412))));

How To: Install an Xcode Docset in OSX Lion

November 16th, 2012

Good lord, this is a pain. But here's how:

Open Terminal. Run 'sudo bash' to get root access. CD to the root of the disk.

CD Applications/Xcode.app/Contents/Developer/Documentation/Docsets

CP -r (path here)/name.docset ./name.docset

Restart Xcode