Discovered in a text file titled: "Game Ideas":

Paramecium Chronicles- base building/survival horror. You choose an orifice to invade, set up shop and start replicating

Awesome idea I have absolutely no memory of coming up with.

Ludum Dare 31

Sadly I wasn't able to participate in Ludum Dare 31.

I thought the theme was interesting. I know there were some complaints that it was overly specific and made 3D games harder or impossible. It was actually one of the themes that I voted for though because I thought it would be fun.

When I woke up and found out that was the winner, I immediately had the idea of doing a classic platformer with multiple levels all visible on the screen at once. I notice today as people start submitting that there are a few other people who had the same idea and they do look awesome!

are two that I've seen so far. I love the idea!

I got as far on Saturday as making a little 8-pix character, Henry:


My plan was to set up as many 64x64 levels as I could all joined together, with puzzles or bosses to defeat to unlock the door to the next space.

Alas, I was unable to do it. I might play around with the idea, but with so little time to do much of anything these days, Henry's dreams of rescuing his dragon will likely remain forever unrealised. Poor Henry.


I spent last week in the New Forest with my family. Apparently this year is a very good year for mushrooms. As we were walking around the forest, I saw lots of different types and some of them made some nice photos. I did have a go at identifying them but it's quite tricky and the only one I am reasonably sure about is the second to last one which looks like a Vermillion Waxcap.

Click for full size.


I'm at the very early stages of learning and working with web-gl. Now that Apple has added support for it in Mobile Safari it's something that I can get excited about.

I've made it much easier for myself to post and edit blog stuff. This can be a kind of living blog post where I can collect links to the stuff I find.

Ultimately, I'd like to produce a simple javascript library that's as easy to use as Jaws.js, starting with 2d as it's the performance increase that I'm interested in.

Full blog post

Although very short, this is a blog post by virtue of the fact that it has a title!

Posted using my new burble based editor.


I made a discovery this weekend. It has taken me almost a year to make the realisation but it was striking when I noticed:

Archive Screenshot

I've never been a particularly prolific blogger, but 2014 is easily one of my worst years yet.

It's no co-incidence either that the last post of 2013 was about me moving my blog to GitHub. In moving it to GitHub I created a barrier to making posts.

Previously, I've always built my own blogging engines and they have always come with web-based front-ends for managing and posting articles. I could quickly navigate to my blog, log into the control panel and post an article.

The workflow for posting an article from GitHub is really not that difficult but it adds a few small extra steps that act as barriers to me actually bothering to do it and it's a real shame.

I have a solution. It's still in progress but the primary functionality is already in place - Burble is a microblog hosted on GitHub as a GitHub Pages site that includes a basic Javascript based editor. The editor uses the GitHub API to make posts directly into the repository, completely bypassing the need to fire up an editor, sync or clone the repository, generating the file with the right name, writing it, committing it back etc etc.

I have some bigger plans for Burble itself, but once I have got the editor working fully (currently it only allows the posting of new 'blurbs', no editing or deleting), I will be able to use it to manage my main gh-pages hosted site (this one!). I'm quite excited about both projects, which will hopefully inspire me to write about them a little more.

Ludum Dare 30

This weekend I took part in Ludum Dare, the build-a-game-in-48-hours competition.

The theme this time was Connected Worlds. I had an idea fairly early on - Scientist (Rodney) accidently opens a portal to another world, gets stuck and has to try to find his way home. Definitely not original, but it was a start.

My Entry was built using HTML5 Canvas & Javascript, using a few simple frameworks:

  • JawsJS - Really nice, simple 2D game framework
  • Howler.js - Clever HTML5 audio library

I was particularly pleased to be able to use some of the pathfinding features in Jaws that I contributed a while back too!

Overall I was pleased with my finished product. It wasn't quite as ambitious as I had planned for but I finished it and it makes some kind of sense.

Things I was pleased with

