I'm Chris. A thirty-something husband, graduate, star gazer, aspiring triathlete, explorer, vegetarian, reader, writer, cinemaniac, and lover of life in general.

Born, raised and currently residing in sunny Bristol I work as a Senior Full-Stack Developer for Creation, a full-service digital agency. Okay, okay, you got me: Bristol isn't even that sunny. I do, though, have over a decade-and-a-half of experience under my belt working with Web technologies, building applications used by millions of people from all four corners of the globe.

Previously I have had a five-year stint running a development studio producing Web solutions for SME's using our purpose built CMS and eCommerce store. I've created an e-signature app to help companies get their contracts signed quicker, cheaper, and with less hassel. And I've built three (yes, three!) SaaS's for people new to the world of Web development, giving them a simple intro.

Whilst still a fully-fledged developer, I now also undertake more senior level tasks: giving strategy, writing reports and feasibility studies, researching and specifying projects, recruitment, and mentoring members of the team.

This site exists primarily to permit myself writing about technology, tips & tricks, and my life in general. You can follow what I am currently reading and listening to, and what makes me tick by following me on Twitter, where I try to occasionally spout something witty.

I made GigAlert

Date: October, 2015 • Role: Project lead, R&D, Objective-C, SQLite, Multiple API integrations

Screenshots of the GigAlert app on an iPhone


The app every gig goer has been waiting for. Everything I want from a gig app is here. Excellent up-to-date information and clean and easy to use.

— Noonanio, Apple App Store


Never usually write reviews for apps, but this is an exception. Such a brilliant app for tracking artists. Amazing app, would definitely recomment.

— 375hero, Apple App Store


I was amazed how good [GigAlert] was despite already having another gig app this one still impressed with its ease of use and speed.

— Splatterjay, Apple App Store


One app solution. Great app, has everything you would want for organising your gigs and lets you know when my favourite bands go on tour.

— FoxFray, Apple App Store


Great! Such a good app and means you don't miss a thing. Everything is in one place and it's really easy to use!

— Rebglo, Apple App Store


Splendid app. Very easy to use… even a monkey can do it! My Ents24 account synced all the artists onto my app, no problemo, easy peasy!

— PESwiftly, Apple App Store

I made an Open Source PHP MVC framework

Date: September, 2012 • Role: Personal project, PHP, MVC

Image of the PHP MVC project, and the profiler

A simple, quick and easy to use PHP MVC with Autoloading, Routing, Models, Views, Controllers, Layouts, and Caching. There are plenty of excellent MVC's out there. So why the need for yet another? Simply because they are big and complex. Why use a sledgehammer to crack a nut?

The projects aims to provide a compact codebase providing the basics for any application. It's designed to be fast, really fast, with its built in profiler you can easily see how fast each fragment of your site is. It has been forked many times, and forms the underlying of the Polyfony framework.


I made Ents24's Messenger Bot

Date: April, 2016 • Role: Project lead, AI NLP, PHP, ElasticSearch, Multiple API's

The Ents24 Messenger Bot, using Facebook

An advanced bot that you can talk to via Facebook Messenger and Amazon Alexa. The bot was designed to be used on many different platforms — so its NLP, input, and output are extensible and interchangeable via dependency injection.

Built as an internal R&D project over a two week period which was then presented and demoed to the company at our monthly meeting.


I made an advanced template engine
LIVE DEMO

Date: July, 2008 • Role: Project lead, PHP, Advanced regular expressions


Submit the form
to see the output here

Developed as part of an online community I built whilst on my final year of university (in-between dissertations and lectures!), and later sold, this parser formed the foundation of the system. It was designed to be as user friendly as possible; you didn't have to be a Web wizard to create a fully functional site. Complete with a user registration/login, forum, messaging, voting, and an admin control panel, it was an early version of sites such as Wix.com and BaseKit.

  • Powering over 30,000 sites
  • Over 200,000 members
  • 2,500,000 page views per month
  • 6,000,000 forum posts

I made an MMOG
LIVE DEMO

Date: April, 2007 • Role: Personal project, PHP

  Defending Attacking
Attacking ship 1
Attacking ship 2
Attacking ship 3
Attacking ship 4
EMP freezing ship
Stealing ship
Salvage ship
Asteroid stealing ship
Asteroids
for

Submit the form above
to see the output here

Built initially as a personal project, it quickly grew into a modestly sized MMOG, requiring a volunteering team of 8 to help run. The general idea is for the attacker(s) to steal as many of the defenders asteroids as possible. The attacker needs to plan wisely, though, as ships only target other specific ships, and there can be multiple attackers and defenders simultaneously.

As the sole developer, I wrote and maintained over 100,000 lines of code, both on the front & backend, as well as the admin control panel, and the database schema. Particular attention needed to be paid to security and speed, as often there would be hundreds of players online at once. The source code for this is hosted on GitHub.


Open Source GitHub projects

