I’ll just leave this here…

A massive rocky outcropping

Avatar-Style Worlds in Minecraft

InfoLab Kitten!


A cat gave birth behind InfoLab earlier in the year, and one of the kittens Hung around!

Totally feral, but its used to people being around due to all the students about all the time so will quite happily sit on the warmer manhole covers and let you take photos.

I’m pondering calling the RSPCA to have them collect it, as food will go scarce when the students leave for Christmas…

Gmail Conversation View

I get rather a lot of e-mail these days.

As a member of several mailing lists, it can get rather hard to keep track of the flow of conversation if the mail client doesn’t really support it, as is the case with Mozilla Thunderbird.

While Thunderbird does include a ‘conversation view’ it doesn’t really work properly with GMail IMAP accounts, and tends to duplicate messages in the list making the thread unreadable.

Alternatively, there is the collapsed ‘thread view’ which shows a summary of the messages with a given subject line.  While this is good for short threads, it does get slightly useless for longer replies.  Futhermore, Thunderbird does not show your replies in this view, relying on the replies from other users to include your text in the conversation!

As a result of looking for a solution to another problem, I stumbled upon this the GMail Conversation View plugin for Thunderbird which has completely fixed the problems of ‘thread view’ for me, allowing messages to be expanded out and viewed in full in the thread list, and contains my sent messages along with the received ones!

Get it! It’s good!

Server Upgrade

I just did a server upgrade – if anyone spots anything that’s broken/in the process of breaking, tell me!

New Broadband – Revisited

A short while back, I posted about using A&A (Andrews & Arnold Ltd) as my broadband ISP, and said I would report back to say how things went.

I’m pleased to report this (bearing in mind this is just an ADSL2+ connection, on normal copper hung on poles…) Results for A&A, 7.02Mb/s down, 0.75Mb/s up

Results from running on the A&A connection

And this!

What my router reports the connection is

Which makes this the fastest connection I’ve ever had the pleasure to be on, and providing that A&A manage to keep this sort of rate, I’ll be coming back to them whenever I need a new connection, and recommending them to anyone who asks!


Having had my feet wet a little with Android development, I decided to have a go at a bigger project – hence; uLaunch.

uLaunch is a very basic home screen replacement, with the intent to design for usability rather than fancy graphics (Oh, and I suck as an artist!).

Anyway – progress on Rev.0 continues thus:

New Broadband

Having messed about with ‘normal’ service providers for a while, I decided to go with a more ‘specialist’ provider this time, to save annoyance and frustration.

One of my previous house-mates discovered who do not shape traffic to below the line limitations! Kickass!

I’ll report on how well they do after I’ve lived with them for a bit, but the outlook is awesome! 😀

Oh, and they have some excellently worded T&C:

The internet is a huge network of computers managed and controlled by thousands of separate organisations. Andrews & Arnold Ltd (A&A) do not control the internet. Do not blame A&A if you find things you don’t like.


Android ‘R’ Class

Just putting this up here in case anyone else falls into the trap I just did.

If you’re writing an Android application, and add a new Activity, you might want to refer to a generated class (from XML) using the ‘R’ class.

In Eclipse, it automagicly imports “android.R” as soon as you use it to attempt to access R.layout for a setContentView( R.layout.something ) call – this then breaks the class!

This is because the class is included as part of your project, but can be accessed via static calls from the Android API, causing a fun name conflict.

Simple workaround – remove the import line! Then your local copy will be used over the static methods of the class described in the API, fixing the issue.


Written for part of my university coursework, so vaguely well structured for once!
It can be downloaded here: GA.tar.gz
What follows is taken directly from the included readme.txt.

This program attempts to solve the Travelling Salesman problem using
a Genetic Algorithm approach.

The basic sequence of events is as follows (omitting special cases and
display code of any kind);

