Open Request to Spotify About Data Requests and Spotify Wrapped Data (2 mins read).

A copy of an email I've sent to Spotify to request my full Spotify streaming history.
Back to /posts/.
Open Request to Spotify About Data Requests and Spotify Wrapped Data (2 mins read).

A copy of an email I've sent to Spotify to request my full Spotify streaming history.
Setting up a Staging Server for my Micropub Endpoint (4 mins read).

Setting up a Micropub server that I can use to test changes before it publishes content to this site.
Gotcha: Running both JUnit4 and JUnit5 Together with Maven (1 mins read).

How to make sure your JUnit4 and JUnit5 Maven tests work within the same project.
Gotcha: Running both JUnit4 and JUnit5 Together with Gradle (1 mins read).

How to make sure your JUnit4 and JUnit5 Gradle tests work within the same project.
meetup-mf2.herokuapp.com release 0.2.0: Adding h-feed support (2 mins read).

Adding h-feed support for my Microformats translation layer for Meetup.com.
Pretty Printing XML on the Command-Line (1 mins read).
How to use xmllint to pretty-print XML/HTML files.
Backporting/Replaying Changes using git format-patch and git apply / git-am (2 mins read).

Using git format-patch and git apply/git am to apply a patch, if git cherry-pick isn't available.
Happy Second Appendixaversary (2 mins read).
Celebrating the second anniversary since my appendix ruptured - and reminiscing on the benefits of a well-funded NHS.
List What Files Changed in a Git Commit (1 mins read).

How to list what files changed in a given commit.
Using Chef to Delete Files that aren't in a List (2 mins read).

How to delete files in a directory that don't match a list.
Converting a JSON Web Key to a X.509 .pem file (in Node.JS) (2 mins read).

Converting a JSON Web Key (JWK) to an X.509 PEM file, using the node-jose library.
Configuring a Jenkins Multibranch Pipeline to Use an External Script with Job DSL (2 mins read).

How to set up a Multibranch Pipeline to use an external Git repo for running your Jenkins script.
ChefSpec Gotcha: Using render_file When Deleting Files (2 mins read).

How to use render_file with ChefSpec when you're deleting the file.
PHPMiNDS August - the Politics of Tool Shaming (7 mins read).

A writeup of James' talk at PHPMiNDS about the impacts of criticising others for their technology choices.
Setting up a directory for OpenSSL's SSL_CERT_DIR (2 mins read).
How to configure a directory of trusted certificates for OpenSSL to trust.
Locking Your Machine Before Suspending Using systemd (2 mins read).
How to get systemd to automagically lock your machine before it suspends.
Reader Mail: Getting an RSS Feed of Only Posts (2 mins read).
Updating my site to allow for RSS feeds for specific post content such as posts, as per a reader's request.
What I've Learned Over National Blog Posting Month (NaBloPoMo) 2019 (4 mins read).
Looking back at a month of blogging every day, and what I've learned.
Parsing URL Querystrings with Node.JS (1 mins read).

How to easily parse a URL querystring with Node.JS.
Using the OpenSSL Command-Line to Verify an SSL/TLS Connection (2 mins read).
How to use the openssl command-line to verify whether certs are valid.
Viewing Jenkins Jobs' Configuration as XML (1 mins read).

How to view the XML configuration for a given Jenkins job.
Trusting Self-Signed Certificates from Ruby (1 mins read).

How to configure Ruby to trust self-signed certificates.
Pretty Printing YAML with the Ruby Command-Line (1 mins read).

Using Ruby's YAML library to pretty-print YAML files from the command-line.
Blocking Twitter Widgets from This Site (2 mins read).
Enforcing a privacy-aware removal of Twitter's JavaScript widget from this site.
Neurodiversity and Blogumentation (1 mins read).
Sending links to people to save myself explaining things isn't always the best idea.
Piping Data When Not Running a Command with sudo (1 mins read).
How to (more) safely pipe stdin to an elevated command with sudo tee.
Minifying JSON with Python (1 mins read).

How to take a pretty-printed JSON string and replace it with a minifed JSON string using Python.
Minifying JSON with Ruby (1 mins read).

How to take a pretty-printed JSON string and replace it with a minifed JSON string using Ruby.
Only Adding Changes for Tracked Files With Git (1 mins read).

How to only add files that have changed with git add -u.
Sending Webmentions More Intelligently (2 mins read).

