A Personal Retrospective

So 2013 was interesting. I bought a flat and then, due to temporary insanity, decided to renovate it while living in it. When I say renovate, I don’t mean just tiling the bathroom (actually still planning to do that) – this was knocking down walls, moving kitchens, and installing new central heating. All while living in one front room. Yep, occasionally I may have lost it a bit.

 

Tick

Yes, yes. No posts for a while. This is because I’m in the process of buying a house. Do you have any idea how time consuming that is for a single bloke? On the plus side I’ve gone well beyond my original aim to just purchase a property this year and have extended it to learning all about rising damp. *sob*

In other news, I have been growing my hair in the hope that it will soon become sentient and can do my job. Or write blog posts. Either will do.

 

Nexus 7 Bluetooth Keyboard and UK Layout

I’ve really been enjoying playing with my Nexus 7 but have discovered a slight problem. I decided to purchase a bluetooth keyboard and so grabbed myself a Perixx PERIBOARD-804. This won out over the Zagg Keys Flex and the Logitech keyboards thanks to compact size, internal USB-rechargeable battery and UK keyboard layout. Unfortunately, while testing this out on the Nexus 7 I discovered that the Nexus doesn’t come with UK keyboard layouts for external keyboards. I haven’t been this annoyed by a keyboard layout since I bought a Mac. Anyway, after a bit of digging around online I found that it’s possible (with root) to upload a custom character mapping for my device to make it work as expected. You can read more about the specs of these files over at the Android Open Source Project.

New Configuration

Two files need to be created to ensure that all the buttons work as expected:

  • A Keyboard Layout which defines which android key code results from a key press.  This lives in /system/usr/keylayout and is named Vendor_<VendorID>_Product_<ProductID>.kl
  • A Key Character Map which defines which android key code produces which character (with modifiers).  This lives in /system/usr/keychars and is named Vendor_<VendorID>_Product_<ProductID>.kcm
Each of these locations contains a Generic.kl/Generic.kcm file that can be used as a template for any changes. These files are used when no other suitable configuration is present so I suggest not editing them directly, or at least backing them up.

Identifying the Device

The VendorID and ProductID in the filenames are used to match the configuration to the specific device.  With the keyboard connected this can be found in a shell (adb or on device) by looking in /proc/bus/input/devices.

shell@android:/ $ cat /proc/bus/input/devices
...
I: Bus=0005 Vendor=04f2 Product=1063 Version=0505
N: Name="Bluetooth Keyboard                   "
P: Phys=10:BF:48:F3:8B:E2
S: Sysfs=/devices/platform/tegra_uart.2/tty/ttyHS2/hci0/hci0:12/input4
U: Uniq=90:7F:61:8E:78:A4
H: Handlers=sysrq event3 keychord
B: PROP=0
B: EV=12001f
B: KEY=4c37fff 72ff32d bf544456 0 0 1 30f90 8b17c007 ffff7bfa d951dfff febeffdf ffefffff ffffffff fffffffe
B: REL=40
B: ABS=101 30000
B: MSC=10
B: LED=1f

Here my Vendor ID is 042f and my Product ID is 1063. Once you’ve created your baseline files by copying (adb pull is your friend) the generic configuration and renaming to match your Vendor & Product IDs you can jump into them and make the changes you require.

Changing Keys

In my case most of the work was in the key character map file (moving quote marks, tilde, etc.) and you may not need to make any changes to the keyboard layout at all. One change I had to make was to support the # key on a UK keyboard (which has the ~ character above it). The generic keyboard layout was sending it as a backslash, along with the actual backslash key. To find which key to change I needed to know the shortcode being sent by the keyboard and for this you can use KeyTest.apk made by Chris Boyle. This app will run and report the short code for all key presses so you can hunt down the one you’re interested in. In my case this meant changing key 43 BACKSLASH to key 43 POUND in my layout file and then putting a corresponding entry in my key character map:

key POUND {
    label:                              '#'
    base:                               '#'
    shift:                              '~'
}

