Brian Willis

I’m Brian Willis. I create software, read books, and write when I can.

You'll find me on Twitter and Facebook, and occasionally I show up on Hacker News. When it comes to coding, I use GitHub (with which this site is produced) and Stack Overflow when I get stuck.

If you need to get in touch, I’m available at brian@brianwillis.com.

This site is built using the excellent Jekyll blogging engine originally written by Tom Preston-Werner. The whole thing is hosted with GitHub Pages (free of charge I might add, which is awfully kind of them).

The fonts come from the good people at TypeKit (and also the bad people at TypeKit). If you look hard enough you’ll find some JQuery lying around too.

You Don’t Get to Set the Terms

A few months ago, someone I used to work for died. We’d fallen out of touch, as people tend to do given enough inertia and time. She had motor neurone disease, and over the course of a few months it took her ability to talk, and then her ability to function, and then it took her life.

I had no idea she was even sick.

However, thanks to regular status updates on Facebook, many people at her well-attended funeral did.

That, amongst other things, was the straw that broke the camel’s back and brought me back to Facebook. I created an account a few days ago.

This is actually my second time on Facebook. I signed up years ago, but deleted my account after a couple of weeks. I left because the site struck me as a place that turned procrastination into a group activity, and it didn’t make my life better in any meaningful way. It also became another inbox to check, with all the sense of social obligation that goes along with that.

Over the years since, when I read about Facebook’s creepy social experiments and questionable business practices, I’d roll my eyes and feel good about myself for being above all that. I became like one of those smug people who don’t own a television, confident in my own correct choices, and oblivious to how irritating I was to everyone else.

I’m starting to learn that I don’t really get to set the terms on which my relationships operate. If a friend wants to invite fifty people to a party using Facebook invites, it’s a generous and forgiving person that goes out of their way to invite me over email—and it demonstrates a sense of entitlement on my part to demand they go out of their way to do that. It’s gotten to the point where opting out of Facebook is much like refusing to own a phone. There are some people who might be able to pull it off, but I no longer can.

So far the whole Facebook experience hasn’t been great, but I’m not hating it. It seems like once you’ve signed up the default pattern of events is to have a few moments of nostalgia with everyone you lost touch with from high school, then curate your profile to pick the music and movies that best identify you as a person (i.e. provide targeting information for the Facebook advertising team), and then finally rifle through every snapshot you’ve ever posed for to find the very best one to use as your profile picture. Seriously, looking at some of these profile pictures you’d think my friends and family were the most photogenic people on earth.

So convince me it was worth the trouble and go follow me on Facebook.

The World’s Slowest Live Blogger Reviews the Google I/O 2014 Keynote

So I watched the video of Google’s I/O keynote, which has been sanitised to exclude protestors and failing demos.

It opens with some sort of incredible machine inspired contraption that had very little to do with Google, developers, or the keynote itself. I’m kind of baffled as to why they thought this would be a good idea. While I’m at it, I’ll also throw the techno-backed intro video into the cute-but-pointless pile. When you make a video that’s supposed to highlight how awesome Android is, it’s probably not a good idea to give significant screen time to Monument Valley and Flappy Bird, two games that got their start as iOS exclusives.

Thankfully, the presentation gets a lot better from there.

It’s cool to see Google highlighting the number of women in attendance. After last week’s publication of Yahoo’s diversity stats, I’m sure we’ll see more tech companies showing off these kind of numbers.

Material design looks beautiful, and I’m glad to see Google actually settle on a single set of design standards. The demos look clear and futuristic, if a little Windows Phone like. Animated touch feedback on standard UI controls really does look awesome. You’d think it’d be gimicky, but having buttons ripple and checkboxes light up when tapped really does look good. iOS’s super-flat borderless buttons look sterile and joyless by comparison.

I enjoyed the demo of personal unlocking, where a phone can automatically unlock without a passcode when it detects the presence of a paired bluetooth watch nearby. My big concern here: how does the device determine if it’s in a trusted environment? and will users understand the difference between the times their phones ask for passcodes, and the times that they don’t? The presenters made reference to detection using locations, bluetooth devices, and voice prints. I’m curious to see how that’ll work in practice.

The demo of Chrome tabs displayed in the recents view as if they were individual apps looks great. This is yet another example of Google embracing the web while Apple begrudgingly puts up with it. On iOS the web gets it’s own little sandboxed corner, whereas on Android (at least from a UI perspective) web apps look to be first class citizens.

There’s a demo of the Unreal engine running on Android, but they made no reference to what hardware the demo was running on - it could have been an x86-based supercomputer for all we know. In comparison to Apple’s demo of Metal at WWDC, this all seemed a bit suspicious. Having advanced gaming engines run on your platform is great, but it’s all for nothing if the hardware support isn’t there.

