Using Renovate to manage updates to go install commands (1 mins read).

How to run Renovate to manage dependency version updates for cases where you're go installing them.
Back to /posts/.
Using Renovate to manage updates to go install commands (1 mins read).

How to run Renovate to manage dependency version updates for cases where you're go installing them.
Using Renovate to manage updates to golangci-lint versions (1 mins read).

How to run Renovate to manage your golangci-lint dependency versions, using the official installation script.
Performing arbitrary executions with Renovate (2 mins read).

How to run Renovate for one-off package upgrades, rather than using it for longer term maintenance.
Getting diagnosed with ADHD (10 mins read).
Looking back at the process to get diagnosed with ADHD.
Prefilling OAuth2 scopes for GitLab Personal Access Tokens (1 mins read).

How to make it easier to set up your OAuth2 scopes on a Personal Access Token with GitLab.
Prefilling OAuth2 scopes for GitHub Personal Access Tokens (1 mins read).

How to make it easier to set up your OAuth2 scopes on a Personal Access Token with GitHub.
Performing AND conditionals in HAProxy (1 mins read).

How to string multiple conditions together in HAProxy to perform an AND.
Creating a JSON Patch endpoint in Go (2 mins read).

How to create a server-side JSON Patch API endpoint in Go.
Extracting the dependency tree from Renovate for given repositories (4 mins read).

Creating a (hacky) solution to retrieve the dependency graph from Renovate for a set of repositories.
Listing all GitHub repositories in a GitHub Organisation (3 mins read).

How to use the GraphQL API to list all the repositories that can be found in a given GitHub organisation.
'Should I be able to learn how to be more productive at work?' (3 mins read).
Looking at whether learning how to be more productive, during work hours, is a reasonable thing to do.
Does the tech industry thrive on free work? (6 mins read).
Thinking about how there are subtle expectations to work on your career outside of tech, and how it's not necessarily great.
Retrofitting OpenAPI documentation to your Rails codebase (12 mins read).

How to take a Rails codebase and introduce OpenAPI documentation and contract tests, in a test-driven manner.
Phew, that's a lot of traffic π What happens when a blog post goes viral? (5 mins read).

Looking at some of the things that happen when my posts have gone viral, from how much traffic it brings, to the various sources of traffic.
I've got ADHD (4 mins read).
Announcing my recent diagnosis with ADHD Inattentive Type.
Analysing our dependency trees to determine where we should send Open Source contributions for Hacktoberfest (8 mins read).

How we (at Deliveroo) are using GitHub Advanced Security's dependency scanning functionality to determine what our most popular dependencies are, and whether we can find any Open Source contributions for the month of Hacktoberfest.
Lessons learned since posting my salary history publicly (8 mins read).
What I've learned in the year since posting my salary history publicly.
Gotcha: testable examples in Go need an output comment (2 mins read).

Beware that your Go Example tests may not actually be running.
Introducing the tidied tool, to more easily check whether go mod tidy has been run (2 mins read).

Why I've created a command-line application called tidied to check go mod tidy has been run.
Converting HTTP requests to Wiremock stubs, with Go (2 mins read).

How to take an HTTP request and convert it into a Wiremock JSON mapping, on the command-line, in Go.
The first script I write in a new job: gg (2 mins read).
Why writing a script to easily git clone repos is my first step as a new starter.
Learning a new language, or how I gained familiarity with Go (10 mins read).

How I've eased into a new language, Go, as a Senior Software Engineer, and some initial thoughts on the language.
Releasing a set of test cases for Content Negotiation (2 mins read).
Introducing a repo for test cases to validate how you're performing server-driven content negotiation.
Releasing a Go library for content-type negotiation (2 mins read).

Introducing a new Go library for performing server-driven content negotiation.
Using generics to get a pointer to any type, in Go (1 mins read).

How to use Go generics to create a helper method for getting a pointer to any type.
Optional configuration for configuring Go code (2 mins read).

How to use optional types to allow configuring your library's Go code.
Building a Go RESTful API with design-first OpenAPI contracts (6 mins read).

How to use oapi-codegen to generate an RESTful API using design-first OpenAPI and code generation.
Pointing to a fork of a Go module (1 mins read).

How to pin your Go modules to a given fork of a repository.
Running Go tests in Parallel (2 mins read).

How to get Go tests to run in parallel for speed.
Ignoring slow-running tests in Go (1 mins read).

