Why I haven't posted much this year

26th August 2023 6:39 pm

Why (nearly) every PHP class you write should be abstract or final

13th August 2023 3:00 pm

Two techniques for handling recursive relationships in MySQL

18th December 2022 2:15 pm

What I think ChatGPT means for developers

11th December 2022 7:20 pm

Why I no longer use the repository pattern

26th October 2022 5:30 pm

Everything's (potentially) a callable

2nd October 2022 7:30 pm

The ORM Delusion

5th June 2022 6:00 pm

Dynamic image handling with Glide and GraphQL

21st August 2021 4:20 pm

Moving to Gatsby.js

28th July 2021 2:36 pm

Lightweight Laravel - deconstructing a full stack framework

30th December 2020 5:00 pm

What I want in a PHP CMS

28th September 2020 2:50 pm

Flow typed AJAX responses with React Hooks

13th June 2020 12:50 pm

Caching the Laravel user provider with a decorator

11th March 2020 9:20 pm

The trouble with integrated static analysis

12th February 2020 10:40 pm

Don't use stdClass

9th February 2020 10:10 am

F*** PHPStorm Man and the high horse he rode in on

25th January 2020 10:25 pm

Input components with the useState and useEffect hooks in React

27th October 2019 9:20 pm

Flexible data types with the JSON field

13th October 2019 10:10 pm

Storing Wordpress configuration in environment variables

22nd September 2019 6:00 pm

Using Mix versioning outside Laravel

21st September 2019 10:30 am

Setting private properties in tests

7th September 2019 7:16 pm

Skipping environment specific PHPUnit tests

28th July 2019 7:55 pm

Powering up git bisect with the run command

19th June 2019 9:00 pm

Writing golden master tests for Laravel applications

14th May 2019 11:15 am

How much difference does adding an index to a database table make?

4th March 2019 9:26 pm

Searching content with Fuse.js

20th February 2019 5:25 pm

Higher-order components in React

16th February 2019 7:00 pm

Creating your own dependency injection container in PHP

2nd February 2019 8:45 pm

Understanding query objects

27th January 2019 11:10 pm

Writing a custom sniff for PHP CodeSniffer

13th January 2019 6:50 pm

You don't need that module package

3rd January 2019 11:55 pm

Why bad code is bad

2nd January 2019 11:00 pm

Improving search in Vim and Neovim with FZF and Ripgrep

27th December 2018 6:37 pm

Decorating service classes

6th December 2018 6:34 pm

Simplify your tests with anonymous classes

20th October 2018 1:48 pm

Adding React to a legacy project

16th October 2018 8:00 am

Do you still need jQuery?

11th October 2018 8:21 am

An approach to writing golden master tests for PHP web applications

8th October 2018 10:20 am

Understanding the pipeline pattern

5th October 2018 6:36 pm

Replacing switch statements with polymorphism in PHP

3rd October 2018 10:07 pm

Career direction after seven years

25th September 2018 9:03 pm

How I'm refactoring a Zend 1 legacy project

24th September 2018 9:30 pm

Mutation testing with Infection

13th September 2018 7:10 pm

Switching from Vim to Neovim

9th September 2018 12:40 pm

Better strings in PHP

25th July 2018 9:25 pm

Forcing SSL in CodeIgniter

23rd June 2018 12:03 pm

Logging to the ELK stack with Laravel

3rd June 2018 3:30 pm

Full-text search with MariaDB

13th May 2018 1:55 pm

Building a letter classifier in PHP with Tesseract OCR and PHP ML

10th May 2018 10:50 pm

Console applications with the Symfony Console component

29th April 2018 7:59 pm

Rendering different views for mobile and desktop clients in Laravel

22nd April 2018 10:50 pm

Making Wordpress less shit

12th April 2018 10:57 pm

Using stored procedures in your web app

10th March 2018 3:10 pm

Check your code base is PHP 7 ready with PHP Compatibility

25th February 2018 5:22 pm

Unit testing your Laravel controllers

25th February 2018 3:50 pm

Put your Laravel controllers on a diet

18th February 2018 6:10 pm

Using Lando as an alternative to Vagrant

4th February 2018 12:12 am

How I deploy Laravel apps

29th January 2018 10:00 pm

Why the speed of your MVC framework is usually a red herring

28th January 2018 8:20 pm

Deploying your Laravel application with Deployer

22nd January 2018 12:00 pm

Creating a caching user provider for Laravel

12th January 2018 1:16 pm

Adding OpenSearch support to your site

10th January 2018 10:07 pm

Easy repositories and decorators with Laravel Repositories

10th January 2018 12:22 pm

Creating Laravel Helpers

9th January 2018 5:26 pm

