Headshot

Jon Atkinson

I'm a technologist, with a long and varied history in high-end technical delivery and infrastructure management. I'm particularly interested in managing software teams, rapid application development, and scalability challenges.

Blog

Notebook: Copying to S3 with awscli

Copying to S3 with `awscli` is essentially the same syntax as SCP. This assumes you have a correctly configures `awscli` (if not, run `aws configure` beforehand). First, simulate the transfer: $ aws s3 cp . s3://my-bucket-name --recursive --dryrun Finally, remove `--dryrun` to start the copy process.

Read more…

2014 Show Podcast

On Monday night, I was on episode 12 of the 2014 Show, with Mark Steadman. We talked nonsense about tech news, game engines, and TV shows. It was a lot of fun.

Read more…

Remote Working

There was a great discussion today on Hacker News, about experiences with remote working. I thought I'd re-post our experiences here, as my comments on the original question seem to have been well received. I've edited this a little for clarity.

Testled has seven people, all working remotely. That breaks down into three developers, one front-end developer, one ...

Read more…

Talent Spotting

There has been a common theme at work recently; talent. This coincided with a spate of "how we hire people" posts on Hacker News, so I wanted to write about how we find people. Testled is, at heart, a consulting firm. We dress it up with different language, but essentially our service is offering our expertise to clients. Our primary ...

Read more…

Leeds Hack 2

Leedshack 2 was brilliant. I'm going to write a more technical teardown on the Testled blog in the next few days, but I thought I'd just blurt out some nonsense while it was still fresh in my mind. We built Barebones, which is a minimal wireframing tool from the iPad, written using Django, a bit of HTML5 and ...

Read more…

bcblackpool

I rather enjoyed Barcamp Blackpool this weekend. I've been to a lot of conferences and Barcamps this year, but I did particularly enjoy a Barcamp on my home soil. I made an effort this weekend to spend less time in talks, and more time talking to people, and I think it paid off. Along with giving my (now rather ...

Read more…

Obtaining GeoIP location with YQL using Python

I've a few projects coming up for 84labs which required location awareness. Location awareness works great with any recent phone, but for traditional clients, I needed to fall-back to obtaining the location from the client's IP address. There is an excellent free IP location database hosted on datatables.org, which offered the easiest way to get the data ...

Read more…

asbo.org.uk, CakePHP and data.gov.uk

Yesterday, I wrote asbo.org.uk, a site which provides really basic visualisation of the UK's anti-social behaviour order data from 1999-2007. This data was recently released by data.gov.uk. I wrote the whole site, wrangled the data, and deployed it yesterday afternoon, in about six hours. I've got some contract work coming up using CakePHP, so ...

Read more…

Sikuli desktop automation

There's quite a lot of buzz around Project Sikuli at the moment, so I spent time today playing with it. Sikuli is a GUI automation engine which uses a vision engine to identify elements on screen. In practise, it works well as a quick way to script repetitive desktop actions, without having to learn the AppleScript actions an application ...

Read more…

Django Project Base

"This is my project base. There are many like it, but this one is mine." Today I finally got around to putting my Django project base on Github. I've been using this base for about six months now, and after a lot of rewrites and different approaches, it's now reasonably stable. I've been starting a lot of ...

Read more…

Headless Virtualbox on OSX

