2015 In Review

2015 In Review

It doesn't seem that long ago that I wrote up my 2014 list - but it's obviously far enough in the past that I don't really remember what I was trying to achieve this year, but it's worth a review - even if we are already six weeks into the new year!

The big stuff in my life in 2014 - death, birth, and home renovations - were, relatively speaking, out of mind in 2015. I had no big personal or career changes, but lots of little things.

Here's my notes to my future self on what I did in 2015, and what I want to do in 2016. None of the following is overly exciting, but I want them recorded for my own future reference.

General stuff

  • Got out in the Campervan. Not as much as we wanted, but spent a total of 14 nights away from home in it. Installed a water pump so we have water without manually pumping like the dark ages. Included two trips of 4 nights each, completely off-grid, without drama.
  • Pilates has kept me away from the physiotherapist - except for when I busted my knee over-training for the half marathon
  • Built a bigger vegetable patch and got some chickens.
  • Bought a 4x4 to tow our campervan - does a much better job than my Subaru!


Gosh they change quickly, every week brings Below are a couple of stand-out memories for me from the past year:

  • Watched our 3 (now 4) year old move into swimming lessons by himself rather than swimming with Lauren or I. Incredibly satisfying to watch him swim laps of the little swim school pool
  • Played video games (on a TV, rather than his iPad educational stuff) with Mr 4 and had a ball. Super Nintendo classics from my childhood (on my original SNES console, not an emulator!) including Donkey Kong Country and Mario Kart as well as Apple TV newcomers like Crossy Road were a real hit.



Since mid-2014 I've been entrenched in two of Melbourne's horse racing clubs working on CRM projects for managing their members and raceday events. It's been interesting, but I'd be lying if I didn't look forward to a project in a new industry.

Both of those clubs "went live" with their new CRM systems with relative success, and both provided their own challenges: most of our projects tend to be back-office systems that don't directly interact with the public at large, so having the pressure of thousands of members of the public trying to scan tickets into a racecourse was a new experience for me.

Due to re-prioritisation of my time I've done pretty much no open-source work, nor have I spent much time on WhisperGifts. Both continue to tick along.

2015 Goals

Based on what I hoped at this time last year I've done OK, but missed a couple of targets.

  • Run twice a week, including three parkruns a month: I ran 90 days in 2015 (including an 11-day streak in December), so not quite twice a week. I've also only done 9 parkruns, not even once a month. I think my overall running is acceptable, though.
  • Complete a 10km run. Smashed it, multiple times - and then went on to run 21.1km!
  • Spend 30 nights in the Campervan, including 5+ nights off the grid in one trip We did half of these nights - and two 4-nighters. Needs work.
  • Meditate Daily, or at least twice a week. Fail. Didn't meditate even once.

2016 goals

  • Spend much, much more time with my wife and kids.
  • Build another vegetable patch, and finish re-landscaping the front yard
  • Continue running.
    • Finish three half-marathons, with at least one under 1:40:00.
    • Get my 10K pace to below 50 minutes (hopefully this "just happens" by focussing on the 21.1k distance)
    • Great Ocean Road half marathon, Run Melbourne Half Marathon, and Melbourne Marathon Half Marathon events are on my calendar.
  • Spend 30+ nights in the campervan, most of them off-grid, with a 5+ night off-grid trip

Photo: Morning mist at Sheepyard Flat campground, in October 2015

Run Melbourne 2015 - My First Half Marathon

Run Melbourne 2015 - My First Half Marathon

Half Marathon is a pretty stupid name for an event. Those in the know are suitably impressed at the ability of the athlete1 to run for 21.1km (13.1 freedom kilometers2), but everyone else wants to know why you're only running half a race.

I started running early in 2014 after 30 years of a pretty sedentary lifestyle. It only took a couple of months but a friend and I got to the point where we could regularly run 4-5km without any serious side effects. I finished Run For the Kids 5.4km in March 2014 and again in March 2015, but not much else. Something spurred me on to run the Beechworth Fun Run, a hilly 10k held over the Easter weekend in April 2015. It was the farthest I'd even run, and I finished in 57 minutes (with a couple of stints of walking - I got a bit enthusiastic running up out of the scenic Beechworth Gorge).

That led to my sister suggesting that if I could do a hilly 10k run, I could do a flat 21.1k "easily"... It turns out that while it wasn't overly easy, it's certainly possible: Two weeks ago I finished the Run Melbourne Half Marathon in 1 hour, 59 minutes, 40 seconds. 20 seconds shy of my target pace.

The run wasn't only about proving to myself that I could run that far.

After the shocking earthquake in Nepal in April 2015, my wife and I had wanted to organise a fundraising ball to raise money to help out how we could. We chose the Australian Himalayan Foundation as our charity of choice, found a venue, and built a website - but unfortunately circumstances dictated that we couldn't push ahead with the event in the timeframe where it would have been most useful.

To continue to do my bit for the people of Nepal, I decided to fundraise for the AHF as part of my Run Melbourne campaign. Using the ubiquitous Everyday Hero I set up a fundraising page named Ross Runs For Nepal and solicited donations from friends and family using Facebook and in-person guilting. Everyday Hero and their ilk have done a good job of simplifying this process, and I was able to raise $469 for the AHF by the time I started my run - funds boosted nicely by my promise to personally match every donation received before the run. Some generous donations afterwards brings my total at time of publishing to $626.50, which I'm incredibly happy with.

My training hadn't been ideal. I suffered a batch of episodes of Benign positional vertigo about 6 weeks before the race, followed by a headcold. We then got a bout of unseasonally cold weather that made me, a big softie, stay inside. All up I missed 3 of my long runs and a handful of speedwork / quality runs.

Regardless, I was mentally ready to run - until I went out with the Ballarat parkrun crew for a comfy (but cold, being Ballarat in July) 5k run while we were staying in town with some friends of ours. The run went great 3 but then I started getting pain - a lot of pain - on the outside of my knee. A trip to the physio quickly diagnosed Iliotibial band syndrome, a relatively common disorder in runners. In my case it's caused by weak legs - so there will be plenty of squats, lunges, and leg presses in my future.

A Pilates session, some acupuncture, some smart taping, and fistfuls of ibuprofen got me to the start line and, somehow, to the finish line. I walked for a total of maybe 300 meters, I managed to change my shirt4 whilst running, and I even managed to show some excitement when my wife took a photo at the 20.5km mark.