Getting the type of an unsupported Postgres field in Laravel

8th January 2018 2:00 pm

Creating an Artisan task to set up a user account

8th January 2018 12:52 pm

Adding comments to models in Laravel

7th January 2018 5:21 pm

More tricks for speeding up your Laravel test suite

7th January 2018 4:32 pm

Adding dynamic flat pages to your Laravel app

3rd January 2018 11:49 am

A Laravel package boilerplate

2nd January 2018 12:12 pm

Using Artisan from standalone Laravel packages

2nd January 2018 12:01 pm

Creating Artisan tasks that generate files

1st January 2018 4:06 pm

Using UUIDs as primary keys with Laravel and PostgreSQL

29th December 2017 6:01 pm

Full text search with Laravel and PostgreSQL

2nd December 2017 11:30 pm

Building a postcode lookup client with HTTPlug and PHPSpec

28th November 2017 11:40 am

Creating custom assertions with PHPUnit

16th November 2017 3:15 pm

Catching debug statements in PHP

6th November 2017 12:00 pm

An Azure Filesystem integration for Laravel

29th October 2017 7:31 pm

Using phpiredis with Laravel

20th October 2017 9:55 pm

Simple fuzzy search with Laravel and PostgreSQL

3rd October 2017 10:56 pm

A generic PHP SMS library

25th September 2017 9:18 pm

Installing Nginx Unit on Ubuntu

8th September 2017 9:05 pm

Making internal requests with Laravel

2nd September 2017 1:45 pm

Run your tests locally with Sismo

19th August 2017 2:40 pm

Profiling your Laravel application with Clockwork

14th August 2017 11:40 am

Snapshot test your Vue components with Jest

17th June 2017 1:12 pm

Enforcing a coding standard with PHP CodeSniffer

15th March 2017 9:37 pm

Decorating Laravel repositories

1st March 2017 11:16 pm

My first Laravel package

19th February 2017 3:50 pm

Integrating Behat with Laravel

18th February 2017 9:25 pm

Testing Laravel Middleware

29th November 2016 11:00 pm

Easy static asset versioning in PHP

26th November 2016 9:40 pm

Building a Phonegap App with Laravel and Angular - Part 4

13th November 2016 4:15 pm

Creating an Azure storage adapter for Laravel

23rd October 2016 11:25 pm

Building a Phonegap app with Laravel and Angular - Part 3

16th October 2016 5:10 pm

Building a Phonegap app with Laravel and Angular - Part 2

18th September 2016 10:18 pm

Building a Phonegap app with Laravel and Angular - Part 1

11th September 2016 6:33 pm

Deploying new versions of a Laravel app with Fabric

5th September 2016 9:22 pm

Maintaining your CV with Markdown and Emacs

29th August 2016 3:40 pm

Creating a personal dashboard with React and Webpack

15th August 2016 10:18 pm

An introduction to managing your servers with Ansible

10th August 2016 7:45 pm

Testing your API documentation with Dredd

8th August 2016 4:05 pm

Using Jenkins pipelines

5th June 2016 3:32 pm

Adding Google AMP support to my site

22nd May 2016 10:29 pm

Broadcasting events with Laravel and Socket.io

14th May 2016 8:00 pm

Writing faster Laravel tests

4th April 2016 7:55 pm

Building a location aware web app with GeoDjango

26th March 2016 9:30 pm

My experience using PHP 7 in production

18th March 2016 7:42 pm

Mocking external APIs in Python

26th January 2016 11:40 pm

Learning more about React.js and Flux

18th November 2015 7:52 pm

Building a real-time Twitter stream with Node.js, React.js and Redis

28th September 2015 7:00 pm

A quick and easy Varnish primer

19th September 2015 6:42 pm

When you should not use Wordpress

22nd August 2015 6:32 pm

Testing Django views in isolation

2nd August 2015 4:58 pm

Exploring the HStoreField in Django 1.8

1st August 2015 5:26 pm

New laptop

21st July 2015 8:15 pm

Handling images as base64 strings with Django REST Framework

4th July 2015 12:01 pm

Getting django-behave and Celery to work together

17th June 2015 7:34 pm

Setting ETags in Laravel 5

14th June 2015 8:29 pm

My static site generator post on Sitepoint

3rd May 2015 6:55 pm

How I added search to my site with Lunr.js

18th April 2015 2:05 pm

Adding a new search engine to my site

4th April 2015 12:47 am

Syntax highlighting in fenced code blocks in Vim

2nd March 2015 11:25 pm

Extending our Node.js and Redis chat server

2nd March 2015 11:03 pm

Switching to my own static site generator

15th February 2015 6:11 pm

Building a chat server with Node.js and Redis

