I spent a couple of days migrating our monitoring stack from self-hosted kube-prometheus-stack (KPS) to GKE’s native Google Managed Prometheus (GMP). The end result is simpler, cheaper, and removes about 2 TiB of persistent storage we no longer need. But the migration had …
22 Why VPA ignores single-replica podsTLDR: VPA’s updater defaults to requiring 2 replicas before it will evict a pod. Single-replica deployments are silently excluded from auto-healing — even if they’re crashlooping. You can override this with minReplicas: 1 in the VPA spec, no cluster upgrade needed. I …
21 Getting my Apple Watch workout history into GarminTL;DR — I switched from an Apple Watch to a Garmin and wanted to bring my workout history with me. Apple’s data export turned out to be surprisingly lossy — heart rate gets aggregated into 15-minute chunks. I ended up building an iOS app to read HealthKit directly, a Python …
17 Fixing Spotlight Search for Applications on macOSTL;DR: If Spotlight can’t find your apps, rebuild the Launch Services database with lsregister. It takes a few seconds and doesn’t require a reindex of your entire drive. The problem Link to heading Spotlight stopped finding some of my applications. Searching for apps …
8 jj for Git Users: A Practical WalkthroughTL;DR: jj (Jujutsu) is a Git-compatible version control system with some interesting ideas — automatic change tracking, universal undo, and a different take on history editing. It works on top of your existing Git repos, so you can try it without committing to anything. Why …
6 Why Jetson Nano Still Matters in 2026TL;DR: Jetson Nano is old and stuck on Ubuntu 18.04-era software, but it’s still a great always-on host for bounded edge workloads like OpenClaw. Treat it like an appliance, not a modern dev workstation. Frank Kelly, who also owns a Jetson Nano, asked my OpenClaw bot to …
6 Mutating webhooks and ghost affinity on StatefulSetsTLDR: Mutating admission webhooks that inject scheduling rules (nodeSelector, tolerations, affinity) persist on StatefulSet pods even after you clean the StatefulSet template. The webhook re-fires on every pod CREATE and can read stale metadata to re-inject what you removed. The …
6 Bulk cleaning stale git worktrees and branchesI use git worktrees heavily for parallel development. One worktree per ticket, across dozens of repositories. They’re especially useful if you work with AI coding agents — each agent gets its own isolated worktree, so it can run tests, install dependencies, and make changes …
2 Rewriting Git History with an LLM for Conventional CommitsTL;DR: Feed your entire git log + file lists into a single LLM call to generate a bash hash map of conventional commit messages, then apply it with git filter-branch in seconds. 143 commits rewritten in 6 seconds, one API call, ~$0.05. Why bother? Link to heading Good commit …
2 Upgrading OpenClaw to Latest on Jetson Nano with Node 22This is a follow-up to my original post, Installing OpenClaw on a Jetson Nano, where I got things working with Bun on Ubuntu 18.04. That setup ran fine for a few weeks — until I tried to upgrade. Why upgrade? Link to heading The original Bun-based install (2026.2.6) was working …
TLDR: Go doesn’t auto-detect container memory limits. Without GOMEMLIMIT, the GC lets the heap double freely until the OOM killer strikes. Read the cgroup limit at startup and set GOMEMLIMIT to ~85% of it via an entrypoint script so it adapts automatically when VPA adjusts …
23 Stop re-running BigQuery queries when paginatingI recently learnt something about BigQuery pagination that I wish I’d known sooner. If you’re paginating BQ results with LIMIT/OFFSET in the SQL, you’re probably paying full slot cost on every single page request — even though BQ already has the results sitting …
18 Happy — controlling Claude Code from your phoneHappy lets you control Claude Code sessions from your phone. You run happy instead of claude, scan a QR code, and your session shows up on your phone. I’ve been using it for a few days — approving permissions on the go, watching output while making coffee, or talking to it …
16 How Cloudflare proxy mode silently breaks SendGrid email deliveryTLDR: If you manage SendGrid DNS records in Cloudflare, make sure PTR-related records are set to DNS-only. Proxying them silently breaks reverse DNS verification and causes email delivery failures with no alerts or warnings. The setup Link to heading If you use SendGrid with a …
15 Switching from Poetry to uvI migrated a few Python projects from Poetry to uv. The conversion is mostly mechanical, so this focuses on what changed and why it was worth doing. TLDR Link to heading uv is generally faster than Poetry for dependency resolution and installation Private registry auth goes from …
13 Kubernetes health probes for stateful Python servicesTLDR: If your entrypoint script doesn’t use exec, SIGTERM never reaches your Python app and graceful shutdown silently does nothing. Docker compose masks this entirely. I use a single /health endpoint for all three Kubernetes probes — startup, liveness, and readiness. The …
12 Fixing slow Docker builds on ephemeral CI runnersTLDR: --mount=type=cache makes RUN layers non-deterministic. On ephemeral runners the mount is always empty, so BuildKit can’t match layers from registry cache. Removing cache mounts, switching to registry cache with dynamic fallback, gating exports to deploy branches, and …
9 SSH fallback hosts with ProxyCommandI have a Jetson Nano at home that I SSH into from my laptop. At home it’s on a local IP, but when I’m out I reach it via a public IP. I got tired of switching between ssh jetson-home and ssh jetson-www depending on where I am. A VPN like Tailscale or WireGuard would …
8 Installing OpenClaw on a Jetson NanoThe idea of messaging an AI assistant from my phone while I’m out walking and having it write code that I can steer — “try this approach instead”, “add tests for that edge case”, “actually scrap that, let’s do X” — is genuinely …
8 Fixing HDMI resolution on a Jetson NanoI connected my Jetson Nano to an external projector and the console text was microscopic. The framebuffer was running at 3840x2160 (4K) on a display where I could barely read anything. Here’s how I fixed it. The problem Link to heading The Jetson Nano auto-negotiates …
7 Running HPA and VPA together on KubernetesTLDR: HPA handles horizontal scaling on CPU, VPA right-sizes memory. Split their concerns with controlledResources: ["memory"] so they don’t fight. Drop CPU limits. Match memory requests to limits for Guaranteed QoS. Only create PDBs when you have 2+ replicas. …
6 Batch updating files across GitHub repos without cloningI needed to roll out the same GitHub Actions workflow change across a bunch of repositories. Doing it repo by repo via clone-edit-commit-push sounded painful. Turns out you can read, modify, and commit files directly through the GitHub API without ever cloning a repo. The …
4 Pulling Twilio Usage Data into Google SheetsI needed to track daily Twilio costs in a spreadsheet. The Twilio console has usage data but no easy export, and I wanted it updating automatically. The solution: Apps Script + Secret Manager Link to heading I wrote an Apps Script that: Fetches Twilio credentials from GCP Secret …
4 Using Google Sheets API with gcloud ADCI wanted to pull data from a Google Sheet using curl and my existing gcloud credentials. Should be simple, right? The naive approach (doesn’t work) Link to heading gcloud auth application-default login \ …
1 Getting VPA resourcePolicy right in Helm chartsTLDR: Templating VPA minAllowed from deployment resource requests prevents VPA from reducing resources. Popular charts make these fields optional and static. After fixing this in our charts: 93% CPU reduction on one service (200m → 15m). I was debugging why our pods were still …
For four years I thought kubectl required gcloud auth login. But I also needed ADC for scripts and apps, so every time my tokens expired I’d authenticate twice - once for the CLI, then again with gcloud auth application-default login. Two browser windows, two OAuth flows, …
22 Pruning Claude Code conversation historyA few days ago I cleaned up 200GB from my Mac and deliberately kept my Claude Code history at 2.3GB. Four days later it had grown to 9.5GB. Here’s how I pruned it back to 1.1GB without breaking conversation continuity. This also broke ccs - my fuzzy finder for Claude …
18 Extracting Travel Data from macOS Photos LibraryI was updating my about page and wanted to add a timeline of places I’ve travelled to. I’ve got thousands of geotagged photos in my Photos library spanning over a decade, and manually going through them would’ve been painful. Here’s how I extracted the …
18 Using Claude to free 200GB from a nearly full diskMy Mac was close to 100% full. macOS was complaining and I couldn’t install updates. Here’s how I used Claude to analyse my disk usage and safely free 200GB. System specs Link to heading Machine: MacBook Pro M4 Pro (24GB RAM) Disk: 494GB SSD macOS: 26.1 (developer …
14 Making bumpver play nice with uvI was setting up automated version bumps for a Python project using bumpver and uv. The problem: when bumpver updates the version in pyproject.toml, the uv.lock file also needs updating - and those changes need to be included in the same commit. The naive approach Link to heading …
6 Migrating from a GitHub bot user to a GitHub AppWe had a dedicated “bot” user account for GitHub automation - creating PRs, pushing commits, merging branches. It worked, but it always felt like a hack. The account consumed a licence seat, used a long-lived PAT that someone had to rotate manually, and the audit …
5 CCS: Search for Claude Code conversationsI’ve accumulated hundreds of Claude Code sessions and kept losing track of where I solved specific problems. The built-in /resume shows recent sessions, but anything older than a few days? Gone. So I built CCS (Claude Code Search) to fix that. TLDR Link to heading brew …
I’ve been using Neovim full-time for a couple of years now. Here’s my current setup - built on LazyVim with a focus on Python development using the Astral toolchain. Why LazyVim Link to heading I started with a custom config but maintaining it became tedious. LazyVim …
27 Python tools I used in 2025I’ve overhauled my Python development setup over the past year. The ecosystem has improved dramatically - faster tools, better defaults, and less configuration. This post describes my current workflow and links to the detailed posts on each tool. The stack Link to heading …
27 Kubernetes debugging in 2025My Kubernetes workflow changed a lot this year. The biggest shift: I started using LLMs as a debugging partner. Combined with a few CLI tools I can’t live without, debugging got noticeably faster. Aliases that stuck Link to heading First, the obvious ones: alias …
22 Developing Magento plugins on Kubernetes with git-syncThis is Part 2 covering plugin development. Part 1 covers setting up Magento on Kubernetes. With Magento running on Kubernetes, you can use git-sync sidecars for live plugin development - push to your repo and see changes within 60 seconds. This post covers the git-sync setup, …
18 Deploying Magento to KubernetesThis guide covers deploying Magento 2.4.8 to Kubernetes with MariaDB and OpenSearch as sidecars. The key benefit: disposable environments. Database corrupted? Config in a weird state? Just delete the PVC and redeploy - you’re back to a clean Magento install with sample data …
17 Git worktree helper with fzfI use git worktrees constantly for parallel development, but typing git worktree list, copying the path, and cd-ing got tedious. So I wrote a shell function. The function Link to heading Add this to your .zshrc: # Git worktree selector with fzf wt() { local create=false local …
16 Cleaning up DockerMy disk was filling up with old Docker images. I got a low disk space warning and traced 80GB back to Docker. Here’s how to reclaim space. How much space can you reclaim? Link to heading First, see what Docker is using: docker system df This shows you a breakdown by images, …
14 Deploying to Cloudflare Pages with wranglerI was deploying a SvelteKit app to Cloudflare Pages and wanted to do it from the command line rather than connecting to GitHub. Wrangler makes this straightforward. Why Cloudflare Pages over Vercel/Netlify Link to heading I evaluated all three for hosting a SvelteKit app: Vercel …
10 Silencing alerts properly in AlertmanagerI was doing planned maintenance on a Kubernetes cluster. Within seconds of starting the work, my phone was buzzing with PagerDuty alerts. I needed to silence them, but not blindly - only the specific alerts related to the maintenance work. Via the UI Link to heading Go to …
9 Fix gcloud PATH in shellAfter installing gcloud, the gcloud command wasn’t found. The PATH wasn’t set up properly. This happened after I upgraded macOS and my shell config got reset. Check if gcloud is installed: ls ~/google-cloud-sdk/bin/gcloud Add to your shell config (~/.zshrc or …
4 OpenSSL certificate testing with SNII was debugging why HTTPS requests to app.example.com were failing with certificate errors. The certificate on the server was valid, but clients were getting “certificate name mismatch” errors. Turns out the server hosted multiple domains on the same IP, and I was …
1 GitHub PR commands with ghUsing gh for PR work is much faster than the web UI, and allows staying in the terminal. It eliminates the need to constantly reach for the browser to check PR status, view diffs, or create new PRs. View the current PR in browser: gh pr view --web Create a PR: gh pr create Create …
1 Advent of Code tipsI started Advent of Code 2025. Here are some tips I’ve picked up. My solving workflow Link to heading Read the problem twice - I often miss details on first read Work through the example by hand (pen and paper for complex ones) Write the naive solution first If it’s …
I needed to check what was in a GCP secret to debug why an application wasn’t starting. Here’s how we inject secrets into GKE workloads, plus some CLI commands for debugging. Debugging secrets with gcloud Link to heading These commands are useful for checking secret …
27 Viewing Docker container logsI left a container running over a long weekend and came back to find it had consumed 50GB of disk space with logs. The application was logging every request at DEBUG level. That’s when I learnt about log rotation and the --since flag. Basic log viewing Link to heading View …
26 Getting your public IP with curlI needed to find my public IP to add it to a firewall allowlist. curl ifconfig.me That’s it. Returns just your IP address. Why you need to check your public IP Link to heading Your local machine’s IP address (like 192.168.1.x or 10.0.0.x) is different from your public …
25 PostgreSQL WAL monitoringAt 2am, I got an alert: database disk usage at 85%. Logged in, checked the usual suspects (tables, indexes, temp files), and everything looked normal. Then I checked /var/lib/postgresql/data/pg_wal/ and found 40GB of Write-Ahead Logs. That’s when I learned to monitor WAL …
25 Connecting to Cloud SQL with gcloudI needed to connect to a Cloud SQL instance to debug a data issue. Here’s the quick way to get a psql session without fiddling with IP allowlists or VPN connections. Using a service account: gcloud beta sql connect my-instance \ --project my-project \ --user=my-user \ …
24 Running local stacks with Docker ComposeI use Docker Compose for local multi-service environments because it keeps runtime config in one file and makes startup/teardown repeatable. My typical docker-compose.yml structure Link to heading Here’s what a typical development setup looks like for me: services: …
24 Searching code across GitHub with ghI needed to find all the places in our GitHub org that were using a deprecated GitHub Actions runner label. We were migrating from runs-on: self-hosted to runs-on: ${{ vars.RUNNER_STANDARD }}, and I needed to find every workflow file that still used the old pattern. The gh search …
20 Troubleshoot stuck ArgoCD syncsI was debugging why a Kubernetes deployment wasn’t updating after merging a PR. The manifest was in git, but the cluster was still running the old version. Turns out ArgoCD was stuck in a sync loop. Here’s what I learned. My GitOps workflow Link to heading A typical …
19 Web scraping with Selenium: quick setupI needed to scrape property listings from a real estate site that heavily relied on JavaScript to load content. The page source was empty until React rendered everything, so traditional tools like requests + BeautifulSoup wouldn’t work. Selenium was the answer. What I was …
19 Cost-optimising GKE with ComputeClassTLDR: I built gkecc to generate cost-optimised GKE ComputeClass specs from live pricing data. It sorts by total cost (CPU + RAM), not just CPU, and intelligently interleaves spot and on-demand instances. I was manually maintaining ComputeClass specs for our GKE clusters. Every …
19 direnv Python path issuesI was setting up a new Python project with direnv to manage environment variables. Suddenly python wasn’t found, even though it was definitely installed. Here’s what happened and how I fixed it. The problem Link to heading I’d been using direnv happily for …
18 Content Security Policy headersTLDR: Start with default-src 'self' and add exceptions as needed. Use report-only mode first to avoid breaking your site. I added CSP to a production site recently and immediately broke half of it. Inline scripts stopped working, external fonts disappeared, analytics failed …
17 pytest-asyncio mode configurationI was getting warnings about pytest-asyncio decorators. Here’s the fix. Why async tests are tricky Link to heading Async tests need an event loop to run. pytest-asyncio handles this, but there are gotchas: Each test gets its own event loop by default Fixtures need to match …
17 Pydantic v2 migration tipsPydantic v2 is a ground-up rewrite with a Rust core, and it shows - validation is noticeably faster. But the migration isn’t trivial. I spent about a day migrating a medium-sized FastAPI project, and here’s what I learned. Use bump-pydantic first Link to heading …
12 Migrating from Redocly to DocusaurusI was evaluating Docusaurus as a replacement for our Redocly docs site. We had around 200 documentation pages and needed more flexibility than Redocly could offer. Turns out Docusaurus was exactly what we needed. Why Docusaurus over other doc tools Link to heading I looked at a …
8 FastAPI patterns for production APIsFastAPI has a few defaults that make API services easier to maintain: request validation, typed contracts, and built-in docs. These are the patterns I reuse most. Quick start Link to heading pip install fastapi uvicorn from fastapi import FastAPI app = FastAPI() …
GKE has four layers of autoscaling that work together: HPA, VPA, cluster autoscaler, and NAP. Understanding how they interact saves a lot of debugging time. The four layers Link to heading HPA - scales pods horizontally (more replicas) based on CPU/memory/custom metrics VPA - …
21 Sentry DSN configurationI was setting up Sentry for a new Python service. The first time I ran it locally without a DSN configured, the app crashed at startup. Sentry’s SDK doesn’t gracefully handle missing configuration. Here’s what I learned about setting it up properly. The problem …
17 Debug Helm charts before deploy with helm templateI was trying to figure out why my Helm chart wasn’t rendering correctly. A missing if condition meant a ConfigMap wasn’t being created in production. helm template showed me exactly what was (and wasn’t) being generated. Basic usage Link to heading See what Helm …
15 Debugging Kubernetes HPA scalingI’d been using HPAs for a while without really understanding them. They worked, so I never looked closely. Then I noticed a service was running way more replicas than the load justified — and I realised I didn’t actually know how to read what HPA was doing or why. …
12 Kubernetes tolerations and node selectorsPods were stuck in Pending and I couldn’t figure out why. kubectl describe showed “0/12 nodes are available: 12 node(s) had taint that the pod didn’t tolerate.” I’d added spot instance nodes to the cluster but forgot they come pre-tainted. Once I …
11 Querying GCP logs with gcloudI needed to search Cloud Logging for specific events from the command line. The CLI is much faster than clicking through the Console when you know what you’re looking for. Basic query Link to heading gcloud logging read 'resource.type="cloud_function"' …
10 Keeping Homebrew packages up to dateI hadn’t run brew upgrade in a couple of months and suddenly gh started failing with cryptic errors. Turned out I was three major versions behind. Now I upgrade weekly - it’s less painful than debugging version mismatches. Basic commands Link to heading Update …
10 Moving commits between branches with cherry-pickI’d been working on a feature branch and accidentally committed a bug fix to it instead of main. The fix needed to go out now, but the feature branch had three other commits that weren’t ready. I didn’t want to merge the whole thing. Basic usage Link to heading …
10 Replacing venv script workflows with uv runWhen sharing quick Python scripts, the old workflow is usually: create a venv, install dependencies, and document setup steps. uv run replaces that with a single command and script-local metadata. Inline dependencies (the killer feature) Link to heading PEP 723 introduced a …
TLDR: Certificate not ready? Check resources in this order: Certificate → CertificateRequest → Order → Challenge. The issue is usually at the Challenge level. Debugging cert-manager feels like archaeology. You start at the surface (Certificate) and dig down through layers of …
15 Setting up Dependabot for uv projectsAfter migrating a project to uv, I noticed Dependabot PRs were still being created but CI was failing. Dependabot was updating pyproject.toml but not regenerating uv.lock, so the lockfile was out of sync. Here’s how I got it working. Basic setup Link to heading Create …
12 Psql connection patterns I use for debuggingI needed to connect to a PostgreSQL database for debugging production issues. After years of copying connection commands from Slack, I finally wrote down the patterns I actually use. Connection methods Link to heading Connect to localhost: psql -h localhost -U myuser -d mydb …
8 Shelving changes with git stashTLDR: git stash to save, git stash pop to restore. Use -m "message" if you’ll have multiple stashes. I was halfway through a refactor when someone pinged me about an urgent bug in production. I needed to context-switch immediately, but my working tree was a mess …
5 Debugging APIs with curl and jqI was debugging why a webhook wasn’t firing. The API was returning something, but staring at a wall of minified JSON in the terminal wasn’t helping. Piping to jq made the problem obvious - a nested field I expected to be an object was actually null. Basic usage Link …
4 Undoing commits with git revertI once pushed a commit that broke production. The fix was already in progress but would take an hour. git revert let me undo the damage immediately while keeping full history of what happened. Basic usage Link to heading Revert the last commit: git revert HEAD Revert a specific …
2 Setting up Claude CLI with MCPI wanted Claude to help me manage Linear tickets without leaving my terminal. The Model Context Protocol (MCP) makes this possible. Here’s how I set it up. Why Claude CLI with MCP? Link to heading I spend most of my day in the terminal. Switching to a browser to check …
2 Tmux session and pane commandsI started using tmux to keep terminal sessions running after disconnecting from SSH. Here’s what I use most. Quick session workflow Link to heading tmux new -s work # do work # Ctrl+b d tmux attach -t work Start a new session: tmux Start a named session: tmux new -s work …
I spend too much time switching between my terminal and Linear’s web app. The Linear CLI lets me manage tickets without leaving my editor. Here’s how I use it. Installation Link to heading Install via Homebrew: brew install schpet/tap/linear Authenticate (opens …
7 Syncing files from GCS with gcloud storageI needed to download a bunch of files from a GCS bucket to process them locally. gcloud storage rsync does the job, and it’s noticeably faster than the old gsutil for large syncs. Sync a bucket to local directory: gcloud storage rsync -r gs://my-bucket/path/ ./local/ …
7 Alembic migration historyI was investigating a production issue where a table column was missing. Turned out someone had merged a migration that dropped it without updating the application code. This is where knowing your way around Alembic’s history commands becomes essential. Basic history …
6 DNS lookups with digWhen an endpoint times out, I check DNS early to rule it in or out quickly. dig gives a fast sanity check before digging into app or network layers. Basic commands Link to heading Basic lookup: dig example.com Get just the answer: dig +short example.com Specific record types Link …
4 Monitoring Kubernetes with watch and topI was watching a deployment roll out and kept running kubectl get pods over and over like a nervous habit. Then I discovered watch and felt slightly embarrassed. Combined with kubectl top, these two commands handle most of my real-time cluster monitoring. watch for live updates …
1 Viewing Kubernetes pod logsI spent 20 minutes staring at empty kubectl logs output wondering why a crashing pod had no errors. The container was restarting before I could catch the logs. Then someone showed me the -p flag - previous container logs. The actual stack trace had been there the whole time. …
TLDR: My order is describe → logs -p → events → exec. Most failures show up in events or previous logs. When a pod is in CrashLoopBackOff, plain kubectl logs can miss the useful output. kubectl logs -p is usually the first command that surfaces the failure. My debugging workflow …
26 Rsync file sync patternsRsync is reliable for repeat syncs, but small flag mistakes can be destructive. I use a dry-run-first workflow, especially with --delete. TLDR: Common rsync patterns Link to heading # Basic sync (local to remote) rsync -avz ./ user@server:/path/to/dest/ # Sync excluding common …
25 Managing Kubernetes deploymentsI once deployed a config change that crashed pods on startup. The rollout was halfway through before I noticed - half the replicas were healthy, half were in CrashLoopBackOff. kubectl rollout undo had us back to the previous version in seconds. That’s when I learnt to …
23 Analysing Svelte build chunksI was working on a SvelteKit dashboard application and noticed the initial page load was sluggish. After investigating, I found we had over 80 separate chunk files - way too many. Too many small chunks means too many HTTP requests, which kills performance on slower connections. …
23 Formatting PHP with php-cs-fixerI was working on a legacy PHP WooCommerce plugin that had inconsistent formatting - some files used tabs, others spaces, brace styles were all over the place. Rather than manually fixing thousands of lines, I used php-cs-fixer to enforce consistent PHP coding standards across the …
23 Setting up pre-commit hooksI was tired of catching trivial issues in PR reviews - trailing whitespace, missing newlines, formatting inconsistencies. Pre-commit hooks solved this by running checks before code even gets committed. Installation Link to heading Install it: uv tool install pre-commit My actual …
21 Pytest tips: last failed and specific testsI run pytest a lot. Here are the flags I use most. My development workflow Link to heading When I’m writing code, I typically: Write the test first (or alongside the code) Run just that test: pytest tests/api/test_order_api.py::test_create_order -v Fix failures, re-run with …
21 GCloud workload identity for GitHub ActionsI was setting up GitHub Actions to deploy to GCP and needed to use workload identity instead of service account keys. Here’s how to manage the providers. TLDR Link to heading Workload identity lets GitHub Actions authenticate to GCP without storing service account keys. …
21 Ruff, the fast Python linterI switched to Ruff because it’s ridiculously fast. On a ~50k line Python codebase, Flake8 + isort + pylint took about 45 seconds. Ruff does it in under 2 seconds. It’s written in Rust and it shows. Basic usage Link to heading ruff check . Fix issues automatically: …
21 Import existing resources into Terraform without downtimeI migrated manually created GCP workload identity pools and GitHub repositories into Terraform so they could be managed consistently in code. The main friction point was provider-specific import ID formats. Basic import Link to heading terraform import …
21 Git worktrees for parallel developmentI was constantly stashing changes to review PRs or fix urgent bugs on other branches. Stash, switch, fix, commit, switch back, pop stash, hope I didn’t mess something up. Git worktrees solved this entirely. What’s a worktree? Link to heading A worktree is a separate …
21 Modern CLI tools: fd and ripgrepI stopped using find and grep ages ago. fd and rg (ripgrep) are faster and have better defaults. Switching to these was probably one of the quickest productivity wins I’ve had. Why they’re faster Link to heading The main reason is .gitignore support by default. If …
20 Publishing Python packages to Artifact Registry with uvI spent way too long trying to get uv publish to work with Google Artifact Registry. The docs suggest using keyring, but that led me down a rabbit hole of authentication errors. The error Link to heading My first attempt was the keyring approach from the uv docs: uv tool install …
I have been working on an Ethereum lottery Dapp with folks attending a meetup hosted by Strange Labs (Gloucester Road, Bristol - NOW CLOSED) and we faced a problem where we realised that Solidity does not have a built in random number generator and therefore picking a winner …
I often log into a remote SSH terminal to use an ipython shell. In doing so, it is necessary for me look at figures invoked by matplotlib as I am exploring and analysing data. For this, I have comfortably been using a combination of screen and xpra. However, I recently hesitantly …
8 Enabling MathJax on a Jekyll server when offlineI like MathJax. It does a great job displaying equations on web pages written using $\rm\LaTeX$. However, I recently wrote a Jekyll blog post which uses MathJax and tried to view it on a locally deployed server while commuting on a train journey with no Internet connection. Then, …
3 File/text was not valid utf8 encodedIn the process of writing my thesis, I had to frequently check that I was not exceeding the word limit by running the following command: texcount thesis.tex -inc -nosub And each time, I would get the following warning: !!! File/text was not valid utf8 encoded. !!! It was not …
After installing TSS’s Aimsun 8.1.3 on Ubuntu 16.04 (x64 build) on my machine, I tried to launch the program. However, the icon would appear briefly and close without any indication of what the problem was. The problem became obvious when starting up Aimsun through terminal …
My presentation for Geomob in London:
Sometimes, the mundane assumes a surreal form and takes one by surprise. I had the pleasure of this encounter this morning and I felt the need to share it.
18 What me eat by Macka BI love this song. Vegan solidarity! Here is the lyrics borrowed from this site: [Intro] Selamta (Greetings in Amharic) Ital (natural) we Ital and Vegan we Vegan I and I (we) eat from the earth and leave the animals to give birth No deaders (dead flesh) No fur No feathers When I …
17 Use crontab to log CPU temperature on OSX!I have just set up a way to automatically log temperature using OSX terminal because my computer was frequently overheating and I wanted to investigate why. Here is breakdown of how I did it. First of all, I installed Temperature Monitor for OSX from this URL into the application …
Finding and deleting files and folders in OSX is simple. Open your terminal. In order to just find your files/folders (non destructive): For files: find . -name "Icon?" -type f For folders: find . -name "Icon?" -type d For files and folders: find . -name …
I had to convert lots of OSGB EPSG:27700 raster files to LonLat EPSG:4326 format and here is how I did it on my OSX terminal. I also wanted to change the format from *.asc to *.tif. Supposing you already have gdal libraries installed, just run the following code: input_folder = …
6 Fastest way to access a list that is a subset of an even bigger listSay I have a list of objects called agents with 100,000 objects. I have a second list called agents_per_step which refers to 39,393 objects in agents. Say I need to access the agents in the reference list. What is the fastest way to access these objects? I ran three tests: Loop …
On 11 May, Bristol Green Party hosted a forum to discuss housing and energy at The Station in central Bristol. The meeting was chaired by Darren Hall, Green Party candidate for Bristol West and Director of Bristol Green Week and on the panel were: Oona Goldsworthy, Chief …
12 Bristol People’s Question TimeOn 10th March, Bristol People’s Assembly hosted People’s Question Time at City Road Baptist Church in Stokes Croft. In the panel were Rufus Hound (Comedian and Actor), Pastor Eric Aidoo (from the Church), Romaine Phoenix (Chair of The People’s Assembly), John McInally (Vice …
11 Another Angry VoiceAnother Angry Voice (AAV) aka Tom paid a visit to Bristol on 5th March. AAV introduced himself as a regular guy and emphasized that if he can do a political blog then anyone can. An example of an infographic by AAV. AAV brings up the information war that left has been quite bad …
10 How well does population distribution predict evacuation time?Previously, we tried to predict 90th percentile evacuation time $T{90}$ determined from ABM simulation using 90th percentile free flow clearance time $T90f$. Bigger the city, greater we can expect $T90f$ to be since it would take longer to traverse. Plotting $T90f$ vs $T90$ …
4 First post!I have just updated the website and finally acquired brtkwr.com for good which is now hosted on Github pages too which is an excellent free of charge service if I may say so. It has just the right amount of manual tweaking to make you think you have control over how the …