Blog
26 Apr 2023
Job ads are not a logic puzzle: BBC Bitesize brainteaser may teach bad lessons
14 Feb 2023
Overwriting native JavaScript functions and intercepting JSON.parse
7 Feb 2022
My first 10 years as a web developer
20 Jan 2022
Should B2B SaaS businesses accept payment by bank transfer?
1 May 2021
Origin of the term "homo economicus"
16 Apr 2020
Identifying what quota is exceeded in Google Cloud
1 Apr 2020
Adventures in filling out a date input with Puppeteer
25 Nov 2019
Understanding my Google Cloud bill
24 Oct 2019
HMRC cancelled my VAT registration, and how it got reinstated
23 Oct 2019
Migrating your Webpack TypeScript build to babel-loader
13 Oct 2019
Reducing Docker image size and cutting Google Cloud costs
17 Sep 2019
Getting users to talk to you when building a software product
7 May 2019
Reporting build metrics to Github
25 Oct 2018
Manually making an HTTP requests in Node.js
28 Sep 2018
Running and debugging CircleCI tests on local
21 Jul 2018
Running headful Chrome on an Ubuntu server with Xvfb
27 May 2018
Dynamic dataflow analysis for JavaScript: How FromJS 2 works
6 Mar 2018
Getting an interactive debuggable Node console
19 Feb 2018
When to write tests
25 Jan 2018
V8 memory quiz
7 Dec 2017
Better types of debuggers
3 Nov 2017
Learning Chinese (or any language really)
30 Oct 2017
How to write a JavaScript-free todo app using just HTML and CSS
7 May 2017
Node-ChakraCore and the relationship between Node and V8
11 Apr 2017
Debugging Macaca end to end tests
29 Mar 2017
A quick look at how Chrome's JavaScript code coverage feature works
29 Mar 2017
Understanding the size of an object in Chrome/V8
1 Feb 2017
Implementing a hash table in JavaScript
31 Jan 2017
Difference between Map and WeakMap in JavaScript
30 Jan 2017
Lazy JavaScript Parsing in V8
22 Jan 2017
Simulating buttons in Chrome's object inspector
22 Jan 2017
Using console.group to make logs more readable
10 Jan 2017
What's a statement completion value in JavaScript?
29 Dec 2016
Why collecting pictures of toilet flush buttons is boring
22 Dec 2016
Time-travel debugging Node programs with Visual Studio Code
20 Dec 2016
Memoizing native JavaScript functions (or not)
9 Dec 2016
A super simple introduction to neural networks
11 Oct 2016
Mapping UK Employment
4 Oct 2016
How FromJS works
19 Aug 2016
Trying to generate source maps by performing dynamic analysis on the compiler
6 Aug 2016
Chrome DevTools: Show native functions in JS Profile
24 Jul 2016
How much memory do JavaScript arrays take up in Chrome?
20 Jul 2016
Proxy objects, symbols, and string conversions
17 Jul 2016
Using FromJS to understand Backbone TodoMVC
7 Jul 2016
Resolving minified production stack traces with StackTrace.JS
10 Jun 2016
Analyzing variable references with Tern
1 Jun 2016
How is node --inspect different from using Node Inspector?
1 Jun 2016
Two mistakes I made working with Redux
17 Mar 2016
Chrome DevTools: Never Pause Here
19 Feb 2016
Writing custom formatters for logged objects in Chrome
14 Feb 2016
How do source maps work?
8 Feb 2016
Chrome DevTools: Restart Frame
28 Jan 2016
JavaScript deep object comparison - JSON.stringify vs deepEqual
13 Jan 2016
Lessons learned from running a free front-end development course
13 Dec 2015
Minimal React/Redux Example
30 Nov 2015
The "Not Yet" Fallacy of Startups
16 Sep 2015
React and Immutable.js
21 Aug 2015
Toggling V8 function inlining with Node
19 Aug 2015
Compiling V8 and viewing the assembly code it generates from JavaScript
7 Aug 2015
6 tips for building a website with limited developer resources
4 Aug 2015
A non-technical explanation of unit and mutation tests
29 Mar 2015
Stepping through JavaScript code in Chrome
20 Dec 2014
Using Backbone Views on server rendered pages
3 Nov 2014
How to manually take an Angular directive out of the DOM
29 Oct 2014
Tracking anonymous users with Mixpanel People Analytics
24 Oct 2014
Using CSS to animate element colors in an SVG image
9 Sep 2014
Using Mixpanel's Engage API to filter and count users
1 Sep 2014
Filtering users by how often they triggered an event in Mixpanel
11 May 2014
Testing and debugging cross-platform websites
10 Jan 2014
Stylesheet architecture and directory layout
6 Jan 2014
Updating Flexslider settings after initialization
2 Jan 2014
Node file system access with promises
30 Dec 2013
Parsing and modifying Javascript code with Esprima and Escodegen
21 Oct 2013
Inheriting from a parent class without calling its constructor in Javascript
15 Oct 2013
Usability of the Tubby Custard machine
5 Oct 2013
How to allow debugger statements when using ng-boilerplate
26 May 2013
Setting the default style of a GeoServer layer with gsConfig
7 May 2013
How to convert an OpenLayers filter object to a CQL XML string for GeoServer
31 Mar 2013
Deploying a Flask app to Ubuntu with Python Paste
13 Feb 2013
Aardwolf - source-level remote Javascript debugging
26 Jan 2013
Minimal Backbone.localStorage example
21 Jan 2013
Backbone LocalStorage - Uncaught TypeError Object has no method 'parse'
18 Jan 2013
jQuery deferred objects and reporting progress
9 Jan 2013
Using deferred objects in your own components
6 Jan 2013
Introduction to jQuery deferred objects
4 Jan 2013
jQuery.Callbacks objects
30 Dec 2012
gRaphael legendmarks for pie charts
19 Dec 2012
Hosting a static website on Amazon S3
11 Dec 2012
jQuery translucent box plugin
21 Nov 2012
Writing custom jQuery selectors
19 Nov 2012
Vsftpd 530 login incorrect after adding user on Fedora
16 Nov 2012
Connecting to an EC2 MySQL server remotely
14 Nov 2012
Setting up MySQL on AWS/Fedora
12 Nov 2012
Setting up an AWS Fedora instance to serve a PHP website
30 Sep 2012
Making a gRapahel pie chart interactive using .hover()
20 Sep 2012
gRaphael pie chart example
2 Sep 2012
Writing a custom parseInt function in Javascript and benchmarking it
21 Aug 2012
Javascript 1.7 - List comprehensions
13 Aug 2012
How does jQuery.noConflict work?
8 Aug 2012
A postfix maillog entry explained
6 Aug 2012
Javascript and EcmaScript versioning
1 Aug 2012
Javascript 1.7- generators with the yield keyword
19 Jul 2012
Debugging Node.js with node-inspector
8 Jul 2012
What's the relationship between jQuery bind/unbind and on/off?
25 Jun 2012
How does jQuery .data() work?
19 Jun 2012
TIL You can change the frame that the Chrome debugging console refers to
16 Jun 2012
Why does the object returned by jQuery() show up like an array in the console?
13 Jun 2012
How does .fn work in javascript libraries?
9 Jun 2012
Logging namespace field addition and removal in Javascript
6 Jun 2012
Simple line chart with g.Raphael 0.5
14 May 2012
Ico.js (and a bar chart example)
9 Apr 2012
Uploading a file to S3 on the client
12 Feb 2012
Unnamed arguments with argparse
DevTools Diaries
1 Aug 2016
Building Chromium
28 Jul 2016
InspectorFrontendHost