I'm a Software Quality Engineer with a passion for backend engineering, especially with regard to APIs and automation. I've been building up my experience working in a DevOps environment as a Software Development Engineer and am now diving into the details of how we prove out the quality in our software. I use my site as a method of blogging about my learnings, as well as sharing information about projects I have previously, or are currently, working on in my spare time.
I'm a GNU/Linux user, a big advocate for the Free Software Movement, and I try to self host my own services where possible, instead of relying on other providers.
Moving talks.jvt.me to reveal-hugo
Migrating my custom Reveal.JS setup to using reveal-hugo.
Recapping my time at the Free and Open Source Developers Europe Meeting conference in Brussels.
Performing a No-Op with
chef-client using JSON
How to perform a
chef-client run without executing anything.
git worktree to have multiple branches checked out at once
How to use
git worktree to check out multiple Git branches from the same repo at once.
Using Git refs to check out GitHub Pull Requests, from your local repo
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
How to pull the Git refs for Merge Requests to your GitLab repo.
Using Git refs to help track your GitLab Environments, from your local repo
How to pull the Git refs that GitLab Environments exposes in your GitLab repo.
Performing Code Review on Your own Merge/Pull Requests
Why the first step to getting others to review your code is to review it yourself.
Automating Promotion of Jekyll Posts from Draft to Post
The handy script I've created to automate publishing a draft in Jekyll, with handy Zsh + Bash autocomplete.
Pretty Printing JSON using Node.JS on the Command Line
Using Node.JS's JSON module to pretty print JSON objects from the command line.
Converting X.509 and PKCS#8
.pem file to a JWKS (in Node.JS)
Converting X.509 and PKCS#8 files to JWKS format, using the
git commit --fixup= to track changes that need to be applied on top of another commit
git commit --fixup= and
git rebase --autosquash to easily track and squash fix commits.
Goodbye Jekyll, Hello Hugo!
My move from Jekyll to super speedy Hugo, and what I've needed to do to migrate.
Creating Microservices for my Static Website
Leaving BTRFS as my primary filesystem
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
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
A review of my time at Hackference's 1-day conference and 24-hour hackathon.
How to run tests from the ChefDK in Docker
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
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
Why you'd want a fat JAR for your Gatling tests and how you'd achieve it.
Tweaking Gatling HighCharts Response Time Bounds
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
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
Finding out that a
nil gets silently coerced to an empty
Hash if given to a custom resource's property of type
Chef 14: ChefSpec Coverage Reporting Deprecation
Noting the deprecation of using
ChefSpec::Coverage.start! when using Chef 14 and above.
Chef 14 Upgrade: Change in
ValidationFailed error messages when setting
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
A few reasons explaining why you should be writing unit tests for your functional tests.
Viewing X.509 DER Certificate Details with OpenSSL
How to convert an X.509 DER file to a human-readable format using
Viewing X.509 PEM Certificate Details with OpenSSL
How to convert an X.509 PEM file to a human-readable format using
Backporting/Replaying Changes 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'
The unfortunate decision to cancel my Packt training courses.
DevOpsDays London 2018
My writeup of my first DevOpsDays conference, and the awesome talks and conversations I was part of.
Showing response headers with
Showing just response headers when
curling a resource, using
Safely Force Pushing with Git using
git push --force-with-lease=ref can save you from overriding others' changes on shared Git branches.
My editorial workflow for blog posts
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
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)
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
How to easily introspect and pretty print a JWT on the command line using Ruby's standard library, or using the ruby-jwt external library.
chef-shell to interactively debug attributes and recipes
How to use
chef-shell to see attribute config and recipes, with and without a Chef Server.
A look at my time at OggCamp 2018, the talks I presented and attended.
Context is key: thinking about your audience
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
Why you'd want a fat JAR and how you'd achieve it.
My Path from School to University to Work
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
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
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
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
Using Ruby's JSON module to pretty print JSON objects from the command line.
Merging multiple repositories into a monorepo, while preserving history, using
How to merge multiple repositories, with their history, into a single repository, using the
git subtree add command.
Better Git Diff Outputs with Git Submodules
How to get nicer
diffs when working with submodules.
Sharing Multiple SSH Sessions over the Same Network Socket
Reusing network sockets for speed and reduction of authentication handshakes with OpenSSH.
file in Chef doesn't actually
Why you should explicitly add
backup false when
file through Chef, to avoid leaving potentially sensitive files still on the box.
Morsels of Goodness: What's Cooking in Chef 14?
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
Receiving the final sign off after four months off for my ruptured appendix.
Serving Branches on a Subdomain using Caddy and GitLab Review Apps
How to dynamically serve a branch on a subdomain for GitLab Review Apps using Caddy Labels.
Deploying to Netlify using GitLab CI
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
python -i to get an interactive REPL after running a Python source file.
Bundling Common Rake Tasks into a Gem
An example of how to create a helper gem for common Rake task, using the real-world example of Chef cookbooks.
docker login as another user in Chef
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
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
Missing space after # and
Do not use block comments errors for your
knife-cookbook-doc formatted comments.
Chef 13 Upgrade: Deprecation of Namespace Collisions in Custom Resources
Preparing for breaking changes in Chef 14 by renaming
new_resource.property_name in Custom Resources.
Chef 13 Upgrade:
knife-cookbook-doc gem upgrade
Logger entries in autogenerated
README.mds for Chef 13.
ruby_blocks with ChefSpec
Testing implementation of a
ruby_block in ChefSpec, to ensure that the code executes as expected.
Verify a Ruby Class Method is Called with Arguments in Rspec, Without Doubles or Mocks
Rspec code to verify that a Ruby Class Method is called from another method, without needing to mock anything.
Chef 13 Upgrade: Lessons Learnt and Documented for Posterity
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 Testing
render_file with ChefSpec and a
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 (
A one-liner shell command to fix Rubocop errors
%w-literals should be delimited by [ and ].
Chef 13 Upgrade: Rubocop Changes for
How to resolve the
Parenthesize the param lazy Rubocop error when upgrading your cookbook to Chef 13.
Chef 13 Upgrade: Testing
ruby_blocks with ChefSpec
block.block.call to trigger
ruby_blocks within ChefSpec 7 and Chef 13.
Emoji Support in Dunst
How to see Emoji when using the Dunst notification system.
2017 in Review
A look back over the awesome (and not so awesome) things that happened in 2017, and a look forward to what 2018 holds.
SSLError When Running Berkshelf Behind a Proxy
Getting around the pesky
OpenSSL::SSL::SSLError SSLv2/v3 read server hello A error when running Berkshelf behind a proxy.
My summary of the Hackference 2017 conference and hackathon.
service resources in Kitchen-Docker
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
How to get the ChefDK (and associated tools) to trust internal / self-signed certificates, in an easy oneliner.
Permission Denied when running ChefSpec
How to handle getting an
EACCES when trying to run ChefSpec on a recipe.
GitLab Review Apps with Capistrano and Nginx
Spinning up a version of your application on every push, so others don't have to manually get the code up and running locally.
include_recipes with Chef and ChefSpec
How to best test
include_recipes 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
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)
Coerce YAML to JSON and vice versa, from the comfort of your Gem-studded command line.
Clean up your Git branches
Remove any merged local or branches from your local Git repository.
Pretty Printing JSON on the Command Line with Python
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
Making it easier to write commit messages by having the diff in your editor.
Building Chef Cookbooks with GitLab (Part 1)
An introduction to how to build a cookbook using GitLab's Continuous Integration platform in conjunction with
Extracting SSL/TLS Certificate Chains Using OpenSSL
A quick one-liner to get you the full certificate chain in
I share the tool I have been using for system utilisation and monitoring,
Saving Repetition with Git Commit Templates
Speed up your commit message writing by providing a template for when you run
Cleaning Up Your LaTeX Build Output with
A tool to help reduce the amount of unnecessary output when building LaTeX files.
Why You Should Use GitLab.com
A discussion about the reasons that I would greatly recommend the GitLab.com platform for all your Git hosting, opposed to its competitors.
Preparing a Technical Workshop - A Checklist
What you need to remember to ask the organisers and what to consider in order to ensure your workshop goes smoothly.
Resurrecting dinosaurs, what could possibly go wrong?
How containerised apps (AppImage, Snappy and Flatpak) could eat our users.
CloudABI - Easily develop sandboxed apps for UNIX
An Application Binary Interface to make it possible to create capabilities-based, hardened, software.
A few words ahead of the storm of articles.
A month of giving back, and a very honest post-mortem of what I learned.
Continuous Delivery with Capistrano and GitLab Continuous Integration
How to get up and running with using GitLab CI and the Capistrano deploy tool.
A few words about my excitement for the start of Hacktoberfest, and some ideas on how to get started yourself.
The Sony Hack
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.
The Hour of Code: What's the Worst that Could Happen?
Why you should invest just a single hour in learning how code can be useful to you.
Game of Drones
Discussing how drones will be shaping the future of the delivery business.
Smart is the New Black: Lightbulbs to Reflect a Modern Age
The future of lighting - using smart, long-lived lightbulbs that can be configured to only turn on when there's someone in the house.
Bringing the Internet of Things to the home, and to help monitor your children.