Cross Browser Functionality – how our Government does it

Anyone who works in the field of web-development will be well aware of the problems of the inconsistencies between the ways different browsers work. All too often, we find ourselves saying such things as “Well, it worked fine in Firefox/Chrome/Opera, why won’t it work in Internet Explorer 6/7/8/9/10”.

The latest issue of Private Eye magazine led me to this site; – an online portal for claiming Disability Living Allowance. Obviously, the current Government is committed to making it as hard as possible for anyone to claim any sort of benefit, but this site takes it a little too far;

Operating systems and browsers

The service does not work properly with Macs or other Unix-based systems even though you may be able to input information.

You are likely to have problems if you use Internet Explorer 7, 8, 9 and 10, Windows Vista or a smartphone. Clearing temporary internet files may help but you may wish to claim in another way.

There is also a high risk that if you use browsers not listed below, including Chrome, Safari or Firefox, the service will not display all the questions you need to answer. This is likely to prevent you from successfully completing or submitting the form. You may wish to claim in another way.

In short – you can only claim for this benefit on-line if you haven’t updated your computer or browser for ten years.

Using multiple entity managers in Symfony2

When using a single Symfony2 install to manage multiple web-apps, each with its own database, you can set up multiple entity managers and tell each bundle which manager to use.

One thing that stumped me, and has seemed to stump others judging by a quick Google, is how to inject a non-default entity manager into a service.

Turns out, the way to do it use [name]_entity_manager, instead of entity_manager in the arguments line of services.yml. So, if you have an entity manager called ‘other’, use this:

         class: Me\MyBundle\Form\Selector\ProjectSelectorType
         arguments: ["@doctrine.orm.other_entity_manager"]


Using PHPass with CodeIgniter

Storing passwords in a database is a necessary evil for most web-applications. No-one in their right mind would save plain-text passwords, and MD5 hashes aren’t much better. A useful library called PHPass exists to hash passwords in a more secure manner. Using this in CodeIgniter should be straightfoward, but it is a bit fiddly.

Using third-party libraries in CodeIgniter is simple – just make sure the class you wish to use is the appliction/libraries directory and then use


But, when CodeIgniter loads the library, it also instantiates an object using the class definition in the library file. If the class constructor requires some parameters, you can pass them by adding an array to the $this->load->library() function;


In this case, $params must be an array.

The PHPass class definition, however, requires two parameters. So, the easy way round this is to adapt the PHPass class constructor to accept an array rather than two single parameters;

function PasswordHash($params)
        $iteration_count_log2 = $params[0];
        $portable_hashes = $params[1];
        $this->itoa64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';

        if ($iteration_count_log2 < 4 || $iteration_count_log2 > 31)
            $iteration_count_log2 = 8;
        $this->iteration_count_log2 = $iteration_count_log2;

        $this->portable_hashes = $portable_hashes;

        $this->random_state = microtime();
        if (function_exists('getmypid'))
            $this->random_state .= getmypid();

Football Results Database – part 1

In order to store the results of the NFL games, we’re going to need some tables. My initial design is as follows;

  • a table to store details of the teams in the league. For simplicity, we’ll assume that we only want to store results for a single season (for now), so the teams won’t change divisions. The ‘teams’ table just needs to store a ‘short-name’ for each team (which might as well act as the Primary Key for the table), the full name of the team, which conference it plays in, and which division. That should do for now.
  • a table to store details of the two Conferences. We might as well use AFC and NFC as the Primary Key for this table
  • a table to store details of each game; the week number, the date, maybe the location (maybe we’ll add this later) and whether the game went into overtime
  • a table to sore the results. a result will take up two rows of the table, one row for each team. I’ve added a ‘home’ field, which will be 1 if that row contains the score of the home team.

So, here is my basic table schema for MySQL;

