Announcing GoReleaser v2

The new major version of GoReleaser is here!

Ep. 4: Mastering Kubernetes Networking: Essential Insights for Efficient Deployment

Introduction: In this detailed discussion, Bill delves into the critical aspects of networking within Kubernetes clusters, emphasizing the necessity of properly defining services to manage internal and external communication effectively. Learn the critical role of service definit...

Reading Google Sheets from a Go program

I recently needed to process some data from a Google Sheet in a Go program, and was looking for the most straightforward way to do so on my local machine. This post lists some approaches that I found to work, with full source code. To access the Sheets API, you'll …

Calculating the GitHub API's `sha` representation of a local file

I've recently been doing some work to commit files directly to a GitHub repository using the API, as part of my work on dependency-management-data. When you're updating a file with GitHub, you need to specify the sha of the file that you're updating, which can be retrieved in one...

Five Years Running a News Site on JAMStack

I started working as the Director of Technology at Spotlight PA the Tuesday after Memorial Day, 2019, over five years ago. There have been a lot of changes in technology, journalism, and the world since then, not least of which was the COVID-19 pandemic. I thought this anniversar...

Updating Snapcraft secrets

If you, like me, release your projects to the Snap Store using GoReleaser, you might need to eventually update the secret. It seems to me that the secret expires every year, and this is the time of the year I need to renew mine. To help future me, this is my recipe on how to do...

packagemain #25: Identifying Container Image vulnerabilities with Docker Scout

We all know, that Docker technology is great and brings us many advantages, but also, unfortunately, Docker images include many attack surfaces on different layers.

Ep. 3: Mastering Kubernetes: Setting Up Environments with Kind

Introduction: In this installment of the Ultimate Software Design series, Bill guides us through setting up a Kubernetes environment using Kubernetes inside Docker (kind). He breaks down the structure of Kubernetes and offers insights into effective cluster management, ensuring a...

Rust error handling is perfect actually

The night is dark and full of errors, so how should we handle these gracefully and safely in our Rust programs? Let’s introduce two of every Rust programmer’s favourite types: Option and Result.

Reasons to not expose Go's choice of default TLS ciphers