There were a few shots across the bow at Apple, aimed squarely at Tim Cook’s remarks about Android at WWDC. “Custom keyboards and widgets—those things happened in Android four to five years ago!”, cue rapturous applause from the crowd. Though “we take security very seriously”, followed by “less than a half a percent of users ever run into any malware issues” seemed a bit defensive.

They announced an SDK for Android Wear, and a few watches to go with it. Twenty bucks says that Apple has no third party developer support for the first year of the iWatch (assuming that they announce one, which many people seem to be treating as fact). The LG G and the Samsung Gear Live watches are a mixture of banal and ugly. The Moto 360 doesn’t look terrible, but it doesn’t look great either.

From here it was demos of Android Auto and Android TV. While all of this looks lovely and vaguely useful, I want to highlight one thing here that represents the biggest difference between developing for Android and developing for Apple platforms. When you’re developing for Apple devices, you make a Mac app, an iPhone app, and an iPad app; and there’s an expectation that you’ll charge for all three (or at least charge separately for Mac/iOS versions). On Android, Google is asking developers to make a single app that works on watches, phones, tablets, chromebook laptops, cars, and TVs. All for one price. That’s a big ask, and I’d argue that it’s the central reason why the third party app ecosystem on Android tablets is so lacklustre. If developers don’t have a financial incentive to make great apps for every form-factor, you’ll find that the only apps that do get made are ones by companies that have alternative financial incentives (Facebook, Yelp, et al.). In order for Android to have a worthwhile app ecosystem, Android users will have to start accepting higher prices for apps that run in all places (not likely), or Google has got to start providing tools to dramatically reduce the cost and complexity of targeting different form factors. Material design goes a small way toward this, but it’s not enough.

Congratulations on making it this far. The presentation wraps up with some new tools available for Google’s cloud infrastructure, and some incredibly uninteresting stuff about big data. The last half hour of the video can be comfortably skipped.

So will I be switching to Android? Probably not, but for the first time Android is a platform that looks like something I could use and love, rather than use and tolerate. In particular when it comes to TVs and phones, Google is really giving Apple a run for their money.

Predictions for 2014

I didn’t do too badly with last year’s set of predictions. Tesla really can’t make the Model S fast enough, and Yahoo really did get it together (go Team Marissa!). While I did guess that the Microsoft Surface would do badly, I never in a million years imagined it would fail in a show-Steve-Ballmer-the-door kind of way. That Kit-Kat name for Android also came out of nowhere.

So, here’s what we have to look forward to in 2014:

Firefox OS hits 1.0, gets some attention amongst the Slashdot crowd, and dies fairly quickly. Android has already gained a lot of traction in the developing world, and Google has a mature operating system and a thriving third-party developer community. Sorry Mozilla, but Google wants this more than you do.

A new CEO takes over at Microsoft. I really have no idea who. I’ll tell you this though - they won’t have an engineering background, they’ll probably have an MBA, and they’ll put the shareholder’s short term interests first. Take that for what you will.

Google Glass goes the way of the Zune. It just isn’t cool to wear a product that’s the target of late night comedy punch lines. Don’t worry though - the underlying technology will stick around, making its way into cars and Android devices.

For some inexplicable reason, Google will continue to push Google Plus. I think at this point we’re really just observing the sunk cost fallacy at work. In many ways it would hurt morale too much to give up on. It’s easier to just keep hoping that it’ll turn into something relevant eventually. Remember how we all thought social services were the next big wave of innovation on the web? Coupled with Facebook’s declining relevance with teenagers, the whole social space seems to be becoming less and less important.

It’s a big year for Apple. They’ll announce something wearable (I don’t want to call it a watch, because telling time will be pretty low on the list of priorities). The Mac will focus on getting smaller with new MacBook Pro models that are thinner and lighter. Conversely iOS devices will get bigger, with a 12 inch iPad Pro and a five inch iPhone.

I finished last year’s post (and the year’s before that) with a prayer that the folks at Valve would get Half Life 3 out the door. The Steam Box is great and all, but what’s it worth without great games? I’m keeping the dream alive, but it’s hard to say for how much longer. Any time now, Mr Newell.

One Man’s Quest to Have His Dates Print Properly in Jekyll

I’m loving Jekyll as a blogging engine. I do not however, love how it formats dates. Outside of a database table, a date should not look like this:

2013-10-04T06:15:00Z

That’s an ISO 8601 date in full Zulu form, in case you were interested.

While we’re at it, dates had better not look like this:

04/10/2013

…because that’s simultaneously ugly and hard to use (quick! tell me which number is the day and which is the month).

This is almost right:

04 October 2013

…because it has an unambiguous month, but that leading zero on the day reminds me of ledgers printed with dot matrix printers, and most irritating of all it’s missing the suffix. Today isn’t “the zero four” of October, it’s “the 4th” and our dates should be written that way.

So we’ve established that we want this:

4th October 2013