Note that this format for the character map is supported from Android 3.0+ (the Nexus 7 is on 4.1 at the time of writing). It’s worth digging into the documentation to read up on the various modifier keys you can react to. Power users may decide that they want alt characters for all of their keys to produce special characters. The AOSP docs explain a bit more about any escape characters you might need to use in special cases as well as how to represent more exotic characters as unicode code points. Wikipedia should serve to provide a reference for the latter.

Installation

Once you’re done with your new configuration you’ll want to deploy this to your device. I did all of this using adb as follows.

  1. Put my new configuration in two local directories: keylayout and keychars
  2. Create a keyboard folder in the root of your /sdcard partition.
  3. adb push your configuration to the device:
    adb push keylayout /sdcard/keyboard/keylayout
    adb push keychars /sdcard/keyboard/keychars
  4. Launch adb shell and run the following commands:
    su
    mount -o remount rw /system
    cat /sdcard/keyboard/keylayout/Vendor_04f2_Product_1063.kl > /system/usr/keylayout/Vendor_04f2_Product_1063.kl
    cat /sdcard/keyboard/keychars/Vendor_04f2_Product_1063.kcm > /system/usr/keychars/Vendor_04f2_Product_1063.kcm
    chmod 644 /system/usr/keychars/Vendor_04f2_Product_1063.kcm
    chmod 644 /system/usr/keylayout/Vendor_04f2_Product_1063.kl
    reboot
  5. Wait for your device to reboot
  6. Profit

Profit

Voila! You should now have a working keyboard layout for your device! If you’ve also got the Perixx 804 then you can take my configuration files from a repo on GitHub. Please feed back any mistakes you find and shout if you’d like any more layouts uploaded. If I have time I might try to get an app together for installing any configs from git and/or editing these config files on the device.

Troubleshooting

If you’re trying to do this yourself and having difficulty troubleshooting what’s happening, keep an eye on adb logcat when you’re connecting your bluetooth device. A message should appear telling you which layout and character map files are being used. This helped me identify what was failing on my first attempt and I eventually tracked a problem to a duplicate definition for POUND in the character map.

A shout out to this post on the Thrive forums for getting me on the right track.

 

Nexus 7: Tablet Of Win?

I wrote a few paragraphs about the Nexus 7 in response to a post on the internal messageaboard at work and so have reproduced this below. Before mine arrives I’ll write up a bit more about why I’m parking my PlayBook in favour of the Nexus.

I got hands on with one of these last week (they kindly brought some along to I/O Extended) and thought I’d share my impressions. TL;DR: I liked it and have pre-ordered.

Physically it’s a very nice device. Since I got my hands on a PlayBook I’ve started to appreciate the 7″ form factor. It’s a good size for use while commuting (easier when standing in a cramped tube). If you’ve got a PlayBook then the Nexus is slightly smaller (same screen size, but no need for the touch sensitive bezel) and about the same thickness. It is, however, considerably lighter. No amount of holding this is going to wear out your wrist. The device is very port light – headphones, micro-USB and four gold points which I’m told are for some sort of Nexus dock thingy. The back of the device grips well so it should be hard to accidentally drop. Sound quality from the speaker was surprisingly good with the test videos I watched. The screen is beautiful, but did seem to have problems rendering blacks without being washed out. This may have been because the brightness settings were all ramped up, but I didn’t get a chance to play with this. A quick side-by-side with a Galaxy Nexus did make it seem a little too light though. One thing that was the source of much debate amongst those present was the lack of a rear facing camera, but most people carry a smartphone that’ll take this role and the consensus was that trying to take photos with a tablet makes you look foolish (no offence intended … but come on).

Onto the software. Jelly Bean is jolly impressive. I was particularly loving the new expandable notifications. It was hard to really test the effectiveness of the new “cards” while just playing at a table in Campus but I think they’ve got potential, especially once they open them up to developers. Context driven layouts seem to be on the increase at the moment with projects like Chameleon so this feature will likely get more and more focus. I can confirm that the interface is indeed smooth as butter (excuse me while I giggle for a few minutes – I just can’t take Project Butter seriously). The vsync / triple buffering combo seems to work well. The various Google apps have also had a bit of a polish, although at time of testing it seems we’re still out of luck in the UK if you want to use Google Music or the new magazines. I’d hope these will come in with time given the whole Play Store emphasis in the keynote seemed like a massive shot across the bows of Amazon and if Google can get out of the US faster than the book people they’ll have a win.

