James R. Williams
James R. Williams
AboutPostsResources

Posts

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…
Tuesday, April 12, 2022
~2 min read
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…
Monday, April 4, 2022
~1 min read
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…
Tuesday, February 22, 2022
~3 min read
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…
Saturday, November 6, 2021
~5 min read
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…
Tuesday, November 2, 2021
~4 min read
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…
Wednesday, September 22, 2021
~2 min read
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…
Tuesday, September 14, 2021
~4 min read
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…
Thursday, September 9, 2021
~1 min read
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…
Thursday, September 2, 2021
~3 min read
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…
Friday, August 20, 2021
~4 min read
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…
Saturday, April 24, 2021
~2 min read
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…
Sunday, April 18, 2021
~4 min read
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…
Sunday, April 4, 2021
~1 min read
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…
Sunday, March 7, 2021
~2 min read
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…
Monday, February 8, 2021
~2 min read
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…
Thursday, October 22, 2020
~3 min read
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…
Tuesday, August 4, 2020
~1 min read
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…
Tuesday, July 21, 2020
~3 min read
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…
Monday, June 15, 2020
~1 min read
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…
Wednesday, April 22, 2020
~2 min read
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…
Tuesday, March 10, 2020
~6 min read
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…
Wednesday, January 8, 2020
~1 min read
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…
Tuesday, July 9, 2019
~1 min read
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…
Tuesday, June 25, 2019
~2 min read
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…
Sunday, June 16, 2019
~1 min read
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…
Wednesday, June 12, 2019
~1 min read
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…
Wednesday, June 5, 2019
~2 min read
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…
Wednesday, May 29, 2019
~2 min read
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…
Saturday, March 30, 2019
~2 min read
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…
Monday, March 25, 2019
~3 min read
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…
Sunday, February 24, 2019
~4 min read
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…
Friday, February 8, 2019
~2 min read
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…
Tuesday, February 5, 2019
~3 min read
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…
Wednesday, January 9, 2019
~3 min read
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…
Tuesday, January 8, 2019
~3 min read
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.
Wednesday, August 22, 2018
~1 min read
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…
Tuesday, August 21, 2018
~1 min read
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…
Monday, July 23, 2018
~1 min read
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…
Monday, July 2, 2018
~1 min read
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…
Friday, June 29, 2018
~1 min read
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…
Monday, June 4, 2018
~1 min read
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…
Monday, June 4, 2018
~1 min read
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…
Wednesday, May 30, 2018
~1 min read
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…
Tuesday, May 29, 2018
~1 min read
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…
Wednesday, April 4, 2018
~1 min read
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…
Tuesday, March 20, 2018
~1 min read
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…
Monday, March 19, 2018
~1 min read
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…
Tuesday, March 13, 2018
~1 min read
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…
Tuesday, March 13, 2018
~1 min read
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…
Tuesday, March 13, 2018
~1 min read
.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…
Wednesday, February 28, 2018
~1 min read
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…
Wednesday, January 31, 2018
~1 min read
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…
Friday, November 24, 2017
~1 min read
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…
Thursday, February 11, 2016
~2 min read
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…
Monday, January 18, 2016
~1 min read
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…
Thursday, January 15, 2015
~3 min read
©2022 James R. Williams['hip','hip']
github
linkedin
twitter
instagram
pluralsight
hackerrank
stackoverflow
salesforce