Tag: ai
Weeknotes the Second: Month Notes
Well this has already been an interesting experiment. Only one week in, and I already feel more motivated and focused to work on personal projects and the goals that I’d set. Some of that might just be the ephemeral “New System Energy” that is plentiful when you start a new organizational system or habit, but what the hey; even if it’s fleeting, I’ll gladly ride it as far as I can!
Weeknotes: The First
I’ve recently been struggling with a feeling of lack of tangible progress towards goals, or even of any idea of what those goals are or should be. Inspired both by GTD and by Simon Willison’s practice, I’ve decided to start writing “weeknotes” - records of what I’ve done each week, and what I’d like to focus on.
Tag: ci/cd
Weeknotes the Second: Month Notes
Well this has already been an interesting experiment. Only one week in, and I already feel more motivated and focused to work on personal projects and the goals that I’d set. Some of that might just be the ephemeral “New System Energy” that is plentiful when you start a new organizational system or habit, but what the hey; even if it’s fleeting, I’ll gladly ride it as far as I can!
Gitea Actions
As I hoped in my last post, I’ve set up Gitea Actions on my homelab, with a view to completely replacing Drone which I’ve found to be pretty buggy and missing some core features1. The process was reasonably smooth, but not entirely turnkey, so I’ve laid out the steps I took in the hopes that they’ll help someone else.
Weeknotes: The First
I’ve recently been struggling with a feeling of lack of tangible progress towards goals, or even of any idea of what those goals are or should be. Inspired both by GTD and by Simon Willison’s practice, I’ve decided to start writing “weeknotes” - records of what I’ve done each week, and what I’d like to focus on.
Auto Announce on Mastodon
I just set up a step in my publication pipeline to automatically post on Mastodon when I publish a new blog post.
Automatic Merging
When working on my personal projects, I typically just push straight to main
- opening a PR just to approve it seems entirely pointless, as if I had been able to find any issues in my own work, I wouldn’t wait to do it in a PR! However, this does mean that, if I forget to run any quality checkers (linters, tests, etc.), I won’t find out about it until on: push
GitHub Action runs, and even then I might not see the failure until several commits later.
Pre-Pipeline Verification, and the Push-And-Pray Problem
It’s fairly uncontroversial that, for a good service-deployment pipeline, there should be:
- at least one pre-production stage
- automated tests running on that stage
- a promotion blocker if those tests fail
The purpose of this testing is clear: it asserts ("verifies") certain correctness properties of the service version being deployed, such that any version which lacks those properties - which “is incorrect” - should not be deployed to customers. This allows promotion to be automated, reducing human toil and allowing developers to focus their efforts on development of new features rather than on confirmation of the correctness of new deployments.
TK Block
I just added a process to my blog deployment pipeline to block the deployment of any blogs that contain the characters “TK”.
Rebuild From Scratch
Observant readers of this blog, refreshing every day desperate for new content, will have noticed that the last blog post - dated 2022-12-31 - actually went live in the middle of January. My k3s cluster, which had always been a bit rickety, finally gave up the ghost in late December, and two of the nodes needed to be fully reimaged before I could start it back up again.
CI/CD/CD, Oh My!
Since leaving Amazon ~4 months ago and dedicating more time to my own personal projects (and actually trying to ship things instead of getting distracted a few days in by the next shiny project!), I’ve learned a lot more about the Open Source tools that are available to software engineers; which, in turn, has highlighted a few areas of ignorance about CI/CD Pipelines. Emulating Julia Evans, I’m writing this blog both to help lead others who might have similar questions, and to rubber-duck my own process of answering the questions.
Tag: cloudflare-tunnels
Jellyfin Over Tailscale
I know just enough about computer security to know that I don’t know enough about computer security, so I default to keeping my systems as closed-off from the outside world as possible. I use Cloudflare Tunnels for the few systems that I want to make externally available1 (like Gitea), and Tailscale to access “internal” services or ssh while on-the-go.
Cloudflare Tunnel DNS
I use Cloudflare Tunnels to expose services (like this blog!) to the public Internet while remaining protected by Cloudflare’s infrastructure. While attempting to add a new service, I noticed that there were two steps required:
- Updating the configuration deployed to the tunnel daemon, mapping the internal service to its externally-accessible name
- Updating Cloudflare’s DNS entries to map the external name to the Cloudflare tunnel
Although the first step is easily automated with the cloudflare/cloudflared
image, the second isn’t so simple - there’s no single command to update all exposed sites, so the logic would need to parse the config file to determine the set of all sites, and the cloudflared
image doesn’t include tools to do so.
Tag: communication
Communication Urgency
Thesis statement: Most communication is less urgent than you think. Encoding urgency into messages as (meta)data is valuable - but building a healthy culture around and relationship with communication urgency is even more so.
Tag: crossplane
Base App Infrastructure
In my previous post, I had figured out how to inject Vault secrets into Kubernetes Secrets using the Vault Secrets Operator. My runthrough of the walkthrough worked, but I swiftly ran into namespacing issues when trying to use it “in production”.
Tag: dns
Tag: end-of-year-wrapups
2024 Wrap Up Books
Continuing a trend started way back in the seventh post on this blog, a summary of the books that I read this year.
2023 Wrap Up - Articles
Stand-outs among articles I read this year - abandoning the table layout from last year in favour of readability.
2023 Wrap Up - Books
Another End Of Year Wrap-up, focusing (as the previous installations did) initially on reading1.
2022 Wrap Up
One of the first posts on this blog was a retrospective on my reading in 2021 - it seems only natural to do something similar this year.
2021 in Books
My good friend George set himself a challenge a while back to read 52 books in a calendar year. He succeeded (as George is wont to do), and that achievement has always stuck in my mind as impressive1. I don’t think I’d ever be able to equal it (especially not now, with Work-From-Home removing my most common reading time - the commute), but I did start tracking my reading as a matter of interest. To that end, I present my year-of-reading-in-review, with book-by-book recaps and the full list at the end:
Tag: gitea
Weeknotes the Third
I had intended to write this weeknotes on the amusing rabbit-hole of yak-shaving I’d fallen down:
Weeknotes the Second: Month Notes
Well this has already been an interesting experiment. Only one week in, and I already feel more motivated and focused to work on personal projects and the goals that I’d set. Some of that might just be the ephemeral “New System Energy” that is plentiful when you start a new organizational system or habit, but what the hey; even if it’s fleeting, I’ll gladly ride it as far as I can!
Gitea Actions
As I hoped in my last post, I’ve set up Gitea Actions on my homelab, with a view to completely replacing Drone which I’ve found to be pretty buggy and missing some core features1. The process was reasonably smooth, but not entirely turnkey, so I’ve laid out the steps I took in the hopes that they’ll help someone else.
Weeknotes: The First
I’ve recently been struggling with a feeling of lack of tangible progress towards goals, or even of any idea of what those goals are or should be. Inspired both by GTD and by Simon Willison’s practice, I’ve decided to start writing “weeknotes” - records of what I’ve done each week, and what I’d like to focus on.
Tag: homelab
Weeknotes the Third
I had intended to write this weeknotes on the amusing rabbit-hole of yak-shaving I’d fallen down:
Gitea Actions
As I hoped in my last post, I’ve set up Gitea Actions on my homelab, with a view to completely replacing Drone which I’ve found to be pretty buggy and missing some core features1. The process was reasonably smooth, but not entirely turnkey, so I’ve laid out the steps I took in the hopes that they’ll help someone else.
Jellyfin Over Tailscale
I know just enough about computer security to know that I don’t know enough about computer security, so I default to keeping my systems as closed-off from the outside world as possible. I use Cloudflare Tunnels for the few systems that I want to make externally available1 (like Gitea), and Tailscale to access “internal” services or ssh while on-the-go.
Uses Page
I’ve fallen out of the habit of blogging, recently, due to some personal/family stuff going down. In an effort to kickstart that process again, I’m taking on a smaller task that requires significantly less effortful thought - a rudimentary “Uses” page, inspired by the general practice of listing the stuff™️ used.
Auto Announce on Mastodon
I just set up a step in my publication pipeline to automatically post on Mastodon when I publish a new blog post.
Base App Infrastructure
In my previous post, I had figured out how to inject Vault secrets into Kubernetes Secrets using the Vault Secrets Operator. My runthrough of the walkthrough worked, but I swiftly ran into namespacing issues when trying to use it “in production”.
Vault Secrets Into K8s
Continuing my recent efforts to make authentication on my homelab cluster more “joined-up” and automated, this weekend I dug into linking Vault to Kubernetes so that pods could authenticate via shared secrets without me having to manually create the secrets in Kubernetes.
Keycloak Backup
Setting up regular backup for my Keycloak installation was a lot trickier than I expected!
Project Management and Async Functions
In my greatest display yet of over-engineering and procrastinating-with-tooling, I’ve started self-hosting OpenProject to track the tasks I want to carry out on my homelab (and their dependencies).
Backups and Updates and Dependencies and Resiliency
This post is going to be a bit of a meander. It starts with the description of a bug (and appropriate fix, in the hopes of helping a fellow unfortunate), continues on through a re-consideration of software engineering practice, and ends with a bit of pretentious terminological philosophy. Strap in, let’s go!
Automatic Merging
When working on my personal projects, I typically just push straight to main
- opening a PR just to approve it seems entirely pointless, as if I had been able to find any issues in my own work, I wouldn’t wait to do it in a PR! However, this does mean that, if I forget to run any quality checkers (linters, tests, etc.), I won’t find out about it until on: push
GitHub Action runs, and even then I might not see the failure until several commits later.
Raspberry Pi Temperature Monitoring
As I’ve discussed before, this blog is hosted on a k3s cluster which runs on 3 Raspberries Pi in a nifty little case. The router that powers our home network is in my partner’s office, with the Pi cluster nearby so that it can benefit from a fast stable wired Ethernet connection.
Rebuild From Scratch
Observant readers of this blog, refreshing every day desperate for new content, will have noticed that the last blog post - dated 2022-12-31 - actually went live in the middle of January. My k3s cluster, which had always been a bit rickety, finally gave up the ghost in late December, and two of the nodes needed to be fully reimaged before I could start it back up again.
VPN on Kubernetes
I was surprised to find that there’s not much discussion of putting Kubernetes pods behind a VPN. Given how useful both tools are, you’d think more people would use them in concert.
CI/CD/CD, Oh My!
Since leaving Amazon ~4 months ago and dedicating more time to my own personal projects (and actually trying to ship things instead of getting distracted a few days in by the next shiny project!), I’ve learned a lot more about the Open Source tools that are available to software engineers; which, in turn, has highlighted a few areas of ignorance about CI/CD Pipelines. Emulating Julia Evans, I’m writing this blog both to help lead others who might have similar questions, and to rubber-duck my own process of answering the questions.
Grafana Oncall
I’ve had several instability issues with my Kubernetes cluster recently, and so I wanted to install some monitoring to notify me of incipient issues. I’m already using Grafana dashboards to visualize the state of my cluster (using some of my own hand-crafted dashboards along with some pre-existing Kubernetes-specific ones), but that’s only useful if I happen to be looking at it at the time a problem is happening - it won’t warn me of a brewing problem (and, if the problem results in my VPN becoming unavailable while I’m away from home, that could result in complete disconnection).
Cloudflare Tunnel DNS
I use Cloudflare Tunnels to expose services (like this blog!) to the public Internet while remaining protected by Cloudflare’s infrastructure. While attempting to add a new service, I noticed that there were two steps required:
- Updating the configuration deployed to the tunnel daemon, mapping the internal service to its externally-accessible name
- Updating Cloudflare’s DNS entries to map the external name to the Cloudflare tunnel
Although the first step is easily automated with the cloudflare/cloudflared
image, the second isn’t so simple - there’s no single command to update all exposed sites, so the logic would need to parse the config file to determine the set of all sites, and the cloudflared
image doesn’t include tools to do so.
Self-Hosted Analytics
Way back in this post, I talked about enabling Analytics Tracking on this blog. I disabled it a while back, as the move to an actually self-hosted blog behind Cloudflare Tunnels (as opposed to an AWS-hosted one) messed that up a bit, and I was more incentivized to have a self-hosted blog without analytics, than vice versa. This post is the story of how I got self-hosting analytics working.
SSH to Idle Screen Window
I’ve written before about setting up my ssh config so that I’ll automatically join an existing screen session when ssh-ing to certain hosts, by setting RemoteCommand screen -D -RR -p +
However, this has a couple of issues:
- It will always create a new window within the session, even if an idle window exists. More often than not, I find myself immediately killing the new window and switching to an existing one.
- It doesn’t restrict the rejoin to a named session - in my current usage, I typically only have a single
screen
session open at once, but that could change!
Secure Docker Registry
Part of the self-hosted setup that supports this blog (along with all my other homelab projects) is a Docker Registry to hold the images built and used in the CI/CD pipeline. Recently I tried to install TLS certificates to secure interaction with the Registry, and it was a fair bit harder to figure out than I expected, so I wanted to write it up both for future-me and for anyone else struggling with the same problem.
Auto Screen
screen
(Wikipedia) is a Unix tool that starts a persistent session on a remote machine, allowing you to detach from that session while keeping any running processes alive. It’s really useful when executing a long-running process over an unstable ssh connection. There are other ways to achieve that aim (like Background Processes), and other features of screen
itself (like fitting multiple panels in a single window), but that’s what I primarily use it for.
Self Hosting Blog
Despite this blog being initially set up to primarily talk about self-hosting, I’d actually been hosting it on AWS until very recently. This was due to caution - I know just enough about security to know that I know next-to-nothing about security, and so I didn’t want to expose any ports on my own network to the Internet. Instead, I set up an AWS CodePipeline to build the blog and deploy to S3 anytime I pushed a new change. Admittedly, this was a pretty cool project in itself that taught me a lot more about CDK and some AWS services; but it didn’t feel like true self-hosting, even though I wasn’t using anything like Medium or WordPress.
Grafana Backup
Update: I’m preserving the post below for posterity, but I had the obvious solution in the final sentence - I changed my setup to run Grafana from Docker and mount a folder from my external Hard Drive (I haven’t saved up for a NAS yet!), and now my dashboard definition is persistent across restarts/re-images.
Check Your Backups
I fully intend to write a full blog-post as a follow-up to my previous post at some point, detailing some of the quirks of this setup and issues that I ran into - but I just got a timely reminder of the importance of checking backups, and wanted to pass it on to you.
Tag: information-management
Communication Urgency
Thesis statement: Most communication is less urgent than you think. Encoding urgency into messages as (meta)data is valuable - but building a healthy culture around and relationship with communication urgency is even more so.
Tag: jellyfin
Jellyfin Over Tailscale
I know just enough about computer security to know that I don’t know enough about computer security, so I default to keeping my systems as closed-off from the outside world as possible. I use Cloudflare Tunnels for the few systems that I want to make externally available1 (like Gitea), and Tailscale to access “internal” services or ssh while on-the-go.
Tag: k8s
Weeknotes the Third
I had intended to write this weeknotes on the amusing rabbit-hole of yak-shaving I’d fallen down:
Gitea Actions
As I hoped in my last post, I’ve set up Gitea Actions on my homelab, with a view to completely replacing Drone which I’ve found to be pretty buggy and missing some core features1. The process was reasonably smooth, but not entirely turnkey, so I’ve laid out the steps I took in the hopes that they’ll help someone else.
Jellyfin Over Tailscale
I know just enough about computer security to know that I don’t know enough about computer security, so I default to keeping my systems as closed-off from the outside world as possible. I use Cloudflare Tunnels for the few systems that I want to make externally available1 (like Gitea), and Tailscale to access “internal” services or ssh while on-the-go.
Base App Infrastructure
In my previous post, I had figured out how to inject Vault secrets into Kubernetes Secrets using the Vault Secrets Operator. My runthrough of the walkthrough worked, but I swiftly ran into namespacing issues when trying to use it “in production”.
Vault Secrets Into K8s
Continuing my recent efforts to make authentication on my homelab cluster more “joined-up” and automated, this weekend I dug into linking Vault to Kubernetes so that pods could authenticate via shared secrets without me having to manually create the secrets in Kubernetes.
Keycloak Backup
Setting up regular backup for my Keycloak installation was a lot trickier than I expected!
PVC Debug Pod
I’ve been annoyed sufficiently-often by the fact that there is no single kubectl
command to “create a pod, and attach a PVC to it” that I threw together the following script:
Backups and Updates and Dependencies and Resiliency
This post is going to be a bit of a meander. It starts with the description of a bug (and appropriate fix, in the hopes of helping a fellow unfortunate), continues on through a re-consideration of software engineering practice, and ends with a bit of pretentious terminological philosophy. Strap in, let’s go!
Rebuild From Scratch
Observant readers of this blog, refreshing every day desperate for new content, will have noticed that the last blog post - dated 2022-12-31 - actually went live in the middle of January. My k3s cluster, which had always been a bit rickety, finally gave up the ghost in late December, and two of the nodes needed to be fully reimaged before I could start it back up again.
VPN on Kubernetes
I was surprised to find that there’s not much discussion of putting Kubernetes pods behind a VPN. Given how useful both tools are, you’d think more people would use them in concert.
Grafana Oncall
I’ve had several instability issues with my Kubernetes cluster recently, and so I wanted to install some monitoring to notify me of incipient issues. I’m already using Grafana dashboards to visualize the state of my cluster (using some of my own hand-crafted dashboards along with some pre-existing Kubernetes-specific ones), but that’s only useful if I happen to be looking at it at the time a problem is happening - it won’t warn me of a brewing problem (and, if the problem results in my VPN becoming unavailable while I’m away from home, that could result in complete disconnection).
Cloudflare Tunnel DNS
I use Cloudflare Tunnels to expose services (like this blog!) to the public Internet while remaining protected by Cloudflare’s infrastructure. While attempting to add a new service, I noticed that there were two steps required:
- Updating the configuration deployed to the tunnel daemon, mapping the internal service to its externally-accessible name
- Updating Cloudflare’s DNS entries to map the external name to the Cloudflare tunnel
Although the first step is easily automated with the cloudflare/cloudflared
image, the second isn’t so simple - there’s no single command to update all exposed sites, so the logic would need to parse the config file to determine the set of all sites, and the cloudflared
image doesn’t include tools to do so.
Self-Hosted Analytics
Way back in this post, I talked about enabling Analytics Tracking on this blog. I disabled it a while back, as the move to an actually self-hosted blog behind Cloudflare Tunnels (as opposed to an AWS-hosted one) messed that up a bit, and I was more incentivized to have a self-hosted blog without analytics, than vice versa. This post is the story of how I got self-hosting analytics working.
Secure Docker Registry
Part of the self-hosted setup that supports this blog (along with all my other homelab projects) is a Docker Registry to hold the images built and used in the CI/CD pipeline. Recently I tried to install TLS certificates to secure interaction with the Registry, and it was a fair bit harder to figure out than I expected, so I wanted to write it up both for future-me and for anyone else struggling with the same problem.
Tag: keycloak
Keycloak Backup
Setting up regular backup for my Keycloak installation was a lot trickier than I expected!
Tag: leisure
The Land of Infinite Fun
Another snippet of literature (following this one) that I think about regularly - this time, from Excession by the late great Iain M. Banks. The Culture Series describes an interstellar post-scarcity civilization, wherein most of the administration and governance is carried out by hyper-advanced AIs called Minds, and biological beings (who live on terraformed planets, on megastructures like Bishop Rings, or aboard planet-sized space-faring Ships) are free to pursue leisure and self-improvement. Basically, Fully Automated Luxury Gay Space Communism.
Tag: mastodon
Attribution on Mastodon
Just a quick one to note that, following instructions on this article, I’ve added a meta tag to posts from this blog (<meta name="fediverse:creator" content="[email protected]" />
1) which should, hopefully, result in attribution when articles are shared on Mastodon (and apparently Discord too 🤷🏻♂️).
Tag: mathematics
Almost All Numbers Are Normal
“Almost All Numbers Are Normal” is a delightful sentence. In just five words, it relates three mathematical concepts, in a way which is true but misleading - the meaning of the sentence is almost exactly the opposite of what a layman would expect.
The Land of Infinite Fun
Another snippet of literature (following this one) that I think about regularly - this time, from Excession by the late great Iain M. Banks. The Culture Series describes an interstellar post-scarcity civilization, wherein most of the administration and governance is carried out by hyper-advanced AIs called Minds, and biological beings (who live on terraformed planets, on megastructures like Bishop Rings, or aboard planet-sized space-faring Ships) are free to pursue leisure and self-improvement. Basically, Fully Automated Luxury Gay Space Communism.
Tag: mentalhealth
Leave of Absence
Last Friday was my last working day for the foreseeable future. I’m taking a Leave Of Absence, meaning I’m still technically employed (and thus retain the all-important Health Insurance and other benefits), but am not working (or getting paid) for three months1. I’m planning to use this time primarily to rest, decompress, and avoid burnout; and then secondarily to think more intentionally about how I want to spend my time and my labour in the future.
Meditation
A few days ago, I hit a 100-day streak of meditating using the Ten Percent Happier app.
Write Only Mode for Twitter
A few weeks ago, I decided to step back from using Twitter so actively. There are certainly a lot of good things about Twitter - it’s entertaining and informative - but, from a mindset of Digital Minimalism, I could not honestly say that it was doing me more good than harm.
Tag: meta
Gitea Actions
As I hoped in my last post, I’ve set up Gitea Actions on my homelab, with a view to completely replacing Drone which I’ve found to be pretty buggy and missing some core features1. The process was reasonably smooth, but not entirely turnkey, so I’ve laid out the steps I took in the hopes that they’ll help someone else.
Attribution on Mastodon
Just a quick one to note that, following instructions on this article, I’ve added a meta tag to posts from this blog (<meta name="fediverse:creator" content="[email protected]" />
1) which should, hopefully, result in attribution when articles are shared on Mastodon (and apparently Discord too 🤷🏻♂️).
Uses Page
I’ve fallen out of the habit of blogging, recently, due to some personal/family stuff going down. In an effort to kickstart that process again, I’m taking on a smaller task that requires significantly less effortful thought - a rudimentary “Uses” page, inspired by the general practice of listing the stuff™️ used.
Auto Announce on Mastodon
I just set up a step in my publication pipeline to automatically post on Mastodon when I publish a new blog post.
Adding RSS
Inspired by this article, I’ve added (or attempted to?) an RSS feed to this blog. From Hugo’s docs it seems pretty simple, but please let me know if you run into any issues!
TK Block
I just added a process to my blog deployment pipeline to block the deployment of any blogs that contain the characters “TK”.
CI/CD/CD, Oh My!
Since leaving Amazon ~4 months ago and dedicating more time to my own personal projects (and actually trying to ship things instead of getting distracted a few days in by the next shiny project!), I’ve learned a lot more about the Open Source tools that are available to software engineers; which, in turn, has highlighted a few areas of ignorance about CI/CD Pipelines. Emulating Julia Evans, I’m writing this blog both to help lead others who might have similar questions, and to rubber-duck my own process of answering the questions.
Cloudflare Tunnel DNS
I use Cloudflare Tunnels to expose services (like this blog!) to the public Internet while remaining protected by Cloudflare’s infrastructure. While attempting to add a new service, I noticed that there were two steps required:
- Updating the configuration deployed to the tunnel daemon, mapping the internal service to its externally-accessible name
- Updating Cloudflare’s DNS entries to map the external name to the Cloudflare tunnel
Although the first step is easily automated with the cloudflare/cloudflared
image, the second isn’t so simple - there’s no single command to update all exposed sites, so the logic would need to parse the config file to determine the set of all sites, and the cloudflared
image doesn’t include tools to do so.
Self-Hosted Analytics
Way back in this post, I talked about enabling Analytics Tracking on this blog. I disabled it a while back, as the move to an actually self-hosted blog behind Cloudflare Tunnels (as opposed to an AWS-hosted one) messed that up a bit, and I was more incentivized to have a self-hosted blog without analytics, than vice versa. This post is the story of how I got self-hosting analytics working.
Tags in Archetype
I’ve been using tags - or taxonomies, as Hugo more generally calls them - to organize posts in this blog for a while, but haven’t imposed much structure on them. I tend to just apply whatever tags feel appropriate at the time I’m writing, which led to posts with near-duplicate tags1. We can solve this problem with COMPUTERS2!
Self Hosting Blog
Despite this blog being initially set up to primarily talk about self-hosting, I’d actually been hosting it on AWS until very recently. This was due to caution - I know just enough about security to know that I know next-to-nothing about security, and so I didn’t want to expose any ports on my own network to the Internet. Instead, I set up an AWS CodePipeline to build the blog and deploy to S3 anytime I pushed a new change. Admittedly, this was a pretty cool project in itself that taught me a lot more about CDK and some AWS services; but it didn’t feel like true self-hosting, even though I wasn’t using anything like Medium or WordPress.
Commenting Enabled
If everything has worked as expected, comments should now be enabled on this blog via Disqus. Don’t make me regret that. Ensure that your comments pass through the Three Gates - they should be true, necessary, and kind. If you want to espouse homophobia, transphobia, racism, fascism, anti-vax, or anything similar, you are not welcome here. Black Lives Matter, Trans Rights Are Human Rights.
I don’t yet know if Disqus provides moderation - if it does, assume that every comment will be subject to approval. If it doesn’t, I reserve the right to remove commenting as soon as it becomes problematic, and then you’ll be the reason why we can’t have nice things.
My First Post
In true navel-gazey meta style, the first post on this blog is a description of how I set up the blog.
Tag: observability
Raspberry Pi Temperature Monitoring
As I’ve discussed before, this blog is hosted on a k3s cluster which runs on 3 Raspberries Pi in a nifty little case. The router that powers our home network is in my partner’s office, with the Pi cluster nearby so that it can benefit from a fast stable wired Ethernet connection.
Rebuild From Scratch
Observant readers of this blog, refreshing every day desperate for new content, will have noticed that the last blog post - dated 2022-12-31 - actually went live in the middle of January. My k3s cluster, which had always been a bit rickety, finally gave up the ghost in late December, and two of the nodes needed to be fully reimaged before I could start it back up again.
Grafana Oncall
I’ve had several instability issues with my Kubernetes cluster recently, and so I wanted to install some monitoring to notify me of incipient issues. I’m already using Grafana dashboards to visualize the state of my cluster (using some of my own hand-crafted dashboards along with some pre-existing Kubernetes-specific ones), but that’s only useful if I happen to be looking at it at the time a problem is happening - it won’t warn me of a brewing problem (and, if the problem results in my VPN becoming unavailable while I’m away from home, that could result in complete disconnection).
Tag: politics
Code Review on Paper
A day or so ago, news broke that engineers at Twitter - newly-owned by Phony Stark - were being asked to “print out their last 30 to 60 days of code, so they could show it to Elon Musk himself”. We saw evidence of this from Twitter employees themselves:
A Dark Day for America
[Content Warning - politics, abortion, human rights]
Last Friday, SCOTUS officially handed down a previously-leaked decision overturning Roe vs. Wade, a legal decision ruling that the U.S. Constitution generally protects a pregnant person’s liberty to choose to have an abortion. Without this federal-level decision, the legality of abortion is decided on a state-by-state basis. Many Conservative states had “trigger” laws to ban abortion which immediately went into effect upon this decision; others are debating their response.
Tag: productivity
Weeknotes the Second: Month Notes
Well this has already been an interesting experiment. Only one week in, and I already feel more motivated and focused to work on personal projects and the goals that I’d set. Some of that might just be the ephemeral “New System Energy” that is plentiful when you start a new organizational system or habit, but what the hey; even if it’s fleeting, I’ll gladly ride it as far as I can!
Automatic Merging
When working on my personal projects, I typically just push straight to main
- opening a PR just to approve it seems entirely pointless, as if I had been able to find any issues in my own work, I wouldn’t wait to do it in a PR! However, this does mean that, if I forget to run any quality checkers (linters, tests, etc.), I won’t find out about it until on: push
GitHub Action runs, and even then I might not see the failure until several commits later.
2023 Wrap Up - Articles
Stand-outs among articles I read this year - abandoning the table layout from last year in favour of readability.
2022 Wrap Up
One of the first posts on this blog was a retrospective on my reading in 2021 - it seems only natural to do something similar this year.
Communication Urgency
Thesis statement: Most communication is less urgent than you think. Encoding urgency into messages as (meta)data is valuable - but building a healthy culture around and relationship with communication urgency is even more so.
Tag: programming-challenges
Zig Zig Zag, as Fast as You Can
In the spirit of one of my favourite books - Seven Languages In Seven Weeks - I’ve been working through this year’s Advent of Code in Zig, a “general-purpose programming language and toolchain for maintaining robust, optimal, and reusable software”1.
2023 Advent of Code
Just a quick note to record that, for the first time, I’m taking part Advent Of Code - a series of programming challenges that run every day from the 1st to the 25th of December. Inspired by my experiences during Exercism’s 12in23 challenge, I’ll be trying to complete the challenges in Rust (see my solutions here). That’s on top of trying to complete Exercism’s “December Diversions”, as well as 5 challenges in another language for the year-long badge to make up for the fact that January was unassigned (and keeping up my reading of Ward to remain on-track to finish by the end of the year). It’s going to be a busy month!
Tag: programming-language-design
Zig Zig Zag, as Fast as You Can
In the spirit of one of my favourite books - Seven Languages In Seven Weeks - I’ve been working through this year’s Advent of Code in Zig, a “general-purpose programming language and toolchain for maintaining robust, optimal, and reusable software”1.
Project Management and Async Functions
In my greatest display yet of over-engineering and procrastinating-with-tooling, I’ve started self-hosting OpenProject to track the tasks I want to carry out on my homelab (and their dependencies).
Tag: python
Conditional Cleanups in Pytest
A helpful pattern in testing is to take some cleanup action only if the test passes/fails. For instance, for a test which interacts with an on-filesystem database, the database should be deleted if the test passes, but it should stick around if the test fails so that the developer can examine it and debug.
Tag: reading
2024 Wrap Up Books
Continuing a trend started way back in the seventh post on this blog, a summary of the books that I read this year.
2023 Wrap Up - Books
Another End Of Year Wrap-up, focusing (as the previous installations did) initially on reading1.
2022 Wrap Up
One of the first posts on this blog was a retrospective on my reading in 2021 - it seems only natural to do something similar this year.
2021 in Books
My good friend George set himself a challenge a while back to read 52 books in a calendar year. He succeeded (as George is wont to do), and that achievement has always stuck in my mind as impressive1. I don’t think I’d ever be able to equal it (especially not now, with Work-From-Home removing my most common reading time - the commute), but I did start tracking my reading as a matter of interest. To that end, I present my year-of-reading-in-review, with book-by-book recaps and the full list at the end:
Tag: real-life
Code Review on Paper
A day or so ago, news broke that engineers at Twitter - newly-owned by Phony Stark - were being asked to “print out their last 30 to 60 days of code, so they could show it to Elon Musk himself”. We saw evidence of this from Twitter employees themselves:
A Dark Day for America
[Content Warning - politics, abortion, human rights]
Last Friday, SCOTUS officially handed down a previously-leaked decision overturning Roe vs. Wade, a legal decision ruling that the U.S. Constitution generally protects a pregnant person’s liberty to choose to have an abortion. Without this federal-level decision, the legality of abortion is decided on a state-by-state basis. Many Conservative states had “trigger” laws to ban abortion which immediately went into effect upon this decision; others are debating their response.
Tag: rust
2023 Advent of Code
Just a quick note to record that, for the first time, I’m taking part Advent Of Code - a series of programming challenges that run every day from the 1st to the 25th of December. Inspired by my experiences during Exercism’s 12in23 challenge, I’ll be trying to complete the challenges in Rust (see my solutions here). That’s on top of trying to complete Exercism’s “December Diversions”, as well as 5 challenges in another language for the year-long badge to make up for the fact that January was unassigned (and keeping up my reading of Ward to remain on-track to finish by the end of the year). It’s going to be a busy month!
Tag: sdlc
Base App Infrastructure
In my previous post, I had figured out how to inject Vault secrets into Kubernetes Secrets using the Vault Secrets Operator. My runthrough of the walkthrough worked, but I swiftly ran into namespacing issues when trying to use it “in production”.
Project Management and Async Functions
In my greatest display yet of over-engineering and procrastinating-with-tooling, I’ve started self-hosting OpenProject to track the tasks I want to carry out on my homelab (and their dependencies).
Backups and Updates and Dependencies and Resiliency
This post is going to be a bit of a meander. It starts with the description of a bug (and appropriate fix, in the hopes of helping a fellow unfortunate), continues on through a re-consideration of software engineering practice, and ends with a bit of pretentious terminological philosophy. Strap in, let’s go!
Automatic Merging
When working on my personal projects, I typically just push straight to main
- opening a PR just to approve it seems entirely pointless, as if I had been able to find any issues in my own work, I wouldn’t wait to do it in a PR! However, this does mean that, if I forget to run any quality checkers (linters, tests, etc.), I won’t find out about it until on: push
GitHub Action runs, and even then I might not see the failure until several commits later.
2023 Wrap Up - Articles
Stand-outs among articles I read this year - abandoning the table layout from last year in favour of readability.
Pre-Pipeline Verification, and the Push-And-Pray Problem
It’s fairly uncontroversial that, for a good service-deployment pipeline, there should be:
- at least one pre-production stage
- automated tests running on that stage
- a promotion blocker if those tests fail
The purpose of this testing is clear: it asserts ("verifies") certain correctness properties of the service version being deployed, such that any version which lacks those properties - which “is incorrect” - should not be deployed to customers. This allows promotion to be automated, reducing human toil and allowing developers to focus their efforts on development of new features rather than on confirmation of the correctness of new deployments.
CI/CD/CD, Oh My!
Since leaving Amazon ~4 months ago and dedicating more time to my own personal projects (and actually trying to ship things instead of getting distracted a few days in by the next shiny project!), I’ve learned a lot more about the Open Source tools that are available to software engineers; which, in turn, has highlighted a few areas of ignorance about CI/CD Pipelines. Emulating Julia Evans, I’m writing this blog both to help lead others who might have similar questions, and to rubber-duck my own process of answering the questions.
Tag: short-thoughts
Consistency in 2023
I’ve said previously that I don’t do New Years’ Resolutions. There are a couple of reasons for this: one is bloody-minded non-conformism1; the other, more defensible reason, is that studies show2 that aiming for “targets”, especially aggressive ones set without experience, tend to lead to failure and frustration. I do, however, often set “intentions” or “focuses” - not benchmarks that I want to hit, but areas that I want to intentionally spend more energy on in the coming year.
Tag: snippets
Work in a Post Scarcity Utopia
Another snippet from Iain M. Banks’ wonderful “Use Of Weapons”, detailing the adventures of the mercenary called Zakalwe within and around the interstellar post-scarcity AI-led super-high-tech Culture. Here, we see a flashback to his cultural adjustment period after being recruited.
Books as Vehicles
“The Liar”, Stephen Fry’s first novel follows a Wildean young man studying language at Cambridge University. I wonder where he got his inspiration.
Writing Poetry
Another quote from the experiences of Zakalwe, the career mercenary for the Culture.
Being a Seagull
Another Iain M. Banks quote - this one from “Use Of Weapons”. Herein, Zakalwe, a virtuoso career mercenary who has changed the course of civilizations with assassinations, kidnappings, and sabotages, muses on what it might be like to live a simpler life.
The Land of Infinite Fun
Another snippet of literature (following this one) that I think about regularly - this time, from Excession by the late great Iain M. Banks. The Culture Series describes an interstellar post-scarcity civilization, wherein most of the administration and governance is carried out by hyper-advanced AIs called Minds, and biological beings (who live on terraformed planets, on megastructures like Bishop Rings, or aboard planet-sized space-faring Ships) are free to pursue leisure and self-improvement. Basically, Fully Automated Luxury Gay Space Communism.
Treating People as Things
Less a blog post, and more “something I want to have a persistent addressable record of”. Terry Pratchett has many pearls of wisdom that bear remembering1 - this particular exchange takes place between Mightily Oats (a naïve well-intentioned religious missionary) and Granny Weatherwax (the tough embittered rustic crone-witch who will help anyone who needs it, but recognizes that “‘good’ ain’t the same as ’nice’”…)
(Future similar “posts” that are merely short quotations from literature will be similarly tagged with #snippets
)
Tag: tailscale
Jellyfin Over Tailscale
I know just enough about computer security to know that I don’t know enough about computer security, so I default to keeping my systems as closed-off from the outside world as possible. I use Cloudflare Tunnels for the few systems that I want to make externally available1 (like Gitea), and Tailscale to access “internal” services or ssh while on-the-go.
Tag: tech-snippets
Upsert in Postgres
A real quick blog post just to record a useful technique I just discovered that I’ll want to have a record for in the future - if inserting into a Postgres table, so long as you’re on >9.5
, you can upsert-and-overwrite with the following syntax:
Tag: testing
Conditional Cleanups in Pytest
A helpful pattern in testing is to take some cleanup action only if the test passes/fails. For instance, for a test which interacts with an on-filesystem database, the database should be deleted if the test passes, but it should stick around if the test fails so that the developer can examine it and debug.
Tag: transhumanism
The Land of Infinite Fun
Another snippet of literature (following this one) that I think about regularly - this time, from Excession by the late great Iain M. Banks. The Culture Series describes an interstellar post-scarcity civilization, wherein most of the administration and governance is carried out by hyper-advanced AIs called Minds, and biological beings (who live on terraformed planets, on megastructures like Bishop Rings, or aboard planet-sized space-faring Ships) are free to pursue leisure and self-improvement. Basically, Fully Automated Luxury Gay Space Communism.
Tag: vault
Auto Announce on Mastodon
I just set up a step in my publication pipeline to automatically post on Mastodon when I publish a new blog post.
Base App Infrastructure
In my previous post, I had figured out how to inject Vault secrets into Kubernetes Secrets using the Vault Secrets Operator. My runthrough of the walkthrough worked, but I swiftly ran into namespacing issues when trying to use it “in production”.
Vault Secrets Into K8s
Continuing my recent efforts to make authentication on my homelab cluster more “joined-up” and automated, this weekend I dug into linking Vault to Kubernetes so that pods could authenticate via shared secrets without me having to manually create the secrets in Kubernetes.
Tag: web3
Criticisms of Web3
I want to start this article by clarifying that I want web31, as commonly proposed, to succeed. The ideals that the web3 movement often espouses - transparency of web service logic, privacy and personal control of user data, anti-monopoly - are ones with which I resonate2. Unfortunately, there are several common questions that current projects seem unable to answer, leaving me skeptical that they will succeed.
The CrAbs Fallacy
First blog post in a long time. This was caused by combination of four things (most of which I hope to address in more detail in following blog posts):
- My home network starting misbehaving and I was focused more on fixing that than blogging (the first rule of homelabbing - whatever you mess with with, your living partners need to be able to access the Internet, and to work the lights and heating!
- I finally took the plunge in moving this blog from fully AWS-hosted to self-hosted (EDIT: blog post here).
- I got Laser Eye Surgery and was recovering from that (probably won’t be blogging about that, not much more to say!).
- I started writing a post to articulate my confusions or uncertainties about web3, with the intention of understanding it better.
Tag: weeknotes
Weeknotes the Third
I had intended to write this weeknotes on the amusing rabbit-hole of yak-shaving I’d fallen down:
Weeknotes the Second: Month Notes
Well this has already been an interesting experiment. Only one week in, and I already feel more motivated and focused to work on personal projects and the goals that I’d set. Some of that might just be the ephemeral “New System Energy” that is plentiful when you start a new organizational system or habit, but what the hey; even if it’s fleeting, I’ll gladly ride it as far as I can!
Weeknotes: The First
I’ve recently been struggling with a feeling of lack of tangible progress towards goals, or even of any idea of what those goals are or should be. Inspired both by GTD and by Simon Willison’s practice, I’ve decided to start writing “weeknotes” - records of what I’ve done each week, and what I’d like to focus on.
Tag: wordle
Cheating at Word Games: Part 2
This is a sequel to my previous post, where I laid out a Information Theoretical approach to algorithmically solving Wordle puzzles.
Cheating at Word Games
The other day, I saw the word game Wordle going around on my Twitter feed. The game prompts you to guess a 5-letter word in a Mastermind-like style - every letter in your guess is reported as being correct, as present (i.e. that letter occurs somewhere in the answer, but is misplaced), or as absent.
Tag: zig
Zig Zig Zag, as Fast as You Can
In the spirit of one of my favourite books - Seven Languages In Seven Weeks - I’ve been working through this year’s Advent of Code in Zig, a “general-purpose programming language and toolchain for maintaining robust, optimal, and reusable software”1.