PHP MVC
There are plenty of excellent MVC's out there. So why the need for yet another? Simply because they are big and complex. Why use a sledgehammer to crack a nut?

MemcachedRT
A tiny application that will monitor your Memcached server, providing real-time monitoring and up-to-the-second data in a glance-able format.

MMOG
You and your fellow planetary companions will work as a team within a turbulent galaxy where planets attack other planets for galaxy supremecy.

PHP/JS Reversi
A PHP/Javascript implementation of the Reversi board game.

I have opinions

2018

The Advocate

I am an INFJ, apparently making me the rarest type in Myers–Briggs Type Indicator: only around 1% of the population. INFJ: Introversion, Intuition, Feeling, and Judging. I walk alongside other INFJ’s such as Martin Luther King, Nelson Mandela, and Mother Teresa.

2016

Broken Windows

There is an interesting theory that came around in 1982 by two American social scientists named James Wilson and George Kelling called “Broken Windows”. This stated that maintaining law and order quickly in urban areas would result in fewer crimes and de-escalating crimes of severity.

2015

Service Manuals

Service Manuals, Playbooks, Style Guides, call them what you want but to any large-ish organisation they are a vital way to maintain consistency among the different departments and outside organisations, to ensure your brand does not get misused and misrepresented.

 

Cleaning up after yourself

Everyone likes a nice clean interface; some of the required scaffolding simply gets in the way of what we want to do. A classic example of this is closing things automatically; there are several ways to do this (using tweaked code examples from the PHP manual):

2014

Magic Mirror

This guy could be on to something. There is a definite huge gap in the market for a quick and easy way to see what’s going on whilst you get ready, without having to look at your phone and then get distracted on Facebook, Clash of Clans, or an email.

 

Gracefully loading images

User experience is important, and it’s the little things that matter the most. Make their visit seamless and they’ll come back time and time again. One of many ways you can achieve this is by loading images “nicely”, not by thrusting them in their face but by displaying a default image and then gracefully loading the image.

 

Getting Sassy

My stance on CSS preprocessors in the past has been far from glowing, but I’m slowly coming around. Slowly being the keyword. But I’m there now, I love it. I used to think it was just because of variables, but actually the syntax is nicer than CSS. There, I said it, humble pie. And it’s not just because it’s leaner, it’s actually more maintainable, and I’m going to give you three quick examples why.

2013

Yoda natation

Everyone’s done it, they’ve missed the second equals sign in an if-statement and created an assignment instead. Much tutting, shaking of the head, and a little chuckle ensues as you realise your error. There is a thought amongst some that Yoda notation is the way to go, so named because it switches the comparative’s to produce errors instead of unexpected behaviour.

 

iOS 7 redesign

I use Mac’s. I think they are leagues ahead of our Windows counterpart. However, I do not own an iPhone and people think I’m crazy. I tell them I use the best tool for the job, for me that is Android, and they laugh at me. I’m not sure why utilising a Mac means I should also have an iPhone, especially since I (and most iPhone owners, come to that…) use Google for most (web)apps.

2012

An introduction to PDO: The basics and benefits

MySQL is/was deeply integrated within PHP. No doubt you have seen and used the mysql_*() functions at some stage, but there is an alternative that makes your database interactions much more reliable. It’s called PDO (PHP Data Object) and here’s a quick guide that should get you up to speed in no time at all.

 

Update: Reversi board game in PHP and Javascript

I like playing the occasional game of Reversi, and thought it would prove to be an interesting project (creating something like RedHotPawn for chess). Several hours programming later I had a simple working prototype. A couple more hours later I added in some missing features and smartened everything up.

 

jQuery plugin: Swiping Blind Effect

This plugin stemmed from a need to have an effect similar to that of a blind, how it displays the content beneath slowly from left to right in strips.

 

StackOverflow challenge: Replicate (almost) HTML text-align justify

Quite an interesting little test, I thought. Has zero practical world application, but it does require the person to have a somewhat analytical mind and problem solving skills. Also a reasonable knowledge of PHP. So I thought I would have a go (without looking at others’ solutions). 10 minutes later a working script which does exactly what was requested.

 

PHP Unit Testing: Test your code like a pro

Running through a website checking for errors is time consuming. It’s also boring and prone to human error. Unit testing has been around for years and is a much faster and reliable way to test for errors.

 

Knolling

Today I learnt a new word, knolling; arranging items in parallel and 90º to each other in an aesthetically pleasing manner.

 

Simple PHP Encryption and Decryption

The need for encryption and decryption in general day-to-day Web programming is quite rare. But it can crop up from every now and again. I use a class that handles both encryption and decryption using mcrypt and the Rijndael algorithm (AES) and a 256 bit key size.

2009

Design Pattern II: Factory

As you might have grasped from the name of the pattern its role is to produce and dispatch a product. In this case a classes. We use the Factory pattern as it is a standard way to create a class which is very similar to other classes by containing the same functions, but implemented in a different way. I always like to use non-technical terms when explaining, and this example will be no different.

 

