Week Notes 20#28 (3 mins read).
What happened in the week of 2020-07-06?
Week Notes 20#28 (3 mins read).
What happened in the week of 2020-07-06?
New Job Title, Who Dis? (1 mins read).
Moving into the world of being a Tech Lead.
Week Notes 20#27 (4 mins read).
What happened in the week of 2020-06-22?
Spring Boot: 'junit-vintage' failed to discover tests
When Using Only JUnit5 Tests (2 mins read).
How to avoid the error 'junit-vintage' failed to discover tests
when using Spring Boot.
Week Notes 20#26 (3 mins read).
What happened in the week of 2020-06-22?
Creating My Own Personal Micropub Client (3 mins read).
Announcing my own personal Micropub client to publish content that is very specific to my workflows.
Generating Random Bytes On the Command Line with OpenSSL (1 mins read).
How to generate random bytes as binary, base64 or hex, using openssl
on the command-line.
Using @Mock
as a Method Parameter with Mockito (2 mins read).
Using @Mock
on method parameters to reduce manual mock setups with Mockito.
Converting a Byte Array to a String in Ruby (1 mins read).
How to convert an array of bytes to a String with Ruby.
Week Notes 20#25 (3 mins read).
What happened in the week of 2020-06-15?
Disabling the logging of Spring Security's Default Security Password (2 mins read).
How to disable Spring Boot logging the generated security password
.
Changing my Static Site Search Setup (1 mins read).
Making changes to fix my search setup, and reduce download overhead for visitors.
Generating the Client Assertion JWT for private_key_jwt
Authentication with Ruby (1 mins read).
A helper script to generate the client assertion required to authenticate to an Authorization Server that supports private_key_jwt
, on the command-line with Ruby.
Verifying Signed JWTs (JWS) with Ruby (2 mins read).
Using the ruby-jwt library to verify a signed JSON Web Token (JWS) on the command-line.
Creating Signed JWTs (JWS) with Ruby (1 mins read).
Using the json-jwt and ruby-jwt libraries to sign a JSON Web Token on the command-line.
Issues with Ordering When Using Vault CLI's -no-print
Argument (1 mins read).
A possible solution for no-print
not taking effect with the vault
CLI when using AWS EC2 auth.
Week Notes 20#24 (2 mins read).
What happened in the week of 2020-06-08?
Keeping Track of Certificate Expiry with a JWKS to iCalendar Converter (4 mins read).
Creating an iCalendar feed for certificate expiry details, given a URI for a JSON Web Key Set.
New CSS, Who Dis? (2 mins read).
Announcing my new site design, based on Hack.css.
Week Notes 20#23 (3 mins read).
What happened in the week of 2020-06-01?
Review: mycookiedough Delivery (2 mins read).
Reviewing our first mycookiedough delivery, and the corresponding sugar rush that came with it.
GitLab CI Shell Executor failing builds with ERROR: Job failed: exit status 1
(1 mins read).
How to work around ERROR: Job failed: exit status 1
errors with GitLab CI's shell executor.
GitLab CI Shell Executor Failing Builds With No Such Directory
(1 mins read).
How to work around No Such Directory
errors with GitLab CI's shell executor.
Deploying a Branch to Netlify on the Command-Line (1 mins read).
How to use Netlify's Node CLI to deploy a given branch to Netlify.
Generating JWK Thumbprints with Ruby (1 mins read).
How to generate JWK thumbprints with Ruby.
Generating JWK Thumbprints with Node.JS (1 mins read).
How to generate JWK thumbprints with Node.JS.
How are Open Banking Key Ids (kid
) Generated? (1 mins read).
Sharing insight into how Open Banking has generated their kid
s for use with JWTs.
Week Notes 20#22 (4 mins read).
What happened in the week of 2020-05-24?
How to Run Java on the Command-Line to Attach a Debugger (1 mins read).
How to run java
on the command-line, and make it possible to attach a debugger.
Extract a Public Cert from a Java Keystore/Truststore (1 mins read).
How to export the public certificate from a Java keystore.
Evicting Spring Cache on a Schedule (1 mins read).
How to evict Spring Cache's @Cacheable
data on a schedule.
No default controller available
With bluetoothctl
(1 mins read).
One possible solution for the No default controller available
error message with bluetoothctl
.
Migrating to Netlify's Deployments from GitLab CI (3 mins read).
Moving to avoid flaky deployments, and trying to reduce deployment times.
How to avoid HttpMessageNotReadableException
when using ContentCachingRequestWrapper
with Java Servlet Filters (1 mins read).
How to avoid receiving Required request body is missing
errors when using a ContentCachingRequestWrapper
.
Reading a Servlet/Spring Request Body Multiple Times (3 mins read).
How to read the request body more than once using Java Servlet Filters.
Week Notes 20#21 (2 mins read).
What happened in the week of 2020-05-17?
Disabling @Valid
Annotation in a Spring Integration Test (1 mins read).
How to disable @Valid
validation in Spring Integration Tests.
Converting Output from Rest Assured to Curl Requests (3 mins read).
How to convert the log output from Rest Assured to a curl
request.
Week Notes 20#20 (2 mins read).
What happened in the week of 2020-05-10?
Navigating through the Vim Changelist with Intellij (2 mins read).
How to use g;
and g,
using IntelliJ's IdeaVim plugin to cycle through changes in a file.
Running Spotless Automagically with Gradle (2 mins read).
How to set Gradle configuration globally to always run spotlessApply
in your projects.
Rendering Micropub Client Data on Posts (2 mins read).
Sharing more information about Micropub clients that have created a post, if possible.
Week Notes 19 (2 mins read).
What happened in the week of 2020-05-03?
Changing the Structure of Homebrew Website Club Nottingham (3 mins read).
Looking to change the format of Homebrew Website Club Nottingham so it works better as a remote event.
Gotcha: AWS SDK Proxy Setup with Test Kitchen (2 mins read).
How to avoid odd proxy issues when using the AWS SDK, when using Test Kitchen.
Determining What Motherboard You're Using, On Linux (1 mins read).
How to determine what motherboard the machine you're using is reporting, on the command-line with Linux.
Creating a 'Firehose' Feed (2 mins read).
Splitting out my content feeds, so it's (hopefully) more applicable and less noisy for consumers.
Week Notes 18 (3 mins read).
What happened in the week of 2020-04-27?
Extracting x5c
s from a JSON Web Key Set (JWKS) to PEM files with Ruby (1 mins read).
How to extract the full chain of certificates from a JWKS' x5c
parameter to files.
Autogenerating the Date
Header in Postman (1 mins read).
How to generate and send a Date
header using Postman.
Week Notes 20#17 (3 mins read).
What happened in the week of 2020-04-20?
New Desk/Office Setup (6 mins read).
Sharing the new layout for our office, and my new desk setup with my new Dell UltraSharp.
Converting a Byte Array to String with Buffer
in Node.JS (1 mins read).
How to convert an array of bytes to a String using Node.JS's Buffer
class.
Week Notes 20#16 (3 mins read).
What happened in the week of 2020-04-13?
GitLab Runner Docker TCP Error (2 mins read).
Fixing the cannot connect to the Docker daemon
error with GitLab Runner and Docker.
Inheriting the Proxy from the Jenkins Host in Docker (1 mins read).
How to pass proxy variables from your Jenkins host to your Docker containers.
Inheriting the Environment Variables from the Jenkins Host in Docker (2 mins read).
How to pass environment variables from your Jenkins host to your Docker containers.
Week Notes 20#15 (4 mins read).
What happened in the week of 2020-04-06?
Being a Bad POSIX Citizen (2 mins read).
Owning up to using GNU coreutils, even on BSDs, because I'm lazy.
Tomcat May Log Cookies Out-of-the-Box (3 mins read).
Warning you about cookies being logged out-of-the-box, and how to resolve it.
Providing Custom Serialization for Map
Keys in Jackson (1 mins read).
How to configure Jackson to use a custom method to serialise keys for a Map
.
Week Notes 20#14 (4 mins read).
What happened in the week of 2020-03-30?
Week Notes 20#13 (3 mins read).
What happened in the week of 2020-03-23?
Toggling Your Bluetooth Connection using bluetoothctl
on the Command-Line (1 mins read).
How to script bluetoothctl
to toggle your connection to a Bluetooth device.
Week Notes 20#12 (3 mins read).
What happened in the week of 2020-03-16?
Platform-Aware @-mentioning People on my Blog (2 mins read).
More easily mentioning others on my posts, and improving my interactions with Twitter syndication.
Extract a Private Key from a Java Keystore (1 mins read).
How to export an asymmetric PrivateKeyEntry
entry from a Java keystore.
Splitting an X509 PEM-Encoded Certificate Bundle into Multiple Files (1 mins read).
Splitting a certificate bundle into separate files using split
or awk
.
Week Notes 20#11 (3 mins read).
What happened in the week of 2020-03-09?
PHPMiNDS March: Slim 4: PHP's Microframework (2 mins read).
Recapping Rob Allen's talk about Slim 4 at PHPMiNDS.
Week Notes 20#10 (3 mins read).
What happened in the week of 2020-03-02?
What's the jvt.me
at the end of your tweets? (1 mins read).
Answering why there are links to jvt.me
at the end of all my tweets.
Thanks GitLab for the Swag! (2 mins read).
Thanking GitLab for the swag store credit for sharing how much I use GitLab.com.
How to Use curl
to Send Requests to Domains Without Editing Your /etc/hosts
File (1 mins read).
Using curl
's --resolve
flag to perform custom lookup for hosts.
Google confirms Microformats are still a recommended metadata format for content (1 mins read).
Noting Google's continued support for Microformats as a metadata format.
Week Notes 20#9 (2 mins read).
What happened in the week of 2020-02-24?
Announcing Micropub-Media-Endpoint-Proxy (2 mins read).
Announcing a web-based solution for uploading files to your Micropub media endpoint.
How to unzip/decompress a Java JAR file (1 mins read).
How we can use the unzip
command to decompress JAR files.
Week Notes 20#8 (3 mins read).
What happened in the week of 2020-02-17?
meetup-mf2.jvt.me
release 0.3.0: Integration issue fixes + caching (1 mins read).
Announcing the 0.3.0 version of meetup-mf2.
Triggering an AWS Lambda from the Command-Line (1 mins read).
How to invoke an AWS Lambda function from the Command-Line.
Skip Builds On Branch Indexing with Jenkins Multibranch Pipelines (2 mins read).
How to stop Jenkins unnecessarily kicking off builds on Multibranch pipelines when indexing the branches.
Generating HMAC Signatures on the Command Line with OpenSSL (1 mins read).
How to generate HMAC signatures for a given string, using openssl
.
Creating Signed JWTs (JWS) with Node.JS (1 mins read).
How to use the jsonwebtoken library to create a Signed JSON Web Token (JWS) with Node.JS.
Announcing Meetup.com Support for Bridgy Publish (2 mins read).
Announcing the ability to RSVP to Meetup.com events from your website, using Bridgy.
Week Notes 20#7 (3 mins read).
What happened in the week of 2020-02-10?
Birds of Prey Review (No Spoilers) (3 mins read).
A short, spoiler-free, review of Birds of Prey: And the Fantabulous Emancipation of One Harley Quinn.
Setting up Multiple redirect_uri
s on the Meetup.com API (2 mins read).
How to allow multiple redirect_uri
s on your Meetup.com (OAuth2) API consumer.
Week Notes 20#6 (3 mins read).
What happened in the week of 2020-02-03?
How to Extract a Twitter Profile URL (But Not Status URL) with a Regex (1 mins read).
A regular expression to match Twitter Profile URLs, but not Status URLs.
Converting a Ruby Hash to a String (1 mins read).
The ways that we can convert a Hash to a String with Ruby.
Week Notes 20#5 (3 mins read).
What happened in the week of 2020-01-27?
Generate Plain Old Java Objects (POJOs) from XML Schema Definitions with xjc
(4 mins read).
How to generate POJOs really quickly and easily, with no manual work, using the xjc
command.
Week Notes 20#4 (3 mins read).
What happened in the week of 2020-01-20?
Removing Distractions with the Focus Mode within Android's Digital Wellbeing (4 mins read).
How I'm using Android's Digital Wellbeing functionality to reduce endless scrolling of social media, and reduce my reliance on my phone.
Week Notes 20#3 (2 mins read).
What happened in the week of 2020-01-13?
Converting an x5c
from a JSON Web Key to a PEM with Ruby (1 mins read).
How to convert a JWK's x5c
to a PEM-formatted certificate with Ruby.
Parsing a Unix Epoch With Bash/Ruby on the Command-Line (1 mins read).
How to convert a Unix Epoch to a human-readable date format.
Performing Mutual TLS Authentication with Rest Assured (via Apache HTTP Client) (3 mins read).
How to configure Rest Assured to perform Mutual TLS authentication against an API.
Week Notes 20#2 (2 mins read).
What happened in the week of 2020-01-06?
Converting Webmentions to Push Notifications (2 mins read).
Automagically sending push notifications to my mobile phone when I receive a Webmention.
2018 in Review (25 mins read).
Looking back at 2018 as a whole - both the positives and negatives, and looking forward to 2019.
Moving Events for the Homebrew Website Club: Nottingham to the IndieWeb Events site (2 mins read).
Announcing my decision to move Homebrew Website Club: Nottingham events from my own site to events.indieweb.org.
Week Notes 20#1 (2 mins read).
What happened in the week of 2020-01-01?
Netlify Billing Request: Extra Bandwidth Allowances (1 mins read).
A copy of an email I've sent to the Netlify team about improving billing for bandwidth allowances.
Women in Tech January - Sensing Change: The Rise of the Smart bins (4 mins read).
Eleanor Tang talks about the work that Eveno is doing to make waste management much smarter.
2019's Music In Review (5 mins read).
What music was I listening to in 2019?
20xx Decade of Music In Review (10 mins read).
What music was I listening to in 20xx?
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 Gradle (1 mins read).
How to make sure your JUnit4 and JUnit5 Gradle tests work within the same project.
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.
meetup-mf2.jvt.me
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.xml
s within a Maven project.
Introducing a Microformats API for Eventbrite: eventbrite-mf2.jvt.me
(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 (1 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 (3 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 (1 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 application/x-www-form-urlencoded
Request (1 mins read).
How to access all key-value pairs of parameters sent in a application/x-www-form-urlencoded
request.
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.
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.
Converting Ruby Hash keys to Strings/Symbols (2 mins read).
How to recursively convert a Ruby Hash's keys to a String / Symbol.
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.
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.jvt.me
(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 (2 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 (2 mins read).
Replacing if
s 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 %2F
s) in Rest Assured.
PHPMiNDS April (2 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 DER Certificate Fingerprints with OpenSSL (1 mins read).
How to view an X.509 DER certificate's fingerprint using openssl
commands.
Viewing X.509 PEM Certificate Fingerprints with OpenSSL (1 mins read).
How to view an X.509 PEM 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 GitHub Pull Requests, from your local repo (2 mins read).
How to pull the Git refs for Pull Requests to your GitHub 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.
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.
2018's Music In Review (5 mins read).
What music was I listening to in 2018?
Creating Microservices for my Static Website (2 mins read).
Exploring moving data out of my site's remit and into its own 'microservices' which can be consumed at build-time, as well as via client-side JavaScript.
Leaving BTRFS as my primary filesystem (5 mins read).
Why I'm moving away from using BTRFS as the primary filesystem on my personal devices, and why it had nothing to do with BTRFS itself.
TYKJS Middleware Gotcha When Base 64 Decoding Data (3 mins read).
How to workaround the Failed to base64 decode: illegal base64 data at input byte
error when trying to use b64dec
in TYKJS middleware.
Unit Testing Your TYK (TYKJS) Middleware (6 mins read).
Writing unit tests (in this case using Jasmine) for the TYK API Gateway's JavaScript middleware functionality.
Hackference 2018 (31 mins read).
A review of my time at Hackference's 1-day conference and 24-hour hackathon.
How to run tests from the ChefDK in Docker (6 mins read).
How to get up and running with the ChefDK to perform common tests, such as unit tests and linting.
Using Fake Cookbooks for Writing ChefSpec Tests for your Custom Chef Resources (3 mins read).
A directory structure I've found quite useful for writing ChefSpec tests for custom resources, by creating a fake cookbook within the cookbook you're testing.
Creating a versionable, self-contained (fat-/uber-) JAR for Gatling tests (17 mins read).
Why you'd want a fat JAR for your Gatling tests and how you'd achieve it.
Tweaking Gatling HighCharts Response Time Bounds (3 mins read).
How to configure the bounds that Gatling marks your response times within for console output and graphing purposes.
Setting your default AWS profile for the AWS CLI and SDKs (2 mins read).
Setting the default AWS profile when working with multiple profiles and the AWS CLI / SDKs.
Chef 14 Upgrade: Custom Resource Properties are Silently Coerced to Hash
if they are a nil
(2 mins read).
Finding out that a nil
gets silently coerced to an empty Hash
if given to a custom resource's property of type Hash
.
Chef 14: ChefSpec Coverage Reporting Deprecation (1 mins read).
Noting the deprecation of using ChefSpec::Coverage.start!
when using Chef 14 and above.
Chef 14 Upgrade: Change in ValidationFailed
error messages when setting required
properties (2 mins read).
The updated error message returned by a Chef ValidationFailed
error, when you're specifying which properties are required
on a custom resource.
Why You Should Be Unit Testing Your Functional Acceptance Tests (7 mins read).
A few reasons explaining why you should be writing unit tests for your functional tests.
Viewing X.509 DER Certificate Details with OpenSSL (2 mins read).
How to convert an X.509 DER file to a human-readable format using openssl
commands.
Viewing X.509 PEM Certificate Details with OpenSSL (2 mins read).
How to convert an X.509 PEM file to a human-readable format using openssl
commands.
Backporting/Replaying Changes Using git cherry-pick
(6 mins read).
Using git cherry-pick
to make it easier to backport or replay Git commits across different versions of your codebase.
Revert 'Some knowledge-sharing news' (5 mins read).
The unfortunate decision to cancel my Packt training courses.
DevOpsDays London 2018 (51 mins read).
My writeup of my first DevOpsDays conference, and the awesome talks and conversations I was part of.
Showing response headers with curl -i
(3 mins read).
Showing just response headers when curl
ing a resource, using curl -i
.
Safely Force Pushing with Git using --force-with-lease=ref
(6 mins read).
How git push --force-with-lease=ref
can save you from overriding others' changes on shared Git branches.
My editorial workflow for blog posts (8 mins read).
Taking you through the journey I go on when writing blog posts, from ideation to publishing the post.
Viewing Git history of a file in git log
while ignoring file renames (5 mins read).
How to track changes to files in Git without pesky file renames getting in the way, using git log --follow
.
Test-Driven Chef Cookbook Development Using ChefSpec (and a sprinkling of InSpec) (38 mins read).
Using the example of deploying and running a Java JAR file as a way to show the lifecycle of a fully test-driven Chef cookbook.
Pretty Printing JSON Web Tokens (JWTs) on the Command Line using Ruby (3 mins read).
How to easily introspect and pretty print a signed JWT (JWS) or an encrypted JWT (JWE) on the command line using Ruby's standard library, or using the ruby-jwt external library.
Using chef-shell
to interactively debug attributes and recipes (5 mins read).
How to use chef-shell
to see attribute config and recipes, with and without a Chef Server.
OggCamp 2018 (21 mins read).
A look at my time at OggCamp 2018, the talks I presented and attended.
Context is key: thinking about your audience (5 mins read).
How to have inclusive conversations by providing the right context for those who may not have the same level of understanding.
Creating a versionable, self-contained (fat-/uber-) JAR for Cucumber tests (11 mins read).
Why you'd want a fat JAR and how you'd achieve it.
My Path from School to University to Work (25 mins read).
A look back at my journey up to now, the choices I've made, and what advice I have for others who are embarking on their own journeys into tech.
Being More Explicit on Content Licensing (3 mins read).
Why I'm re-licensing the code snippets and post content on my site is, and how I'm making it more obvious.
Some exciting job and knowledge-sharing news (4 mins read).
Moving into Quality Engineering, publishing Chef training courses, conference speaking about Chef at OggCamp and the complex mess that is this very static website at DevOpsDays London.
Notes from the AWS + Chef Dev Day Roadshow in London (13 mins read).
Notes from the AWS Dev Day Roadshow in London, where we got to play around with Chef, Chef Automate and InSpec using AWS OpsWorks.
Pretty Printing JSON on the Command Line with Ruby (1 mins read).
Using Ruby's JSON module to pretty print JSON objects from the command line.
Merging multiple repositories into a monorepo, while preserving history, using git subtree
(3 mins read).
How to merge multiple repositories, with their history, into a single repository, using the git subtree add
command.
Sharing Multiple SSH Sessions over the Same Network Socket (3 mins read).
Reusing network sockets for speed and reduction of authentication handshakes with OpenSSH.
Better Git Diff Outputs with Git Submodules (2 mins read).
How to get nicer diff
s when working with submodules.
Beware: delete
ing a file
in Chef doesn't actually delete
it (3 mins read).
Why you should explicitly add backup false
when delete
ing a file
through Chef, to avoid leaving potentially sensitive files still on the box.
Morsels of Goodness: What's Cooking in Chef 14? (5 mins read).
A look at the new features coming in the new Chef 14 release, as well as what to watch out for when upgrading.
Finally Returning to Full Time Work After 123 Days (2 mins read).
Receiving the final sign off after four months off for my ruptured appendix.
Serving Branches on a Subdomain using Caddy and GitLab Review Apps (2 mins read).
How to dynamically serve a branch on a subdomain for GitLab Review Apps using Caddy Labels.
Deploying to Netlify using GitLab CI (3 mins read).
How adding two lines to my .gitlab-ci.yml
migrated my existing site from GitLab Pages to Netlify.
Executing an Interactive Python Shell (REPL) for a Script (1 mins read).
Using python -i
to get an interactive REPL after running a Python source file.
Bundling Common Rake Tasks into a Gem (8 mins read).
An example of how to create a helper gem for common Rake task, using the real-world example of Chef cookbooks.
Running docker login
as another user in Chef (2 mins read).
Hitting the error permission denied while trying to connect to the Docker daemon socket
when trying to run docker login
as a non-root user in Chef.
My First Week Back to Working (Remotely) After Three Months (6 mins read).
How I've found the first week back to work after almost three months, and the productivity gains of working reduced hours.
Chef 13 Upgrade: knife-cookbook-doc
Rubocop Updates (1 mins read).
Disabling the Missing space after #
and Do not use block comments
errors for your knife-cookbook-doc
formatted comments.
Chef 13 Upgrade: knife-cookbook-doc
gem upgrade (1 mins read).
Fixing odd Logger
entries in autogenerated knife-cookbook-doc
README.md
s for Chef 13.
Chef 13 Upgrade: Deprecation of Namespace Collisions in Custom Resources (1 mins read).
Preparing for breaking changes in Chef 14 by renaming property_name
to new_resource.property_name
in Custom Resources.
Verify a Ruby Class Method is Called with Arguments in Rspec, Without Doubles or Mocks (1 mins read).
Rspec code to verify that a Ruby Class Method is called from another method, without needing to mock anything.
Testing Chef's ruby_block
s with ChefSpec (3 mins read).
Testing implementation of a ruby_block
in ChefSpec, to ensure that the code executes as expected.
Chef 13 Upgrade: Lessons Learnt and Documented for Posterity (1 mins read).
Notes on the main problems encountered when upgrading from Chef 12 to Chef 13, both with ChefSpec and Rubocop.
Chef 13 Upgrade: Rubocop Changes for lazy
Parameters (1 mins read).
How to resolve the Parenthesize the param lazy
Rubocop error when upgrading your cookbook to Chef 13.
Chef 13 Upgrade: Rubocop Changes for Testing render_file
with ChefSpec and a with_content
Block (1 mins read).
How to resolve the Parenthesize the param render_file
Rubocop error when upgrading your cookbook to Chef 13.
Chef 13 Upgrade: Rubocop Changes for Word Array Literals (%w
) (1 mins read).
A one-liner shell command to fix Rubocop errors %w-literals should be delimited by [ and ]
.
Chef 13 Upgrade: Testing ruby_block
s with ChefSpec (1 mins read).
Replace your block.old_run_action
with block.block.call
to trigger ruby_block
s within ChefSpec 7 and Chef 13.
Emoji Support in Dunst (2 mins read).
How to see Emoji when using the Dunst notification system.
SSLError
When Running Berkshelf Behind a Proxy (2 mins read).
Getting around the pesky OpenSSL::SSL::SSLError SSLv2/v3 read server hello A
error when running Berkshelf behind a proxy.
2017 in Review (68 mins read).
A look back over the awesome (and not so awesome) things that happened in 2017, and a look forward to what 2018 holds.
Hackference 2017 (8 mins read).
My summary of the Hackference 2017 conference and hackathon.
2017's Music In Review (5 mins read).
What music was I listening to in 2017?
Running service
resources in Kitchen-Docker (3 mins read).
How to get up and running with service
resources when running Test Kitchen with the Docker driver, in this example for use with GitLab CI.
Trusting Self-Signed Certificates from the Chef Development Kit (2 mins read).
How to get the ChefDK (and associated tools) to trust internal / self-signed certificates, in an easy oneliner.
Getting around Permission Denied
when running ChefSpec (3 mins read).
How to handle getting an EACCES
when trying to run ChefSpec on a recipe.
GitLab Review Apps with Capistrano and Nginx (4 mins read).
Spinning up a version of your application on every push, so others don't have to manually get the code up and running locally.
Testing include_recipe
s with Chef and ChefSpec (2 mins read).
How to best test include_recipe
s within your Chef recipes, as well as how to ensure that you aren't running any dependent recipes in your tests.
Blogumentation - Writing Blog Posts as a Method of Documentation (4 mins read).
Why I'm starting to use blog posts as a form of documentation, and why I think they're so well suited.
Converting YAML to JSON and vice versa (Part 1 - Ruby) (2 mins read).
Coerce YAML to JSON and vice versa, from the comfort of your Gem-studded command line.
Clean up your Git branches (3 mins read).
Remove any merged local or branches from your local Git repository.
Pretty Printing JSON on the Command Line with Python (2 mins read).
Using Python's JSON module to pretty print JSON objects from the command line.
Viewing your diff while writing your commits with git commit --verbose (3 mins read).
Making it easier to write commit messages by having the diff in your editor.
Building Chef Cookbooks with GitLab (Part 1) (11 mins read).
An introduction to how to build a cookbook using GitLab's Continuous Integration platform in conjunction with kitchen-docker
.
Extracting SSL/TLS Certificate Chains Using OpenSSL (1 mins read).
A quick one-liner to get you the full certificate chain in .pem
format.
glances, a top
and htop
replacement (1 mins read).
I share the tool I have been using for system utilisation and monitoring, glances
.
Saving Repetition with Git Commit Templates (3 mins read).
Speed up your commit message writing by providing a template for when you run git commit
.
Cleaning Up Your LaTeX Build Output with latexrun
(3 mins read).
A tool to help reduce the amount of unnecessary output when building LaTeX files.
Why You Should Use GitLab.com (13 mins read).
A discussion about the reasons that I would greatly recommend the GitLab.com platform for all your Git hosting, opposed to its competitors.
Resurrecting dinosaurs, what could possibly go wrong? (12 mins read).
How containerised apps (AppImage, Snappy and Flatpak) could eat our users.
Preparing a Technical Workshop - A Checklist (4 mins read).
What you need to remember to ask the organisers and what to consider in order to ensure your workshop goes smoothly.
CloudABI - Easily develop sandboxed apps for UNIX (7 mins read).
An Application Binary Interface to make it possible to create capabilities-based, hardened, software.
FOSDEM 2017 (4 mins read).
A few words ahead of the storm of articles.
Open S-awesome (5 mins read).
A month of giving back, and a very honest post-mortem of what I learned.
Continuous Delivery with Capistrano and GitLab Continuous Integration (4 mins read).
How to get up and running with using GitLab CI and the Capistrano deploy tool.
2016's Music In Review (5 mins read).
What music was I listening to in 2016?
Hacktoberfest 2016 (12 mins read).
A few words about my excitement for the start of Hacktoberfest, and some ideas on how to get started yourself.
2015's Music In Review (5 mins read).
What music was I listening to in 2015?
The Sony Hack (6 mins read).
A discussion about Sony Pictures Entertainment being hacked in the months before the release of the action comedy, The Interview, and its depiction of Kim Jong Un.
2014's Music In Review (6 mins read).
What music was I listening to in 2014?
The Hour of Code: What's the Worst that Could Happen? (4 mins read).
Why you should invest just a single hour in learning how code can be useful to you.
Game of Drones (6 mins read).
Discussing how drones will be shaping the future of the delivery business.
Smart is the New Black: Lightbulbs to Reflect a Modern Age (4 mins read).
The future of lighting - using smart, long-lived lightbulbs that can be configured to only turn on when there's someone in the house.
Intelligent Parenting (3 mins read).
Bringing the Internet of Things to the home, and to help monitor your children.
2013's Music In Review (6 mins read).
What music was I listening to in 2013?
2012's Music In Review (6 mins read).
What music was I listening to in 2012?