When I'm developing, I try to continuously deploy to a realistic environment as often as possible. This means a Debian server running a stack as close to production as I can get. Of course, I don't deploy to the actual production servers (a lesson I've learnt many times over), so I virtualise a Debian box and clone ...

Read more…

New Years Resolution: Stop switching tools

Like nearly everyone else on the planet, I've spent some of today thinking about how I can do better next year. My resolutions are roughly split into two categories; tech stuff, and everything else, which makes sense considering I spend at least half of my waking hours in front of a computer. Since I can remember, I've compulsively ...

Read more…

Barcamp London

I've just finished at Barcamp London. It was worth going, but very busy, probably a little too busy. There were so many rooms that I had to choose between two good talks in each session, which was great for the event, but not so easy for me. The standout sessions were the elevator pitching practise, which was a lot ...

Read more…

Barcamp Blackpool

I attended Barcamp Blackpool this weekend, it was great. There was a really wide diversity of speakers and sessions (I attended sessions on sign language, writing Android apps and geocaching, among others). This was the first time I'd been to a Barcamp, and I liked the format. Hayley, who doesn't attend geek events often at all, said that ...

Read more…

Local SMTP server with Python and Django

Like most things, I'm probably the last to know about this, but it's very useful. When I'm locally developing Django applications which use SMTP, I usually get stuck in a cycle which goes: make request, send, wait, check inbox, wait, wait, there-it-is, oh, it's wrong, I've wasted 3 minutes. Annoying. This snippet runs a local ...

Read more…

yasnippet bundles for Django and FSF licenses

I've been working on a couple of snippet collections for yasnippet recently, which I never got around to writing about. First is yasnippet-licenses, which contains a set of short and long-form FSF licenses. It should suit the fastidious, who like to license each file correctly. Second is yasnippet-django, which is a fairly comprehensive set of snippets from Django 1 ...

Read more…

YSlow, expires header and compression

Every time I need to raise a pitiful YSlow score, I follow the same recipe, and every time I do so, I realise I've not written it down anywhere. In my continuing quest to turn convert this blog from interesting narrative to boring snippets archive, I present the appropriate apache.conf stanza:

# Enable Expires header
ExpiresActive On
ExpiresByType image ...

Read more…

More on Paypal/Django

I get quote a lot of traffic to my entry on encrypting Paypal buttons with Django. I was pleased to see that John Boxall has created django-paypal, a nice clean pluggable Django application for dealing with Paypal payments in Django projects which uses a few of the ideas I developed in my original post. Hopefully this means that I can ...

Read more…

Creating a read only backup user with MySQL

I always have to look up which permissions a user needs to just run mysqldump successfully. This creates a new backup user, without a password, and gives them the least amount of privilege necessary.

CREATE USER 'backup'@ 'localhost';
GRANT SHOW DATABASES, SELECT, LOCK TABLES, RELOAD ON *.* to backup@localhost;
FLUSH PRIVILEGES;

Read more…

The biggest mistakes of my career

I've just finished reading this post about horrible experiences in software development, by Eric Spiegel. I've been working in the web industry for quite a while now, and like anyone, I've had my share of project which have gone bad, but I'd quite like to write about one of them; to my mind the worst sequence ...

Read more…

Disabling comments

I've disabled comments for now due to a crazy amount of blog spam; the only reason I regret writing my own blog system is that I can't just install a plugin to handle annoyances like that.

Read more…

SSH on multiple ports with OSX 10.5

I want my Mac Mini running Leopard to listen for SSH connections on multiple ports. This proved to be far more difficult that it should have been. For the sake of this example, lets say SSH should listen on port 22, which is the default, and port 10022. On most unixes, you just edit /etc/sshd_config to contain the following ...

Read more…

Using the hash key in Emacs with a UK keyboard

I've been using Emacs recently, and it took me a while to figure out how to make option-3 produce a hash symbol like other Cocoa applications. This assumes you're using mac-key-mode like this:

(add-to-list 'load-path "~/.emacs.d/mac-key-mode/")
(require 'mac-key-mode)
(mac-key-mode 1)
(setq mac-option-modifier 'control)
To rebind the hash key, just drop the following in your .emacs:
(global-unset-key ...

Read more…

Joining PDFs with Ghostscript

If you need to join together a large amount of PDF files, but don't particularly want to pay for Acrobat Pro, Ghostscript can do the same. First, download Ghostscript, then build it in the usual manner:

tar xjf ghostscript-xxx.tar.bz2
cd ghostscript-xxx
./configure --prefix=/usr/local
make
sudo make install
Then you can join multiple PDF files like ...

Read more…

Removing the toolbar in MacVim

I'm sure this is nothing new to anyone, but I only just discovered how to hide the toolbar in MacVim (and the associated guioptions preferences). In .vimrc:

if has("gui_running")
    set guioptions=egmrt
endif

Read more…

Installing M2Crypto on OSX

I really like M2Crypto, but it is difficult to install on OSX without a few annoying prerequisites. Assuming you are running Leopard (or, I guess, newer), this is what you need to do: First, you need to install the XCode Developer Tools. You probably have these installed already, but if not, they're on your OS install discs, or you ...

Read more…

Paypal encrypted buttons with Django

Update (13/03/09): If you're reading this, you should probably also read this. I'm currently writing an invoicing application for Mampi, and we decided to use Paypal as our payment processor. While I know plenty of people think that Paypal are evil, for processing small volume transactions via UK debit and credit cards, they're far cheaper ...

Read more…

Changes

I blogged the other day about FileMerge. Changes is a good, modern replacement, even if the web site recommends 512mb of RAM. For a glorified diff app. Times have changed.

Read more…

Django's user_passes_test and generic views

Previously, I've often used a combination of django.contrib.auth and the login_required decorator as a simple way of controlling access to certain parts of an application. However, I'm working on a fairly complex application right now, which will grant access based on the is_staff and is_superuser fields. It's trivial (and well documented) to use the user_passes_test ...

Read more…

Djangocon 2008

I realise I'm ridiculously late to this party, but I'm just catching up with the videos from DjangoCon 2008. I've seen quite a few amusing talks this year (hat tip to Matt and Matt's talk at dConstruct, which gets second place), but Cal Henderson's "Why I hate Django" is one of the best. Djangopony now ...

Read more…

FileMerge keyboard shortcuts

I really like Apple's FileMerge. I like it because it is simple, and I like it because the interface is apparently unchanged since NeXTSTEP. It feels like using a well-worn hand tool of some kind. I don't like the fact that it requires use of the mouse for all but the most simple of tasks (the only merge-window ...

Read more…

Fixing RubyGems out of memory errors

I run Debian Etch on a 256MB Xen instance (provided by Mampi). For quite a long time I've been running into out of memory errors when using RubyGems. The usual transcript would go something like this:

$ sudo gem install rails
Bulk updating Gem source index for: http://gems.rubyforge.org
Killed
For a while, I hacked around this problem ...

Read more…

Acid Brass

My delightful thing of the day is Acid Brass:

Acid Brass was a musical collaboration between Turner-Prize-winning artist Jeremy Deller and the Williams Fairey Brass Band. The project was based on fusing the music of a traditional brass band with acid house and Detroit techno.
There are some limited examples on Youtube.

Read more…

dConstruct 2008

I attended dConstruct 2008 at the weekend. I was only there for the day of the conference, and didn't attend either of the parties, but I did enjoy it nonetheless. I thought that there were some pretty interesting talks (certainly it was more engaging that the exasperating @media2008). Highlights included Aleks Krotoski on what web developers and video game ...

Read more…

Returning

So I figured I'd get the old blog content back here. I have a couple of articles I'm planning on writing in the next few days.

Read more…

http://1.2.3.8/bmi-int-js/bmi.js

I'm currently using my T-Mobile 3G connection to do most of my web browsing, what with it being Christmas, and that I've been travelling around a lot without reliable WiFi. In contrast to a few years ago, when the hardware support for laptop to phone connections was terrible, that is now incredibly simple. I paired my phone and ...

Read more…

Creating Xen DomU's, now with actual connectivity

xen-tools is a useful connection of scripts. However, when you're creating a new Xen guest, don't forget to specify the correct gateway and netmask. Otherwise, you may end up spending a whole evening trying to figure out a routing problem which doesn't actually exist.

xen-create-image --hostname=example.com\ 
                      --ip=XXX.XXX.XXX.XXX\
                      --gateway=XXX.XXX.XXX ...

Read more…

Importing python modules, avoiding namespace clashes

Python does dumb things when importing modules. The scenario; one local source file called 'calendar.py', and one Python module (part of the standard libraries), 'calendar'. If, within calendar.py, you evaluate

>>> import calendar
then the script will import itself. This is both proper, and useful, but there is no way to force the interpreter to import the module. This ...

Read more…

Cheerleading

I've been making some good progress recently on a few of my projects. We're in the final stages of getting Mampi Hosting ready for launch. We've bought the hardware (lots of it), got the website ready, and our marketing campaign is prepared (we're going for an Adwords campaign, and a UK-only print campaign in a few ...

Read more…

Reading List

Rob and I were talking about our reading lists expanding into good business and marketing blogs the other day, and I mentioned a few but didn't really come up anything concrete. So here it is, my current (short) daily reading list:

Read more…

Removing .svn folders recursively

If you want to recursively delete all the Subversion folders from a working copy (for deployment or whatnot), this works well:

rm -rf `find . -type d -name .svn`

Read more…