Updating my post-deployment tooling to only send Webmentions when they've not already been accepted (or rejected).
Adding Series Metadata to Posts (1 mins read).
Making a series of posts more discoverable using the series taxonomy.
Validating my JSON Feed on every site build (2 mins read).

Adding in a validation in the pipeline to protect from a broken feed.
Adding a Merge Request Checklist for new Articles (1 mins read).

Adding a checklist for articles in my GitLab Merge Requests.
Music and Associations (2 mins read).
Music has a crazy way of reminding you of times gone.
Creating a Global .gitignore (1 mins read).

How to have Git have a list of files to globally ignore, without configuring anything in your ~/.gitconfig.
Ditching Event Platforms for the IndieWeb (5 mins read).

How we can replace event platforms like Meetup.com with your own IndieWeb-backed platforms.
Reader Mail: What Static Site Generator Would I Recommend? (4 mins read).
What Static Site Generator would I recommend?
Getting Started With Vim (3 mins read).

How to dip your toes into Vim to learn some of the basics.
Gotcha: Netlify Makes All Your Filenames Case-Insensitive (1 mins read).

Beware if you have a requirement for case-sensitive URLs for Netlify.
Making Hugo Generate Case Sensitive URLs (2 mins read).

How to make your Hugo URLs case sensitive.
New Push Notification: Suspicious Transactions (2 mins read).
A concerning experience with fraudulent transactions on my Monzo account.
Request for Enhancement for Gousto: Reducing Partial Use of Ingredients (1 mins read).

An opportunity to reduce food waste by suggesting when meals use only some of an ingredient.
Chef Attributes and default.rb - it's in the name (3 mins read).

Why you should only be setting defaults in your Chef attributes, and moving heavy lifting elsewhere.
Take Take Take: Rethinking How I Consume Free and Open Source Software (4 mins read).
Thinking about how I should be contributing back to the projects I rely on so heavily, both financially and with my own contributions.
Auto-announcing Events in my Feed (2 mins read).
Updating my main site feed to publish a note when I've published a new event.
Viewing the Contents of a Certificate Signing Request (CSR) with OpenSSL (1 mins read).
How to look at the contents of a Certificate Signing Request (CSR) with the openssl command-line tool.
Off Days (1 mins read).
It's OK to not be 100% every day.
Adulting: The Constant Struggle of Prioritisation (3 mins read).
A rant about how it sucks to be an adult because there's so much to do, but very little of it is stuff you want to do.
National Blog Post Month (NaBloPoMo) (2 mins read).
Starting National Blog Post Month with a blog post. Very meta.
Reader Mail: Webmention Spam (2 mins read).

Replying publicly to an email about my continual webmention sending.
Reader Mail: Getting Started with Hugo and Micropub (5 mins read).

Answering a question by a reader about how to get started with writing a Micropub endpoint for use with Hugo.
Owning My Step Count (5 mins read).
Sharing the journey of starting to own my step counts and my technical solution.
The IndieWeb Movement: Owning Your Data and Being the Change You Want to See in the Web (22 mins read).

A look at what the IndieWeb is, why you should care, and how to get started with it.
Setting Your Maven Project Versions (1 mins read).

How to set the versions of all Maven pom.xmls within a Maven project.
Introducing a Microformats API for Eventbrite: eventbrite-mf2.herokuapp.com (3 mins read).

Announcing the Microformats translation layer for Eventbrite.com/Eventbrite.co.uk events.
Listing the Contents of a Java Truststore (3 mins read).

How to extract a list of trusted certificates from a Java Trust store.
DevOpsDays London 2019 (63 mins read).

A writeup of the DevOpsDays London conference, and the talks and Open Spaces I attended.
Getting git diff Outputs Without a Prefix (2 mins read).

How to remove a/ and b/ from git diff outputs.
Moving Teams after Three Years (4 mins read).
Announcing my move between teams at Capital One, and looking back over three years in my previous team.
Diagnosing my Slow Netlify Deploy Times (2 mins read).

How I managed to shave off 7 minutes of my deploy time, (in true clickbait fashion) just by removing one line of code.
On Panic Attacks (3 mins read).
Remembering my first (and so far only) panic attack.
IndieWebCamp Amsterdam 2019 (19 mins read).

Recapping my time at IndieWebCamp Amsterdam, my first 'official' IndieWeb event, and meeting some of the big names in the community.
Auto-linking URLs with Hugo (2 mins read).

