Web App Development

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

Meetup Notes

8 Jul 2014
Law for startups - Issues and traps

18 Jun 2014
Building a developer-centric company culture (SE Careers London)

9 Jun 2014
The Old, The New and the Scary - Cultural innovations in companies

9 Jun 2014
Agile vs Agile - The fall of "scientific" management

22 May 2014
How to get a stranger to agree to something (HN London May 2014)

22 May 2014
Q&A with Gil Dibner (HN London May 2014)

13 May 2014
Models of Automation - Two Paradigms (London Selenium Meetup May 2014)

8 May 2014
Running Node.js on Google Cloud Platform

20 Mar 2014
London Web Meetup March 2014

20 Jan 2014
London Node User Group January 2014

22 Nov 2013
Untangle the Web November 2013

Ideas

I have a list of project ideas I think would be interesting to do, but don't have the time for right now.