Random world generation - I used a Cellular Automaton algorithm that I'd been exploring earlier in the year with one of my A-level classes. It took quite a bit of tuning to get it to generate useful worlds, namely due to the Javascript random number generator, it seems to cluster > 0.5. I might do a little more research into that later.

Enemy AI - It's laughable to call it AI really, the Bat Fiends look around, if they see Rodney they move to intercept. But it really worked. It looks really cool when you walk into a new void area and a whole flock of Bat Fiends come chasing out of some side corridor after you. It's the little things.

Art - I am no artist, but I've been developing my pixel art skills over the last year or so and I was actually pretty pleased with the result:

Rodney the Scientist

The bat fiends were pretty simple, but cool looking:

Bat Fiend

Things not so pleased with

Sound - Howler turned out to be brilliant, really easy to use and just worked. My ability to create sound effects however needs much development. Music I completely failed with, no idea where to start. Definitely an area to work on for next time.

Animation - I definitely need to work on my walk cycles!

Fun - I'm not completely convinced that the game is actually much fun. It was quite cool when 3 or 4 portals in, I found myself tunneling through the walls to get around instead of walking through open areas because there were so many bat fiends, but I'm not sure it had much lasting appeal.

Bottom line

I had a lot of fun working on this. Technically, I'm quite pleased with it, but conceptually, it could be better - I think I need to spend the next few months playing as many computer games as possible to get a better idea of what makes them fun.

Things to work on:

  • Musical composition skills

WSGI and the 403 Forbidden error

I recently set up a new server so I could deploy an app I've been working on.

Because I'm lazy, I simply copied and pasted all the various settings files from an existing app that was running perfectly happily and restarted Apache.

Annoyingly, all I got was 403 Forbidden: You don't have permission to access / on this server and it took me about an hour and a half to work out what was wrong. I eventually found this StackOverflow answer that explained that the newer versions of Apache have slightly different security settings.

I added the line Require all granted to my VirtualHost apache config file, restarted and everything worked perfectly. My new config looks like this now:

<VirtualHost *:80>

    WSGIDaemonProcess flaskTest user=flask group=www-data threads=5 home=/<redacted>/flaskTest
    WSGIScriptAlias / /<redacted>/flaskTest/flaskTest.wsgi

    <Directory /<redacted>/flaskTest>
        WSGIProcessGroup flaskTest
        WSGIApplicationGroup %{GLOBAL}
        WSGIScriptReloading On
        Order deny,allow
        Allow from all
        Require all granted

Publish to GitHub from Editorial

After I decided to move my blog into GitHub, I got quite excited about learning to use the API. I downloaded Editorial a few weeks ago but hadn't gotten around to using it much yet but it has an absolutely fantastic Python scripting engine built in with all kinds of really cool modules. I set aside a whole weekend to get stuck in an learn the arcane invocations required to activate the API and mate it with Python.

I ended up being really disappointed - the GitHub API is incredibly easy to use and the modules built into Editorial made it an absolute breeze to get everything working! I especially liked the keychain module for safely storing API keys out of the source.

Here's my script Gist:

#coding: utf-8
import keychain
import console
import editor

import time
import re

import requests
import json
import base64

SITE_BRANCH = 'master' # either master or gh-pages
COMMITTER = {'name': 'Joe Bloggs', 'email': ''}

#keychain.delete_password('GitHub', 'username')    # Uncomment these lines
#keychain.delete_password('GitHub', 'token')       # to change the details
#keychain.delete_password('GitHub', 'repository')  # stored in the keychain

# Get Username, API Token and Repository
username = keychain.get_password('GitHub', 'username')
if not username:
    username = console.input_alert("Username", "Enter your GitHub Username", '', "Save")
    keychain.set_password('GitHub', 'username', username)

tokn = keychain.get_password('GitHub', 'token')
if not tokn:
    tokn = console.password_alert("API Token", "Enter your GitHub API Token", '', "Save")
    keychain.set_password('GitHub', 'token', tokn)