How to get URLs automagically converted to links in Hugo, using Regular Expressions.
Proposing a Microformats2 Markup for Licensing Information (7 mins read).

Some recommendations for how to mark up licensing information with Microformats, for making license information machine-discoverable and machine-readable.
Pushing your Git Branches to a Matching Remote Branch (1 mins read).

How to save yourself from typing git push --set-upstream origin ${branch} and have Git determine the branch you're pushing to.
Testing Your SLF4J Logs (2 mins read).

Looking at how we would unit test our SLF4J logs to gain confidence they work, and to catch regressions in the future.
Viewing Logs for a systemd Unit with journalctl (1 mins read).
How to view the logs for a given unit, using systemd and journalctl.
Setting up a custom RubyGems Repository for Chef in Test Kitchen (1 mins read).

How to use a private RubyGems repository for your Chef gem dependencies in Test Kitchen.
Overriding Test Kitchen Driver Configuration (2 mins read).

How to override specific configuration in Test Kitchen's project-specific .kitchen.yml.
How Many Gadgets Does the Kitchen Need?! The Many Tools for Chef Dependency Management (5 mins read).

Looking at the different dependency management solutions of Chef, and how, where and why you would use each one.
Adding RSVP Support for Indie Events (1 mins read).

Adding RSVP support to my Micropub endpoint for Indie events.
Sending Webmentions Automagically on Deploys of the static website www.jvt.me (4 mins read).

The journey to getting Webmentions sending automatically from my static website, www.jvt.me.
Extracting Request Parameters Dynamically for a multipart/form-data Request (2 mins read).

How to access all key-value pairs of parameters sent in a multipart/form-data request.
Extracting Request Parameters Dynamically for a application/x-www-form-urlencoded Request in Spring (1 mins read).

How to access all key-value pairs of parameters sent in a application/x-www-form-urlencoded request.
Adding a 404 page for www.jvt.me on Netlify, with Hugo (1 mins read).

Announcing a swanky new 404 page for www.jvt.me.
Merging an 'Override' Ruby Hash into the Original Hash (6 mins read).

How to use Ruby to merge two hashes with nested arrays of hashes, with the second hash overriding values from the first.
Converting Ruby Hash keys to Strings/Symbols (2 mins read).

How to recursively convert a Ruby Hash's keys to a String / Symbol.
Adding Newlines to all Files in Git (3 mins read).

Adding newlines at the end of all Git-tracked files.
Adding Calendar details on events pages (1 mins read).
Adding an iCalendar event as well as an 'Add to Google Calendar' link for each event on this site.
Introducing a Microformats API for Meetup.com: meetup-mf2.herokuapp.com (4 mins read).

Announcing the Microformats translation layer for Meetup.com events.
Making it easier to determine the kind of content for Indie posts (2 mins read).
Adding a kind hint to my Indie post types to make it easier to look through each content kind.
Setting Up a Micropub Server for www.jvt.me (7 mins read).

Announcing the creation of my Micropub server, to allow publishing content away from my laptop/desktop.
How to RSVP to an Indie Event from your Website (4 mins read).

How to use your personal website in conjunction with Microformats and Webmention to be able to RSVP to Indie events.
AWS Nottingham: Where Did All the Money Go? (13 mins read).

A writeup of the AWS Nottingham meetup about cost saving in AWS.
Restructuring The Way That My Site's Content Types Work (5 mins read).
How I've restructured my content to map more closely to Microformats for any Indie content types.
Easily Parsing Failed Cucumber Scenarios from the JSON Report (2 mins read).

How to parse a Cucumber JSON report to display the failed scenarios and their causes.
Using OpenSSL Behind a (Corporate) Proxy (1 mins read).
How to use OpenSSL commands when behind a proxy server.
Extract a Secret Key from a Java Keystore (2 mins read).

How to export a symmetric SecretKey entry from a Java keystore.
Parsing Key-Value URL Fragments with Node.JS (1 mins read).

How to easily parse a URL fragment containing key-value pairs of data, with Node.JS.
Creating an iCalendar feed for my RSVPs (3 mins read).
How and why I've created a public calendar for the RSVPs I send from this site.
Add your Meetup.com Events to your Calendar (1 mins read).

How to get all your upcoming Meetup.com events straight to your calendar.
Pretty Printing JSON Files Inline on the Command Line (2 mins read).

