Brian Willis

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

You can find me on and Twitter, 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

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.


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:


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:


…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 = | 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 %}
{{ | date: '%e' }}{{ suffix }}{{ | 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.

Why Does This Product Exist?

Had Apple followed the trend that they’ve established in the last few years, this morning they would have released the iPhone 5S and kept last year’s iPhone 5 around as their lower cost $99 model.

Instead, they decided to release the iPhone 5C - a pointless product which I can’t understand the existence of.

If you gave me a choice between the metal-backed, durable, good looking iPhone 5, and the functionally equivalent but plastic iPhone 5C, I’d stick with the older model.

What purpose does the 5C serve? Sure, it’s a cheaper iPhone, but we’ve had those for years. It comes in a bunch of colours, but people who care about that sort of thing often use cases to achieve the same effect. I know some people like to scoff at cases for uglying things up, but Apple hasn’t been shy about getting into the business of making them alongside their devices, which looks like an endorsement for using them.

I imagine that plastic back is cheaper to produce though, even if it is less nice. Remember all that hoopla about 725 unique glass inlays that were indistinguishable to the naked eye? Yeah, that’ll cost you $100 more now.

In Defence of April Fool’s Day

There’s a culture that has developed on the web. Like any large group of people thrown together in loose association, societal norms have sprung up that dictate what’s considered acceptable behaviour. Over the last few years, April Fool’s Day has evolved into a collective excuse to let our hair down and do something a little silly for a few hours. It’s a pleasant tradition that I get a chuckle out of each year, and I’m sure many of you reading this feel the same way.

This year though, things seem a little different. There’s a cynical attitude being circulated around that April Fool’s is unprofessional or childish or somehow beneath us all.

In my opinion, that way of thinking is a little sad. We shouldn’t allow ourselves to be sucked in by cynicism. We need these cultural touchstones. Depending on where you live in the world Christmas, Hanukkah, or Easter might be a part of your community’s cultural makeup. These events become landmarks in our personal histories that bind us to the people around us and become a part of our identities.

On the web there’s very little that binds us as a community, but April Fool’s Day has become a mostly harmless part of our way of life that we all get to be a part of, and I think that’s a good thing.

Alright, now with that out of the way, go laugh at Google Nose.