How to use Go's -short testing mode to avoid running slower tests.
Shipping services more quickly with design-first OpenAPI contracts (8 mins read).

How using OpenAPI has led to being able to ship a new service more effectively, by removing the need to write scaffolding, and instead focus on the business logic.
Automating boilerplate/scaffolding code with custom code generation in Go (4 mins read).

How to use Go's code generation tooling to add custom code generation to your project.
Describing a multi-value querystring parameter in OpenAPI (1 mins read).

How to define a querystring parameter that has multiple values, in OpenAPI.
Stubbing out the Go http.Client to test an HTTP HandlerFunc (2 mins read).

How to write a unit test to validate your router's HTTP handlers work, by stubbing out the http.Client implementation.
Automagically determining feeds provided for a given URL on the command-line (1 mins read).
Creating a command-line application to discover feeds for a given URL.
Managing your Go tool versions with go.mod and a tools.go (3 mins read).

Better dependency management for your tools and without needing to go install the tools before executing them.
Setting up OpenAPI Contract Tests with a Rails and RSpec codebase (2 mins read).

How to run OpenAPI-driven contract tests against a Rails API.
Only testing your public API in a Go package (3 mins read).

How to test only exported parts of a package in Go.
API Design tip: use objects for similar data (1 mins read).

Why you should use objects to nest similar data in JSON responses.
Idea for Open Source/Startup: monetising the supply chain (2 mins read).
An idea I've had for how to better distribute support to Open Source libraries in the supply chain for your software.
Describing JSON Patch operations with OpenAPI (2 mins read).

How to describe your JSON Patch endpoints using OpenAPI.
Weirdness with git diff-index showing 1 file changed, 0 insertions(+), 0 deletions(-) (1 mins read).

Something weird I hit last week with git diff-index, which shows 1 file changed, but no changes.
Introducing a library for OpenAPI contract testing with Go's net/http package (2 mins read).

Creating a Go library that can verify net/http handlers implement an OpenAPI contract, for use with testing.
Testing Go net/http handlers (1 mins read).

How to write unit tests to validate an HTTP handler.
Constructing a serialised YAML string in Ruby (1 mins read).
How to convert a YAML document to a string representation, preserving escaped newlines, with Ruby.
Lessons learned from modernising a lesser maintained (Spring Boot) service (16 mins read).
What I learned from taking ownership of a lesser maintained service and bringing it up to a better standard.
Getting the OpenID Connect thumbprint for AWS on the command-line with Go (2 mins read).

How to automagically retrieve an OpenID Connect thumbprint for use with AWS' OpenID Connect federated identity.
Getting the fingerprint of a certificate in Go (1 mins read).

How to retrieve an X.509 thumbprint from a remote server, in Go.
Setting up a Go package structure for a combined library and CLI tool (2 mins read).

How to structure a Go repository to be both a library and command-line tool(s).
Parsing AWS ALB/ELB access logs into SQLite (2 mins read).

How to take a set of ALB/ELB logs and convert them to an SQLite database for further processing.
When should I use env to start a command with environment variables? (2 mins read).

When you should use the env command to specify environment variables when executing a command on the command-line (TL;DR: always).
Should I commit generated Go code? (1 mins read).

Answering whether go:generated code should be committed (TL;DR is yes).
Lessons learned from the recent job hunt (13 mins read).
A recap of the recent interview process with several companies, what I learned, and what others should know.
Installing Nokogiri on an M1 Mac (1 mins read).

How to get Nokogiri building on an M1 Mac, when using Bundler.
Determining if there are uncommitted changes in Git (1 mins read).

A one-liner to work out whether there are uncommitted changes in a repository.
Extracting Podcast Addict listening history from the SQLite database (2 mins read).

How to get raw listening history from the Podcast Addict database.
Building a fault-tolerant work queue for command-line executions with GNU Parallel (2 mins read).

How to use parallel to create a lightweight work queue of commands, with retry logic and a record of what's been executed.
Removing 'smart' quotes from a file, on the command-line (2 mins read).
A one-liner with sed to replace 'smart' quotes with regular quotes.
I'm Joining Deliveroo (2 mins read).

Announcing my move into Deliveroo as a Senior Software Engineer.
Automagically setting the project version for Go projects in SonarQube (2 mins read).

How to automagically set sonar.projectVersion for Go projects, based on Git tags.
Converting a Byte Array to String from a Node.JS Buffer, in Go (1 mins read).

How to convert an array of bytes to a string using Go.
Prefactoring: Preparatory Refactoring (2 mins read).