31st December 2014 2:10 pm

My first Grunt plugin

28th December 2014 5:04 pm

Building a URL shortener with Node.js and Redis

9th November 2014 5:13 pm

My Django web server setup

19th October 2014 6:52 pm

Introducing generator-simple-static-blog

5th October 2014 6:56 pm

Django Blog Tutorial - the Next Generation - Part 9

28th September 2014 7:51 pm

Changing date format from DD/MM/YYYY to YYYY-MM-DD in Vim

28th September 2014 6:53 pm

Django Blog Tutorial - the Next Generation - Part 8

31st August 2014 9:00 pm

Django Blog Tutorial - the Next Generation - Part 7

25th August 2014 4:15 pm

Django Blog Tutorial - the Next Generation - Part 6

25th May 2014 4:23 pm

Django blog tutorial - the next generation - part 5

24th May 2014 7:15 pm

Django blog tutorial - the next generation - part 4

15th February 2014 5:45 pm

My first Yeoman generator

25th January 2014 11:38 am

Django Blog Tutorial - the Next Generation - Part 3

3rd January 2014 12:57 pm

Django blog tutorial - the next generation - part 2

2nd January 2014 11:28 am

Django blog tutorial - the next generation - part 1

28th December 2013 3:00 pm

A starting boilerplate for PHP development with Vagrant

16th August 2013 9:49 pm

First steps with Node.js

28th July 2013 7:20 pm

My first jQuery plugin

21st April 2013 10:06 pm

Running the PHP development server with Laravel

15th December 2012 12:26 am

Testing PHP web applications with Cucumber

3rd November 2012 4:43 pm

Counting Commits in Git

5th September 2012 12:13 am

Falling back to local copies of jQuery and jQuery Mobile

13th August 2012 7:54 pm

Dumping WordPress for Octopress

31st May 2012 9:25 pm

Yet another tutorial for building a blog using Python and Django - part 5

23rd April 2012 9:55 pm

Yet another tutorial for building a blog using Python and Django - part 4

29th March 2012 9:29 pm

Yet another tutorial for building a blog using Python and Django - Part 3

24th March 2012 6:23 pm

Yet another tutorial for building a blog using Python and Django – Part 2

19th March 2012 3:18 pm

New theme

28th February 2012 6:25 pm

Yet another tutorial for building a blog using Python and Django - Part 1

24th February 2012 4:17 pm

So you REALLY don't know regular expressions?

29th January 2012 7:52 pm


13th January 2012 7:25 pm

Linux in the workplace

24th October 2011 10:18 pm


29th May 2011 2:53 pm

New phone

30th March 2011 8:34 pm

More on my mini server

21st February 2011 10:26 pm

My new mini server

24th January 2011 12:30 am

A slight change...

13th November 2010 8:20 pm

Deleting unwanted Vim swap files using Perl

29th October 2010 8:49 pm

A couple of things I love about Perl

27th October 2010 12:15 am

I passed!

19th October 2010 2:52 pm

Another Perl snippet...

16th October 2010 9:11 pm

Getting work done with Perl

15th October 2010 8:39 pm

What makes a good programming textbook?

22nd August 2010 5:15 pm

Perl after Python

16th August 2010 9:50 pm

Moving away from OS X

8th August 2010 12:47 am

Staying productive in summer

10th July 2010 1:21 am

Five things you should consider including on your website

5th July 2010 8:01 pm

Moving on to Perl

23rd June 2010 1:41 pm

Exam tomorrow

22nd June 2010 3:57 pm

Should you have adverts on your website?

20th June 2010 8:11 pm

Why is Chrome so popular all of a sudden?

18th June 2010 10:12 pm

First steps with PHP

8th June 2010 10:24 pm

Creating 10 Most-Used Javascript Techniques Using Pure CSS Styling

31st May 2010 4:16 pm

Is Dreamweaver the best choice for developing your first website?

15th May 2010 5:27 pm

Why you should try Vim

10th May 2010 8:15 pm

New hosting

10th May 2010 12:52 am


3rd May 2010 6:23 pm

Learning JavaScript

3rd May 2010 5:29 pm


3rd May 2010 12:04 am

My new home on the Web

2nd May 2010 11:57 pm


21st April 2010 3:06 pm

Election time

18th April 2010 8:09 pm

Comments policy

18th April 2010 7:57 pm

My new website

20th March 2010 9:52 pm

Switching to Slackware

14th March 2010 1:56 pm

The great IE6 switchover

18th February 2010 8:30 pm

Moderation on

11th February 2010 5:55 pm

The rise and rise of Unix

19th January 2010 2:19 pm

Self-appointed guardians of the English language beware!

3rd January 2010 11:38 am