Thursday, November 03, 2016

Ports

Something about the discussion around the new MacBook Pros' (lack of) ports was bugging me. In particular, this tweet:

Having re-found and re-read it, I realise now that Marco wasn't saying that pre-iMac Macs used PS/2 and parallel ports. Still, it's as good a jumping-off point as any for why I think comparing the MacBook Pro's move to USB-C ports only to the iMac's adoption of USB in 1998 is a false equivalence.

Prior to the iMac, Macs used ADB, serial via mini-DIN and SCSI. These aren't just legacy ports. ADB was a proprietary Apple connection. Serial and SCSI, while industry standards, were the less popular choices in their respective categories. And that, I think, is why they had to go from Jobs' volksputer. At a time when you could pick up a perfectly reasonable serial mouse for £2, replacement ADB mice started from around £20. [I can't find an information about whether you could use serial mice in place of ADB. Even if you could, you'd need a dongle.] The £99 ink jet printers were parallel (and increasingly USB); models with serial interfaces were available, but they were typically the more expensive pro models. And the SCSI variants of external devices generally came at a premium over their parallel or USB counterparts. Adopting USB — unlike dropping the floppy drive — was as much about opening up access to a world of commodity peripherals as it was about ditching dusty old legacy interfaces.

Saturday, January 02, 2016

Things

Last year I worked my first (and probably last) IoT gig. I was brought in to build a prototype of the product's iOS companion app and then asked to work on the firmware for the (still-NDA'd) product itself. It was definitely an experience.

Firstly, working with hardware engineers in very different from working with software engineers. For one thing, their desks are so much messier. They tend to have far more pointy and/or hot tools to hand, and generally do at least one thing each day which could potentially burn down the build.

Product planning also takes on a very different flavour. Brainstorming meetings typically follow this kind of pattern:

SOFTWARE GUY: Here's an idea. Why don't we do [thing involving computing]

HARDWARE GUY: Well, yes, we could. But it would have a detrimental effect on battery life.

SOFTWARE GUY: Then how about we do [another thing involving computing]

HARDWARE GUY: Maybe. But it would mean drawing an extra [ridiculously small amount of power] from the battery.

SOFTWARE GUY: Or we could —

HARDWARE GUY: No. Battery.

SOFTWARE GUY: Okay. Would anyone like a cup of —

HARDWARE GUY: BATTERY!

The hardware guys I worked with were wonderful chaps, utterly boffiny types, but boy were they obsessed with batteries.

My second observation involves embedded toolchains, and how they are utter shit. Seriously. I was never one of those complain-about-Xcode guys, but from now on, I shall stifle even the smallest gripe should it threat to escape my lips. What's that? Xcode's crashed? Well at least it hasn't caused a kernel panic, like MP-fucking-Labs kept doing.