[In response to those pointing out lack of 3G] I have started thinking more and more about the non-connectedness of the device. I’m leaning towards the conclusion that it’s purely my desire to have allthetoys™ that makes me think it needs to have its own 3G connection. I’ve berated the PlayBook in the past for not having 3G, but the difference between that and the Nexus 7 is that I’ve found most Google made apps (and many of the third party ones) to be very offline tolerant, whereas the PlayBook just seems to give up on being useful if it’s not online. I already regularly use gMail and gReader on my DHD when I’m underground, happy in the knowledge that it’ll sync and catch up once I’m back in a connected world. Google do seem to be acknowledging this use case more and more (I believe the offline Google docs editing & syncing was covered in the I/O day 2 keynote). I think, much like the PlayBook with BB Bridge, the pitch here is that this couples with your smartphone so you can tether through that. I find that to be a bit of a cop out as that’s just adding more drain to my phone battery to have the hotspot enabled, but I’m going to try to look past this. I think this device’ll work just fine with wifi as and when I can get it – time will tell.

Other Thoughts:
– Very glad that Google haven’t done a string replace of $ to £
– Any claims about battery life from Google still need to be validated in action with some standard services running in the background
– For all of you who were wondering, I can confirm that Blinkendroid does work on the Nexus 7: http://www.youtube.com/watch?v=g8b7JL1bBqU

 

Google I/O 2012

Google I/O 2012 starts tomorrow and I’ve taken some time off to attend the I/O Extended event organised by the London GTUG. Foolishly I have made plans for my mornings so I think it’s going to be a couple of heavily caffeinated days to make it through!

I’m honestly not sure what to expect from the keynote. Obviously there are rumours flying around and many “leaks” of the Nexus tablet, but I haven’t yet seen anything that’s going to make me go “yeah, I didn’t see that coming and that looks pretty cool”. Last year that slot was filled by the Android @ Home section so I live in hope that we’re still going to see something I haven’t already heard rumblings about. Or lots of details on Project Glass. Yep, I’ll happily settle for that!

Anyhow, beyond the keynote there are lots of interesting sessions. Might have to try to stream some on the night bus journey home to catch up on the many many clashes!

 

Little Green (Accented) Bag

For a few years I’ve been sporting a Timbuk2 messenger bag.  It’s a really practical bag for carrying all my gadgets if I’m travelling and can comfortably make space for everything from my laptop to my camera and lenses.  Unfortunately it’s not perfect for every situation.  Sometimes I need a smaller and smarter bag to just cart around a laptop, book and a few cables without having to find space for both myself and it on a crowded tube.  Enter the WaterField Designs Muzetto.  I’m lucky to have some awesome friends who clubbed together to buy this for me for my birthday and it arrived this week.  Their website has some good photos and videos to cover the features of the bag, but I’ve included some of my own photos below.  After a week of use I can happily corroborate any of the statements they make about the bag: it’s sturdy, looks (and smells … mmm cow) great and is incredibly comfortable.  It has no problem holding my MacBook Air, charger, a couple of books and assorted pens and cables.  The gold lining genuinely helps when it comes to digging around inside the bag to find that missing micro-USB cable.  It should also be noted that the front pocket is neoprene lined and, while I don’t think it’s designed to do so, perfectly fits the 13″ MacBook Air (obviously this is the 13″ version of the bag).  I don’t really want to do this regularly as it’s a useful pocket for a tablet so this does highlight one of the drawbacks of the bag – there’s no dedicated laptop partition to protect my Air.  Of course this also means that the bag is flexible for when I don’t want to keep my laptop with me.  WaterField recommend getting one of their sleeve cases with the bag but I was surprised at how bulky they looked and I didn’t want to reduce the overall bag space so found an alternative option.