Why I use prefactoring as a means to perform up-front refactoring for codebases, splitting these into separate PRs/MRs where possible.
Protecting an Architect Framework Application with OAuth2 or OpenID Connect Authentication (4 mins read).

How to set up OAuth2/OpenID Connect authentication with an Architect Framework application.
Getting node-canvas to run on AWS Lambda (3 mins read).

Some common issues that occur when using node-canvas on AWS Lambda, and how to solve them.
Parsing the Cookie and Set-Cookie headers with Go (2 mins read).

How to parse the value of a Cookie or Set-Cookie header to a JSON object.
Generating a Go HTTP Client from OpenAPI schemas (2 mins read).

How to generate a Go HTTP client really quickly and easily, with no manual work, using the oapi-codegen project.
Generating Go structs from OpenAPI schemas (2 mins read).

How to generate Go structs really quickly and easily, with no manual work, using the oapi-codegen project.
Setting up GitLab CI for Go projects (2 mins read).

How to set up a basic set of automated builds for Go projects on GitLab CI, for modern Go projects.
Introducing tiktok-mf2.tanna.dev, for converting TikTok video metadata to Microformats2 (1 mins read).

Announcing a hosted service for converting TikTok metadata to a Microformats2 object.
Adding a Non-AWS Hosted Custom Domain to an AWS API Gateway without CloudFront (2 mins read).

How to set up a domain name for AWS API Gateway for a domain that isn't managed through AWS Route 53.
Creating a minimal AWS S3 Bucket Policy for deploying with Hugo via hugo deploy. (1 mins read).

How to configure an AWS S3 Bucket for hugo deploy with the minimal access required for a role to write objects to.
Automagically deploying Architect Framework applications to AWS uisng GitLab CI (3 mins read).

How to use GitLab's OpenID Connect support with AWS, to allow deployment using the Architect Framework automagically on GitLab CI.
Avoiding Spring context issues when parallelising @Nested Spring integration tests (3 mins read).

Using abstract base classes to reduce risk of Spring context overall issues with Spring (Boot) integration tests.
Providing a basic implementation of Ruby's ARGF.read in Go (2 mins read).

Creating a Go helper method to read from stdin or a file, inspired by Ruby's ARGF.read method.
Integration Testing Your Spring WebClients with Wiremock (4 mins read).

How to write integration tests using Wiremock, for use with WebClients.
Accessing the OpenAPI Specification for a Kubernetes Cluster (1 mins read).

How to get the OpenAPI specification for your Kubernetes Cluster.
Solving ConnectExceptions with the Kubernetes Java ApiClient (1 mins read).

How I solved ConnectExceptions in my Kubernetes Java client usage, by moving to cluster mode.
Automagically Auditing GitHub (Actions) Security using OpenSSF Scorecards (6 mins read).

How to use the OpenSSF Scorecards GitHub Action to audit your GitHub and GitHub Actions configuration, and a breakdown of some of the issues raised by it.
Introducing opengraph-mf2 a library, and service opengraph-mf2.tanna.dev, for converting OpenGraph metadata to Microformats2 (3 mins read).

Announcing an NPM package and a hosted service for converting OpenGraph metadata to a Microformats2 object.
How to fix Failed to load ApplicationContext in Spring (Boot) applications (6 mins read).

Some common issues with Spring dependency injection and how to fix them.
Extracting x5cs from a JSON Web Key Set (JWKS) to PEM files with Node.js (1 mins read).

How to extract the full chain of certificates from a JWKS' x5c parameter to files.
Converting an x5c from a JSON Web Key to a PEM with Node.JS (1 mins read).

How to convert a JWK's x5c to a PEM-formatted certificate with Node.JS.
Generate a running mock server from an OpenAPI specification using Prism (3 mins read).

Using Stoplight's prism tool to run a stubbed server from an OpenAPI specification, for better testing.
Gotcha: checked and unchecked exception handling from Spring WebFlux WebClient (2 mins read).

How checked and unchecked exceptions may appear when testing your WebClient code.
Accessing the response body with Spring WebFlux WebClient with onStatus (1 mins read).

How to access the body of an (error) response when using WebClient's onStatus method.
Running a command on a visual selection in Vim (1 mins read).

How to pipe the text in a visual selection to a command, either to run it, or to replace the text in the seletion.
Updating the CA Certificate bundle in Chef Installations (3 mins read).