The more hasty readers amongst you will have leapt to the conclusion that you can pick the appropriate filters and have all that perfectly formatted goodness just spill out. But no! It’s not that simple! Because Jekyll uses Liquid for filters, which uses strftime for formatting dates, and strftime doesn’t have support for suffixes on dates. I know all this because I raised an issue with the nice people on the Liquid team asking them to add support for suffixes on dates, and they (very politely) said no.

So I was torn. I wasn’t about to go spelunking through the code to strftime to figure out a way to do this. For one thing, it’s written in C and languages without garbage collection are for braver men than me. Also after this many decades of active development I’m sure it’s an incredibly complex and sophisticated beast. I’ve written a small amount of code to handle time zones and it made my brain hurt. I can’t imagine working full time on a project where all you do is wrangle dates.

So I thought about it some more and came up with this:

{% assign day = page.date | date: '%d' %}
{% case day %}
  {% when '01', '21', '31' %}
    {% assign suffix = 'st' %}
  {% when '02', '22' %}
    {% assign suffix = 'nd' %}
  {% when '03', '23' %}
    {% assign suffix = 'rd' %}
  {% else %}
    {% assign suffix = 'th' %}
{% endcase %}
{{ page.date | date: '%e' }}{{ suffix }}{{ page.date | date: ' %B %Y' }}

Update 26th October 2013: Anatol Broder was kind enough to send me a pull request with a much simpler solution, which you can see above.

Yes, I know. This solution is not elegant. It’s a monstrous piece of code which aims to achieve something very simple. It works at the wrong level of abstraction, using Liquid filters when it should be using C. It’s probably hopelessly inefficient.

It does however, have the benefit of actually working.

So if you want pretty dates in your Jekyll blog, copy and paste that into the appropriate place in your templates and you’ll be good to go.

Reeder 2

I’ve been using Reeder for a few years now, but when Google Reader was shut down the the iPad and Mac versions were left out of commission as Silvio Rizzi built support for other back end syncing services. It’s been a great product though, and I’m not really upset about the time it’s taken to get this 2.0 release done. I’d much rather see a polished app done right than a clumsy app done quickly.

Reeder 2 looks very much like an iOS 7 app. If you’re still on iOS 6 the icon looks out of place nestled in amongst gloss, gradients, and drop shadows; but once you’re in the app it feels pretty nice. While using it I couldn’t help being reminded of Vesper. Animations and transitions are smooth and well thought out, even on the dated hardware of my iPhone 41. I’m particularly fond of the little labels that pop up underneath toolbar buttons as you press them. This is a great piece of interaction design that gives you an uncluttered UI without requiring you to you play guess-the-icon.

Reeder's instructions screen on the iPad.

On the first launch of the app you’re presented with a gargantuan list of gestures to learn. For anyone who used the previous version this won’t be a big deal, but for new users I think this will be a major source of pain. Gestures are essential to getting things done in Reeder. Much of the value of the app comes from its ability to get you through your feeds quickly, which you can’t really do effectively without understanding how the gesture system works. You can’t go back to the list that explains all the gestures after you’ve dismissed it - this is your one and only chance to learn how to use Reeder properly. If you miss something, or don’t fully understand what the text is trying to say, then I guess you’re on your own. There are better ways to teach people how to use an app, and presenting a list of stuff that we’re expected to memorize does no one any favours.

Once you get past that hurdle, you’ll find that this version really is easier to use than the one it replaces. Text is bigger and clearer, you can swipe from left-to-right to go back to the previous menu2, you can even grab the title bar and invoke a pull-to-refresh without scrolling back to the top of a list.

Unlike the previous version, Reeder 2 is a universal binary that works on both the iPad and iPhone. The iPad version is a complete rethink of the app, ditching the grid of icons for a multi-column layout similar to how Twitter’s iPad app used to work back when Twitter was run by people who knew what they were doing. You can push columns around with playful springiness and fly through your unread list pretty quickly. Photos take up the full width of the display now, which on a retina display really does look neat.

Reeder displaying an image on the iPad.

My only gripe about the iPad version is the buttons to flick back and forth between posts are now at the bottom of the display rather than the side. When they were on the side you could hold your iPad in both hands, and have the buttons within swinging distance of your thumb. Now you’ve got to grip the device awkwardly every time you want to quickly skip a post.

I know I’ve listed a few complaints here, but Reeder 2 really is a great piece of software, and for five bucks it’s a no-brainer. Go buy it.

  1. I know. I know. I’m upgrading this year, but can’t decide between the Galaxy S4 and the iPhone 5S.

  2. I’m not sure who first came up with the idea to do this. I first saw it in Sparrow, but since then I’ve learnt the iOS music app has it too (even in iOS 6 you can swipe left-to-right on the album art while a song is playing and you’ll go back to the songs list). Either way, it’s a very good idea that’s become a system-wide part of iOS 7.