How to rewrite multiple JSON files inline on the Command Line.
Why I Have a Website and You Should Too (12 mins read).
A persuasive look at the many reasons why you should have your own website, and some of the benefits it will bring you.
Croatia 2019 Summer Holiday (7 mins read).

Some of the highlights of an amazing holiday with Anna in Dubrovnik, Croatia.
Visualising My Posting Habits (2 mins read).
Adding the capability to my site to enable visualisation of how often I post content.
A Reflection on Four Months of Gousto (11 mins read).

Looking back at the last four months of using Gousto to prepare meals for dinner.
Being Celebrated in the 2019 Tyk Community Awards (1 mins read).

Announcing my win in the 2019 Tyk Community Awards for my blogging efforts.
DDD East Midlands: Speaker Workshop (18 mins read).

A writeup of my notes from the awesome Speaker Workshop run by DDD East Midlands.
Rendering Webmentions using Client Side JavaScript (2 mins read).

Replacing my server-side rendered webmentions with client-side rendering.
Force a Refresh of an Emby Library in Kodi (1 mins read).

How to force an update of an Emby library from Kodi.
Notts Techfast: What do testers even do all day? (6 mins read).

A writeup and some thoughts about Dan Caseley's talk at Notts Techfast.
Talking about the IndieWeb at OggCamp 2019 (1 mins read).

Announcing my talk at OggCamp 2019 about the IndieWeb.
Explaining Networking and Packet Switching with LEGO and the Postal Service (3 mins read).
A recap of how I've explained the concept of packet switching through the use of LEGO and the postal service.
Pretty Printing JSON Web Tokens (JWTs) on the Command Line using OpenSSL (3 mins read).

How to easily introspect a JWT on the command line using OpenSSL and optionally Python for real pretty-printing.
Women In Tech June 2019 - Negotiating For Fun And Profit (5 mins read).

A writeup of Ashley's talk at Women In Tech June about how to negotiate for a fairer deal.
URL Decoding with Ruby on the Command Line (1 mins read).

How to use Ruby's standard library to decode URLs with a handy one-liner.
Why www.jvt.me? (3 mins read).
Why is this site www.jvt.me? Why do I use www.? All will be explained.
Using Hugo .Render to Save Repetition (3 mins read).

Replacing ifs with .Render to save duplication in Hugo templates.
.NET Notts May: Software Quality in the DevOps World (4 mins read).
A writeup of Matteo's talk at .NET Notts about Software Quality and DevOps.
Adding iCalendar Feeds for Events in Hugo (1 mins read).

Using Hugo's custom output formats to automagically create an iCalendar feed for events.
Cyber Nottingham May (5 mins read).
A writeup of the Cyber Nottingham meetup in May.
Using <details> tags for HTML-only UI toggles (3 mins read).
How using the <details> HTML tag can provide a toggleable UI element with only built-in HTML.
Creating a /now page (1 mins read).
Joining the Now Movement by creating a /now page.
Implementing h-feed, and making all site content discoverable (2 mins read).

Announcing h-feeds for this website, and making it easier to read non-blog posts.
PHPMiNDS May: Running your PHP site on AWS Lambda with Bref (3 mins read).

The May edition of the PHPMiNDS meetup, and things I've learnt about porting existing applications to AWS Lambda.
Re-enabling search on my static website (2 mins read).
Announcing the re-enabling of search functionality on my static website.
Verify if a field in a JSON response is not set with Rest Assured (1 mins read).

How to verify whether a field is not present in a JSON Rest Assured Response.
Pretty Print JSON with Java (1 mins read).

How to pretty print a JSON object using Java and Jackson.
Gotcha: URL Encoding for consecutive double slashes issue with Rest Assured (2 mins read).

How to workaround consecutive double slashes being URL encoded (as %2Fs) in Rest Assured.
PHPMiNDS April (3 mins read).

A recap of PHPMiNDS' April meetup.
Marking up my pronouns with Microformats (2 mins read).

Adding my pronouns to my personal h-card to help others determine how I identify.
Tech Nottingham April (5 mins read).

A recap of Tech Nottingham's April meetup.
Prettier HTML Reports for Cucumber-JVM (2 mins read).

How to generate prettier HTML reports for Cucumber with cucumber-reporting and cucumber-reporting-plugin, with and without Jenkins.
Using Netlify for hosting www.jvt.me in Production (2 mins read).