Cookie replay attack protection

So let’s jump straight in, what is a replay attack? Essentially a security breach whereby someone poses as someone else using some unique piece of data the user supplied/was issued to/from the Web server. It’s kind of similar to a man-in-the-middle attack. We’re going to be looking at the attack using specifically cookie authorisation, a very common means of implementing a “remember me” function.

 

Defensive programming

Earlier in the week, whilst implementing a domain registration API into another client project (and pulling my hair out), I thought back to a seminar from university. The module was Component Based Design and it was all about writing code in a standard way, helping to aid both the supplier (API creator) and the client (the person using the API). Although I didn’t realise it until now it actually played a large role…

 

MySQL is 24 seconds too slow

1246402800. A perfectly valid UNIX timestamp, but one that created some confusion and head scratching in our office for one of our latest internal projects. The problem came around when converting the timestamp into a MySQL date using the FROM_UNIXTIME function which produced the wrong output. The timestamp is perfectly valid, it’s the timestamp for 1st June 2009, 00:00:00 (check it, if you don’t believe me).

 

PHP __auoload

PHP5 reared it’s head mid 2004, 5 long years ago and all PHP developers rejoiced. Especially me. It gave us lots of new shiny tools to play with, including the obvious improved OO support and my particular favourite: the __autoload function. For all you Java developers out there you know that you never have to include or require files, the Java language instinctively knows where to find them thanks to the…

2008

Battle of the CSS positions

It all began a couple days ago, one slightly dull Tuesday afternoon. The air was thick and the light was dimmed. Ahem, I have a challenge for you; try and place a div underneath another. “Piece of cake,” you say. “That’s hardly a challenge”. Well, not so it would seem. I was perplexed by what I saw for a few minutes, at least. So much that I wrote this article and created a little demonstration.

 

Delete from multiple MySQL tables

I have just spent the last half hour scratching my head over how to delete from 2 tables, joined by a unique ID. For some reason, MySQL kept spitting out: Unknown table ‘myTable’ in MULTI DELETE. Many visits to the MySQL manual still made me scratching my head (Yes, looking back on the manual makes me hit my head for not noticing the “Note” about a third of the way down the page).

 

jQuery tooltip

Sorry for the lack of updates recently but I have been swept off my feet with work. A couple days ago I redesigned part of my companies website, Centation, whereby I needed to make a little jQuery tooltip to add a dynamic flair to the page. Well, I didn’t need to make one, but the lack of quality jQuery tooltip plugins forced me to. I thought I would give you the code of how I did this, and give you a couple demonstrations.

 

PHP class: SimpleXML

One thing I have found is the lack of really simple XML classes—that’s not to say there aren’t any good ones out there, I have used several really cracking ones. For my new version of my personal site (yes, this site is planned for a revamp) I wanted to integrate my Twitter feed somewhere. I looked and looked for a really simple XML class but was unable to find one. So I made one. And here is the result:

 

jQuery text resizer

I was on a site today which offered text resizing. Great I thought, let me increase the font a wee bit—it was a bit small. It proceeded to reload the page completely to set the cookie using some server-side language. The site in question was running quite slow, so it took me upwards of 5 seconds to see the changes. It would have been quicker for me to tap cmd+plus a couple times.

2007

Submit buttons not submitting

Wow, I have been busy lately, what with a hectic workplace and personal life. But I am here to tell you about a little problem I have known about for years but recently popped up when a friend couldn’t work out what was happening.

 

POST requests are actually GETs

I found out a pretty interesting, and slightly strange, feature of the HTTP protocol today. When submitting a form as a POST request, if you set the action to the targeted files folder name without the trailing slash it submits the form as a GET request—this caused me to scratch my head over a script for a couple minutes.

 

PHP class: Text to anything

I recently had a client who sent me a 300+ list of items they wanted placing into a drop down select menu. Beside the obvious accessibility issues they were quite set in their ways about what they wanted—per usual.

 

Design Pattern I: Singleton

In this first episode of PHP design patterns, we will be looking at the Singleton. The Singleton is available in most, if not all, OO languages. The purpose of the Singleton is to only ever have 1 instance of a class available which supplies the rest of the application with consistent data. I would like to point out that my version of a Singleton may differ slightly from other peoples; design patterns are not exact nor are they set in stone.

 

phpSimpleAuthent

I was browsing a couple of PHP forums the other day, and it seems people require a simple authentication script for their website. So, I thought I would make just that.

 

Magically dynamic PHP

There are several functions in the PHP language which were made to make classes more accessible and dynamic. I am going to be talking about two of these so called “magic functions” which allow you to set and get information dynamically, whilst also providing a simple log to show you what is really going on behind the scenes. These two functions are of course __set() and __get().

 

PHP exception handling

Arguably one of the best things to come out of PHP5 was its improved OO support. With OO comes easier separation of presentation, data, and business logic layers which leads to reusable code and better code management, amongst a host of others.