(Or at least that was the plan before I started working with Swift… But that's a story for another day.)

I don't really want to go too in-depth into exactly how shite the MPLabs IDE is. I'm trying to put the whole experience behind me. I won't bitch about how the compiler's a modified version of GCC which they've somehow managed to make worse. Or how Microchip want to charge you money for allowing you to write in C++. Or even C99. I am completely over the stress-induced headaches which come from it optimising-away entire blocks of code I had set breakpoints in, even at the lowest setting (or that the higher settings were a paid upgrade).

Let me just make a single observation about the IDE: it doesn't feature any kind of code autocompletion, but it does spellcheck your comments.

Finally, let's deal with the important stuff: the hardware and software. What OS did we use? Ha! Where we're going, we don't need no OS! Okay, this isn't entirely true. The hardware doesn't require an OS (this is embedded microcontroller programming, after all), but after a couple of months of random flailing around it because quite obvious that I did. My years wasted writing assembly language on the Atari ST hadn't properly prepared me for getting this close to the metal. In the end there was some considerable re-tooling and we settled on FreeRTOS to provide a sheen of civilisation to the otherwise register-level barbarity. Tasks! Queues! If felt like someone who went camping and ended up booking into a hotel as soon as it started raining, but sod it, I was comfortable again.

There was a little concern that adding the decadent excess of an OS would fritter away our limited resources, and I must admit I got caught up in this until the point where a took a step back and realised that the chip in question — based on the 32-bit MIPS M4K core running at 40Mhz — was more powerful then the first half dozen computers I owned combined. Sure, it only had 32k RAM and 256k ROM, but we were only asking it to perform some very basic coordination between peripherals. The hardware they'd used to make Jurassic Park wasn't that much more powerful. We could manage.

I left the project when yet another shift in hardware was on the cards. It seemed like a natural break. I'd been telling them from day one that they would be better served by hiring an embedded specialist, and eventually I just felt I had to make a move and force them to take that step. I would have liked to stay on to see The Thing go into production and onto the market. Imagine: seeing neatly shrink-wrapped boxes containing a product that you helped take from an idea to a finished item, rolling off the production line and onto the shelves. I'm keeping an eye open for when it does.

Friday, January 01, 2016

Rez '16

I know there's really no cosmic significance to the 1st of January, but it's as good a day as any to make a new start.

This year I'm going to write every day. Simple as that. Sure, I have a good idea of what I want to write, a list of stories waiting to come to life and be checked off the list, some pie-in-the-sky dreams of where I want to end up, but let's not overcomplicate things. I spent most of last year with fingers on keyboard — at least 10 hours a day, as a result of the day job — and yet I produced nothing, adding only a few paragraphs to one short story. And that simply isn't good enough.

I've started running again. I'm wondering why I can do that — peel myself out of a lovely toasty bed, dress myself in silly clothes, go out into the freezing morning and stumble about wheezing and red in the face — and yet I'm finding it so difficult to devote even half an hour a day to writing. That's going to have to change.

Thursday, December 31, 2015

TV

I recently treated myself to one of the new AppleTVs. To be honest, I'm kicking myself for not signing up for the Developer pre-release lottery earlier in the year. I didn't because I knew I wouldn't be able to work on anything for launch day, so why risk taking a unit away from a dev who might. (This is also why it takes about half an hour each morning before I can squeeze my way onto a train.)

My initial impressions? I can't say I'm overly impressed. I've had an Amazon Fire TV box for the last year or so, which received a lot of use and which will be my main point of comparison.

The most obvious area where the AppleTV falls down in my opinion is the controller. The touch pad is too imprecise, making even simple navigation difficult. Selection veers off all over the place and trying to enter text becomes a major frustration. The Fire TV's controls are unimaginative but they're all the better for that. They work. When I click to the left or right I can be fairly certain where my selection in the UI will end up. With the AppleTV's touch pad it's a lottery.

Where the AppleTV will in future excel — and I've absolutely no doubt that it will quickly pass both Amazon's and Google's boxes in terms of units sold and users — is with apps. I should really start thinking up some ideas for it.

Tuesday, December 22, 2015

Faulty

I am now 40 years old. I honestly have no idea how this has happened. It feels like only yesterday that I was a stupid teenager wasting his time messing around with computers in his bedroom. I'm still just as stupid, and I still waste my time messing around with computers, but now I've been allowed to do it in the lounge.

This last years generally been pretty damn good, but I'm still left with the aching feeling that I've achieved nothing. None of my pre-forty goals have been met. I really need to step things up next year.

(Queue no further posts for another 12 months…

Friday, January 02, 2015

Rez

This year's resolution: a thing a month. It could be some fiction. It could be a game (I'm going to get into game making this year). It should be something more substantial than a blog post — although doing a few more of those this year wouldn't go amiss. Let's see how many months it takes for me to give up on this one.

Sunday, December 21, 2014

Countdown

Happy birthday to me! (39, in case anyone's keeping count.)

40 still holds a certain psychological significance. Maybe it's a halfway point: 80 should be easily obtainable these days, barring any of the nastier health issues. I can probably look forward to still being active in another 40 years — if not still actively employed. (I really should re-start paying into that pension.)

Nevertheless, I feel a certain amount of pressure to achieve something in the next twelve months. The last year has been a bit of a bust. Professionally I've only managed to reaffirm that I'm not really suited to working with anyone (or that I have a monumentally low threshold for fuckwits). I've hardly written anything, which isn't a great loss because no one is reading anything I've written previously. I haven't worked on any of my own projects either, deciding instead to spend my dwindling spare time working on apps for other people.

I think it's time for some ridiculously optimistic new years resolutions.

Sunday, January 12, 2014

Raspberry Pi iBeacons

I finally got around to playing with iBeacons on the Raspberry Pi today, following this tutorial from The Register. I chose a cheap (£12) Bluetooth LE USB dongle from Amazon, which Raspbian (from NOOBS v1.3.4) found without any problems. Configuration wasn't quite so effortless. I found that the following was a better order of steps once the BlueZ stack had been compiled and installed:

    sudo hciconfig hci0 up       # to ensure that the device was running
    sudo hciconfig hci0 noleadv  # unadvertise
    sudo hciconfig hci0 leadv 3  # readvertise, but as not-connectable
    sudo hcitool -i hci0 cmd ... # etc. etc.

I wrote a quick Python script to automate starting and stopping the beacon. (I'm still only starting to learn Python, so be gentle.)

On the iOS side, it appears to be necessary to set the (poorly-named) .notifyEntryStateOnDisplay property of the CLBeaconRegion instance you're monitoring to YES in order to get beacon entry and exit notifications while the app is active (as apposed to only when the device is sleeping or the app is in the background).

At the moment I have to walk to the far side of my flat in order to get an 'exiting beacon region' message, so I'm going to have to have a play about with the signal strength property. Or get a larger flat.

Saturday, January 11, 2014

Scarce

Reading John Robb's excellent Punk Rock: An Oral History, what struck me from the beginning were the reoccurring tales of the difficulty early fans had in finding information about their new favourite bands, let alone getting hold of their records. Allegiances were formed on the strength of single paragraph reviews in the music press; overnight cross-country pilgrimages were made to see the bands play; the photocopied fanzine was the organ of record. (This was at the grassroots level. The Sex Pistols of course were the brainchild of an arch media manipulator. You had to work hard to avoid hearing about them.)

All of which William Gibson describes far more eloquently in his essay "1977" in Punk: An Aesthetic. He describes the shock of the new upon first seeing a stack of UK fanzines brought back to Toronto. "Today we know what new things look like before we encounter them physically. Usually we know what they'll look like before they even exist." He identifies grunge as the last of the pre-digital counterculture movements, the last to start its slow burn to popularity away from the gaze of a public always hungry for something new.

Even though I grew up in the pre-internet world, I find it hard to image what it would be like to experience such scarcity when nowadays even the most niche form of entertainment is, from its very earliest days, its very inception, only ever a Google away. Rather than fighting to have their voices heard across the great open expanse of culture, these day new experiences struggle to be heard above the cacophonous din of a million competing entertainments. Will the next significant movement benefit by the increase exposure the internet allows? or instead be drowned in a sea of noise?

Friday, January 10, 2014

NIB-Based Xcode iOS Template

I once failed one of those coding test job interviews things because of the changes made while I wasn't looking to Xcode templates. In my defence I hadn't actually needed to create a new project in a while and we'd just moved to a new version of Xcode and so on. The challenge itself wasn't too hard — just grab an XML file from a server, parse it, and then display the results in a table — but by the time I'd beaten the empty project into a shape I recognised most of the time had already slipped away. Ce la vie.

More recently, Xcode has moved to having all new templates use Storyboards by default. Often, this isn't what you want. While there are ways of reverting to the NIB-based templates available in Xcode 4, they aren't quite as simple as all that. Which is why I made this basic NIB-based template, which you can grab from GitHub here. Full installation instructions ("drop it into a folder") are included.

This template isn't a direct clone of the old-style ones, since by default it creates the application window and root view controller in code rather than loading them from a main NIB. What it does do is to create a NIB (or two NIBs, in the case of universal apps) for the root UIViewController subclass. I think this is close enough to the old behaviour for the usual use case of needing a quick test bed for trying something out — for any more substantial projects you're going to want to take the time to configure them by hand anyway. The template inherits (as far as Xcode templates implement inheritance) from Xcode's default iOS template, which means that projects created from it in the future will benefit from whatever (hopefully sane) changes Apple make there.

I was helped to throw this together by this StackOverflow post, and this description of the template format which it linked to.

Friday, October 04, 2013

Coffee

App Store pricing is back in the news again. These lines from Florian Kugler, quoted by Vinny Coyne, caught my attention.

We’re in the business of creating products which offer very little value to people. It’s our choice if that’s what we want to pursue.

No. A million times no. This may be merely splitting semantic hairs, but the idea that the product you create offers little value to your customer is not only wrongheaded but cancerously so. If someone goes to the trouble of downloading and using your product then it must have value for them. The problem is that they perceive it as having little value, in a way taking it for granted. I have lost track of the number of people I work with — people who make their living designing, pitching and managing the production of app — acting shocked and outraged when they discover developers charging for apps. These are people who know how much work goes into the creation of an app, both in terms of time and money. And yet they still treat the final result of all this work as being worthless. The problem of app value is one of perception, and it's a problem which the developer community needs to address.

Sunday, April 21, 2013

UIButton states

UIButton allows you to set difference appearance properties (fore- and background images, title text and colour, and so on) to be displayed according to what state the button is currently in. What to my eternal shame I hadn't realised until the other day is that these states (selected, highlighted and disabled) are not mutually exclusive. This is mentioned in passing in the documentation for the UIControlState enum, but doesn't appear to be emphasised anywhere else. I blame the property-setting UI in Interface Builder for my confusion. It only allows configuration of the four main states, and not for combinations of states.

Misleading.

Combinations of states? Yes. So if you every wanted to set different disabled images for when the button is selected or unselected, you have to do the configuring in code, passing an ORed bitmask of states (such as UIControlStateSelected|UIControlStateDisabled ) to the relevant setter method.

Friday, January 04, 2013

2DO

Since I failed so completely with last year's Big List of Things to Do without suffering any negative repercussions, I thought I'd try again this year with an even longer list. Here we go:

  • Publish the other couple of short stories which I've got almost edited.
  • Start, finish and publish a novella (the one provisionally entitled "This is not a Game").
  • Learn to juggle.
  • Produce a work of interactive fiction (and in the process develop the game engine and tools to allow me to create more).
  • Finish my re-write and iPadification of "Plaques".
  • Write the script for a graphic novel (possibly just a short) and commission someone to draw it for me.
  • Learn to snowboard.
  • Write up the scripts for the couple of animated shorts I have ideas for (and maybe look at finding someone to make them).
  • Learn to sail a boat.
  • Find a form of storytelling which will actually attract readers/viewers (or whatever that particular media's consumers are called).
  • Get the battery in my watch fixed.
  • Consider what it means to be a creator trying to create in the current over-saturated, content-bloated environment.
  • Design and 3D-print something.
  • Enter as many writing competitions as I can find.

Plenty of suitably vague stuff there. I must surely be able to achieve at least one of them, eh?

Monday, December 31, 2012

Recap

In January I scribbled out a short list of writing-related things I'd like to achieve. As the last moments of 2012 trickle away, let's take a look back and see how badly I failed.

  • (Self) Publish two volumes of short stories — Well, I got halfway there, even if at two stories it's only just a collection. I've got another couple of stories almost edited, so I'll see if I can't completely tick this one off next year.
  • Commission a graphic novel — Didn't even come close. The script still needs writing. In typical programmer geek fashion, I think I'm going to have to code myself the ultimate storyboarding iPad app first, before I can settle down to writing the actual story.
  • Complete a full-length script — I'm not sure I even started a script this year.
  • Complete the novel(la) I've been planning — Yeah... Nope. Didn't happen.

So there you have it. Twelve months later and I'm no closer to achieving my writing goals. Time to start work on another list, I think.

Monday, December 17, 2012

Ï€

I've had a Raspberry Pi for a few months now, and to be honest I still don't know what to make of — or indeed with — it. Here are a jumble of my current thoughts.

Running RISCOS is fun. Way back in the distant past when I was at school, the computing lab was populated exclusively with Archimedeses. Compared to the home computers of the day — the Atari STs and Commodore Amigas — these were nice fast machines with a lovely hi-colour GUI. Real Rolls Royce machines. Seeing RISCOS boot in a few seconds on the Pi gives me a real buzz. It's also cool to see it connecting to the internet, given that we didn't have any of that nonsense back when I was in school. It's just a shame that the default web browser doesn't support JavaScript, rendering most of the modern net unfortunately broken.

I wish I could find more to do with RISCOS. But then it's always seems to be the same with me when running a new OS for fun. Without actually needing to get work done with it I'm usually at a loss. I guess if I wanted to risk nostalgia overload I could spend more time running the Hatari ST emulator on it. I'm looking forward to giving BBC Basic a whirl. It would be nice to think that this classic language, on which a good number of the UK's bedroom coders cut their teeth, could step in to fill the Pi's remit of inspiring and empowering the next generation of programmers.

DexOS looks like a fun low-level OS. I haven't got it running yet, but I will one of these weekends. The same goes for Plan 9, which doesn't seem to like my mouse at all. And I'm really looking forward for the day when Android is usable on it, especially if someone figures out how to let it host its own development environment.

Rasbian, the Pi's de facto operating system, however, is slow. Almost unusably so, in my opinion. Maybe this is in part due to running it from an SD Card, but since this is the main configuration for the majority of people you'd think it would've been optimised. Applications are slow to launch and web pages trickle down. Sure, the Pi is "only" a 700Mhz CPU with less than 128Mb of RAM, but I can't be the only person who remembers Linux performing far better than this on much older hardware. Yes, considering you get a complete Linux distribution for free, I really shouldn't be complaining. But the aim of the Pi project is to get kids coding, and I'm not sure whether such a frustrating environment is the best place for that.

The thing with the hardware from the home computer boom of the early 80s — the hardware and the time which the Pi is seeking to hark back to — was the constraints it imposed. Constraints foster creativity, and most of the fun learning to program in those days was in finding the limits of the hardware and pushing against them. You typically only had a choice of a couple of languages (if you had any choice at all, otherwise it was just the built-in BASIC) in which to explore your environment. Learning everything about the machine was possible, and once you had a lot of the fun was in teaching it to perform new tricks. (This kind of limitation, I think, was also partly why the iPhone quickly became popular with hobbyist coders.)

The Raspberry Pi finds itself in an unfortunate position. The hardware, while undoubtedly cheap and mostly capable, is underpowered by the standards of the day. It can run Linux, but not nearly as well as you could on a standard x86 desktop system. The same goes for the available languages and programming environments. Ultimately, the Pi fails to be unique in the way which the home computer systems it tries to ape were.

Sunday, November 04, 2012

First

It's only bloody November again, isn't it? This year I'm not even going to pretend to attempt NaNoWriMo, following my abject failures of the past couple of years. Not that everything's dead in the water on the wordage front. I've finally sorta ticked-off one of the items on my to do list by self-publishing some short stories. I say sorta because, rather than the half dozen or so I initially planned to include, this slim volume contains only two.

The Endless Sleep is available from Amazon here. It's a Kindle exclusive for the moment (until early next year, at least), meaning that it's available to borrow for free to Kindle-owning Amazon Prime customers. I'm doing this for the readers (and feedback) rather than the money, so I'm hoping this is a gamble which will pay off. I'm finding it almost impossible to get motivated to write at the moment, so I'm hoping that this will provide some form of a shot in the arm. Maybe a few 2-star reviews along the lines of "Not quite the worse thing I've ever read". A boy can dream.

I really have to thank my editor, Julia McKay. She can be contacted here and I'm sure can help you like she helped me. Together we fixed a lot of problems. All the remaining ones are due to my own intractable stupidity.

Wednesday, September 19, 2012

Wednesday, September 12, 2012

Clock

Since the electricity was turned off briefly a couple of months ago, it has permanently been --:-- o'clock in my sitting room. Over the weekend I finally resolved to do something about this. Faced with a choice of either Googling the instruction manual for my ancient Philips DVP 3100V combo DVD+Video or just nipping down to Poundland to buy a cheap wall clock, I decided to go with option 3. And so I wrote a simple clock app using Corona and repurposed a 1st generation iPad to run it on.

Oh, the hours I could waste watching those little balls bounce around. It took a bit of fine tuning the trap door to stop them from clogging-up the workings but the current version has been running for a day or so now without grinding to a halt.

I've got a few other ideas I'd like to try out, so I think I'll make changing this clock a regular event.

Xerox

After seeing both the Swedish and US film versions of The Girl with the Dragon Tatoo I felt compelled to find a copy of the book just to read the canonical version of the story. While the two movies where identical in so many respects — almost down to the framing of some shots, which I assume is a testament to the descriptive clarity of the source narrative — there were a couple of notable differences. Was Blomkvists's religious daughter invented by Fincher, or did the Swedes choose to remove her and instead give Lisbeth her pivotal revelation? The remake of Total Recall offers a similar chance to examine what is considered the soul of a story.

Most importantly, Total Recall is a remake of the 1990 film, rather than a further re-imagining of We Can Remember It for You Wholesale. PKD is listed as writer of the original inspiration in IMDb but I can't say I remember seeing his name up on the screen. All that has been kept of his story is the central premis of a spy whose suppressed memories are re-awoken after a visit to Rekall. Mars has been discarded entirely, apart from as a throw-away line.

So what's been brought forward from the Arnie version? The names have been kept the same; we get the same double-tripple-bluff plot; the "this is all a delusion and you're still at Rekall scene" (although minus the neat "So it won't matter if I shoot you then?" resolution of the original); and the pretend wife. In fact, this remake is all about the pretend wife, who is given a more prominent role than Sharon Stone's version. Which I guess makes sense, given that Kate Beckinsale is director Len Wiseman's missus. (We also get a couple of nice references to keep fans of the original happy: there's the three-breasted hooker — which, given the lack of radiation mutants doesn't make much sense here — and a woman bearing the likeness of the exploding-head Arnie decoy in the customs scene.)

In all the film was pretty good. It was played straight, but not in the po-faced way The Dark Knight Rises was. (They bungle the single almost funny line: In response to "That's your wife?" I would have gone with "We're having problems".) Sure, there were some major logical flaws (not least, how about they start by building some robots to build all those other robots?) but on the other hand I could happily watch Kate Beckinsale kick/shoot/jump over things for hours. And once again we see Bill Nighy demonstrating that he's happy to spout any old tosh for cash.

Also, it's fun to imagine that in the original script the only two parts of the world left inhabitable were the UK and France, and that The Fall was originally the Chunnel.

Sunday, August 19, 2012

Nexus 7

In a moment of giddiness following the Android coding introduction I took at iOSDevUK, I ordered a Google Nexus 7. I've had it for a few weeks now (and, no, still haven't written any code for it), so here are a few of my current thoughts regarding it.

The bottom line is that I like it. I like the 7" form factor and I like the Jelly Bean system software. I don't think that, as a whole, it is better than the iPad, but it is definitely better in some ways and overall getting closer. It has replaced the iPad for most of my second-screen needs, and in particular I find it much better for reading eBooks. The screen isn't quite iPad 3 quality, but the difference isn't so great as to be noticeable, and the difference in weight more than makes up for it. (I chiefly use the Kindle app rather than iBooks, meaning that all my purchased books are synced between both devices.)

So... First impressions. Which were terrible. I was greeted by the screen you see below.

Would you look at that? A Michael Bay film (which doesn't actually exist — as all right-thinking people know, there was only ever one Transformers movie made and that stared Orson Welles and Eric Idle) and a Jeffrey Archer book. Seriously, Google, what the hell are you trying to do to me?

Joking aside, the real first impression of the Nexus 7 came from the screen which offered to set up the device with all my Google accounts. I thought I had unchecked this option when I ordered, but there on the first screen was my Google username and a prompt for my password. (Perhaps that was the difference — by unchecking that option, I had to manually start the setup process myself.)

For a lot of people, their first interaction with Jelly Bean will be entering their wifi password. This is the bit where you discover the default keyboard is disappointing compared to the iPad's and that the beep it makes on every key press is incredibly annoying. You can, of course, replace it with a third party keyboard. And here you have both the advantage and disadvantage of Android in a nutshell: the power to configure the system to your liking traded off against a less than optimal default setup.

There is a lot to prefer in Android over iOS. In many places it feels far more of an integrated whole. There are also times when it can be downright baffling. The behaviour of the system-wide back button is one such place. These two are related, as they're to do with the way individual parts of apps can be chained together and called from one another. So for instance, the Facebook app may open a page in Chrome which instantly pulls up the YouTube app to display a video. Hitting the back button will let you work backwards through this stack to return to the Facebook app. Unless you stop to interact with, say, Chrome on your way through, at which point the back button will start working back through Chrome's history. Or something. Like I said: confusing.

I can't really say what the Nexus 7 is like as a tablet, because so many of the apps I've tried are basically the phone version displayed on a large screen — or larger screen, since Android phone screens are already creeping up into the far end of big. The lack of polish is also noticeable, even in big name apps. IMDB is one of the most professional-looking I've tried, and even there the rough edges are evident, such as in the image gallery view, where you swipe the screen to flick between photos. There's no smooth page-to-page scrolling, no smooth transitions, no inertial scrolling through lists — none of the little features which are so easy for iOS developers to implement and which make such a difference to the user experience. In fact, it's sad to say that most of the apps with the best UX are direct un-Android copies of their iOS equivalents.

But in all, and for its price, the Nexus 7 is a great device. Hopefully it will inspire developers to create some great tablet apps to make best use of its features. (And since I would argue that Android tablets are a distinct market to Android phones I hope we will see it becoming worth those developers' time to do so.) I wouldn't recommend anyone get it instead of an iPad, unless they're on a very tight budget, but I'd certainly suggest you take a look at it if you were, for instance, considering a Kindle (or have given up waiting for the Kindle Fire to appear in the UK).