Add Your Email Address to Your RSS Feed
Inspired by the Add Your Email Address to Your RSS Feed article, I added the email element to the Atom feed of the blog (the RSS feed already had the email address). Enjoy 🎉
(via)
Inspired by the Add Your Email Address to Your RSS Feed article, I added the email element to the Atom feed of the blog (the RSS feed already had the email address). Enjoy 🎉
(via)
In the Agentic Coding article, Simon WIllson talks about the Agentic Coding: The Future of Software Development with Agents YouTube talk from Armin Ronacher.
I picked up a bunch of useful tips from this video:
- Armin runs Claude Code with the
--dangerously-skip-permissions
option, and says this unlocks a huge amount of productivity. I haven't been brave enough to do this yet but I'm going to start using that option while running in a Docker container to ensure nothing too bad can happen.- When your agentic coding tool can run commands in a terminal you can mostly avoid MCP - instead of adding a new MCP tool, write a script or add a Makefile command and tell the agent to use that instead. The only MCP Armin uses is the Playwright one.
- Combined logs are a really good idea: have everything log to the same place and give the agent an easy tool to read the most recent N log lines.
- While running Claude Code, use Gemini CLI to run sub-agents, to perform additional tasks without using up Claude Code's own context
- Designing additional tools that provide very clear errors, so the agents can recover when something goes wrong.
- Thanks to Playwright, Armin has Claude Code perform all sorts of automated operations via a signed in browser instance as well. "Claude can debug your CI... it can sign into a browser, click around, debug..." - he also has it use the
gh
GitHub CLI tool to interact with things like GitHub Actions workflows.
I would add to this list a link to the Agentic Coding Recommendations blog post of Armin.
It supports both single variables and more complex expressions. Here’s a few examples:
>>> x = 42 >>> f"{x=}" 'x=42' >>> f"{1+2=}" '1+2=3' >>> f"{(1+2)*3=}" '(1+2)*3=9'This is described in What’s New In Python 3.8;
(via)
Started the festival season at ZOA City with yet again a concert of Lost Frequencies. 🥳
I've long had a list of "magic numbers" which show up in a bunch of places, and even made a post about it back in November of 2020. You ever wonder about certain permutations, like 497 days, or 19.6 years, or 5184 hours, and what they actually mean?
I've been doing that stuff by hand in a calculator and finally decided to just do it in Javascript and put it online for anyone to try.
So, here's my latest waste of CPU cycles:
(via)
Here's a tip that works on YouTube and almost any other web page that shows you a video. You can increase the playback rate beyond the usually-exposed 2x by running this in your browser DevTools console:
document.querySelector('video').playbackRate = 2.5
(via)
Cleaned up a bit the links in the sidebar.
I find myself clicking less and less on them.
Mostly reading blogs via NetNewsWire these days.
Removed:
Someday I should find the motivation to export an OPML file from the reader and make it available.
The full OPML list would be way too big for the sidebar, so a dedicated place would need to be found. 😅
benjojo does some clever data analysis for Picking uncontested private IP subnets with usage data.
He not only gathers the usage data of the various subnets, but also provides a nice tool to get a /24 subnet from the list that has no known users.
And to top it off the article also provides the underlying data.
A Zip file with the /24 subnets with number of known users (local copy).
And the distilled list of subnets that have no known users (local copy).
As part of my migration to Bunny CDN for andreas-jaggi.ch, I also moved the DNS zone over.
There are not many records in the zone, but one which turned out to be a bit more tricky was the CAA one.
I wanted to use the following Terraform snippet to create it:
resource "bunnynet_dns_record" "andreas_jaggi_ch_CAA" { zone = bunnynet_dns_zone.andreas_jaggi_ch.id name = "" type = "CAA" value = "0 issue \"letsencrypt.org;validationmethods=http-01\"" }
But this always failed with a cryptic error message during terraform apply
:
│ Error: Unable to create DNS record │ │ with bunnynet_dns_record.andreas_jaggi_ch_CAA, │ on dns.tf line 22, in resource "bunnynet_dns_record" "andreas_jaggi_ch_CAA": │ 22: resource "bunnynet_dns_record" "andreas_jaggi_ch_CAA" { │ │ A tag can be a maximum of 50 ASCII characters.
After some head-scratching I figured out that the Terraform provider has dedicated fields for the flags
and tag
parts of the CAA DNS record.
And it insists on them being used this way:
resource "bunnynet_dns_record" "andreas_jaggi_ch_CAA" { zone = bunnynet_dns_zone.andreas_jaggi_ch.id name = "" type = "CAA" tag = "issue" flags = 0 value = "letsencrypt.org;validationmethods=http-01" }
With this in place, it worked fine.
And it prepared me also for the MX record where a similar approach is required.
For andreas-jaggi.ch I wanted to try out Bunny CDN.
Everything went very smooth and I nicely used Terraform to configure Edge Rules blocking all unwanted access.
As andreas-jaggi.ch does not have much content this resulted in a list of allowed files similar to this:
resource "bunnynet_pullzone_edgerule" "andreas_jaggi_4" { pullzone = bunnynet_pullzone.andreas_jaggi.id description = "block not(known good) http://www.andreas-jaggi.ch" enabled = true match_type = "MatchNone" actions = [{ type = "BlockRequest", parameter1 = null, parameter2 = null, parameter3 = null }] triggers = [ { match_type = "MatchAny", patterns = [ "http://www.andreas-jaggi.ch/", "http://www.andreas-jaggi.ch/favicon.ico", "http://www.andreas-jaggi.ch/robots.txt", "http://www.andreas-jaggi.ch/security.txt", ], type = "Url", parameter1 = null, parameter2 = null }, ] }
After this I did setup the www subdomain as CNAME and added it as additional hostname to the CDN Pullzone.
But the process to get a Let's Encrypt certificate for the www subdomain always failed with an error.
This is where I messed up.
Turns out my Edge Rules blocking all unwanted access also blocked the Let's Encrypt validation requests. 🤦
Once I realized this (which took a shamefully long amount of time), I added an entry to the Edge Rules for the .well-known/acme-challenge/
subpath:
resource "bunnynet_pullzone_edgerule" "andreas_jaggi_4" { pullzone = bunnynet_pullzone.andreas_jaggi.id description = "block not(known good) https://www.andreas-jaggi.ch" enabled = true match_type = "MatchNone" actions = [{ type = "BlockRequest", parameter1 = null, parameter2 = null, parameter3 = null }] triggers = [ { match_type = "MatchAny", patterns = [ "http://www.andreas-jaggi.ch/", "http://www.andreas-jaggi.ch/favicon.ico", "http://www.andreas-jaggi.ch/robots.txt", "http://www.andreas-jaggi.ch/security.txt", "http://www.andreas-jaggi.ch/.well-known/acme-challenge/*", ], type = "Url", parameter1 = null, parameter2 = null }, ] }
With this in place, the process worked immediately and the www subdomain now also serves encrypted traffic. 🔐