CREATE TABLE `conferences` (
  `short` char(3) NOT NULL,
  `name` varchar(50) NOT NULL,
  PRIMARY KEY (`short`)
insert  into conferences values 
('AFC', 'American Football Conference'), 
('NFC', 'National Football Conference');

CREATE TABLE `games` (
  `game_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `week` int(11) NOT NULL,
  `year` int(11) NOT NULL,
  `date` date NOT NULL,
  `overtime` tinyint(4) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`game_id`)

CREATE TABLE `results` (
  `game_id` int(11) unsigned NOT NULL,
  `team` char(2) NOT NULL,
  `points` int(11) NOT NULL,
  `home` tinyint(4) NOT NULL DEFAULT '0',
  KEY `game_id` (`game_id`),
  KEY `team_fk` (`team`),

CREATE TABLE `teams` (
  `short` char(2) NOT NULL,
  `name` varchar(100) NOT NULL,
  `conference` char(3) NOT NULL,
  `division` varchar(5) NOT NULL,
  PRIMARY KEY (`short`),
  KEY `conf` (`conference`) USING BTREE,

('AC', 'Arizona Cardinals', 'NFC', 'West'), 
('AF', 'Atlanta Falcons', 'NFC', 'South'), 
('BB', 'Buffalo Bills', 'AFC', 'East'), 
('BR', 'Baltimore Ravens', 'AFC', 'North'), 
('CB', 'Chicago Bears', 'NFC', 'North'), 
('CL', 'Cleveland Browns', 'AFC', 'North'), 
('CN', 'Cincinnati Bengals', 'AFC', 'North'), 
('CP', 'Carolina Panthers', 'NFC', 'South'), 
('DB', 'Denver Broncos', 'AFC', 'West'), 
('DC', 'Dallas Cowboys', 'NFC', 'East'), 
('DL', 'Detroit Lions', 'NFC', 'North'), 
('GB', 'Green Bay Packers', 'NFC', 'North'), 
('HT', 'Houston Texans', 'AFC', 'South'), 
('IC', 'Indianapolis Colts', 'AFC', 'South'), 
('JJ', 'Jacksonville Jaguars', 'AFC', 'South'), 
('KC', 'Kansas City Chiefs', 'AFC', 'West'), 
('MD', 'Miami Dolphins', 'AFC', 'East'), 
('MV', 'Minnesota Vikings', 'NFC', 'North'), 
('NE', 'New England Patriots', 'AFC', 'East'), 
('NG', 'New York Giants', 'NFC', 'East'), 
('NJ', 'New York Jets', 'AFC', 'East'), 
('NO', 'New Orleans Saints', 'NFC', 'South'), 
('OR', 'Oakland Raiders', 'AFC', 'West'), 
('PE', 'Philadelphia Eagles', 'NFC', 'East'), 
('PS', 'Pittsburg Steelers', 'AFC', 'North'), 
('SD', 'San Diego Chargers', 'AFC', 'West'), 
('SF', 'San Francisco 49ers', 'NFC', 'West'), 
('SL', 'St. Louise Rams', 'NFC', 'West'), 
('SS', 'Seattle Seahawks', 'NFC', 'West'), 
('TB', 'Tampa Bay Buccaneers', 'NFC', 'South'), 
('TT', 'Tennessee Titans', 'AFC', 'South'), 
('WR', 'Washington Redskins', 'NFC', 'East');

Very Early Mercury Rev advert

Sorting through a box of old cassettes the other day, I found a recording of the first Mercury Rev gig that I ever attended – brought back some memories, to say the least. The gig was at the Duchess of York in Leeds (long since closed), and I remember singer David Baker started the gig at the bar, then took an age to fight his way through the crowd to the stage.

Anyways, here is an advert for that tour and their first UK single, Car Wash Hair. Hit it, crickets!Mercury Rev advert from 1991


Football Results Database – Prologue

I guess you should always blog about something you know about, so I’m going to start rambling on about databases and (American) Football. Many years ago, I had to choose a topic for my Computer Studies O-level. I came up with two options – a London Underground route-planner or a database to store NFL results. I chose the later, after my 15-year-old brain couldn’t figure out shortest-path algorithms (strange that I should end up specializing in traffic-assignment algorithms, but that’s another story).

My results database was written for my BBC micro, using BBC basic. I was very proud of the fact that it didn’t contain a single GOTO statement! It didn’t actually use a proper database either – these were the days before MySQL.

Here’s how it worked;

  • Each team was given a two-letter code to save you having to type in its full name every time. Tampa Bay was “TB”, San Francisco was “SF”. I realised that there were quite a few teams that could have used the “CB” code – Chicago Bears, Cleveland Browns or Cincinnati Bengals. I think I decided Chicago got “CB”.
  • You typed in the two-letter code of the home team, then the number of points score Repeat for the away team.
  • The program then saved all the results to disk, and would generate the league standings. It even could take into account some of the NFL’s complicated tie-breaker procedures.
  • It could also show each week’s results in a nice MODE7 table, just like on teletext.

So, I’m now going to create a similar program using PHP and MySQL, and, hopefully, learn something new.

Bradley’s Helmet Call

A topic that I will probably return to many times, and a suitable one for my initial blog post – cycle helmets!

Up until a few days ago, Bradley Wiggins was a hero of mine. Winning le Tour, being a nice-chap, having a huge collection of guitars – all things I can only dream of. But, after winning his Gold Medal in the time trial at the Olympics, was asked to comment on the tragic death of a cyclist just outside the Olympic Park. One thing he seemed to suggest was that helmet wearing should be compulsory (

The first thing that sprung to mind was why was he even being asked for his views? Is Jenson Button asked to comment every time someone is hurt in a car crash? Is Paula Ratcliffe asked for her views whenever someone gets run over? Bradley is a sportsman – a great sportsman – but he is not, as far as I know, a road safety expert.

This seems to part of the media’s (and, by association, the Great British Public’s) inability to disentangle the sport of cycling from the everyday activity of riding a bike. Things that apply to one do not apply to the other, and, just as Formula 1 racing is very different to driving down to the Co-Op, everyday cycling is very different to the type of cycling Bradley does.

Anyway, I disagree with Bradley’s idea, and later reports state that Bradley claims he was misunderstood. Fair enough.

Here are my ideas for how cycling can be made safer (in no particular order);

  1. lower (and enforced) speed limits on residential and urban streets
  2. a commitment from highway authorities to filling in potholes
  3. if cycle facilities are to be installed (I remain unconvinced as to whether they are actually a good thing), they must meet the published guidelines
  4. no-fault liability for motorists
  5. blind-spot mirrors on all large vehicles
  6. cycle training to be made available to everyone who wants it
  7. a lower drink-drive limit
  8. enforcement of existing traffic laws (especially those regarding mobile-phone use and overtaking on double-white lines)
  9. conversion of large roundabouts to continental geometries
  10. cyclist-awareness refresher courses for drivers of buses and HGVs