generation = new RandomGeneration( size );
    iteration = 0;
    while( iteration < maxGenerations ){
        Perform ERO on quads from top half of ‘generation’.
        Randomly select ‘n’ children{
            For each child{
                Randomly swap city positions in its genome ‘X’ times.
        //Sort the generation by path length (shortest first)
        if( not changed in X generations )

If the ‘–attempt_autocorrection’ (or -ac) flag is set upon starting the
program, the following sequence is executed immediately following the
mutate stage;

//Child Mutate
    Randomly select ‘n’ children{
        For each child{
            Randomly swap city positions in its genome ‘X’ times.

In this implementation, genes are stored as array offsets, allowing very
fast manipulation of data without extensive memory access.
Additionally, this allows modifications to the agents to be made without
details on the search space, allowing very generic representations of

Edge Recombination is used to breed new agent sequences from a
pair of parents. This has the advantage of only creating offspring
which are very similar to their parents, keeping ‘good’ sequences in the
gene pool and allowing them to spread to other agents genome in the next
breeding cycle.

The Edge Recombination Operator (ERO) is defined thus;

For each parent{
        Generate adjacency matrix for their genome.
    Combine the matrices to one, removing any duplicated entries.
    Start from a parent‘s first point.
    Remove all instances of the current point from the matrix
    While( Matrix not empty ){
        if( Points exist on this row )
            Select next point from matrix.
            Choose a random point on the matrix.
        Remove all instances of the current point from the matrix
    Return new child( from points );

Selection is simple, the entire generation is ordered by how close to
zero they are, and the bottom half are removed. The top half then breed
with their ‘rightmost’ neighbours, stepping twice for each breed
( 1&2&3&4, 3&4&5&6, 4&5&6&7, etc. ) and populate the generation with
pairs of children.

Once they have bred, the breeders then move into the next generation
themselves, such that they can persist unless better candidates are

The algorithm will exit if the best solution has not changed in a set
number of generations, as determined by the –stagnate (or -st)

While this is not a brilliant metric for completion, it works most of
the time as the GA tends to plateu after a while as the probability of
it finding a better solution reduces the closer it gets to the perfect


With javac and javadoc on your PATH, simply calling;


which will generate both the binaries and the java documentation in
./bin and ./docs respectively.

To perform a clean build;

make clean && make

Logs of example runs can be found in ./logs, and are stored such
that the short parameter names follow their values; ie.

150 agents, 25 cities = 150a25c.txt
300 agents, 100 cities = 300a25c.txt

Logs are in CSV with the column order of:

Best Length
Worst Length
Average Length
SteveScore Best
SteveScore Worst
SteveScore Average

USAGE: java GeneTest
            [–width=X | -w=X]
            [–height=X | -h=X]
            [–agents=X | -a=X]
            [–cities=X | -c=X]
            [–mutate=X | -m=X]
            [–mutate_factor=X | -f=X]
            [–simple | -s]
            [–stagnate=X | -st=X]
            [–noreturn | -nr]
            [–stevescore | -ss]
            [–show_worst | -b]
            [–seed=X | -se=X]
            [–manual | -e]
            [–log=FILE | -l=FILE]
            [–attempt_autocorrection | -ac]
    –width=X | -w=X
        Sets the width of the search space to X.

    –height=X | -h=X
        Sets the height of the search space to X.

    –agents=X | -a=X
        Sets the number of agents in each generation to X.

    –cities=X | -c=X
        Sets the number of cities to pathfind through.

    –mutate=X | -m=X
        Sets the number of agents to run mutations on.

    –mutate_factor=X | -f=X
        Sets the number of mutations to occur in a mutated agent.

    –stagnate=X | -st=X
        Will halt the GA after no better route is found after X generations.

    –noreturn | -nr
        Performs calculations without a return path – gives open-ended routes.

    –stevescore | -ss
        Displays the scores in ‘steve’ format, for benchmarking purposes.

    –simple | -s
        Uses simple random mutation rather than edge recombination breeding.

    –show_worst | -b
        Displays the worst path in red on the search space window.

    –seed | -se=X
        Sets the random seed for city position generation.

    –manual | -e
        Allows you to tweak the best route produced for each generation.
        ‘swap [a] [b]’ swaps two points in the tour array, and
        ‘skip [generations]’ skips edits until ‘n’ generations have passed.

    –attempt_autocorrection | -ac
        Attempts to reduce the number of small, crossed over routes by
        an additional form of mutation. This takes the form of selectively swapping
        the points in edges with very short lengths.
        This uses the mutate factor to determine where to start reassembling
        edges in the generation (distance from best).

    –log | -l
        Sets the log file and starts logging to that file

        Prints this help.

The Downloads Page

I kept telling myself that I should put stuff I write up on my site, but never actually got around to doing it.

Finally, I have a way of getting (semi) useful stuff I’ve written up for people to look at (and/or laugh at, whatever) and it can be found via the shiny new ‘Public Files’  link at the top of this page, or by following this link.

If anyone finds any use for any of this, or have any problems with compiling/running something, drop me a comment and I might look into it, depending on available time.