Displaying a progress bar for a series of promises
Promises are awesome. They make dealing with asynchronous operations in JavaScript a breeze
without having to visit or even think about call-back hell. One thing I have often wanted to
do is display a progress update for a series of Promises to the…
Lightweight templated pages with Alpine.js
Alpine.js is a super lightweight (15.04 KB) JavaScript framework that adds
some basic interactivity and templating behavior all via HTML attributes. It helps with templating
pages with data, like looping, toggles etc. all with a minimal markup based…
Using GitHub issues as a CMS
Reading lists, you know that feature in your browser you never quite use. You know the one,
saves a URL for a rainy day. This is my quest for a better reading list. I once used Pocket for
about a month (the Mozilla one), but it felt like it was…
Building an app using Gatsby, Firebase, and Sanity.io
During the second Points' hackathon of 2021 I was involved in a project that aimed to build an application to gamify our on-boarding process with interactive activities and reinforced learning. It featured various quizzes that are added to certain…
Monitoring subresource integrity issues on the client
One of the more recent web security topics I have been working with is subresource integrity or SRI.
These take the form of hashes set as the integrity on various assets which help mitigate against file manipulation attacks by providing a way for a…
Using the Toggl Track API to automate a daily ritual with Python
I have a real habit of over-engineering automation tools. This is yet another, semi-useless
automation project, but this time using Python! Before we dive into specifics, here is a bit of
context... In my current team's form of agile, we post a…
Designing APIs with the OpenAPI spec (v3.0)
My team has been talking about revamping our testing strategy for a core service for some time. We heavily
rely on E2E tests against a pleothra of other microservices which makes all of our pipelines unbelievably slow.
We're looking to implement…
Ditching Tailwind.css and embracing MDX
What started as a minor tweak to this site turned into quite a large refactor! I've added a little theme improvement
and some changes to the tooling around the site build. Along with the headliner changes detailed below: Added MDX support The…
Automate git activities with Node
Turns out you can automate Git commands and processes with node, and interact with any other
scripts with a copious use of child_process.exec . A recent silly exercise in wasteful automation
of mine was to speed up some git housekeeping we need to…
Building a README badge image API with Python
README badges are great convenient way to display important information and links about a project.
Showcasing things like your builds passing, or the number of downloads a project has. Here is an
example of some README badges from my Flagpole…
Using the Xcode iOS simulator CLI
The Apple development application Xcode comes with a nifty iOS simulator bundled with it. Most of the time you probably use this for app development activities, but you can also test web things in a native Safari environment without using things…
Building a component props editor with React
With my move to the engineering team at Points , I've had to step away from one of my most recent random idea for workflow improvement: An interactive GUI to edit props that are passed to React components. It is a bit like Storybook , but tailored…
Sets in JavaScript
I was getting to know a code base I'll be working with a lot more in my new role as a development engineer at Points the other week, and I came across something I'd never seen before, a Set . I initially thought it might be part of lodash or…
Expanding on my Google App Scripts text formatter
This post is a follow up
to " Programmatic text formatting in Google Sheets with Google Apps Script " Starting from where I left off in my last post, I had just started getting the basic bits and pieces wired together for
this. A few months on, I've…
Site improvements and changes for 2021
In what now seems like an annual period of self-improvement and motivation, I took it upon myself to seriously update my site again! This time implementing some new tricks and processes I've picked up, from almost a year of React, and a lot more…
Programmatic text formatting in Google Sheets with Google Apps Script
As part of a recent side project I've been exploring ways to apply rich text formatting to Google Sheets programmatically. Google Workspace (previously G Suite) comes with an extensive suite of APIs for interacting with its products called Google…
Opacity in CSS hex color notation
RRGGBBAA ! What sounds like some guttural scream of a developer trying to vertically center something in a page without Flexbox, is actually a nifty new CSS property that is working its way into the specification in the form of CSS Color Module…
Migrating from Hugo to Gatsby
Back in 2019 I made the decision to stop publishing my personal site on WordPress and move to static site generators in a hunt for their better performance, and the opportunity to use more modern technology. After a few failed attempts at fixing Ruby…
Camping at Grundy Lake Provincial Park
For our second camping trip of 2020 we headed further north to Grundy Lake Provincial Park . A pleasant three-hour drive out of Toronto, towards Perry Sound in north(ish) Ontario. The weather held up as we arrived on Friday afternoon and set up camp…
Building my own PC
With COVID-19 cancelling all my travel plans for the year, and finding myself with a lot more time on my hands I decided it was time to retire my old 2009 27" iMac. I had already moved all my side project work onto my new Points work laptop (a 1…
A CSS wheel of fortune
A lot of what I do at Points is to bring to life small experiences to engage customers following some form of email or them arriving at our partner's storefronts. Recently a partner got in touch asking if we could do a "wheel of fortune" style…
Personal development goals for 2020
2019 was a very good year for me . I went on two very exciting trips, one to Disney World, and later to Banff National Park, which was a lovely close to my first full year in Canada. On the professional front I got a fantastic job with the lovely…
A start to my General Transit Feed Specification project: GTFS to SQL
I've recently came across General Transit Feed Specification (GTFS) files when looking for a way to build my own version of Go Transit 's (terrible) website to look at train times. Turns out these are dense information files which are next to…
Fixing the PHPStorm command line launcher
I use Jetbrains' PHPStorm as my primary editor for any digital project and have been since mid-2017. It's an all round solid editor, especially useful when working with WordPress projects and I've found it a bit more powerful than VSCode but one…
Stack Upgrade: Ditching google Chrome for Firefox Quantum
From Google Chrome to Firefox Developer Edition With Google Chromes proposed changes to the WebRequest about to render ad blockers as we know them defunct I thought it was time I commit to switching to another browser for both work and personal use…
MacOS: Make TextEdit.app open new file on launch
I use TextEdit a lot to format small snippets of text and code when formatting is not a concern for me. One of my biggest annoyances with this tiny application as how that it always opened to the "open file" dialog when I needed to quickly format…
MacOS: Creating a right click option to copy a file path
Sometimes you just really need a file path. You've got a file open in Finder, and you just need the path. Ideally without going through the usual drag-and-drop into Terminal and/or take note of the file location then cd your way back.
The goal. A…
Recreating the field set <legend> effect, just without the field set
The Ask I had a dilemma. A seemingly simple design element that featured a line of text with a border starting from each end and stretching out to the edge of the container. Something like this: Note the background gradient. My first idea here would…
A wild Chrome extension appears
Laziness is one of the three great virtues of a programmer. The other two virtues are impatience and hubris, read about them here , but that is not what I'm really worried about at here. Laziness, according to Larry Wall is: "The quality that makes…
I think I’ve survived my first winter in Canada!
He says optimistically... The weeks are flying by for me here in Canada. It must be the cold weather and wishing summer was here, or that spring refuses to stick around for longer than a few hours. I've almost been here six months now so I thought it…
A deep dive into the console API
I will be honest with you. I debug almost all of my Javascript with a million and one console.log() calls. I haven't been able to get very far into using a proper Javascript debugger system just yet, but I might not be alone. Brian Kernighan said…
Fisticuffs with timezones in Javascript
Today marks the day I had my first experience with the headache that is programming and timezones. I was working with a booking calendar for a service based in the UK, with me sat at my dinner table in Toronto, which is five hours (UTC-5 or EST…
JavaScript Encryption with RSA and AES
Background A recent client project called for a bit of an exploration into client side encryption implementations. A first for me. A large (>1mb) JSON file needs to sent from a client angular.js application to a server, from there needs to be…
I emigrated to Canada!
A little under three months ago, after a year or so of forms and online applications I left the UK, and landed in Canada as a new permanent resident! A move I had been thinking about since early 2016, but towards the end of 2017 I started the process…
Moving from WordPress to Hugo
I have taken a move to rebuild my personal site in Hugo instead of WordPress! Why you ask? Why the heck not. I spend most of my professional life building WordPress sites for clients, why stop now. For me it was the danger of familiarity. When I…
CSS attribute selectors
Target all images that have an empty alt tag A links without a href attribute Bonus - Target pseudo selector For highlighting hash (#) links when they're active in the current URL fragment.
Getting started with SSH config
This is rough personal reference for getting myself setup correctly for using SSH keys with git. Nothing worse than trying to git pull and it asks you for your password each time. First off, there are two files where SSH is configured depending on…
Autocomplete branch names on the command line
Trying to get over the force of habit that is using tab to auto-complete things on Mac. Well, it doesn't work for git out of the box but here is a way to get it working on the command line. You can use this script as part of your bash_profile in…
Fetch domain information in the command line
Sometimes you need to fetch domain information on a domain to debug hosting/SSL etc. You can always use services such as MXToolbox to do this, however, there are a number of ways you can fetch domain information via the command-line. Here are a few…
Finding files by size with the command line
If you just need to find large files, you can use find with the -size option. The next command will list all files larger than 10 Megabytes: If you want to find files between a certain size, you can combine it with a size smaller than search. The…
Useful git commands
This is a quick and dirty git cheat sheet of all the commands I frequently forget how to do with Git: See which remote is configured Stop tracking file permissions Debug Authentication Issues Find Unmerged Branches Export GitLog as a file Change…
Feature Flags WordPress Plugin
I recently came across a new technique release technique while watching a YouTube video on Netflix ’ s DevOps . This new thing: Feature flags. A 'feature flag' (or feature toggle) is the ability to turn features of your application on/off. These…
zxcvbn – A sensible password strength estimator
Password requirements should get out of the user ’ s way. The often restrictive password requirements limiting users to a password of just 8 characters and forcing symbol use ignores one of the main parts of password security. Length. Bonus XKCD…
Long live the WordPress CLI
My previous method of choice for migrating a site from a development URL to a production one was to open an SQL dump in my editor, find-and-replace all the instances of the URL (sans-protocol) and then upload the new SQL file to the server. The…
Terminal Aliases
Aliases are nothing more than keyboard shortcuts or abbreviations, and although they’re a bit limited, they’re great for simple commands. Edit the nano ~/.bash_profile file and add your alias, save and restart and boom, shortcuts! Projects Folder…
Social Links
Let ’ s do away with large script includes for share buttons. URL share intents are much better: Twitter Twitter docs for Web Intents . Pinterest Pinterest documentation for share widgets . Buffer Tumblr Pocket Share to Pocket via a link…
Postcardware
The very talented people over at Spatie have a cool way to pay them back for their open source work. Postcards. I recently came across this while looking for a library to create those pesky “ Add to calendar ” links (a technology that still hasn…
Zipping folder contents
ZIP the contents of the current folder into a zip with it ’ s parent directory as it ’ s name. Useful for zipping just the contents without the folder parent folder. Zip the current directory into a folder called app.zip : Especially useful for…
Quick Save (QS) – Side project
During a recent project exploring Javascript encryption, I added an auto-save feature for the form fields so I didn ’ t need to constantly repast RSA keys and other configs into the page. I have expanded this into its own library (my first). I used…
Sending a variable as an attachment with PHP Mailer
Recently I've been working on a on-boarding application for an agency client that involved some fallback processes if their CRM write failed. The client requested we send them an email with the form data attached as JSON, so they could manually…
.htaccess redirects scratchpad
Redirects are a frequent request for me during my working day. Clients moving their sites around, sandbox projects changing domains and other such reasons often call for legacy URLs to be handled with care. While using .htaccess files slows down…
Git/SSH Keys Personal Cheat sheet
GitHub Deploy Keys Create SSH Key: Set the git remote: Check Auth with username against GitHub: Echo out easy to copy-paste version of the public key: Get MD5 fingerprint of key A key fingerprint is a short sequence used to identify a larger key…
Article – Life as a Web Developer
Towards the end of 2017 I was asked by the recruitment agency Adlib (who helped me land my job at Silver) to write an article as part of their “ live as a ” series. Every few weeks they publish a new article about positions they ’ ve been…
Aside from work, what do you do?
Whenever I hear someone asked “ So aside from work, what do you do? ” I cower. This question fills me with dread. Not that I get asked it that often. It is just that momentary panic. Trying to come up with two or three things I have done recently…
Where was I when 2015 turned into 2016? Is that where I wanted to be?
2015 was an interesting year for me, finally finished my undergraduate degree in Multimedia Web Design, graduating with a 2:1. More of a relief than anything. Other 2015 highlights of mine include: A successful trip to Cheltenham Races in March, My…
As long as human beings have the element of choice and exercise that element of choice, technology will stay the slave and man its master.
The following is an essay I wrote during my University degree: As technology intersects more and more aspects of peoples lives is becoming more difficult to avoid the encroachment of technology into our lives. With an estimated 73% of adults in the…