How to update/add new certificates to the Certificate Authority Certificate Bundle in a Chef Development Kit / Workstation installation.
Introducing a Go command-line tool for interacting with Micropub servers (1 mins read).

Announcing the initial release of micropub, a CLI for interacting with Micropub servers.
Automagically formatting on save, with Neovim and Language Server Protocol (LSP) (1 mins read).

How to use Neovim's Language Server Protocol (LSP) support to autoformat code on a file's save.
Gotcha: Segfault when HTTP headers include newlines with Go (2 mins read).

Why you may be receiving a segfault when using http.Client with HTTTP headers that include newlines.
Converting Spring Boot Property Variables to Environment Variables with Go (1 mins read).

A command-line script to convert a Spring Boot property to an environment variable.
Pretty Printing JSON Web Tokens (JWTs) on the Command Line using Go (2 mins read).

How to easily introspect and pretty print a signed JWT (JWS) or an encrypted JWT (JWE) on the command line using Go.
Gotcha: Field casing is important when marshalling structs to JSON in Go (2 mins read).

Why you may be missing fields from your structs in your Go json.Marshal calls.
Testing @Scheduled annotations with Spring (Boot) (2 mins read).

How to test your Spring (Boot) scheduling without waiting for hours.
Creating a "Manual of Me" (1 mins read).

Creating a reference document about how to best collaborate together.
Reading all of stdin on the command-line with Go (1 mins read).

How to read the whole of stdin, up to EOF, with Go.
Pretty Printing JSON on the Command Line with Go (1 mins read).

Using Go's JSON module to pretty print JSON objects from the command line.
Exporting a Git repo as an archive (1 mins read).

How to export a Git repo as an archive format, such as a .tar.gz or a .zip.
How to interpolate a property inside Spring Security @PreAuthorize / @PostAuthorize (3 mins read).

How to use the value of a property in a Spring Security authorization statement.
Combining an Audio-only and Video-only MP4 with ffmpeg on the command-line (1 mins read).
How to use ffmpeg to combine two MP4 files, where each file contains audio and video separately.
Determining if the Spring Boot Application is Running in Debug or Trace Mode (3 mins read).

How to determine if your Spring Boot application is running in debug mode, for instance to selectively enable other features of your application.
Adding a Wiretap to a Spring WebFlux WebClient to Log All Request/Response Data (2 mins read).

How to log all request/response data from a Spring Webflux WebClient.
Simplifying Spring (Boot) ExceptionHandlers by extending ResponseStatusException (1 mins read).

How to drive HTTP response status codes from exceptions by extending Spring's ResponseStatusException.
Bundling Multi-File OpenAPI Documents into a Single File (2 mins read).

Looking at the options we have for converting a multi-file OpenAPI specification to a single document.
Announcing openapi.tanna.dev, a client-side OpenAPI Viewer (1 mins read).

Creating a hosted version of a local and client-side only OpenAPI viewer.
Generating Favicons using ImageMagick on the Command-Line (1 mins read).

How to generate a multi-size favicon.ico on the command-line using ImageMagick.
Please Add a Relevant Publish Time to Blog Posts (2 mins read).
A request to bloggers to not use midnight as the time they publish an article.
Excluding Filters When using WebMvcTest (1 mins read).

How to exclude specific Filters from running when performing WebMvcTests.
Integration Testing Your Spring WebClients with okhttp's MockWebServer (5 mins read).

How to write integration tests using MockWebServer with Spring Boot, for use with WebClients.
Capturing HTTP Requests with okhttp's MockWebServer.takeRequest (1 mins read).

How to use MockWebServer's takeRequest method to verify that HTTP request(s) are sent correctly.
Generate Plain Old Java Objects (POJOs) from OpenAPI Model Definitions with Gradle (2 mins read).

How to generate POJOs really quickly and easily, with no manual work, using the Gradle openapi-generator Plugin.
Running Elements API Viewer to Verify Local OpenAPI/Swagger Documents (2 mins read).

How to run Elements UI locally to visualise OpenAPI documents.
I don't think you should be logging that? π³ (12 mins read).
Common pitfalls and dangerous things that you should be watching out for in your log messages.
Validating a MockMvc Response Has No Content Type (1 mins read).

How to validate, in a MockMvc test, whether the response has no content-type nor a body.
Replacing Text in Vim with the Output of a Command (1 mins read).

How to replace text under the cursor with the output of a command.
Integration Testing Your Spring RestTemplates with RestClientTest, using spring-test (8 mins read).