Pros

  • Looks great!  The leather is lovely and will weather well to give the bag more character over time.
  • Well designed.  Just the right number of pockets to throw bits and bobs into.
  • Comfortable.  The bag hangs well and the shoulder strap is comfortable and non-slip.

Cons

  • I’ve become incredibly protective of it in the first week of ownership so rarely put it down!
  • Could do with a thin protector to segregate a laptop from the rest of the bag contents.

So, I mentioned above an alternative option to the WaterField SleeveCase.  The only real requirement was that it should protect the surface of my MacBook from superficial scratches.  I searched around for some basic microfibre cloth sleeves, but couldn’t find quite what I was after.  WaterField actually do a nice looking suede jacket sleeve, but I was too impatient to wait for UK delivery.  Enter the Joli Originals MacBook Air Sleeve.  These simple end-loading sleeves are hand made from felt sandwiched between Italian leather.  They come in a range of colour options and I decided to go with the classic Black & Red combo.  Now, the sleeve itself is great.  It’s a tight fit, but not so tight that you can’t get your MacBook in and out.  It should serve well both as an in-bag protector and a carry case in its own right.  This is a very simple product so there’s not much more to say about the product itself, but it’s worth mentioning the delivery presentation.  On opening the cardboard envelope it was delivered in I was faced with a handwritten thank you note and the sleeve itself beautifully wrapped in illustrated tissue paper.  OK, so that has little value after the initial impression, but it gives me confidence that a lot of care has gone into the making of this product.  See the photos below for more details.

Pros

  • Looks great.  The coloured felt middle shows around the edges of the sleeve, making it easy to spot and identify your sleeve!
  • Well constructed.  The sleeve is a perfect fit and seems solid.
  • Joli seem nice :) The personal touch is really appreciated for a product like this.  I’ll certainly be buying from them again (have my eye on one of their wallets).

Cons

  • None I can see yet.
 

Learning Awesome Cross Stitching

Well, I’m still not smoking and am working on the backlogs of tasks.  Many of my targets are ongoing ones, but I have managed to learn one of my target of “5 new things”.  Cross stitching.  Yep, you heard me right, cross stitching.  OK, so you may be asking a few questions.  Why is probably quite high up the list.  What may indeed help to explain why. How might appear if you’ve managed to get past why and what.  Anyhow, I digress. Let me begin with …

 

Why

To fully explain why I have been cross stitching I’m going to have to walk you through my thought process.  I have a friend from university who I introduced to Buffy back in the day.  She has since developed a full blown Whedon addiction.  Her thirtieth is coming up and someone (not me) came up with the bright idea of making a quilt for her.  Everyone was to contribute a patch.  This prompted the following thoughts:

  1. Crapola.  I’m not creative enough for this.
  2. Maybe I can attach something pre-embroidered to a patch.  I’m sure I’ve seen some Serenity patches before …
  3. Nope.  That’s not going to work.   How about printing, maybe I can find some Whedon based pictures.
  4. But there’s a risk they’ll be low quality on fabric.  What about pixel art?
  5. Aha!  A hit for … no, wait, that’s cross-stitched pixel art.  Hmmm.  How hard could that be?
  6. (2 weeks later) Bloody hell that took a lot of time …

And so my cross stitching skills gain a +1.

What

As mentioned above, I ended up stitching a pixel art pattern.  Etsy to the rescue with an awesome Pixel People pattern of the Buffy gang!  There are a few different Whedon patterns on there – I’ve provided links below – and the Buffy one seemed like an achievable goal.  This pattern is sold as a grid pattern to print along with a list of the coloured thread needed.  The colours are listed for three different common manufacturers of thread so it’s not hard to find a source.  I bought mine online from Sew and So along with needles and an embroidery hoop.  I really can’t recommend the latter more.  While it’s possible to do without, for a beginner it makes life a lot easier and allows you to stop at will with less chance of tangling things up.

The Patterns: Etsy Buffy Pattern  Etsy Dr Horrible Pattern  Etsy Firefly Pattern