Announcing my move to Netlify for hosting www.jvt.me.
Adding a JSON Feed to my site (1 mins read).

Setting up JSON feed for site for better interoperability with the IndieWeb.
Viewing X.509 PEM Certificate Fingerprints with OpenSSL (1 mins read).
How to view an X.509 PEM certificate's fingerprint using openssl commands.
Viewing X.509 DER Certificate Fingerprints with OpenSSL (1 mins read).
How to view an X.509 DER certificate's fingerprint using openssl commands.
Hello IndieAuth! (1 mins read).
Setting up my IndieAuth provider for interacting with IndieWeb applications everywhere.
Pretty Printing JSON with Ruby (1 mins read).

Using Kernel.jj to pretty print Ruby objects as JSON objects.
Hello IndieNews! (2 mins read).
Discovering IndieNews and starting to syndicate my posts to it.
Specifying datetime in your Hugo posts' front matter (1 mins read).

Setting your posts' date to a datetime string to specify the time a post was published at.
Marking up Events with Microformats (1 mins read).

Announcing the events content type and their markup with h-event.
Beyond Rest: The Future of Web APIs (8 mins read).

A writeup of the meetup talking about what could come next for APIs.
Homebrew Website Club: Nottingham, Session 1 (2 mins read).

A recap of our first Homebrew Website Club: Nottingham.
Easily rewriting Git URLs from HTTPS to SSH and vice versa (2 mins read).

How to use Git's config to rewrite HTTPS URLs to SSH and vice versa, for repo pushes and pulls.
Adding the microformats h-entry markup to my blog posts (1 mins read).

Announcing the addition of the h-entry markup to my blog posts.
Displaying Webmentions on my Hugo website (3 mins read).

How and why I've gone about getting Webmentions rendered on my static Hugo site.
Setting up a personal hCard for myself (2 mins read).

Setting up an hCard to allow microformats parsing for details about myself.
Homebrew Website Club: Nottingham (2 mins read).

Thoughts about setting up the first Homebrew Website Club in Nottingham.
I'm Not Good With People (12 mins read).
A bit of a raw look about how I'm really poor in social situations, how I've got to this realisation, and how I want to do better about it.
Verifying Signed JWTs (JWS) with Node.JS (3 mins read).

How to use the jsonwebtoken and node-jose libraries to verify the signature of a Signed JSON Web Token (JWS) with Node.JS.
Moving talks.jvt.me to reveal-hugo (3 mins read).

Migrating my custom Reveal.JS setup to using reveal-hugo.
Performing a No-Op with chef-client using JSON (2 mins read).

How to perform a chef-client run without executing anything.
FOSDEM 2019 (31 mins read).

Recapping my time at the Free and Open Source Developers Europe Meeting conference in Brussels.
Using git worktree to have multiple branches checked out at once (4 mins read).

How to use git worktree to check out multiple Git branches from the same repo at once.
Using Git refs to help track your GitLab Environments, from your local repo (2 mins read).

How to pull the Git refs that GitLab Environments exposes in your GitLab repo.
Using Git refs to check out GitLab Merge Requests, from your local repo (2 mins read).

How to pull the Git refs for Merge Requests to your GitLab repo.
Using Git refs to check out GitHub Pull Requests, from your local repo (2 mins read).

How to pull the Git refs for Pull Requests to your GitHub repo.
Performing Code Review on Your own Merge/Pull Requests (4 mins read).
Why the first step to getting others to review your code is to review it yourself.
Pretty Printing JSON using Node.JS on the Command Line (1 mins read).

Using Node.JS's JSON module to pretty print JSON objects from the command line.
Automating Promotion of Jekyll Posts from Draft to Post (2 mins read).

The handy script I've created to automate publishing a draft in Jekyll, with handy Zsh + Bash autocomplete.
Converting X.509 and PKCS#8 .pem file to a JWKS (in Node.JS) (2 mins read).

Converting X.509 and PKCS#8 files to JWKS format, using the node-jose library.
Using git commit --fixup= to track changes that need to be applied on top of another commit (4 mins read).

Using git commit --fixup= and git rebase --autosquash to easily track and squash fix commits.
Goodbye Jekyll, Hello Hugo! (5 mins read).

My move from Jekyll to super speedy Hugo, and what I've needed to do to migrate.