repo = keychain.get_password('GitHub', 'repository')
if not repo:
    repo = console.input_alert("Repository", "Enter your GitHub Repository name", '', "Save")
    keychain.set_password('GitHub', 'repository', repo)

# Mangle the post ;)
post_text = editor.get_text()

post_sections = post_text.split('---')
if len(post_sections) > 1:
    yaml_header = post_sections[1].splitlines()

  # Find the title in the YAML
    post_title = None
    date = None
    for line in yaml_header:
        if line[:6] == 'title:':
            post_title = line[6:].strip()
        elif line[:5] == 'date:':
            date = line[5:].strip()[:10]

    if post_title:
        safe_title = re.sub('[^a-zA-Z0-9\s]', '', post_title).replace(' ', '-')
        safe_title.replace('--', '-')
        if not date:
            date = time.strftime('%Y-%m-%d', time.gmtime())

        post_filename = '_posts/%s-%s.markdown' % (date, safe_title)

        URL = '' % (username, repo, post_filename)

        header = {
            'Authorization': 'token %s' % tokn,
            'User-Agent': username

        get_data = {
            'path': post_filename,
            'ref': SITE_BRANCH

        response = requests.get(URL, headers=header, params=get_data)
        response_json = response.json()

        if response.status_code == 404:     # File doesn't exist, create it.
            data = {
                'path': post_filename,
                'content': base64.b64encode(post_text),
                'message': 'Blog Post - %s' % post_title,
                'branch': SITE_BRANCH,
                'committer': COMMITTER

            response = requests.put(URL, headers=header, data=json.dumps(data))

            if response.status_code == 201:
                console.hud_alert("Blog post created successfully.", 'success', 2)
                console.alert("Commit failed.")
        elif response.status_code == 200:   # File exists, update it.
            data = {
                'path': post_filename,
                'content': base64.b64encode(post_text),
                'message': 'Blog Post - %s' % post_title,
                'branch': SITE_BRANCH,
                'committer': COMMITTER,
                'sha': response_json['sha']

            response = requests.put(URL, headers=header, data=json.dumps(data))

            if response.status_code == 200:
                console.hud_alert("Blog post updated successfully.", 'success', 2)
                console.alert("Commit failed.")
        else:                        # Something went wrong!
            console.alert("There was a problem with the server.")

        console.alert("Couldn't find a title.\n\nAction Halted.")

    console.alert("No YAML header found.\n\nAction Halted.")

I could have stored the branch and committee details in the keychain too, but I thought 5 pop-up dialogs might be two too many!

I also adapted it to pull in a post from GitHub using the YAML front matter; you have to add the date field for that to work.

I'm really impressed with Editorial and I think it has some huge potential.

Moving home

I've spent the last couple of days moving my website from my virtual host over to GitHub Pages. I've been overtaxing the server it sits on and it kept falling over. I want my website to be a little bit more stable!

I'm going to write up some of the problems I came across over the next week or so, but I just wanted to see how easy it was to write a new post directly on the website!

Things I still need to do:

  • Implement some kind of search system
  • Trawl for broken links
  • Write a Python module for publishing posts right out of Editorial
  • I also need to fix the way posts are displayed in the RSS Feed!

Advertising - An Update

Back in January I decided to try a short experiment by adding ads to my site, just to see what happened.

I only intended to leave it in place for a couple of months, but I think I've established by now that I'm at the very least a chronic procrastinator.

In the 10 months that I have had adverts on my site, I have made a grand total of £2.66; since Google puts a payment threshold of £60.00 on payments, it would take me about 20 years just to get paid.

I don't think I'm uncovering any Grand Truth or anything here - my blog traffic is small, but when I looked at the quality of the adverts I was displaying, I realised that it just wasn't worth it.

I have removed ads and will henceforth be writing for the sheer pleasure.