And the work:

How

So, seems pretty cool huh?  OK, not so much, but it could make a great gift for someone someday so maybe you want to give it a go.  For my transformation from no-hoper to stitching hero I dug deep into the wonders of the internet for help.  The video below is an excellent five minute introduction to all you need to know to start cross stitching.  It’s worth paying attention to the bit on how to neaten up the back of your cross stitch as that pays off with the flatness of the finished product.

For the additional wording below the pattern I used StitchPoint’s cross stitch writing tool to compose the text and then copied this onto my Buffy character grid.  Easy peasy lemon squeezy.

 

The Thirty Project

Yesterday I turned thirty years of age.  Feels a hell of a lot like 29 to be honest.  Looking back at my twenties, I’m reasonably happy with my achievements.  Graduated from Oxford, wandered my way up Kilimanjaro and started a promising career in the City.  Not too shabby, but I can’t help but feel I could’ve done more with the last decade.  Unfortunately I’m both lazy and easily distracted by new projects, so this year I’ve decided to set myself some goals to try to reach by this time next year.  I’m going to see how much I can work tech into each of these to help achieve my goals.  So, to the list:

  • Drop a waist size.  Nothing like working in London to fatten you up, time to sort that out.  Should give me a good excuse to try out some fitness apps.
  • Write 3 apps.  I’ve got a backlog of ideas and I need to commit them to code.
  • Buy a house.  It’s time.
  • Finish a game backlog.  I have so many games on Steam / PS3 that I’ve never played.  I need to catch up on these so I’m going to go through one platform and clear the backlog before adding anything new.
  • Visit a country I can’t remember.  This may seem like a strange way to phrase this, but I was born in Canada and left when I was very young.  I may choose this year to return.
  • Set up a new site.  I’ve got an idea and I need to actually get it done.
  • Learn 5 new things.  Might be languages, horse riding, another instrument.  I’ll work this out as the year goes on.
  • Quit smoking.  Occasional puff is alright but they’ve been taxed to a ridiculous price in the UK.  Oh, and apparently it’s not healthy or something.
 

Apple Implements Annoying Fake Security

On my way home this evening I read about the Battery Health app for giving information about my MacBook battery.  Sounded like a handy thing to have so I fired up the App Store when I got home and tried to install it.  I say “tried” as no sooner had I entered my Apple ID password as I was faced with this window.

Security Info Window

“Bloody hell”, thought I, “more stupid question/answer pairs to remember.  Well at least they haven’t …. oh no.”  Yes, not only have Apple gone in for the security question theatre but they’ve also gone and implemented a fixed set of questions rather than allowing them to be personalised.  Beyond that they’ve gone for the “trendy” approach of asking non-standard questions.  No “what’s your mother’s maiden name” type questions here.  No, it has to be about your favourite teacher, car, and other such guff.  I’ve copied the options you’re allowed to select from below.

The Fixed Security Questions

Well, this is just bloody brilliant.  Possibly these questions do mean something to you and you can always pick the same answer from your mind, in which case these could be secured more easily than any password by using some social engineering or looking at Facebook.  If, on the other hand, the questions mean nothing to you (and, as I’ve mentioned before, it’s amazing how many idiots implement lists of questions that don’t apply universally) then you’re either going to get stuck every time you have to answer them or you’ll end up writing them down somewhere.  How very very secure.  Maybe you think I’m being a bit over the top in accusing Apple of providing a useless set of questions, so let me ask a simple question.  Given that one fifth of the available questions depend on car ownership, how many people in the world have never owner a car?  Now, as an alternative, how many people don’t know their mother’s maiden name?  While the standard questions one finds in these types of forms have no benefits (or indeed detriments) in terms of security level, at least they do tend to cover a wider range of people.  Better yet, why not offer completely customisable options?  Oh yes, because it’s Apple and Apple knows best.