How to write integration tests using RestClientTest with Spring Boot, for use with RestTemplate and RestTemplateBuilders.
Running Swagger UI to Verify Local OpenAPI/Swagger Documents (2 mins read).

How to run Swagger UI locally to visualise OpenAPI documents.
Create Executables, not Shell Aliases or Functions (2 mins read).
Why I create standalone executable scripts instead of shell aliases or functions.
Announcing spring-content-negotiator, a Java Library for Content Negotiation with Spring (1 mins read).

Releasing a new library that can support content negotiation in Spring (Boot) applications, i.e. in Filters or ExceptionHandlers.
Getting Started with jMolecules and the (Classical) Onion Architecture, with a Spring Boot project (6 mins read).

A guided example of converting a Spring Boot project to the Onion Architecture pattern.
How to Create and Unit Test Java Bean Validation Annotations (12 mins read).

A guided example through what the different type of annotation ElementTypes are, with respect to Bean Validation, and how to write unit tests for them.
Codifying Your Technical / Architectural Standards with ArchUnit (7 mins read).

How to use ArchUnit to codify your technical standards to reduce code review requirements, and arrive at a more consistent codebase.
Don't Just String Append to a Querystring (1 mins read).
Why you shouldn't use concatenate strings together to append to a querystring.
Appending to a Querystring using Go (1 mins read).

How to append query parameters in a URL in Go.
Simplifying Spring (Boot) ExceptionHandlers with ResponseStatus Annotations (2 mins read).

How to use annotations to drive HTTP response codes from a Spring ExceptionHandler.
Use SLF4J, not Log4J, as Your Logging Interface (3 mins read).

Why we should be using the interface API for logging, rather than the underlying implementation's API.
Using the Facade Pattern to More Easily Test static or Complex Classes (2 mins read).

How to use the Facade design pattern to more easily test classes that are more complex than our tests need to understand.
Mocking void methods with Mockito (1 mins read).

How to Mock a void method with Mockito, for instance to throw an exception.
Thoughts on Social Media Anonymity (4 mins read).
My thoughts on the protection of social media anonymity.
Content Negotiation with Servlet Filter in Spring (Boot) (3 mins read).

How to perform content-negotiation in a Servlet Filter, to serve the correct representation of error to a consumer, based on the Accept header.
Content Negotiation with ControllerAdvice and ExceptionHandlers in Spring (Boot) (5 mins read).

How to perform content-negotiation in a Spring ExceptionHandler, to serve the correct representation of error to a consumer, based on the Accept header.
Error Handling in (Spring) Servlet Filters (2 mins read).

How to return HTTP errors when a Java Servlet fails with Spring (Boot).
'Knowing Me, Knowing You': Wiggly ears, custom pizzas and a burst appendix (5 mins read).
A copy of answers to the DSA's 'Knowing Me, Knowing You'.
Validating UUIDs with Regular Expressions in Java (1 mins read).

How to validate UUIDs and UUIDv4s in Java with a regex.
Announcing uuid, a Java Library for UUID Validation (1 mins read).

Releasing a new library that can be used to validate UUIDs in Java.
Auditing with Spring Boot Actuator (9 mins read).

How to use Spring Boot Actuator for your audit and business event logging needs.
Returning a Value, or a Default, From a Java Optional (1 mins read).

How to replace imperative code with a functional style, when returning a default value for a Java Optional.
Building an Automagically Updating Personal README for GitLab and GitHub (2 mins read).
Announcing the publishing of readme.jvt.me as well as automagically updating READMEs in my GitLab and GitHub profiles.
Adding both an ObjectMapper and a YAMLMapper to Spring Boot (2 mins read).

How to have an ObjectMapper and a YAMLMapper coexisting in a Spring Boot project's bean dependencies.
Testing Data Serialisation/Deserialization in Java (with Gson) (3 mins read).

How to validate your JSON types correctly serialise/deserialise when using the Gson library.
Improving Life-Work Balance on GitHub using per-Organisation Notification Settings (2 mins read).

How to set up per-organisation notification settings so your personal email doesn't get work-related notifications.
Publishing to Maven Repositories with GitLab CI, with Signed Artefacts (4 mins read).

How to publish signed artefacts from a Gradle build to Maven repositories (such as Maven Central) when using GitLab CI.
Suppressing No pinentry warnings with GPG (in Automated Builds) (1 mins read).
How to get avoid No pinentry warnings when running GPG in automated build environments like CI/CD.