Best of all I've shown myself that I can do this, even with an injured leg. I'm going to recover properly (as I write I'm about to head to the physiotherapist. Again.) and get back into training for another half marathon, sometime before the end of the year.

And by then, I'll have figured out the right answer to "Why are you only running half a race?".

Photos: The pre-dawn starting line at The Age Run Melbourne, Sunday 26th July 2015, by Ross Poulton. Ross shows medal and hides pain, by Lauren Poulton

  1. Yeah, athlete is a pretty loose term when you're talking about a guy who runs a just-sub-2-hour half marathon. Sounds better than "runner", though. 

  2. Known to North Americans as "miles", for some reason 

  3. I almost set a 5k PB! That's not meant to happen a week before a big race... it speaks volumes about the dead-flat Ballarat course versus our slightly-undulating course at home in Diamond Creek 

  4. Yep. I'd misjudged the weather forecast and started with a long-sleeved running shirt and my race shirt on... by the 5km mark I was too warm, so whilst running removed my race shirt, removed my long shirt, and put my race shirt back on. I dumped the long-sleeve shirt at the next kilometer flag, to be donated to charity. I hope they can wash it first. 

Nice UX Touch from Dropbox

Nice UX Touch from Dropbox

This afternoon I tidied up my Dropbox account a little bit - I removed a folder with 80gb of photos I no longer needed stored there (they're backed up in a few other locations) and disconnected some old computers and phones that should no longer have access to my Dropbox.

When I later visited their Help page, I was prompted with two warnings. One, shown above, asks if I need help re-linking a computer I've recently unlinked. The other message said that I'd recently deleted over 500 files - would I like help un-deleting them?

What a nice touch, and a great way to deal with support issues before they arise. Dropbox is easily one of my favourite bits of software — I use it all day, every day, without even thinking about it.

(If you want to sign up to Dropbox, you should use my referral link. You'll get an extra 500mb of storage, and I'll get an extra gig)

Song Exploder: The story of "The Commander Thinks Aloud", by The Long Winters

Song Exploder: The story of "The Commander Thinks Aloud", by The Long Winters

From Episode 28 of the Song Exploder podcast - The Commander Thinks Aloud by The Long Winters:

On February 1st, 2003, the Space Shuttle Columbia broke apart while reentering the earth’s atmosphere. John Roderick, singer and songwriter of The Long Winters, wrote “The Commander Thinks Aloud” about that fateful moment.

Even after listening to numerous Roderick on the Line episodes I hadn't heard of The Long Winters until recently, and I've really enjoyed listening to their back catalogue.

This particular track, though, I came across by accident thanks to the Song Exploder podcast. It's helped, I think, by Roderick's fantastic storytelling, but hearing that almost magical drum track in isolation makes my inner music nerd (no matter how small said nerd is) rather happy.

Just wait for the lump in your throat - was that something in my eye? - when you hear that crew compartment line over and over again.



I've been using the Moves app for a little while to have a bit of fun with recording where I visit, when, and how I get around. At this stage I don't know exactly what I'll do with the data, but I've just come accross the Hello-O-Scope, a project of Halftone, that takes the Moves data and nicely maps it. Transit, running, and cycling lines show with higher intensity when they're more regularly used.

The image above is taken from my last few weeks of activity - I can't wait to see what this looks like after a few months or even a year.

The Benefits of a Lunch Hour Walk

The Benefits of a Lunch Hour Walk

The New York Times, on The Benefits of a Lunch Hour Walk:

A new study finds that even gentle lunchtime strolls can perceptibly — and immediately — buoy people’s moods and ability to handle stress at work.


On the afternoons after a lunchtime stroll, walkers said they felt considerably more enthusiastic, less tense, and generally more relaxed and able to cope than on afternoons when they hadn’t walked and even compared with their own moods from a morning before a walk.

I've been a long-term fan of the lunchtime walk. Sometimes it's as simple as walking 10 minutes to get a sandwich, and when time permits it's 30-45 minutes with a brief lunch stop along the way.

My mid-afternoon productivity is severely lacking if I don't get even a short walk at lunchtime - and my back pain during the week becomes unbearable if I miss a few walks.

A short lunchtime walk is a critical part of my being able to contribute to society.

Self-Hosted Server Status Page with Uptime Robot, S3, and Upscuits

For quite a while I've had a public "Status" page online for WhisperGifts via Pingdom. It basically just shows uptime over the past few days, but given my site is relatively low-volume and not ovely critical to my customers, the $10/month for Pingdom was actually one of my largest expenses after hosting.

So, I started looking for an alternative.

Today I re-deployed the WhisperGifts Status Page using a combination of Uptime Robot, Upscuits and Amazon S3.

In short, I have Uptime Robot checking the uptime of my site (including it's subsites, such as the admin and user pages). The statistics are gathered and presented by Upscuits, which is entirely client-side JavaScript hosted on S3.

My basic todo list for next time:

  1. Sign up for Uptime Robot. I'd been using them for ages on their Free plan as a backup to Pingdom; this gives 5-minute checks. Their paid plan gives 1-minute resolution.
  2. Add your sites, make sure they're being monitored correct.
  3. On the Uptime Robot dashboard, click My Settings. Open the section labelled Monitor-Specific API Keys and search for your Monitor. Copy the API key to a text file for later; repeat this step for subsequent monitors you want to include on your status page.
  4. Download the latest Upscuits release to your PC.
  5. In the public folder of the upscuits package, rename config.example.js to config.js. Paste your API key(s) inside it.
  6. Create an AWS bucket called eg status.mysite.com and enable website mode. Setup your DNS etc to point to this bucket.
  7. Upload the contents of public/ to your AWS bucket
  8. Visit your new status page and view your last 12 months of Uptime Robot statistics
  9. Close your Pingdom account saving $10 a month Profit!

For a small site like mine this has a couple of obvious benefits. It's free (or $4.50/month if you want higher resolution - still half the price of the most basic Pingdom plan); it uses a tiny amount of S3 storage which is as good as free, and doesn't involve running any server-side code. The included index.html is also easily customisable if you like, since it's just plain HTML (using the Bootstrap framework, by default). This is a big win over hosted solutions, IMO.

How I use HuffDuffer as "Instapaper for Audio"

I like to listen to podcasts. There's the big names I listen to such as This American Life, their spinoff Serial, and Radiolab - but I also like listening to ad-hoc pieces of audio that I come across without subscribing to a whole podcast feed.

For a while now I've been doing this with Huffduffer. Huffduffer lets me have my own personal "podcast" feed made of individual audio files. In a way it's like Instapaper (another favourite of mine for collecting articles to read) but for listening.

I use the official Huffduffer Chrome extension. Whenever I come across a page with a link to an MP3 I want to listen to later, I hit the little Huffduffer 'hand' and the details are saved to my Huffduffer feed.

In my Podcast player (I use and like Overcast) I manually subscribe to my feed. It's at https://huffduffer.com/username/rss. Then, whenever I 'Huffduff' some audio, it appears as a podcast episode in Overcast.

A few places I've used this recently:

I've no idea if this is how Huffduffer is intended to be used, but it's bloody useful.

2014 In Review

What a year 2014 was. I know we're already a week into the new year, but there's a few things I wanted to list out - however terse some items are - so at least I can tell in the future what happened, when.

I won't go into details for most of these items, but it's safe to say I had a busy year.


  • In March, our second son was born. At four, our family is now complete.
  • Spent much of the early part of 2014 coming to grips with the loss of my father
  • On the last day of 2014, my uncle lost his battle with brain cancer.
  • Bought a Campervan, and enjoyed a bunch of fun trips away with my family. It's like camping, but with a fridge.
  • Took up running and improved my 5K time from almost 7 minutes per Km to around 5:25 per Km. We have a parkrun near home which I've only managed to get to once. I entered my first big event, the Run Melbourne and had a very respectible 5km time.
  • Did a better job with my diet and dropped 5 kilograms and two inches off my waist.
  • Renovated our house and made it a much nicer place for us to spend time
    • Replaced the entire kitchen, plus laundry cabinets
    • Re-tiled the floor
    • Painted everywhere
    • Block-out blinds to all bedrooms
    • Other minor stuff
  • Became Zoo Members and visited on two consecutive Christmases
  • Built my first Lego kit with my eldest son (he loves Duplo, and got some Lego for Christmas. His 3 year old patience isn't quite ready yet)
  • Tried meditating a bunch of times, particularly when I was struggling with various issues. It was peaceful and satisfying, and I'm not sure why I haven't done it more.
  • Took up Pilates to help deal with ongoing back pain. It's working bloody well.


2014 was a good year for projects at work. I've been fully booked and had a couple of nice milestones.

My day job is going well and I'm really enjoying it. Client relationships are better than previously and I'm getting really good feedback. That really makes work more enjoyable!

  • January: Completed a large project; the first I'd been pretty much solely responsible for from start to finish.
  • Mid-year: Worked with a large Charity, again solo from start to finish.
  • Since July: Things are going very well with one of Melbourne's racing clubs. The client is very happy and my co-workers have been fantastic, although being on-site by myself gets lonely after a while.

Work outside "work" was quiet this year and wasn't a major focus of mine. My open source contributions are way down, but projects like django-helpdesk continue to get good community input.

WhisperGifts is doing well. We've done some minor redesign work and added nice new features. It isn't making me rich, but people get real value from it and I see more paid users than free users (excluding those who sign up for free but don't go on to use it)


Right now my 2015 goals are relatively simple. The work on our house is pretty much complete and I need to spend more time with my kids and focusing on my mental and physical health. So I have just four things I will push hard to achieve:

  • Get back into running. At least 2 runs a week, including a 5K Parkrun at least three Saturdays a month.
  • Complete a 10km run.
  • Spend at least 30 nights away from home in the Campervan, including a trip with 5+ nights off the grid.
  • Meditate. Daily would be nice but I'll be very happy with 10 minutes twice a week.

I'm excited. Early 2014 was somewhat tumultuous, but things have settled down now and I'm ready for a happy and peaceful year ahead.

Being a Problem Solver

David Cramer, in Be a Problem Solver

For me the best thing that happened to our generation was Google. Not necessarily Google itself, but the idea of search. The Internet is a sprawling amount of unstructured information, and products like Google Search empower people like myself to solve problems they have little to no experience in.

My days are split into two kinds of categories: ones where I know what I need to do, and ones where everything is burning to the ground. Tools like search allow me to deal with that rain of fire.

Do you remember how to configure HSTS in Nginx off the top of your head? I intentionally don’t. A quick Google will give me a link to Stack Overflow or some random blog post, both of which will happily give me the answer. I don’t need to maintain that knowledge, because the Internet is doing it for me.


In the past I've under appreciated people who are willing to answer questions themselves [...] most notably how someone with context and knowledge can be fairly effective until they hit an issue in unexplored territory.

Spend a few extra minutes looking for an answer. Be open to asking questions on various mediums (Stack Overflow, Twitter, IRC). Literally type in “How do I [X]” into Google. Be surprised at how easy things get.

I couldn't agree more. Here's the first line of my bio, at rossp.org:

My name is Ross Poulton. I'm 30-something, and I'm a problem solver.

If you know how to troubleshoot, and you know how to be a problem solver, then your product-specific training quickly becomes less relevant.

Having an awareness of how something works - understanding the broad pieces that you are working with and their relationships, as opposed to knowing exactly how it works - makes it so much easier to know what to search for when something goes wrong. There's nothing wrong with Googling your way out of situations that are rare or unexpected.

It's one of the reasons I want my kids to grow up knowing how to do basic computer programming and how to build things with their own hands. When they come across something that doesn't work, even if they don't know exactly what's wrong they'll have the knowledge to perform some troubleshooting or testing (be it on a computer, in their car, or fixing a cabinet hinge in the kitchen), they'll be able to search the web for answers with confidence, and be more likely to fix it themselves.

Serial: We're listeners, not detectives

I love listening to Serial, the podcast you've already heard about where This American Life journalist Sarah Koenig revisits the 15-year-old murder case of Hae Min Lee, uncovering details week by week. Today in The Guardian, Jon Ronson, published an exclusive interview with the family of Adnan Syed, the man convicted of Lee's murder.

Serial: The Syed family on their pain and the ‘five million detectives trying to work out if Adnan is a psychopath’*:

Then came the conviction, and the family fell apart. Tanveer vanished to Philadelphia, becoming totally estranged from the family. “Imagine having a family one day, and the next day you wake up and it’s completely broken,” Yusuf says. “It’s all gone.”

And then came the Serial podcast. And suddenly people have started running up to the family with tears in their eyes.

People listening to the podcast are trying to crack the case themselves.

This article (both the article and the behaviour it talks about) make me uncomfortable. We must take Serial as the entertainment that it is. Koenig is doing a spectacular job of telling the story to us, the listener, but we need to remember that our job is as listeners. We're listening to Koenig's perspective on this story (albeit a very thoroughly researched perspective), and we have never been invited to get involved and start doing our own interviews with the people close to the crime.

When the general public or the press start contacting the family of Lee, a murder victim, or the Syed family (reminder: Adnan Syed is still a convicted murderer, no matter your opinion based on Serial), a line has been crossed. These families have been trying to rebuild their lives for the past decade and a half, and having every news outlet and amateur sleuth on the internet knocking on their door is not going to help their personal circumstances.

“I haven’t told Sarah this,” Yusuf [Syed] says, “but we feel Serial has brought us all back together. My older brother Tanveer – who was estranged for 15 years – he came home. When he heard my brother’s voice, it brought back all the memories. He’s visited us three or four times already.”

Hidden towards the end of Ronson's article in The Guardian, this snippet gave me a glimmer of hope that Serial isn't entirely bad for those close to the horrific events of 1999. However this is only one family; based on a verified posting on Reddit, Hae Min Lee's family aren't so happy with their new-found fame - and I'm sure the public sympathy towards the man convicted of their daughters' murder doesn't help.

If Syed is innocent, or if the podcast raises enough doubt in the minds of the US justice system that a retrial or appeal occurs, then it's pretty easy to justify the additional press coverage of these families... and I'd hope that nobody would begrudge a retrial, if there was sufficient evidence that Syed might be innocent.

Until then, the friends and family of Hae Min Lee and Adnan Syed need to be left alone. Enjoy the show, but don't do further harm to those who have already suffered enough.

Please Offer An Excel Export Option

Evan Miller, writing in Please Offer An Excel Export Option:

Data is ultimately meant to be consumed by people. This may come as a shock, but most people are not computer programmers. They are not going to read your CSV with Python and process it with Pandas or Numpy. They are not versed in the libcsv API, nor do they possess ambitions to convert your CSV to JSON in order to build a web mashup. Of the grammar of graphics, they know nothing.

In all likelihood they are going to open your CSV file in Microsoft Excel 2004, or if you're lucky Microsoft Excel 2007, and they are going to spend hours building pixelated pie charts, bar charts, and 3D line graphs. You might not use Excel to analyze data, but they almost certainly will. So why not accommodate their intentions as well as you can? Isn't programming fundamentally about helping users achieve their goals?

But it isn't just human-readable files that can benefit from being in Excel over CSV. Over the last few years I've come to loathe the CSV format. Sure, they're "portable", but there are so many flaws that I never feel I can truly trust the data coming out of them. A list that nicely sums up a bunch of the challenges I regularly face with CSV files (or poorly built spreadsheets) can be found in Releasing data or statistics in spreadsheets, including these gems:

5 . Numbers should just be numbers. Don’t put commas in them, or stars after them, or anything else.

7 . Don’t use colour or other stylistic cues to encode information

Much of my day job involves migrating data from one line-of-business application to another. If the data is available in a raw SQL database I know I'm going to have a relatively easy time — but much of the migration tasks I work on involve exporting data to CSV files then trying to import them at the other end. The problem is, every system has it's own crappy definition of things like line-breaks inside cells, relational data, writing or reading numbers, and handling of non-ASCII characters.

For better or worse, I often print very small subsets of data when I'm trying to determine how to best process and manipulate it. I do this in table form, often on an A3 page, and then scribble all over it to identify what goes where. It's amazing how many carefully-prepared spreadsheets fail the simple black-and-white printer test due to important information being encoded in coloured text or varying shades of background fill.

I'll read the data directly from the source database whenever I can, but for all other cases an Excel file is a great deal nicer than CSV files - which should be used for only the simplest and tightly-defined of datasets.

Kano - Make a Computer


Kano is a computer you build and code yourself. Lego simple, Raspberry Pi powerful, and hugely fun.

US$149.99, free shipping worldwide.

I really wish my kids were a bit older - this is exactly the sort of thing I cannot wait to use to introduce them to computers. Not just "computers", as such, but computing. How they work, what the components are, what can be changed, how you make them work, and how you fix them when they break.

(Found via a passing comment in Turning This Car Around - the podcast I pretend to listen to for parenting chat, but it's this nerdy shit that really gets me)

What's New With WhisperGifts

In the past couple of months I've done some fun and interesting stuff over at WhisperGifts, my side project that lets couples put their bridal gift registry online. It's all built with Django, so I thought I'd share a few neat things I've come across along the way.

Bookmarket and image detection

For a while I've had a bookmarklet to add any item to your registry, which basically took the page title, selected text (or meta description), and URL and pre-filled the Add Item form. Recently, I updated it to also find the largest image on the page, and add that as the default image for the item you selected.

This makes it pretty quick to add an item from, for example, an Amazon page or a manufacturer's website. The code to do it was surprisingly simple. Apologies for the short variable names; this is taken directly from my bookmarklet code so brevity is a plus in that scenario.

var ims=document.getElementsByTagName('img');
var imsMxD=0;
var im='';
    var xDim=parseFloat(ims[x].width)*parseFloat(ims[x].height);

This will give me a variable, im, which contains the URL of the largest image on the page. I then pass this to the form to pre-populate the image field. It's a really easy way to find the largest image on the page (in this case, taken as the largest surface area) and then do something useful with it.

Updated HTML and Pricing

I rebuilt WhisperGifts marketing site and dashboard using Bootstrap. The visual design is identical to the previous design, but it's now responsive. Making this change only took a few hours of effort, and saved me from trying to retrofit responsive utilities into my existing layout. It also gave me a chance to clean up my Django templates a bit.

At the same time, I changed the default template that my customers get to be much nicer than the black and white default I previously used. Pricing also got simplified; I took out both the cheap and expensive paid options and kept a single paid plan for $29. The pricing page is much simpler as a result.


For something a bit different, I installed and set up restless to get a REST API for some parts of the WhisperGifts site. For a while I've wanted to play around with some mobile client development, and a proper API will make that a bit easier. It's only just been announced and given the site's audience I am not expecting a huge amount of use, but it was an interesting project to undertake regardless.

This might also lead me to mess around with a single-page JavaScript app that can consume the API (specifically for the user dashboard side of things) but who knows when!

Weather lookups

If a WhisperGifts user has added the address of their wedding to their registry page, I use that address to do hyperlocal weather lookups using Forecast.io. I'm using python-forecastio, which makes the interesting part of this only a few lines of code:

forecast_result = forecastio.load_forecast(settings.FORECASTIO_API_KEY, lat, lng, time=registry.weddingdate)
weather = forecast_result.currently()
w_temp = weather.d.get('temperature', None)
w_summ = weather.d.get('summary', None)

if w_temp is not None and w_summ is not None:
    registry.weather = "%s, %s&deg;" % (w_summ, w_temp) # Results in "Partly cloudy, 19°".

I can then show this on the couple's registry page and use it in reminder emails sent to guests. At the moment I do these lookups daily for any registry that's within the next month; so far Forecast.io has weather details for 30 days out for most locations which is rather amazing.

None of these are specific to the wedding business, but it's been a fun way to play around with a few pieces of tech that haven't really fit into any other project so far.

Clothes For Tall Men

I'm a tall guy. I don't have great fashion sense, but I'm aware that most mens clothes in most stores do not fit me at all. Over the years I have struggled to find clothes that fit me well, so I thought I'd chronicle some recent discoveries in the hope that other tall gents find clothes that better fit them, too.

To give you an idea of what I am looking for with clothes: By day I am customer facing in a professional services role. This means a suit and shirt (or, at the very least, a shirt and nice trousers) five days a week, with jeans & t-shirts the rest of the time.

I'm taller than most, at 6'4" (193cm), and I weigh approx 85kg (195lbs)1. My arms and legs are longer than usual. Most "L" size clothes here in Australia fit around my body OK (occasionally being a little tight) but are always too short in the arms and legs.

I'm a 34" (86cm) waist, recently down from a 36" (91.5cm). Most brands have the same leg length for these two waist sizes, which is also too short for me.2 It's safe to say that buying any clothes off the rack without trying them on first will be unsuccessful.

So there you go. You've got my details. What clothes fit?

Casual Clothes

I find that most short-sleeved shirts and t-shirts fit me OK. For long-sleeved tshirts I've had particular luck with:

  • XXL Merino T-Shirts from Kathmandu. These are slim fitting, hence the XXL. As usual with Kathmandu, retail price is extortionate but then things suddenly become $20 on sale. Kathmandu have ruined the Australian outdoor clothing marketplace, but I can't walk past $20 merino.
  • XXL Cotton T-Shirts from Sherpa Adventure Gear, including a long-sleeved version of their Hero tee which I wear quite a bit. The Sherpa people are small, so again I need a larger size. These are difficult to find in Australia, I recommend the $2500 option which includes a flight to Nepal from Melbourne, and a two-week trek. The Sherpa Adventure Gear store in Namche Bazzar is great. It's also a rough mountain flight and two-day walk from the nearest city.
  • Element, being a skater brand, has a bunch of styles that are longer or baggier than usual. A Large will therefore fit OK; mileage varies drastically though.

I've had success with some Sportscraft and Esprit long-sleeved shirts, but most "casual" shirt styles just don't fit me.

Casual Pants and Jeans

  • Industrie pants seem to be slightly longer than usual, as are Sportscraft. Try them on first, expect to pay $100 per pair.
  • Jeans West are magical. They sell Standard, Long, and Extra-Long jeans in most styles. Their Extra-Long come unhemmed with an absurdly long 38" leg length; take them to your favourite aunt or alteration shop to get them finished to the perfect length. I actually find their "Long" jeans usually fit me alright, and they're available in-store without needing adjustment. Bonus points: Jeans West sell "half sizes", such as 33 & 35 inch waist. Typically $70 per pair.
  • ASOS sell some styles of their house brand jeans in Long and Extra Long. They're a pretty slim cut; their Long "Straight" leg in a 34" waist is just long enough but I'd call it a skinny style. On special these are under $40.

Business Shirts

I used to wear Van Heussen shirts pretty much every day. Their Classic shirts come in multiple sleeve lengths, so for ages I wore a 41" neck with extra-long sleeves. It turns out I looked like a circus tent for a few years.

These days I've only found two nice shirts that fit me pefectly.

  • TM Lewin are based out of London and have a good online store, plus stores in some Australian cities. In Australia their shirts are also available at Myer, if you can face the worst of the worst of old-style retail. Check their sizing tables; I find their fully fitted (the slimmest style) in a 16.5" collar and 36" sleeve to fit well. The same shirt in a 16" collar is way too short in the arms; the additional shoulder width in the slightly larger size makes a world of difference. Available colours & styles change regularly. Prices are approx $90 each, however multibuy pricing is impressive and they often have sales where you can get four shirts for $40 each (join the email list for regular discount coupons). Tip: their pure cotton shirts (the cheapest) are a pain the ass to iron. Spend the extra on the "non iron" shirts: the label lies, but they need significantly less ironing than usual.
  • Charles Tyrwhitt are also London-based, with a decent online store. They seem to have identical sizing to TM Lewin; their Extra Slim Fit in a 42cm collar and 36" sleeve is fine on my body shape and the sleeves are long enough. Prices are $50-$99 AUD; again non-iron is the way to go.

Both of the above online retailers have very fair return policies. I suggest an initial order of 4x different sized shirts: You'll take advantage of the packaged pricing, you get to find the perfect fit, then exchnage the three shirts that don't fit for your newly found size and style.

It's not really a shirt, but I've recently bought a wollen jumper from Stafford Direct at a local DFO Outlet; size XL fits nicely in the body and sleeves over a business shirt.


Until recently, I would put off buying work trousers for as long as possible. I'd then go to a Myer store and try every brand on, with increasing frustration and very little retailer assistance, until I found a pair that fit OK in the waist and had enough excess fabric in the hem to be able to be taken down.

Most expensive suitors and tailors will sell unhemmed trousers; I don't spend thousands on a suit though and have little interest in paying $400+ for a pair of pants.

As of this week I've found a single lone retailer who sell unhemmed trousers at suitable prices: Charles Tyrwhitt sell multiple styles in both Slim and Classic cuts with an unhemmed 97cm inseam. For $15 and a ten-minute wait I can have these hemmed to suit me at the local shopping centre; the trousers themselves are $99-$149 plus delivery.

Until I find someone else selling unhemmed trousers, all my work pants will come from Charles Tyrwhitt.

I hope that fellow tall guys get some use out of this little list. If you're not overweight, most clothes for tall guys are just too hard to find. If you've got other tips, I'd love to hear them.

1. Yes, I'm using imperial height and metric weight measurements. It's not just me, the world is fucked. Australians measure nothing in imperial measurements except for the height of adults and the weight of babies.

2. Why do trouser manufacturers sell "Regular" and "Short" leg lengths? Surely "Long" and "Regular" makes more sense. After all, it's much easier to cut fabric off and re-hem pants than it is to magically make the fabric *longer* for us tall folk.

Payments for Australian Startups: Update regarding Pin Payments requirements

In October last year I put together a summary of payment processing options for Australian startups, as it was at that point in time.

One of my favourite providers was Pin Payments, who were the only Australian company in the lineup, however they had two requirements that bugged me: They required the billing address of my customers, and they emailed a receipt directly to my customers upon payment.

For WhisperGifts I really don't want either of those things, so I implemented payments with Stripe.

Recently, Chris from Pin Payments reached out to me with an update. I've posted it over on the original post but with his permission have included the email below.

Pin Payments are able to switch off the e-mail receipt sent to customers, and set the billing address fields to be optional. At the moment you just need to e-mail the team at support@pin.net.au

Something else that's worth noting when comparing is the multi-currency support we provide. Currently you can bill in 6 currencies. This is seriously powerful for Australian companies looking to go global, or even being able to tap adjacent markets like NZ.

For me, these changes put Pin back at the top of my preference list. Being local is a big deal for support purposes, so when time permits I'll be switching WhisperGifts over to Pin.

Thanks to Chris from Pin for reaching out and for allowing me to post this.

Djangosites Open Sourced

Back in 2008 I started djangosites.org as a listing of websites powered by Django. Prior to that, we relied on a wiki page to see who was using Django, so an image-based website felt like a big improvement.

Since day one I've promised to release the source code that I use for the site. It's relatively simple, so I never stressed much about making it a high priority - but I continue to be asked and politely berated for not getting it published.

Today that's changed. I think it's too late for me to say I've come good on my promise, but the Djangosites source code is now available on GitHub.

The README has more details, but in short this is a dump of the code currently running the site. I'll continue to use this repository as changes are made to the live site, however I'm not actively working on djangosites at this point in time (other than reviewing & approving submissions)

There's a few pieces of this that might be useful for people new to Django, but otherwise this is really a collection of generic views. The useful bits might be:

Suggestions and pull requests are welcome, but I'm not actively soliciting changes. I should probably clean things up a bit given that this codebase hasn't changed materially since Django 0.96, other than slight refactors to allow upgrades to work - so I'm certainly not yet taking advantage of new functionality that's been made available in recent Django versions. Perhaps now you can see how bad the code is, I'll have more of an incentive to fix it :)

The source code is available right now from GitHub under a mixed licence: the Python code is MIT-licenced, and the rest (HTML etc) is not open source but included in the repository for completeness and as an example.

Payment processing options for Australian startups - 2013 Edition

Not that long ago, startups and hobby businesses had very few options for accepting online payments here in Australia. We could sign up with a merchant facility with a bank (with minimum fees over $100/month) and then pay to use eWay or similar gateways (again, for a few hundred bucks a year), or we could use PayPal.

As services such as Stripe launched in the US, us Aussies felt a bit left out. Our tightly regulated banking industry didn't seem welcoming to new players, or so it seemed.

Throughout 2013, a number of new players have become available in Australia.

Since launching WhisperGifts we've begrudgingly accepted PayPal payments. Although PayPal is pretty ubiquitous, the user experience leaves a lot to be desired - sending your ready-to-buy customers to an external website for payment looks amateurish, regardless of how much custom design that external party lets you do.

The three key players as of today are Braintree, Pin Payments, and Stripe. Having tried each of them for WhisperGifts, I'm ready to write up my thoughts and recommendations.

Common Features

As far as I'm concerned, all three services cost pretty much the same. All have no monthly fee, a 30c per transaction base fee, and a small percentage per transaction (ranging from 2.4% for Braintree to 3% for Pin). I do pretty low transaction turnover, so at this stage I'd rather pay a slightly higher per-transaction fee than a monthly fee.

All provide Javascript-based payment processing libraries, allowing you to put a form on your own website that POSTs encrypted credit card details to your server for processing. None of them require a customer redirect for payment.

Lastly, all three have similar functions for storing credit cards for future or recurring use. Braintree and Stripe have explicit recurring billing functionality built in (ie they handle the recurring billing themselves), and Pin Payments has a relationship with Spreedly to manage this, albeit at extra cost. If you do your recurring billing yourself against a pre-saved customer token, all three are sufficient.


Braintree Payments are an American company, who launched in Australia in late 2012. The service is solid, having had a few years to mature in the US market, although their initial Australian offering had a minimum monthly fee of $50. These days, there's no monthly fees.

Their web console is also quite useful, although after getting started with them I had a major gripe: The underlying banking relationships are just too messy. It sometimes feels like Braintree are an old-style bells-and-whistles gateway, who have cut fees to appeal to startups and small businesses.

When you sign up for Braintree in Australia, you're actually opening a merchant facility with the National Australia Bank. This isn't made clear during the initial process, however it's abundantly obvious when you come across any issues: My first settlement from Braintree took over a month to arrive, due to the NAB refusing to pay proceeds to my personal bank account (I run as a sole trader; my legal entity name doesn't match my trading name. This is normal.)

This led to a long process of opening a new business bank account in my trading name, simply to get paid by Braintree. But it wasn't pretty - after I started interacting directly with the NAB, I began to be charged all sorts of fees that Braintree must normally abstract / negotiate away. Every interaction with the NAB seemed to cause a regression, and the NAB business bankers really don't understand the relationship with Braintree.

Not all of this is directly Braintree's fault, of course - but it still soured my experience. Regardless, this banking relationship has it's benefits: Braintree do settlements within a couple of days.

Braintree is now owned by PayPal, however the public messaging is that they'll remain as-is for now. Support times were somewhat slow, as it appeared to be done out of the United States (despite an Australian office). This meant multi-day to-and-fro email conversations to get issues resolved.

Pin Payments

The first Australian payment provider (that I know of!) to launch was Pin Payments, who hit the scene with a public beta in early 2013. I joined up pretty quickly, as their beta participants received a no-monthly-fee account. After their public launch, the fee jumped to $30 however there is again, as of October 2013, no monthly fee.

Transaction fees are pretty normal, at $0.30 + 3%. Some foreign payments attract conversion fees, which you should be aware of.

Pin's API is fantastic, as is their web console. I released an open-source Pin Payments library for Django which is easy to use.

The relationships with banks are abstracted away to become almost invisible, however the signup process asks questions typical of a merchant facility. This suggests to me that they're doing a lot of work under the covers to hide that bank relationship, which is fine by me.

There's two things, however, that I don't like about Pin at the moment.

Firstly, your payment form must collect the full address of your customers, rather than just their credit card details. As I'm selling an online service, I don't need these details for any other purpose and would rather not collect them. I can appreciate the fraud management use of this data, however if I can get away with keeping it off my signup form then I'd prefer to do so.

The second irritation is that Pin will email your customer a payment receipt. This means that you must share your customer contact details with Pin, and the customer begins to see the plumbing of your payment system as the Pin email includes their logo and contact details. When I contacted Pin about this, they mentioned that there might be an option to disable it in the future if you agree to email a receipt yourself - although this is still in the pipeline.

Settlements take seven days, which might be an issue if you rely on the cashflow - however they don't hold any balance other than this. Support was fantastic, with quick responses. This is the joy of having a vendor in your own timezone!

Update January 2014: Chris from Pin Payments was nice enough to reach out to me after this blog post to address my points above. With his permission, here's the meaty bit of of his email:

Pin Payments are able to switch off the e-mail receipt sent to customers, and set the billing address fields to be optional. At the moment you just need to e-mail the team at support@pin.net.au

Something else that's worth noting when comparing is the multi-currency support we provide. Currently you can bill in 6 currencies. This is seriously powerful for Australian companies looking to go global, or even being able to tap adjacent markets like NZ.

Changing the e-mail receipt and billing address were a big deal for me, so I'm likely to switch back to this Australian-based provider. Now, back to the original post! End update


Stripe were the first company since PayPal that I remember seeing turn the payments industry upside down. For a long time, foreigners looked at websites using Stripe with awe, thinking "If only we could do that!".

In August 2013, Stripe launched in Australia. They're still in Beta, but it's easy to apply.

In my opinion, Stripe is the benchmark in simple payment processing and it's clear that Pin have somewhat modelled themselves on Stripe. I can't blame them.

The signup process is incredibly simple, and there's no multi-day account setup or validation (you do, however, have to provide copies of your drivers licence or passport to meet Australian banking laws). There are many, many third party libraries for Stripe - they are very well supported. The only fields you are required to have on your site are the credit card number, expiry, and verification code - no address or e-mail address.

Like Pin, payments are settled after 7 days.

I haven't yet needed to contact Stripe support, however I wouldn't be surprised if I saw similar wait times to Braintree.

Final Thoughts and Recommendations

Since none of these services have signup or monthly fees, I'd highly suggest signing up for yourself to try them out. The barrier to integration is pretty low (especially compared to PayPal) and all have mature APIs and third party libraries.

For my use, I'm currently sticking with Stripe. It ticks all the boxes for me, is easy to use, and doesn't have any quirks that impact me. If Pin end up simplifying requirements for payment forms to only collect payment card info, and stop sending my customers an email, I'd prefer to use them due to their being Australian owned and operated - something I have major respect for.

The online payments industry in Australia is currently undergoing quite a bit of a transition. In less than a year we've seen two major foreign players launch locally, and have seen a home-grown company get off the ground with quite a bit of success. The next year or two are going to be really exciting, as it finally seems that we can launch a small startup in Australia without the long and expensive process of applying to accept credit cards. I'll drink to that.

Eulogy for my father

Three weeks ago, on September 4th, my father Phillip Harry Poulton passed away at age 58 after a brief battle with cancer of the gall bladder. The toughest thing I've ever done was read part of his eulogy along with my siblings, mum, and Dad's friends.

I'm very proud of my Dad, and I'm happy with the stories about my time with him that I was able to squeeze into the few short minutes that I spoke.

Below is one of my earlier drafts, which has more detail than what I read at his funeral on September 11th 2013. At the bottom is a video that was recorded - I've included this for friends and family who weren't able to make the service - I assume it isn't fascinating viewing for anybody else.

A number of newspaper notices were placed for my Dad, from friends, family, and his colleagues. You can read tributes to Phil Poulton on the Herald Sun website.

Like most people, I learned a heck of a lot from my Dad. Chatting to my siblings it was clear that we all saw Dad in much the same way - he was genuine to everybody he met, and didn't filter his personality to suit the audience.

Dad married my mother, his first wife, and they renovated their home together in Ringwood. I was their eldest child, but not their first pregnancy - Dad helped mum through a miscarriage in an earlier pregnancy, setting the scene for the strong role he'd play for the rest of his family life. The fernery in their Ringwood home was expanded as a small memorial for their unborn baby.

We moved to Mitcham before I started school, into a house that was continually being worked on.

Before Benn started school, Mum and Dad showed us the world. We moved temporarily to the UK for a working holiday, to a small town outside Cambridge called Royston. My memories are foggy but fond, and seemed to involve more time driving our little Ford hatchback around Europe than we did at school or work.

Whilst in Royston, Mum discovered a lump - she was diagnosed with breast cancer. The UK jaunt was cut short, and we returned home for treatment.

In 1992, Mum passed away. Benn was 6, and I was 9.

When I look back on my hero father, it's from this point forward that he really deserved that badge. He was a widowed father of two young boys, working full time, running regularly, but he couldn't cook to save himself. For a short while, Benn and my diet consisted of sausages in bread and "fruit cake" - but I use both words loosely. Sue recently reminded me of the recipe, which was a grand total of 5 ingredients: flour, bran, milk, dried fruit, and sugar. You'll notice a distinct lack of eggs.

Apparently such a loaf is fantastic for endurance runners, but Benn was lucky enough to get one for his birthday one year. It seems to be one of the few things for which he hasn't forgiven Dad.

Even through this grief, the accountant in Dad kicked in. Although he was working hard at Heritage Seeds, and trying to keep up with Benn and I, Dad made sure mum's teachers superannuation was shared between Benn and I - a forethought that gave both of us a huge help to buy our first homes.

Alice and Bill, my maternal grandparents, were and still are a huge part of our lives. They often lived with us, and us with them. Dad still called grandpa "Dad", even though there they were inlaws.

A while after Mum died, new neighbours moved in, so Dad went over to introduce himself to the lovely blonde who had started making a new home with her two kids.

My memory is hazy, but I'm told that it was Ben and Benn who became great friends and knocked a hole in the fence. Something tells me that's only part of the story, since I doubt Dad would have let a primary school kid loose on his fence with a powersaw - but soon after, we were a regular fixture for dinner at Lesley's house.

I'm sure Dad would have hosted Lesley, Ben, and Tash for dinner, but he was trying to make an impression - and sausages and cake wasn't going to help his cause.

Soon after, we found ourselves living together as one family here in Eltham. Dad always seemed to have a love for Eltham, especially for places such as Montsalvat where we are today - lots of trees, lots of timber, and other eclectic building materials. Many of you will know of our first house in Eltham, a timber and mud brick house that was always being extended upon. This theme of always improving was one of the biggest that rubbed off on me, as evidenced by the number of half-finished jobs around home.

My time in Eltham was my true formative years: I started high school, made lifelong friends, and really got to know Dad's own lifelong friends. As time went on, I learned more and more about the world, much of it from Dad's viewpoint. I was learning from Dad until the day he passed away.

Dad got me my first job, doing work experience with the company who looked after the computers at Heritage Seeds. As a result, through a series of buyouts and cross-training, I've never had to interview for a new job - yet I've ended up working somewhere I love with a fantastic group of people.

We often spoke politics at the dinner table, although we rarely saw eye to eye. The weekly dinner table was where we bought our own growing families, to talk with and learn from Pa. It was also the scene for the infamous "Sonos Battles".

Us four kids had always considered Dad a bit of a ... let's just say he was an Accountant. Fads, trends, and new stuff wasn't his cup of tea, and as he held the cash we weren't likely to be sporting new video games or the latest Nikes.

When he moved to the new house at Wombat Drive, something seemed to change. Maybe it was because we weren't in his back pocket all the time, but suddenly there was a huge TV. Then two more, just in case.

The old record player was put on the nature strip, and a top of the range surround sound system found it's way into the living room, along with a remote-controlled music system.

It became a bit of a game at Sunday dinner to see who could choose a song that would actually get played through to the end. One of us kids would chose something contemporary, and we'd all happily hear the first half of the song. Dad would then decide that he'd like to hear Aretha Franklin, so he would pull out his phone and queue up an Aretha Franklin song. Well, he tried to - but every time, without fail, we ended up with the entire Aretha Franklin back catalogue, including live versions, cover songs, and interviews. And he didn't just queue them up to play after our one song - he stopped the song hard halfway through, and we'd hear the opening bars of "R.E.S.P.E.C.T", followed by her rendition, as lovely as it was, of "Bridge over Troubled Water".

Dad was a pretty non-technical person, who still did his banking with bits of paper. To watch a new guest arrive for the first time was amusing, as they tried to deal with Dad's excited demonstrations of wireless music selection. Who would have thought that after a life of collecting 8-tracks and then records, that he'd be most enthusiastic about music over the internet.

Watching him in the last few years I learned a few other useful lessons. It turns out, that a caravan cannot be too large. It also cannot have too many gadgets. Once the gadget-laden caravan arrives, there's no reason not to go out and buy more gadgets to go in it.

It turns out it's also OK to wear shorts. Dad was particularly rapt one night after going shopping on his way to running, having had a stranger at the supermarket yell out "Nice legs!".

Even when we landed in Nepal, our Sherpa guide, Lhakpa, asked with a concerned face, "Mr Phil, do you know you are in Lukla?". Dad was doing us proud, surrounded by the permanently ice-capped Himalayas - wearing his shorts.

Dad also taught us that coffee is a great way to catch up with friends and family. Meeting for Saturday coffee was as important as Sunday dinner, as Ollie sat on Pa's lap to eat his muffin while we slowly started our weekends. More recently, we'd started bumping into each other at the coffee shop before work. It was a nice coincidence that we started going out of our way to foster a few days a week, even if it was only a 2 minute chat while getting a take away coffee.

But above all, Dad was all about family and friends, tied together by music - and he used it to make us laugh at the saddest of times.

Last Wednesday afternoon, with friends and family sitting in the sun at home, we put on a playlist Dad had built called "Phil's Favourites". Of course the first 5 hours was everything the Rolling Stones have ever had a part in, but the music kept going, and going, and going. I guess that's the advantage to adding entire discographies to your playlist.

As the evening wore on, we knew what the outcome would be. With twenty of us surrounding Dad's bed in tears, we kept talking to him and listening to the music he queued up.

Then, some of the worst music interviewing I've heard came onto the stereo and filled the room. I have no idea who it was, or why an interview was even on Spotify, but his living room was filled with noise we didn't want to listen to. We reached for Dad's iPad, to try to get back to the music - but it refused to work for us. His horrid music management made us all laugh, both with him and at him, at a time when we should have been in tears.

Luckily we fixed the music, and soon after Elton John's "Candle in the Wind" came on. It was quite possibly the last music he ever heard.

The messages and support I've received from everybody around me has been simply amazing, for which I'm eternally grateful. Good friendships make tough times that little bit easier.

Dad's gall bladder cancer was rare and aggressive. In his memory, we've been raising some funds for the Forgotten Cancers Project at the Cancer Council of Victoria. More research into this cancer might help extend the lives of future patients, so that they may spend more time with their families than the three months we got with my dad.

Tracking CPC Results in Django

Like many startups, I use CPC ads to attract attention to WhisperGifts. I bid a set fee per click for particular search words on Google, and for ads shown to my target demographic on Facebook. I wanted to track an individual signup to their source CPC campaign, so put together a really quick bit of Django middleware to help me out.

All I do is stash the value of utm_campaign (set by Google or Facebook) into a cookie called wgcookie.

class CampaignMiddleware(object):
    def process_response(self, request, response):
        from registry.models import Campaign
        if 'utm_campaign' in request.GET.keys():
            if 'wgcampaign' not in request.COOKIES.keys():
                # add campaign cookie
                c = request.GET.get('utm_campaign', None)
                response.set_signed_cookie('wgcampaign', c, max_age=31536000, httponly=True)
        return response

At signup time, I read out the cookie into the users table:

    campaign_code = request.get_signed_cookie('wgcampaign', None)
    campaign_code = None

user.campaign_code = campaign_code

Simple! I've now got the capability to track actual revenue by campaign source - a very handy tool to identify which campaigns might warrant higher or lower spending.

I'm aware this isn't rocket science, but I figured it's worthwhile sharing - it makes more sense to me to track these things directly in my own database, than to try and match data from the AdWords panel with various analytics services.

Happy CPC bidding!

Moving to FastMail

I've been a long-time FastMail user, and they make me happy. For various reasons I never liked using Gmail, although I never tried Google Apps for Domains. Max Masnick recently wrote a post on his move from Gmail to FastMail and experience is close to mine - and his migration tips are useful for all, not just Gmail users.

If you're looking for a fast, sturdy, secure, easy-to-use third party mail service for yourself, your family, or your business, I can highly recommend FastMail.

New Podcast: Django Roundup

Lincoln Loop are one of the earlier Django-based development shops, and their various employees contribute in many ways to the open-source community. One new addition they've just made is the launch of Django Round-Up, a podcast covering the news in the Django community.

This is a podcast hosted by @kennethlove and @bkonkle from @lincolnloop that highlights recent articles and projects in the Django community. We love talking about web development, so our podcast focuses on casual conversations as we cover the latest blog posts and project releases.

I was surprised to hear my name coming through my headphones, only a minute into their first episode - with a quick review of my recently-published django-readonly-site package.

As a result of their comments I've made some minor updates to address questions and suggestions from the podcast team.

I want to publicly thank them for including my item in their inaugural episode, and suggest that anybody in the Django community goes out and checks out this valuable new resource!

Day & Night Phones (Or: Why I Carry Two Mobile Phones)

I carry two mobile phones, for most of the week. I have a personal phone which I use to call friends and family, to read my personal e-mail, access social media, and play games. My personal phone is almost always in my pocket, unless I'm in a work meeting or giving a presentation.

I also have a work phone. It is only used by clients or co-workers to call me about work-related matters, to access my work e-mail, and access our internal CRM systems. The nature of my job means that nobody typically calls me outside of working hours - so my work phone is in my pocket during the day, but very rarely at night.

Often, somebody will see two phones on my desk and ask the obvious question: "isn't one enough?" The recent talk about Silicon Valley executives carrying two phones got me thinking about this a little more.

There's no doubt that I'd prefer to only have one phone, however it isn't that big a deal. My work and personal lives rarely overlap, so I don't miss calls. Most of my work involves sitting at a desk with my phones on the desk, so I don't constantly have pockets full of mobile phones.

So why do I do it?

I want two phone numbers for the same reason I have two e-mail accounts - one for play, one for work.

My father has recently left his job. He's been there for over 20 years, so his work e-mail address was his first e-mail address, and his work-provided mobile phone was his first portable phone. Whenever somebody asked for his phone number or e-mail address, he gave out his work details.

Now, as he moves into retirement, he's left with the burden of updating his e-mail address with every person and organisation he wants to keep an online relationship with - from Facebook to overseas friends to his newspaper subscription. He's lucky that he's able to keep his phone number, so that's one less thing to change.

I won't be so lucky. When I move jobs, I'll most likely stay in an industry close to what I currently do - so my employer is not likely to let me keep access to my e-mail account or to let me take my phone number, along with all of the contacts and business benefits it brings.

As part of the generation who got mobile phones and e-mail addresses before getting a job, I didn't want to go through that hassle when I move on from my current job. Now, watching my dad go through the process as he wraps up his career, I'm glad I made that choice.

And, if I can let you in on a secret: Sometimes I carry three phones, so I can test stuff out for work. I'm the sole user of no less than five 3G/4G devices. Connectivity is actually rather useful.

Tools I Can't Live Without (2013 Edition)

I'm not one to jump from productivity tool to tool to try and become 5% better. In fact I use very few such tools, preferring to keep things simple instead. However over the past few years I've collected a short list of extremely valuable tools that I think it's safe to say I cannot comfortably work without. I often recommend one or more of these to friends and colleagues, so I figured I'd write up the list here for future use.

My day job and my hobbies are very different, however I use most of these tools for both. My hardware consists of a Windows 7 laptop for work, a Windows 7 desktop for home (hobbies, games, and other non-work stuff), and an iPad & iPhone (used for work & play). I also carry a Windows Phone 7.5 for work use.

Some context: I spend my day customising Microsoft Dynamics CRM for clients, which requires very little code cutting. When it does, it is usually plain JavaScript. I also write significant volumes of documentation, in MS Word. Say what you like about Word, but it's synchronisation and multi-user editing with SharePoint is fantastic. I also blog, both at work and at home. I take lots of photos, mostly of my kid, and don't share most of them online.

I've used every one of these for at least a year, in most cases many years. Where possible I pay for services so they don't disappear on me.


I distrust Google with my e-mail for various reasons, and I really dislike seeing ads next to my e-mail. FastMail (now owned by Opera) is my go-to for e-mail services. They give me multiple domain names with multiple aliases, a shared address book with my wife, and great IMAP support over any port I like (great for networks that specifically filter IMAP/SMTP). There's also alternate logins and two-factor authentication.

I am more than happy to pay the few bucks a month this costs me for what really is a premium e-mail service.

Tip: With a Family or Business account, you can share address books and files between users.


Evernote Screenshot

Evernote sucks as a text editor, but it's a great way to store snippets of text across multiple systems. I use it for note-taking in meetings, and I use it to write most of my blog posts (so that I can add to & edit on my iPad or work laptop).

The tagging & classification is really useful - I often find myself using Evernote to refer back to previous notes to make sure I haven't missed anything. My notes are kept in-sync between laptop, desktop, and iPad.

Tip: Create bullet lists but insert Checkboxes on each line instead. Your notes then instantly become a todo list that you can mark off. Evernote can also capture Win+S and save screenshots to a new Evernote note, or to your clipboard.

Sublime Text

Sublime Text is my go-to text editor in Windows. I use it for building HTML, writing JavaScript, and even editing long blocks of text. For a long time I used Vim32 on Windows, but it just doesn't seem right to me. It doesn't seem to work as fluidly as on a Linux machine, probably because of the lack of useful command line. (Yeah, yeah, PowerShell and Cygwin and such. Doesn't do it for me, sorry).

Tip: When you close ST, even with unsaved documents, your exact location is saved. When you reopen it, the unsaved buffers are shown. This means you can constantly have a scratchfile open that doesn't have to be saved, that maintains state through reboots. However, this also means that you close down ST sometimes without saving changes to disk, so the files you e-mail/upload aren't complete.


When I'm coding for fun, it's usually using Django on a Linux server. To edit this code I use Vim because it's what I know best. I have never been a huge fan of it on Windows, however, which is why I still use Sublime Text there.

Multiple buffers, good command-line support, syntax highlighting, and (for me) absurdly quick keyboard controls make this ugly duckling incredibly powerful and fast.


My BackBlaze Stats

I've had a computer stolen before, and it isn't nice. If you don't have sufficient backups, then all of your documents, photos, and more are gone. Just like that. A fire is possibly worse, as it wipes out your CD-Rs and USB hard-drives that you "safely" stored in the wardrobe.

I pay BackBlaze fifty bucks a year to store all of my junk on their servers in the United States. Photos, documents, prior years tax receipts, and more. Whenever I add new photos to my PC from my DSLR, they're automatically backed up.

Tip: Make sure your photo folder(s) are included in the backup, as well as any external hard drives you use. Test the backup by downloading a significant chunk of it, so you understand the restore process before you need it.

Royal TS

Royal TS with Multiple open connections

Royal TS is a great remote desktop tool that lets you save and connect to multiple RDP sessions at once within a single window. It's cheap. Apparently it's now available for OS X and iOS, however I only use it on Windows.

Tip: Group servers into Folders, and save login credentials (at least just Domain & Username) against the Folder. You then avoid storing login details against each server, making changes even quicker & easier.


The defacto SSH client on Windows - Using PuTTY with Pageant makes accessing Linux shells from Windows a piece of cake. It's also great for building secure tunnels through my home network when I'm on the road.

Tip: Put PuTTY in your $PATH and save your session details (eg which key to use, hostname, and window configuration). You can then run putty -load dev to login to your dev machine with pre-saved configuration.


It seems pretty common to use Dropbox for backups, however I don't use it for that - it's just a stupidly simple way for me to move files from one machine to another, or share online. Most commonly it'll be to move files between my work & home PCs; less regularly to move documents onto my iPad without using iTunes.

I only use a few hundred MB of storage so it's completely free. If you want to kick more storage space my way, you can use my Dropbox referral link (I get 250mb of storage if you signup this way, and it won't cost you any extra.)


1Password for Windows

I can't put a price on 1Password. Here's how it works: When you sign up for some new website, 1Password generates a password for you. It'll be something like 1yf~f6dUBmw[rY. It then saves your passwords for you, so you don't need to remember 1yf~f6dUBmw[rY. When you then visit that website again, just press Ctrl-\ in your web browser and 1Password logs in for you with the right password! The whole password list is secured by a single strong password; you type that password each web browsing session (eg type it once the first time you press Ctrl-\, it remembers it for the next half-hour or so).

Since using it, a number of high profile sites I use have had security breaches but I've never been overly concerned as I know that my passwords are never re-used anywhere. I don't know what most of my passwords are, and I'm happy with that.

1Password for iOS

Tip: Sync across devices using Dropbox. Ensure you've got your Dropbox and primary e-mail passwords stored elsewhere, in case you find yourself with no access to 1Password or Dropbox. Use 1Password on iOS to copy passwords to your clipboard, to then paste into Safari or other iOS apps - retyping those long random passwords is a shit task, especially on a touch-screen.

Pocket Casts

Pocket Casts - My preferred iOS podcast client

Pocket Casts is the only iOS Podcast client that I've found with push notifications. When new episodes come out, they pop up on my screen without me manually opening the app & refreshing the feeds.

I do wish that it had slightly better handling of 'show notes', but otherwise it's a great replacement for the buggy and incomplete Apple Podcasts app.


Spotify Playlists

I use Spotify on my iPhone and iPad, almost always streamed over AirPlay to my Apple TV. For now I've given up on buying MP3s, and listen to random playlists when I want background music.

There's something fantastic about sitting on my back verandah, listening to any songs I could ever want to listen to (OK, except for The Beatles and AC/DC), without any cables or physical media.


Instapaper Menu

Instapaper has a simple premise: When you find something you want to read later, you click 'Read Later' in your browser. Then, when you've got time to read, you open the Instapaper app, where the article is formatted in a reader-friendly fashion. It even works off-line.

Instapaper Article View

Instapaper is incredibly simple, and it works well. The basic service is free, and the iPad/iPhone apps cost a few bucks. It's initially hard to believe something so simple isn't free, but then you realise how useful it really is for those of us who like to consume long-form articles in our own time.

Tip: Don't forget to open Instapaper & sync it before getting on a plane. You've then got access to your reading backlog at 30,000 feet - images and all.

What else?

There are plenty of apps I use daily, but they're probably common enough to not need explanation. A few things you'll see me using if you watch long enough:

  • Outlook - paired with Exchange, it's the killer corporate e-mail & calendar system.
  • Google Chrome
  • Adobe Lightroom
  • Paint.NET
  • WinSCP


Occasionally I need to take WhisperGifts offline, but still show some parts of the site to users. This has included some system changes that require the site to be non-functional for a little while (such as doing a deployment with a bunch of backwards-incompatible changes, or large database migrations) and for server moves, whilst waiting for DNS changes to propogate.

To do this, I wrote a little library that I could toggle within my Django settings. I've just pulled it out of the WhisperGifts codebase, and django-readonly-site is now available on GitHub. I think it's pretty simple to use.

Install it with pip install django-readonly-site, add readonly to your Django projects' settings.INSTALLED_APPS, and set settings.SITE_READ_ONLY = True. More options are available to keep parts of your site online, see the README for more details.

By keeping parts of your site online (such as the homepage, about us page, and in my case a customers' registry listing) you can provide a transitional experience to users, while the database-intensive and high-integrity parts of the site (such as signup, account management, and checkout) are taken offline with a polite "Sorry, we're temporarily unavailable" message.

Just after I had to quickly move to Rackspace after an outage with my previous web host, Rackspace announced that they now had a public cloud offering in Australia. For performance reasons, I'll be moving from DFW to SYD soon - and I will use django-readonly-site to try and minimise the perceived downtime for my users.

Your thoughts, suggestions, and pull requests are welcome on the GitHub Project Page.


Want to see more? Check out the yearly archives below.