Unfortunately Apple’s technical support have not been particularly helpful so far, only suggesting I raise a ticket for iTunes feedback.  Well, that doesn’t exactly help me install new software on my Mac or update (say to improve security) existing apps.  Oh well, once again I realise why I absolutely loathe Apple as a software maker.  Love their hardware, hate their systems, hate their policies.

For a good explanation of where this sort of authentication came from and why it’s utterly daft, head over to The Daily WTF to read about Wish-It-Was Two-Factor authentication.

 

Spending Time to Save Time: Automating My Builds

As a one man developer it’s very easy to fall into patterns of bad habits with the development process.  I don’t have a team to worry about, I’m not beholden to any code reviews or quality metrics and it’s just me and my PC, so why go the extra mile to do things right?  Some things have clear benefits and such a small up-front effort requirement that they’re a no brainer.  I have a svn repo running on my NAS and this has saved me many a time – do not underestimate the sinking feeling you will get when you realise the drive that just failed in your PC was the one with your dev environment on it.  Even if you don’t have a seperate server for source control, it may be worth considering a local install and then regular dumps of your repository to external storage.

OK, so that was quite an easy example.  Job done, point justified right?  Well, not quite.  I’d like to share an example of another area where a little bit of upfront effort has made my life easier: automation in the build process.  Now, to be clear, I’m not talking about a full end to end build process / CI here.  At the moment I don’t see the value in that beyond providing me with an excuse to spend money on a server.  Any changes I’m making in code I’ll be immediately deploying to either a simulator or device depending on my current requirement.  There is, however, one key part of my build process that needed some automation and that’s creating art resources.

I’ve written before about the tools I use to create sprites: Inkscape, Blender and TexturePacker Pro (with a splash of Paint.NET) all come together nicely as a toolbox for those who aren’t up to creating graphics by hand.  The thing is, when I want to tweak a sprite, change something completely, add something new or provide assets for multiple resolutions I have to go through a hell of a process to manually deploy this to a build.  Let’s take creating a new menu button as an example:

  1. Create the menu button in Inkscape
  2. Save this somewhere sensible that I’ll find again later
  3. Export the region I want at a scale for the app sizes I want (1080p, 720p, SD, etc.)
  4. Store these exported files somewhere
  5. Open up the texture atlas definitions for each app size and add the new assets
  6. Export the new texture atlases and their indexes and save these somewhere
  7. Copy the new atlases into each project that uses them and rebuild

The process doesn’t differ much for making small changes to existing sprites.  As you can imagine, this results in me looking at to-do items demanding I perform a bit of an art clean-up, sighing and then ignoring them in favour of playing with some new code.  Not a great position to be in. Looking at the above process, there’s clearly a lot of scope for automation and process improvement.  I’ve probably made a lot of things more difficult than they need to be as this was my first project.  Luckily, all of the apps I use come with command line functionality that provides what I need to make my life easier.  By making a few design decisions I now have a three step process:

  1. Create / edit Inkscape / Blender files
  2. Run batch script
  3. Rebuild apps

Nice eh?  To do this I’ve set up my environment in the following way:

  • All projects now look for texture atlases in a root project folder called Resource[X]\textures where the [X] is a number indicating whether the resources are HD or not
  • All Inkscape / Blender files are designed with the assumption of a HD screen to display on and placed in a Textures path within the project directory
  • Sub directories within the Textures path group the texture source files together by theme (uicontrols, menus, decorations)

The batch script (Windows version attached) iterates over each sub-directory and uses Inkscape and Blender to output full resolution PNG exports of each file to a temporary directory, divided up with the same sub-folder structure.  TexturePacker Pro is then used to create an atlas from each of these sub-directories.  This is run three times as TexturePacker Pro will handle reducing the size of the atlases for the different resource sets (I use three multipliers – 1, 0.7 and 0.5).  All that is then left in code is to import the atlases and refer to the textures within by name.  While the process could certainly be made more efficient (by not re-working items with no changes), this isn’t necessary for my personal needs.

If you want to look at the details of the arguments I use on the command line, grab the batch script and take a read.  It’s not amazingly complicated but the effort required to create it more than pays for itself.

The script: generate_svg_to_png