diff options
24 files changed, 101 insertions, 2462 deletions
diff --git a/about/resources.md b/about/resources.md index 18b46173..8b91d218 100644 --- a/about/resources.md +++ b/about/resources.md @@ -35,105 +35,105 @@ You won't find any links on this site because, over time, the links will break. In random order: -* DNS and BIND; Cricket Liu; O'Reilly * The DevOps Handbook; Gene Kim, Jez Humble, Patrick Debois, John Willis; Audible -* 100 Go Mistakes and How to Avoid Them; Teiva Harsanyi; Manning Publications -* Go Brain Teasers - Exercise Your Mind; Miki Tebeka; The Pragmatic Programmers -* Leanring eBPF; Liz Rice; O'Reilly -* Ultimate Go Notebook; Bill Kennedy -* The KCNA (Kubernetes and Cloud Native Associate) Book; Nigel Poulton -* Pro Puppet; James Turnbull, Jeffrey McCune; Apress -* Think Raku (aka Think Perl 6); Laurent Rosenfeld, Allen B. Downey; O'Reilly * The Practise of System and Network Administration; Thomas A. Limoncelli, Christina J. Hogan, Strata R. Chalup; Addison-Wesley Professional Pro Git; Scott Chacon, Ben Straub; Apress -* Effective awk programming; Arnold Robbins; O'Reilly -* The Kubernetes Book; Nigel Poulton; Unabridged Audiobook +* The KCNA (Kubernetes and Cloud Native Associate) Book; Nigel Poulton +* Learn You Some Erlang for Great Good; Fred Herbert; No Starch Press +* Raku Fundamentals; Moritz Lenz; Apress +* Ultimate Go Notebook; Bill Kennedy +* Effective Java; Joshua Bloch; Addison-Wesley Professional +* Tmux 2: Productive Mouse-free Development; Brain P. Hogan; The Pragmatic Programmers +* Leanring eBPF; Liz Rice; O'Reilly +* Systemprogrammierung in Go; Frank Müller; dpunkt +* The Pragmatic Programmer; David Thomas; Addison-Wesley * Funktionale Programmierung; Peter Pepper; Springer -* Concurrency in Go; Katherine Cox-Buday; O'Reilly -* Higher Order Perl; Mark Dominus; Morgan Kaufmann -* Polished Ruby Programming; Jeremy Evans; Packt Publishing +* C++ Programming Language; Bjarne Stroustrup; +* 97 things every SRE should know; Emil Stolarsky, Jaime Woo; O'Reilly +* Perl New Features; Joshua McAdams, brian d foy; Perl School +* Hands-on Infrastructure Monitoring with Prometheus; Joel Bastos, Pedro Araujo; Packt +* The Docker Book; James Turnbull; Kindle * Raku Recipes; J.J. Merelo; Apress +* Kubernetes Cookbook; Sameer Naik, Sébastien Goasguen, Jonathan Michaux; O'Reilly +* Data Science at the Command Line; Jeroen Janssens; O'Reilly +* 100 Go Mistakes and How to Avoid Them; Teiva Harsanyi; Manning Publications * Site Reliability Engineering; How Google runs production systems; O'Reilly -* DevOps And Site Reliability Engineering Handbook; Stephen Fleming; Audible -* Systems Performance Tuning; Gian-Paolo D. Musumeci and others...; O'Reilly * Clusterbau mit Linux-HA; Michael Schwartzkopff; O'Reilly -* Java ist auch eine Insel; Christian Ullenboom; -* The Docker Book; James Turnbull; Kindle -* Systemprogrammierung in Go; Frank Müller; dpunkt -* Distributed Systems: Principles and Paradigms; Andrew S. Tanenbaum; Pearson -* Effective Java; Joshua Bloch; Addison-Wesley Professional +* Higher Order Perl; Mark Dominus; Morgan Kaufmann * Programming Ruby 3.3 (5th Edition); Noel Rappin, with Dave Thomas; The Pragmatic Bookshelf -* Object-Oriented Programming with ANSI-C; Axel-Tobias Schreiner -* Modern Perl; Chromatic ; Onyx Neon Press -* Data Science at the Command Line; Jeroen Janssens; O'Reilly +* Go Brain Teasers - Exercise Your Mind; Miki Tebeka; The Pragmatic Programmers +* Programming Perl aka "The Camel Book"; Tom Christiansen, brian d foy, Larry Wall & Jon Orwant; O'Reilly +* Distributed Systems: Principles and Paradigms; Andrew S. Tanenbaum; Pearson * The Go Programming Language; Alan A. A. Donovan; Addison-Wesley Professional -* 97 things every SRE should know; Emil Stolarsky, Jaime Woo; O'Reilly -* C++ Programming Language; Bjarne Stroustrup; -* Kubernetes Cookbook; Sameer Naik, Sébastien Goasguen, Jonathan Michaux; O'Reilly +* Developing Games in Java; David Brackeen and others...; New Riders +* Concurrency in Go; Katherine Cox-Buday; O'Reilly +* Effective awk programming; Arnold Robbins; O'Reilly * Terraform Cookbook; Mikael Krief; Packt Publishing -* Raku Fundamentals; Moritz Lenz; Apress +* Polished Ruby Programming; Jeremy Evans; Packt Publishing +* Pro Puppet; James Turnbull, Jeffrey McCune; Apress +* Amazon Web Services in Action; Michael Wittig and Andreas Wittig; Manning Publications * Learn You a Haskell for Great Good!; Miran Lipovaca; No Starch Press -* Perl New Features; Joshua McAdams, brian d foy; Perl School +* Systems Performance Tuning; Gian-Paolo D. Musumeci and others...; O'Reilly +* Object-Oriented Programming with ANSI-C; Axel-Tobias Schreiner +* Think Raku (aka Think Perl 6); Laurent Rosenfeld, Allen B. Downey; O'Reilly +* Modern Perl; Chromatic ; Onyx Neon Press +* The Kubernetes Book; Nigel Poulton; Unabridged Audiobook * 21st Century C: C Tips from the New School; Ben Klemens; O'Reilly -* Learn You Some Erlang for Great Good; Fred Herbert; No Starch Press -* Hands-on Infrastructure Monitoring with Prometheus; Joel Bastos, Pedro Araujo; Packt -* Programming Perl aka "The Camel Book"; Tom Christiansen, brian d foy, Larry Wall & Jon Orwant; O'Reilly -* Developing Games in Java; David Brackeen and others...; New Riders -* The Pragmatic Programmer; David Thomas; Addison-Wesley -* Tmux 2: Productive Mouse-free Development; Brain P. Hogan; The Pragmatic Programmers -* Amazon Web Services in Action; Michael Wittig and Andreas Wittig; Manning Publications +* Java ist auch eine Insel; Christian Ullenboom; +* DevOps And Site Reliability Engineering Handbook; Stephen Fleming; Audible +* DNS and BIND; Cricket Liu; O'Reilly ## Technical references I didn't read them from the beginning to the end, but I am using them to look up things. The books are in random order: -* BPF Performance Tools - Linux System and Application Observability, Brendan Gregg; Addison Wesley -* Implementing Service Level Objectives; Alex Hidalgo; O'Reilly +* Understanding the Linux Kernel; Daniel P. Bovet, Marco Cesati; O'Reilly * Go: Design Patterns for Real-World Projects; Mat Ryer; Packt -* Groovy Kurz & Gut; Joerg Staudemeier; O'Reilly * Algorithms; Robert Sedgewick, Kevin Wayne; Addison Wesley * Relayd and Httpd Mastery; Michael W Lucas -* Understanding the Linux Kernel; Daniel P. Bovet, Marco Cesati; O'Reilly +* Implementing Service Level Objectives; Alex Hidalgo; O'Reilly +* BPF Performance Tools - Linux System and Application Observability, Brendan Gregg; Addison Wesley * The Linux Programming Interface; Michael Kerrisk; No Starch Press +* Groovy Kurz & Gut; Joerg Staudemeier; O'Reilly ## Self-development and soft-skills books In random order: +* Influence without Authority; A. Cohen, D. Bradford; Wiley +* The Daily Stoic; Ryan Holiday, Stephen Hanselman; Profile Books +* Digital Minimalism; Cal Newport; Portofolio Penguin +* The Bullet Journal Method; Ryder Carroll; Fourth Estate +* Solve for Happy; Mo Gawdat (RE-READ 1ST TIME) +* The Phoenix Project - A Novel About IT, DevOps, and Helping your Business Win; Gene Kim and Kevin Behr; Trade Select * Getting Things Done; David Allen -* The 7 Habits Of Highly Effective People; Stephen R. Covey; Simon & Schuster UK +* The Obstacle Is The Way; Ryan Holiday; Profile Books Ltd +* Ultralearning; Anna Laurent; Self-published via Amazon +* Coders at Work - Reflections on the craft of programming, Peter Seibel and Mitchell Dorian et al., Audiobook +* Eat That Frog!; Brian Tracy; Hodder Paperbacks +* Meditation for Mortals, Oliver Burkeman, Audiobook * So Good They Can't Ignore You; Cal Newport; Business Plus -* Time Management for System Administrators; Thomas A. Limoncelli; O'Reilly +* Who Moved My Cheese?; Dr. Spencer Johnson; Vermilion +* Soft Skills; John Sommez; Manning Publications +* Psycho-Cybernetics; Maxwell Maltz; Perigee Books +* Eat That Frog; Brian Tracy * Buddah and Einstein walk into a Bar; Guy Joseph Ale, Claire Bloom; Blackstone Publishing +* Atomic Habits; James Clear; Random House Business +* Never Split the Difference; Chris Voss, Tahl Raz; Random House Business +* The Joy of Missing Out; Christina Crook; New Society Publishers +* The 7 Habits Of Highly Effective People; Stephen R. Covey; Simon & Schuster UK +* Time Management for System Administrators; Thomas A. Limoncelli; O'Reilly * The Off Switch; Mark Cropley; Virgin Books (RE-READ 1ST TIME) -* The Power of Now; Eckhard Tolle; Yellow Kite * Consciousness: A Very Short Introduction; Susan Blackmore; Oxford Uiversity Press -* The Obstacle Is The Way; Ryan Holiday; Profile Books Ltd -* Digital Minimalism; Cal Newport; Portofolio Penguin -* Soft Skills; John Sommez; Manning Publications +* Deep Work; Cal Newport; Piatkus * Staff Engineer: Leadership beyond the management track; Will Larson; Audiobook -* Eat That Frog; Brian Tracy -* Ultralearning; Anna Laurent; Self-published via Amazon -* The Daily Stoic; Ryan Holiday, Stephen Hanselman; Profile Books -* Eat That Frog!; Brian Tracy; Hodder Paperbacks -* Influence without Authority; A. Cohen, D. Bradford; Wiley +* 101 Essays that change the way you think; Brianna Wiest; Audiobook +* Search Inside Yourself - The Unexpected path to Achieving Success, Happiness (and World Peace); Chade-Meng Tan, Daniel Goleman, Jon Kabat-Zinn; HarperOne +* The Power of Now; Eckhard Tolle; Yellow Kite +* Slow Productivity; Cal Newport; Penguin Random House * Stop starting, start finishing; Arne Roock; Lean-Kanban University +* Ultralearning; Scott Young; Thorsons * The Complete Software Developer's Career Guide; John Sonmez; Unabridged Audiobook -* Meditation for Mortals, Oliver Burkeman, Audiobook -* Coders at Work - Reflections on the craft of programming, Peter Seibel and Mitchell Dorian et al., Audiobook * The Good Enough Job; Simone Stolzoff; Ebury Edge -* Psycho-Cybernetics; Maxwell Maltz; Perigee Books -* Slow Productivity; Cal Newport; Penguin Random House -* The Phoenix Project - A Novel About IT, DevOps, and Helping your Business Win; Gene Kim and Kevin Behr; Trade Select -* Ultralearning; Scott Young; Thorsons -* Search Inside Yourself - The Unexpected path to Achieving Success, Happiness (and World Peace); Chade-Meng Tan, Daniel Goleman, Jon Kabat-Zinn; HarperOne -* Solve for Happy; Mo Gawdat (RE-READ 1ST TIME) -* Who Moved My Cheese?; Dr. Spencer Johnson; Vermilion -* The Joy of Missing Out; Christina Crook; New Society Publishers -* Never Split the Difference; Chris Voss, Tahl Raz; Random House Business -* 101 Essays that change the way you think; Brianna Wiest; Audiobook -* The Bullet Journal Method; Ryder Carroll; Fourth Estate -* Deep Work; Cal Newport; Piatkus -* Atomic Habits; James Clear; Random House Business [Here are notes of mine for some of the books](../notes/index.md) @@ -141,30 +141,30 @@ In random order: Some of these were in-person with exams; others were online learning lectures only. In random order: -* Structure and Interpretation of Computer Programs; Harold Abelson and more...; -* The Well-Grounded Rubyist Video Edition; David. A. Black; O'Reilly Online +* Ultimate Go Programming; Bill Kennedy; O'Reilly Online * Functional programming lecture; Remote University of Hagen -* AWS Immersion Day; Amazon; 1-day interactive online training -* Developing IaC with Terraform (with Live Lessons); O'Reilly Online -* Protocol buffers; O'Reilly Online +* F5 Loadbalancers Training; 2-day on-site training; F5, Inc. * Red Hat Certified System Administrator; Course + certification (Although I had the option, I decided not to take the next course as it is more effective to self learn what I need) +* Scripting Vim; Damian Conway; O'Reilly Online * Apache Tomcat Best Practises; 3-day on-site training +* The Ultimate Kubernetes Bootcamp; School of Devops; O'Reilly Online +* AWS Immersion Day; Amazon; 1-day interactive online training * Linux Security and Isolation APIs Training; Michael Kerrisk; 3-day on-site training * Cloud Operations on AWS - Learn how to configure, deploy, maintain, and troubleshoot your AWS environments; 3-day online live training with labs; Amazon -* Scripting Vim; Damian Conway; O'Reilly Online * MySQL Deep Dive Workshop; 2-day on-site training -* Ultimate Go Programming; Bill Kennedy; O'Reilly Online +* The Well-Grounded Rubyist Video Edition; David. A. Black; O'Reilly Online +* Developing IaC with Terraform (with Live Lessons); O'Reilly Online +* Protocol buffers; O'Reilly Online * Algorithms Video Lectures; Robert Sedgewick; O'Reilly Online -* The Ultimate Kubernetes Bootcamp; School of Devops; O'Reilly Online -* F5 Loadbalancers Training; 2-day on-site training; F5, Inc. +* Structure and Interpretation of Computer Programs; Harold Abelson and more...; ## Technical guides These are not whole books, but guides (smaller or larger) which I found very useful. in random order: -* Advanced Bash-Scripting Guide -* How CPUs work at https://cpu.land * Raku Guide at https://raku.guide +* How CPUs work at https://cpu.land +* Advanced Bash-Scripting Guide ## Podcasts @@ -172,57 +172,57 @@ These are not whole books, but guides (smaller or larger) which I found very use In random order: +* The Changelog Podcast(s) +* Fork Around And Find Out +* Dev Interrupted +* Backend Banter * Pratical AI * Modern Mentor -* The ProdCast (Google SRE Podcast) +* BSD Now [BSD] * Hidden Brain * Cup o' Go [Golang] -* Deep Questions with Cal Newport -* The Changelog Podcast(s) -* BSD Now [BSD] -* Dev Interrupted -* The Pragmatic Engineer Podcast -* Backend Banter * Fallthrough [Golang] -* Fork Around And Find Out +* The Pragmatic Engineer Podcast +* The ProdCast (Google SRE Podcast) * Maintainable +* Deep Questions with Cal Newport ### Podcasts I liked I liked them but am not listening to them anymore. The podcasts have either "finished" (no more episodes) or I stopped listening to them due to time constraints or a shift in my interests. -* Modern Mentor -* Java Pub House -* Ship It (predecessor of Fork Around And Find Out) * Go Time (predecessor of fallthrough) +* Java Pub House * CRE: Chaosradio Express [german] +* Modern Mentor * FLOSS weekly +* Ship It (predecessor of Fork Around And Find Out) ## Newsletters I like This is a mix of tech and non-tech newsletters I am subscribed to. In random order: -* Golang Weekly -* The Valuable Dev -* Applied Go Weekly Newsletter -* The Pragmatic Engineer -* Ruby Weekly -* Register Spill +* The Imperfectionist * Andreas Brandhorst Newsletter (Sci-Fi author) -* VK Newsletter -* byteSizeGo +* Register Spill * Monospace Mentor -* The Imperfectionist +* Golang Weekly +* byteSizeGo +* Ruby Weekly * Changelog News +* VK Newsletter +* The Pragmatic Engineer +* The Valuable Dev +* Applied Go Weekly Newsletter ## Magazines I like(d) This is a mix of tech I like(d). I may not be a current subscriber, but now and then, I buy an issue. In random order: -* Linux User -* Linux Magazine * freeX (not published anymore) * LWN (online only) +* Linux Magazine +* Linux User # Formal education diff --git a/gemfeed/2024-05-03-projects-i-currently-dont-have-time-for.md b/gemfeed/2024-05-03-projects-i-currently-dont-have-time-for.md index e71adedf..8badb762 100644 --- a/gemfeed/2024-05-03-projects-i-currently-dont-have-time-for.md +++ b/gemfeed/2024-05-03-projects-i-currently-dont-have-time-for.md @@ -217,225 +217,6 @@ I am abandoning this project because my workplace has stopped the annual pet pro I value privacy. It would be great to run my own Matrix server for communication within my family. I have yet to have time to look into this more closely. -# Projects I currently don't have time for - -> Published at 2024-05-03T16:23:03+03:00 - -Over the years, I have collected many ideas for my personal projects and noted them down. I am currently in the process of cleaning up all my notes and reviewing those ideas. I don’t have time for the ones listed here and won’t have any soon due to other commitments and personal projects. So, in order to "get rid of them" from my notes folder, I decided to simply put them in this blog post so that those ideas don't get lost. Maybe I will pick up one or another idea someday in the future, but for now, they are all put on ice in favor of other personal projects or family time. - -``` -Art by Laura Brown - -.'`~~~~~~~~~~~`'. -( .'11 12 1'. ) -| :10 \ 2: | -| :9 @-> 3: | -| :8 4; | -'. '..7 6 5..' .' - ~-------------~ ldb - -``` - -## Table of Contents - -* [⇢ Projects I currently don't have time for](#projects-i-currently-don-t-have-time-for) -* [⇢ ⇢ Hardware projects I don't have time for](#hardware-projects-i-don-t-have-time-for) -* [⇢ ⇢ ⇢ I use Arch, btw!](#i-use-arch-btw) -* [⇢ ⇢ ⇢ OpenBSD home router](#openbsd-home-router) -* [⇢ ⇢ ⇢ Pi-Hole server](#pi-hole-server) -* [⇢ ⇢ ⇢ Infodash](#infodash) -* [⇢ ⇢ ⇢ Reading station](#reading-station) -* [⇢ ⇢ ⇢ Retro station](#retro-station) -* [⇢ ⇢ ⇢ Sound server](#sound-server) -* [⇢ ⇢ ⇢ Project Freekat](#project-freekat) -* [⇢ ⇢ Programming projects I don't have time for](#programming-projects-i-don-t-have-time-for) -* [⇢ ⇢ ⇢ CLI-HIVE](#cli-hive) -* [⇢ ⇢ ⇢ Enhanced KISS home photo albums](#enhanced-kiss-home-photo-albums) -* [⇢ ⇢ ⇢ KISS file sync server with end-to-end encryption](#kiss-file-sync-server-with-end-to-end-encryption) -* [⇢ ⇢ ⇢ A language that compiles to `bash`](#a-language-that-compiles-to-bash) -* [⇢ ⇢ ⇢ A language that compiles to `sed`](#a-language-that-compiles-to-sed) -* [⇢ ⇢ ⇢ Renovate VS-Sim](#renovate-vs-sim) -* [⇢ ⇢ ⇢ KISS ticketing system](#kiss-ticketing-system) -* [⇢ ⇢ ⇢ A domain-specific language (DSL) for work](#a-domain-specific-language-dsl-for-work) -* [⇢ ⇢ Self-hosting projects I don't have time for](#self-hosting-projects-i-don-t-have-time-for) -* [⇢ ⇢ ⇢ My own Matrix server](#my-own-matrix-server) -* [⇢ ⇢ ⇢ Ampache music server](#ampache-music-server) -* [⇢ ⇢ ⇢ Librum eBook reader](#librum-ebook-reader) -* [⇢ ⇢ ⇢ Memos - Note-taking service](#memos---note-taking-service) -* [⇢ ⇢ ⇢ Bepasty server](#bepasty-server) -* [⇢ ⇢ Books I don't have time to read](#books-i-don-t-have-time-to-read) -* [⇢ ⇢ ⇢ Fluent Python](#fluent-python) -* [⇢ ⇢ ⇢ Programming Ruby](#programming-ruby) -* [⇢ ⇢ ⇢ Peter F. Hamilton science fiction books](#peter-f-hamilton-science-fiction-books) -* [⇢ ⇢ New websites I don't have time for](#new-websites-i-don-t-have-time-for) -* [⇢ ⇢ ⇢ Create a "Why Raku Rox" site](#create-a-why-raku-rox-site) -* [⇢ ⇢ Research projects I don't have time for](#research-projects-i-don-t-have-time-for) -* [⇢ ⇢ ⇢ Project secure](#project-secure) -* [⇢ ⇢ ⇢ CPU utilisation is all wrong](#cpu-utilisation-is-all-wrong) - -## Hardware projects I don't have time for - -### I use Arch, btw! - -The idea was to build the ultimate Arch Linux setup on an old ThinkPad X200 booting with the open-source LibreBoot firmware, complete with a tiling window manager, dmenu, and all the elite tools. This is mainly for fun, as I am pretty happy (and productive) with my Fedora Linux setup. I ran EndeavourOS (close enough to Arch) on an old ThinkPad for a while, but then I switched back to Fedora because the rolling releases were annoying (there were too many updates). - -### OpenBSD home router - -In my student days, I operated a 486DX PC with OpenBSD as my home DSL internet router. I bought the setup from my brother back then. The router's hostname was `fishbone`, and it performed very well until it became too slow for larger broadband bandwidth after a few years of use. - -I had the idea to revive this concept, implement `fishbone2`, and place it in front of my proprietary ISP router to add an extra layer of security and control in my home LAN. It would serve as the default gateway for all of my devices, including a Wi-Fi access point, would run a DNS server, Pi-hole proxy, VPN client, and DynDNS client. I would also implement high availability using OpenBSD's CARP protocol. - -[https://openbsdrouterguide.net](https://openbsdrouterguide.net) -[https://pi-hole.net/](https://pi-hole.net/) -[https://www.OpenBSD.org](https://www.OpenBSD.org) -[https://www.OpenBSD.org/faq/pf/carp.html](https://www.OpenBSD.org/faq/pf/carp.html) - -However, I am putting this on hold as I have opted for an OpenWRT-based solution, which was much quicker to set up and runs well enough. - -[https://OpenWRT.org/](https://OpenWRT.org/) - -### Pi-Hole server - -Install Pi-hole on one of my Pis or run it in a container on Freekat. For now, I am putting this on hold as the primary use for this would be ad-blocking, and I am avoiding surfing ad-heavy sites anyway. So there's no significant use for me personally at the moment. - -[https://pi-hole.net/](https://pi-hole.net/) - -### Infodash - -The idea was to implement my smart info screen using purely open-source software. It would display information such as the health status of my personal infrastructure, my current work tracker balance (I track how much I work to prevent overworking), and my sports balance (I track my workouts to stay within my quotas for general health). The information would be displayed on a small screen in my home office, on my Pine watch, or remotely from any terminal window. - -I don't have this, and I haven't missed having it, so I guess it would have been nice to have it but not provide any value other than the "fun of tinkering." - -### Reading station - -I wanted to create the most comfortable setup possible for reading digital notes, articles, and books. This would include a comfy armchair, a silent barebone PC or Raspberry Pi computer running either Linux or *BSD, and an e-Ink display mounted on a flexible arm/stand. There would also be a small table for my paper journal for occasional note-taking. There are a bunch of open-source software available for PDF and ePub reading. It would have been neat, but I am currently using the most straightforward solution: a Kobo Elipsa 2E, which I can use on my sofa. - -### Retro station - -I had an idea to build a computer infused with retro elements. It wouldn't use actual retro hardware but would look and feel like a retro machine. I would call this machine HAL or Retron. - -I would use an old ThinkPad laptop placed on a horizontal stand, running NetBSD, and attaching a keyboard from ModelFkeyboards. I use WindowMaker as a window manager and run terminal applications through Retro Term. For the monitor, I would use an older (black) EIZO model with large bezels. - -[https://www.NetBSD.org](https://www.NetBSD.org) -[https://www.modelfkeyboards.com](https://www.modelfkeyboards.com) -[https://github.com/Swordfish90/cool-retro-term)](https://github.com/Swordfish90/cool-retro-term)) - -The computer would occasionally be used to surf the Gemini space, take notes, blog, or do light coding. However, I have abandoned the project for now because there isn't enough space in my apartment, as my daughter will have a room for herself. - -### Sound server - -My idea involved using a barebone mini PC running FreeBSD with the Navidrome sound server software. I could remotely connect to it from my phone, workstation/laptop to listen to my music collection. The storage would be based on ZFS with at least two drives for redundancy. The app would run in a Linux Docker container under FreeBSD via Bhyve. - -[https://github.com/navidrome/navidrome](https://github.com/navidrome/navidrome) -[https://wiki.freebsd.org/bhyve](https://wiki.freebsd.org/bhyve) - -### Project Freekat - -My idea involved purchasing the Meerkat mini PC from System76 and installing FreeBSD. Like the sound-server idea (see previous idea), it would run Linux Docker through Bhyve. I would self-host a bunch of applications on it: - -* Wallabag -* Ankidroid -* Miniflux & Postgres -* Audiobookshelf -* ... - -All of this would be within my LAN, but the services would also be accessible from the internet through either Wireguard or SSH reverse tunnels to one of my OpenBSD VMs, for example: - -* `wallabag.awesome.buetow.org` -* `ankidroid.awesome.buetow.org` -* `miniflux.awesome.buetow.org` -* `audiobookshelf.awesome.buetow.org` -* ... - -I am abandoning this project for now, as I am currently hosting my apps on AWS ECS Fargate under `*.cool.buetow.org`, which is "good enough" for the time being and also offers the benefit of learning to use AWS and Terraform, knowledge that can be applied at work. - -[My personal AWS setup](./2024-02-04-from-babylon5.buetow.org-to-.cloud.md) - -## Programming projects I don't have time for - -### CLI-HIVE - -This was a pet project idea that my brother and I had. The concept was to collect all shell history of all servers at work in a central place, apply ML/AI, and return suggestions for commands to type or allow a fuzzy search on all the commands in the history. The recommendations for the commands on a server could be context-based (e.g., past occurrences on the same server type). - -You could decide whether to share your command history with others so they would receive better suggestions depending on which server they are on, or you could keep all the history private and secure. The plan was to add hooks into zsh and bash shells so that all commands typed would be pushed to the central location for data mining. - -### Enhanced KISS home photo albums - -I don't use third-party cloud providers such as Google Photos to store/archive my photos. Instead, they are all on a ZFS volume on my home NAS, with regular offsite backups taken. Thus, my project would involve implementing the features I miss most or finding a solution simple enough to host on my LAN: - -* A feature I miss presents me with a random day from the past and some photos from that day. This project would randomly select a day and generate a photo album for me to view and reminisce about memories. -* Another feature I miss is the ability to automatically deduplicate all the photos, as I am sure there are tons of duplicates on my NAS. -* Auto-enhancing the photos (perhaps using ImageMagick?) -* I already have a simple `photoalbum.sh` script that generates an album based on an input directory. However, it would be great also to have a timeline feature to enable browsing through different dates. - -[KISS static web photo albums with `photoalbum.sh`](./2023-10-29-kiss-static-web-photo-albums-with-photoalbum.sh.md) - -### KISS file sync server with end-to-end encryption - -I aimed to have a simple server to which I could sync notes and other documents, ensuring that the data is fully end-to-end encrypted. This way, only the clients could decrypt the data, while an encrypted copy of all the data would be stored on the server side. There are a few solutions (e.g., NextCloud), but they are bloated or complex to set up. - -I currently use Syncthing for encrypted file sync across all my devices; however, the data is not end-to-end encrypted. It's a good-enough setup, though, as my Syncthing server is in my home LAN on an encrypted file system. - -[https://syncthing.net](https://syncthing.net) - -I also had the idea of using this as a pet project for work and naming it `Cryptolake`, utilizing post-quantum-safe encryption algorithms and a distributed data store. - -### A language that compiles to `bash` - -I had an idea to implement a higher-level language with strong typing that could be compiled into native Bash code. This would make all resulting Bash scripts more robust and secure by default. The project would involve developing a parser, lexer, and a Bash code generator. I planned to implement this in Go. - -I had previously implemented a tiny scripting language called Fype (For Your Program Execution), which could have served as inspiration. - -[The Fype Programming Language](./2010-05-09-the-fype-programming-language.md) - -### A language that compiles to `sed` - -This is similar to the previous idea, but the difference is that the language would compile into a sed script. Sed has many features, but the brief syntax makes scripts challenging to read. The higher-level language would mimic sed but in a form that is easier for humans to read. - -### Renovate VS-Sim - -VS-Sim is an open-source simulator programmed in Java for distributed systems. VS-Sim stands for "Verteilte Systeme Simulator," the German translation for "Distributed Systems Simulator." The VS-Sim project was my diploma thesis at Aachen University of Applied Sciences. - -[https://codeberg.org/snonux/vs-sim](https://codeberg.org/snonux/vs-sim) - -The ideas I had was: - -* Translate the project into English. -* Modernise the Java codebase to be compatible with the latest JDK. -* Make it compile to native binaries using GraalVM. -* Distribute the project using AppImages. - -I have put this project on hold for now, as I want to do more things in Go and fewer in Java in my personal time. - -### KISS ticketing system - -My idea was to program a KISS (Keep It Simple, Stupid) ticketing system for my personal use. However, I am abandoning this project because I now use the excellent Taskwarrior software. You can learn more about it at: - -[https://taskwarrior.org/](https://taskwarrior.org/) - -### A domain-specific language (DSL) for work - -At work, an internal service allocates storage space for our customers on our storage clusters. It automates many tasks, but many tweaks are accessible through APIs. I had the idea to implement a Ruby-based DSL that would make using all those APIs for ad-hoc changes effortless, e.g.: - -```ruby -Cluster :UK, :uk01 do - Customer.C1A1.segments.volumes.each do |volume| - puts volume.usage_stats - volume.move_off! if volume.over_subscribed? - end -end -``` - -I am abandoning this project because my workplace has stopped the annual pet project competition, and I have other more important projects to work on at the moment. - -[Creative universe (Work pet project contests)](./2022-04-10-creative-universe.md) - -## Self-hosting projects I don't have time for - -### My own Matrix server - -I value privacy. It would be great to run my own Matrix server for communication within my family. I have yet to have time to look into this more closely. - [https://matrix.org](https://matrix.org) ### Ampache music server diff --git a/gemfeed/2024-12-03-f3s-kubernetes-with-freebsd-part-2.md b/gemfeed/2024-12-03-f3s-kubernetes-with-freebsd-part-2.md index afd68911..1cc803ed 100644 --- a/gemfeed/2024-12-03-f3s-kubernetes-with-freebsd-part-2.md +++ b/gemfeed/2024-12-03-f3s-kubernetes-with-freebsd-part-2.md @@ -224,232 +224,6 @@ NewRec 0 days, 00:07:33 | since Mon Dec 2 12:21:44 2024 ``` This is how I track the uptimes for all of my host: -# f3s: Kubernetes with FreeBSD - Part 2: Hardware and base installation - -> Published at 2024-12-02T23:48:21+02:00 - -This is the second blog post about my f3s series for my self-hosting demands in my home lab. f3s? The "f" stands for FreeBSD, and the "3s" stands for k3s, the Kubernetes distribution I will use on FreeBSD-based physical machines. - -We set the stage last time; this time, we will set up the hardware for this project. - -These are all the posts so far: - -[2024-11-17 f3s: Kubernetes with FreeBSD - Part 1: Setting the stage](./2024-11-17-f3s-kubernetes-with-freebsd-part-1.md) -[2024-12-03 f3s: Kubernetes with FreeBSD - Part 2: Hardware and base installation (You are currently reading this)](./2024-12-03-f3s-kubernetes-with-freebsd-part-2.md) -[2025-02-01 f3s: Kubernetes with FreeBSD - Part 3: Protecting from power cuts](./2025-02-01-f3s-kubernetes-with-freebsd-part-3.md) -[2025-04-05 f3s: Kubernetes with FreeBSD - Part 4: Rocky Linux Bhyve VMs](./2025-04-05-f3s-kubernetes-with-freebsd-part-4.md) -[2025-05-11 f3s: Kubernetes with FreeBSD - Part 5: WireGuard mesh network](./2025-05-11-f3s-kubernetes-with-freebsd-part-5.md) -[2025-07-14 f3s: Kubernetes with FreeBSD - Part 6: Storage](./2025-07-14-f3s-kubernetes-with-freebsd-part-6.md) - -[](./f3s-kubernetes-with-freebsd-part-1/f3slogo.png) - -> ChatGPT generated logo.. - -Let's continue... - -## Table of Contents - -* [⇢ f3s: Kubernetes with FreeBSD - Part 2: Hardware and base installation](#f3s-kubernetes-with-freebsd---part-2-hardware-and-base-installation) -* [⇢ Deciding on the hardware](#deciding-on-the-hardware) -* [⇢ ⇢ Not ARM but Intel N100 ](#not-arm-but-intel-n100-) -* [⇢ ⇢ Beelink unboxing](#beelink-unboxing) -* [⇢ ⇢ Network switch](#network-switch) -* [⇢ Installing FreeBSD](#installing-freebsd) -* [⇢ ⇢ Base install](#base-install) -* [⇢ ⇢ Latest patch level and customizing `/etc/hosts`](#latest-patch-level-and-customizing-etchosts) -* [⇢ ⇢ After install](#after-install) -* [⇢ ⇢ ⇢ Helix editor](#helix-editor) -* [⇢ ⇢ ⇢ `doas`](#doas) -* [⇢ ⇢ ⇢ Periodic ZFS snapshotting](#periodic-zfs-snapshotting) -* [⇢ ⇢ ⇢ Uptime tracking](#uptime-tracking) -* [⇢ Hardware check](#hardware-check) -* [⇢ ⇢ Ethernet](#ethernet) -* [⇢ ⇢ RAM](#ram) -* [⇢ ⇢ CPUs](#cpus) -* [⇢ ⇢ CPU throttling](#cpu-throttling) -* [⇢ Conclusion](#conclusion) - -# Deciding on the hardware - -Note that the OpenBSD VMs included in the f3s setup (which will be used later in this blog series for internet ingress - as you know from the first part of this blog series) are already there. These are virtual machines that I rent at OpenBSD Amsterdam and Hetzner. - -[https://openbsd.amsterdam](https://openbsd.amsterdam) -[https://hetzner.cloud](https://hetzner.cloud) - -This means that the FreeBSD boxes need to be covered, which will later be running k3s in Linux VMs via bhyve hypervisor. - -I've been considering whether to use Raspberry Pis or look for alternatives. It turns out that complete N100-based mini-computers aren't much more expensive than Raspberry Pi 5s, and they don't require assembly. Furthermore, I like that they are AMD64 and not ARM-based, which increases compatibility with some applications (e.g., I might want to virtualize Windows (via bhyve) on one of those, though that's out of scope for this blog series). - -## Not ARM but Intel N100 - -I needed something compact, efficient, and capable enough to handle the demands of a small-scale Kubernetes cluster and preferably something I don't have to assemble a lot. After researching, I decided on the Beelink S12 Pro with Intel N100 CPUs. - -[Beelink Mini S12 Pro N100 official page](https://www.bee-link.com/products/beelink-mini-s12-pro-n100) - -The Intel N100 CPUs are built on the "Alder Lake-N" architecture. These chips are designed to balance performance and energy efficiency well. With four cores, they're more than capable of running multiple containers, even with moderate workloads. Plus, they consume only around 8W of power (ok, that's more than the Pis...), keeping the electricity bill low enough and the setup quiet - perfect for 24/7 operation. - -[](./f3s-kubernetes-with-freebsd-part-2/f3s-collage1.jpg) - -The Beelink comes with the following specs: - -* 12th Gen Intel N100 processor, with four cores and four threads, and a maximum frequency of up to 3.4 GHz. -* 16 GB of DDR4 RAM, with a maximum (official) size of 16 GB (but people could install 32 GB on it). -* 500 GB M.2 SSD, with the option to install a 2nd 2.5 SSD drive (which I want to make use of later in this blog series). -* GBit ethernet -* Four USB 3.2 Gen2 ports (maybe I want to mount something externally at some point) -* Dimensions and weight: 115*102*39mm, 280g -* Silent cooling system. -* HDMI output (needed only for the initial installation and maybe for troubleshooting later) -* Auto power on via WoL (may make use of it) -* Wi-Fi (not going to use it) - -I bought three (3) of them for the cluster I intend to build. - -## Beelink unboxing - -Unboxing was uneventful. Every Beelink PC came with: - -* An AC power adapter -* An HDMI cable -* A VESA mount with screws (not using it as of now) -* Some manuals -* The pre-assembled Beelink PC itself. -* A "Hello" post card (??) - -Overall, I love the small form factor. - -## Network switch - -I went with the tp-link mini 5-port switch, as I had a spare one available. That switch will be plugged into my wall ethernet port, which connects directly to my fiber internet router with 100 Mbit/s down and 50 Mbit/s upload speed. - -[](./f3s-kubernetes-with-freebsd-part-2/switch.jpg) - -# Installing FreeBSD - -## Base install - -First, I downloaded the boot-only ISO of the latest FreeBSD release and dumped it on a USB stick via my Fedora laptop: - -```sh -[paul@earth]~/Downloads% sudo dd \ - if=FreeBSD-14.1-RELEASE-amd64-bootonly.iso \ - of=/dev/sda conv=sync -``` - -Next, I plugged the Beelinks (one after another) into my monitor via HDMI (the resolution of the FreeBSD text console seems strangely stretched, as I am using the LG Dual Up monitor), connected Ethernet, an external USB keyboard, and the FreeBSD USB stick, and booted the devices up. With F7, I entered the boot menu and selected the USB stick for the FreeBSD installation. - -The installation was uneventful. I selected: - -* Guided ZFS on root (pool `zroot`) -* Unencrypted ZFS (I will encrypt separate datasets later; I want it to be able to boot without manual interaction) -* Static IP configuration (to ensure that the boxes always have the same IPs, even after switching the router/DHCP server) -* I decided to enable the SSH daemon, NTP server, and NTP time synchronization at boot, and I also enabled `powerd` for automatic CPU frequency scaling. -* In addition to `root,` I added a personal user, `paul,` whom I placed in the `wheel` group. - -After doing all that three times (once for each Beelink PC), I had three ready-to-use FreeBSD boxes! Their hostnames are `f0`, `f1` and `f2`! - -[](./f3s-kubernetes-with-freebsd-part-2/f3s-collage2.jpg) - -## Latest patch level and customizing `/etc/hosts` - -After the first boot, I upgraded to the latest FreeBSD patch level as follows: - -```sh -root@f0:~ # freebsd-update fetch -root@f0:~ # freebsd-update install -root@f0:~ # freebsd-update reboot -``` - -I also added the following entries for the three FreeBSD boxes to the `/etc/hosts` file: - -```sh -root@f0:~ # cat <<END >>/etc/hosts -192.168.1.130 f0 f0.lan f0.lan.buetow.org -192.168.1.131 f1 f1.lan f1.lan.buetow.org -192.168.1.132 f2 f2.lan f2.lan.buetow.org -END -``` - -You might wonder why bother using the hosts file? Why not use DNS properly? The reason is simplicity. I don't manage 100 hosts, only a few here and there. Having an OpenWRT router in my home, I could also configure everything there, but maybe I'll do that later. For now, keep it simple and straightforward. - -## After install - -After that, I installed the following additional packages: - -```sh -root@f0:~ # pkg install helix doas zfs-periodic uptimed -``` - -### Helix editor - -Helix? It's my favourite text editor. I have nothing against `vi` but like `hx` (Helix) more! - -[https://helix-editor.com/](https://helix-editor.com/) - -### `doas` - -`doas`? It's a pretty neat (and KISS) replacement for `sudo`. It has far fewer features than `sudo`, which is supposed to make it more secure. Its origin is the OpenBSD project. For `doas`, I accepted the default configuration (where users in the `wheel` group are allowed to run commands as `root`): - -```sh -root@f0:~ # cp /usr/local/etc/doas.conf.sample /usr/local/etc/doas.conf -``` - -[https://man.openbsd.org/doas](https://man.openbsd.org/doas) - -### Periodic ZFS snapshotting - -`zfs-periodic` is a nifty tool for automatically creating ZFS snapshots. I decided to go with the following configuration here: - -```sh -root@f0:~ # cat <<END >>/etc/periodic.conf -daily_zfs_snapshot_enable="YES" -daily_zfs_snapshot_pools="zroot,zdata" -daily_zfs_snapshot_keep="7" -weekly_zfs_snapshot_enable="YES" -weekly_zfs_snapshot_pools="zroot,zdata" -weekly_zfs_snapshot_keep="5" -monthly_zfs_snapshot_enable="YES" -monthly_zfs_snapshot_pools="zroot,zdata" -monthly_zfs_snapshot_keep="6" -END -``` - -[https://github.com/ross/zfs-periodic](https://github.com/ross/zfs-periodic) - -Note: We have also added `zdata` to the list of snapshot pools. Currently, this pool does not exist yet, but it will be created later in this blog series. - -### Uptime tracking - -`uptimed`? I like to track my uptimes. This is how I configured the daemon: - -```sh -root@f0:~ # cp /usr/local/mimecast/etc/uptimed.conf-dist \ - /usr/local/mimecast/etc/uptimed.conf -root@f0:~ # hx /usr/local/mimecast/etc/uptimed.conf -``` - -In the Helix editor session, I changed `LOG_MAXIMUM_ENTRIES` to `0` to keep all uptime entries forever and not cut off at 50 (the default config). After that, I enabled and started `uptimed`: - -```sh -root@f0:~ # service uptimed enable -root@f0:~ # service uptimed start -``` - -To check the current uptime stats, I can now run `uprecords`: - -```sh - root@f0:~ # uprecords - # Uptime | System Boot up -----------------------------+--------------------------------------------------- --> 1 0 days, 00:07:34 | FreeBSD 14.1-RELEASE Mon Dec 2 12:21:44 2024 -----------------------------+--------------------------------------------------- -NewRec 0 days, 00:07:33 | since Mon Dec 2 12:21:44 2024 - up 0 days, 00:07:34 | since Mon Dec 2 12:21:44 2024 - down 0 days, 00:00:00 | since Mon Dec 2 12:21:44 2024 - %up 100.000 | since Mon Dec 2 12:21:44 2024 -``` - -This is how I track the uptimes for all of my host: [Unveiling `guprecords.raku`: Global Uptime Records with Raku-](./2023-05-01-unveiling-guprecords:-uptime-records-with-raku.md) [https://github.com/rpodgorny/uptimed](https://github.com/rpodgorny/uptimed) diff --git a/gemfeed/2025-01-01-posts-from-october-to-december-2024.md b/gemfeed/2025-01-01-posts-from-october-to-december-2024.md index f9ea7bd7..a44041ee 100644 --- a/gemfeed/2025-01-01-posts-from-october-to-december-2024.md +++ b/gemfeed/2025-01-01-posts-from-october-to-december-2024.md @@ -58,66 +58,6 @@ These are from Mastodon and LinkedIn. Have a look at my about page for my social * [⇢ ⇢ ⇢ Excellent article about your dream Product ...](#excellent-article-about-your-dream-product-) * [⇢ ⇢ ⇢ I just finished reading all chapters of CPU ...](#i-just-finished-reading-all-chapters-of-cpu-) * [⇢ ⇢ ⇢ Indeed, useful to know this stuff! `#sre` ...](#indeed-useful-to-know-this-stuff-sre-) -* # Posts from October to December 2024 - -> Published at 2024-12-31T18:09:58+02:00 - -Happy new year! - -These are my social media posts from the last three months. I keep them here to reflect on them and also to not lose them. Social media networks come and go and are not under my control, but my domain is here to stay. - -These are from Mastodon and LinkedIn. Have a look at my about page for my social media profiles. This list is generated with Gos, my social media platform sharing tool. - -[My about page](../about/index.md) -[https://codeberg.org/snonux/gos](https://codeberg.org/snonux/gos) - -## Table of Contents - -* [⇢ Posts from October to December 2024](#posts-from-october-to-december-2024) -* [⇢ ⇢ October 2024](#october-2024) -* [⇢ ⇢ ⇢ First on-call experience in a startup. Doesn't ...](#first-on-call-experience-in-a-startup-doesn-t-) -* [⇢ ⇢ ⇢ Reviewing your own PR or MR before asking ...](#reviewing-your-own-pr-or-mr-before-asking-) -* [⇢ ⇢ ⇢ Fun with defer in `#golang`, I did't know, that ...](#fun-with-defer-in-golang-i-did-t-know-that-) -* [⇢ ⇢ ⇢ I have been in incidents. Understandably, ...](#i-have-been-in-incidents-understandably-) -* [⇢ ⇢ ⇢ Little tips using strings in `#golang` and I ...](#little-tips-using-strings-in-golang-and-i-) -* [⇢ ⇢ ⇢ Reading this post about `#rust` (especially the ...](#reading-this-post-about-rust-especially-the-) -* [⇢ ⇢ ⇢ The opposite of `#ChaosMonkey` ... ...](#the-opposite-of-chaosmonkey--) -* [⇢ ⇢ November 2024](#november-2024) -* [⇢ ⇢ ⇢ I just became a Silver Patreon for OSnews. What ...](#i-just-became-a-silver-patreon-for-osnews-what-) -* [⇢ ⇢ ⇢ Until now, I wasn't aware, that Go is under a ...](#until-now-i-wasn-t-aware-that-go-is-under-a-) -* [⇢ ⇢ ⇢ These are some book notes from "Staff Engineer" ...](#these-are-some-book-notes-from-staff-engineer-) -* [⇢ ⇢ ⇢ Looking at `#Kubernetes`, it's pretty much ...](#looking-at-kubernetes-it-s-pretty-much-) -* [⇢ ⇢ ⇢ There has been an outage at the upstream ...](#there-has-been-an-outage-at-the-upstream-) -* [⇢ ⇢ ⇢ One of the more confusing parts in Go, nil ...](#one-of-the-more-confusing-parts-in-go-nil-) -* [⇢ ⇢ ⇢ Agreeably, writing down with Diagrams helps you ...](#agreeably-writing-down-with-diagrams-helps-you-) -* [⇢ ⇢ ⇢ I like the idea of types in Ruby. Raku is ...](#i-like-the-idea-of-types-in-ruby-raku-is-) -* [⇢ ⇢ ⇢ So, `#Haskell` is better suited for general ...](#so-haskell-is-better-suited-for-general-) -* [⇢ ⇢ ⇢ At first, functional options add a bit of ...](#at-first-functional-options-add-a-bit-of-) -* [⇢ ⇢ ⇢ Revamping my home lab a little bit. `#freebsd` ...](#revamping-my-home-lab-a-little-bit-freebsd-) -* [⇢ ⇢ ⇢ Wondering to which `#web` `#browser` I should ...](#wondering-to-which-web-browser-i-should-) -* [⇢ ⇢ ⇢ eks-node-viewer is a nifty tool, showing the ...](#eks-node-viewer-is-a-nifty-tool-showing-the-) -* [⇢ ⇢ ⇢ Have put more Photos on - On my static photo ...](#have-put-more-photos-on---on-my-static-photo-) -* [⇢ ⇢ ⇢ In Go, passing pointers are not automatically ...](#in-go-passing-pointers-are-not-automatically-) -* [⇢ ⇢ ⇢ Myself being part of an on-call rotations over ...](#myself-being-part-of-an-on-call-rotations-over-) -* [⇢ ⇢ ⇢ Feels good to code in my old love `#Perl` again ...](#feels-good-to-code-in-my-old-love-perl-again-) -* [⇢ ⇢ ⇢ This is an interactive summary of the Go ...](#this-is-an-interactive-summary-of-the-go-) -* [⇢ ⇢ December 2024](#december-2024) -* [⇢ ⇢ ⇢ Thats unexpected, you cant remove a NaN key ...](#thats-unexpected-you-cant-remove-a-nan-key-) -* [⇢ ⇢ ⇢ My second blog post about revamping my home lab ...](#my-second-blog-post-about-revamping-my-home-lab-) -* [⇢ ⇢ ⇢ Very insightful article about tech hiring in ...](#very-insightful-article-about-tech-hiring-in-) -* [⇢ ⇢ ⇢ for `#bpf` `#ebpf` performance debugging, have ...](#for-bpf-ebpf-performance-debugging-have-) -* [⇢ ⇢ ⇢ 89 things he/she knows about Git commits is a ...](#89-things-heshe-knows-about-git-commits-is-a-) -* [⇢ ⇢ ⇢ I found that working on multiple side projects ...](#i-found-that-working-on-multiple-side-projects-) -* [⇢ ⇢ ⇢ Agreed? Agreed. Besides `#Ruby`, I would also ...](#agreed-agreed-besides-ruby-i-would-also-) -* [⇢ ⇢ ⇢ Plan9 assembly format in Go, but wait, it's not ...](#plan9-assembly-format-in-go-but-wait-it-s-not-) -* [⇢ ⇢ ⇢ This is a neat blog post about the Helix text ...](#this-is-a-neat-blog-post-about-the-helix-text-) -* [⇢ ⇢ ⇢ This blog post is basically a rant against ...](#this-blog-post-is-basically-a-rant-against-) -* [⇢ ⇢ ⇢ Quick trick to get Helix themes selected ...](#quick-trick-to-get-helix-themes-selected-) -* [⇢ ⇢ ⇢ Example where complexity attacks you from ...](#example-where-complexity-attacks-you-from-) -* [⇢ ⇢ ⇢ LLMs for Ops? Summaries of logs, probabilities ...](#llms-for-ops-summaries-of-logs-probabilities-) -* [⇢ ⇢ ⇢ Excellent article about your dream Product ...](#excellent-article-about-your-dream-product-) -* [⇢ ⇢ ⇢ I just finished reading all chapters of CPU ...](#i-just-finished-reading-all-chapters-of-cpu-) -* [⇢ ⇢ ⇢ Indeed, useful to know this stuff! `#sre` ...](#indeed-useful-to-know-this-stuff-sre-) * [⇢ ⇢ ⇢ It's the small things, which make Unix like ...](#it-s-the-small-things-which-make-unix-like-) * [⇢ ⇢ ⇢ My New Year's resolution is not to start any ...](#my-new-year-s-resolution-is-not-to-start-any-) diff --git a/gemfeed/2025-02-01-f3s-kubernetes-with-freebsd-part-3.md b/gemfeed/2025-02-01-f3s-kubernetes-with-freebsd-part-3.md index 9942e524..f11a637f 100644 --- a/gemfeed/2025-02-01-f3s-kubernetes-with-freebsd-part-3.md +++ b/gemfeed/2025-02-01-f3s-kubernetes-with-freebsd-part-3.md @@ -374,382 +374,6 @@ Other BSD related posts are: [2024-01-13 One reason why I love OpenBSD](./2024-01-13-one-reason-why-i-love-openbsd.md) [2022-10-30 Installing DTail on OpenBSD](./2022-10-30-installing-dtail-on-openbsd.md) [2022-07-30 Let's Encrypt with OpenBSD and Rex](./2022-07-30-lets-encrypt-with-openbsd-and-rex.md) -# f3s: Kubernetes with FreeBSD - Part 3: Protecting from power cuts - -> Published at 2025-01-30T09:22:06+02:00 - -This is the third blog post about my f3s series for my self-hosting demands in my home lab. f3s? The "f" stands for FreeBSD, and the "3s" stands for k3s, the Kubernetes distribution we will use on FreeBSD-based physical machines. - -[2024-11-17 f3s: Kubernetes with FreeBSD - Part 1: Setting the stage](./2024-11-17-f3s-kubernetes-with-freebsd-part-1.md) -[2024-12-03 f3s: Kubernetes with FreeBSD - Part 2: Hardware and base installation](./2024-12-03-f3s-kubernetes-with-freebsd-part-2.md) -[2025-02-01 f3s: Kubernetes with FreeBSD - Part 3: Protecting from power cuts (You are currently reading this)](./2025-02-01-f3s-kubernetes-with-freebsd-part-3.md) -[2025-04-05 f3s: Kubernetes with FreeBSD - Part 4: Rocky Linux Bhyve VMs](./2025-04-05-f3s-kubernetes-with-freebsd-part-4.md) -[2025-05-11 f3s: Kubernetes with FreeBSD - Part 5: WireGuard mesh network](./2025-05-11-f3s-kubernetes-with-freebsd-part-5.md) -[2025-07-14 f3s: Kubernetes with FreeBSD - Part 6: Storage](./2025-07-14-f3s-kubernetes-with-freebsd-part-6.md) - -[](./f3s-kubernetes-with-freebsd-part-1/f3slogo.png) - -## Table of Contents - -* [⇢ f3s: Kubernetes with FreeBSD - Part 3: Protecting from power cuts](#f3s-kubernetes-with-freebsd---part-3-protecting-from-power-cuts) -* [⇢ ⇢ Introduction](#introduction) -* [⇢ ⇢ Changes since last time](#changes-since-last-time) -* [⇢ ⇢ ⇢ FreeBSD upgrade from 14.1 to 14.2](#freebsd-upgrade-from-141-to-142) -* [⇢ ⇢ ⇢ A new home (behind the TV)](#a-new-home-behind-the-tv) -* [⇢ ⇢ The UPS hardware](#the-ups-hardware) -* [⇢ ⇢ Configuring FreeBSD to Work with the UPS](#configuring-freebsd-to-work-with-the-ups) -* [⇢ ⇢ ⇢ USB Device Detection](#usb-device-detection) -* [⇢ ⇢ ⇢ `apcupsd` Installation](#apcupsd-installation) -* [⇢ ⇢ ⇢ UPS Connectivity Test](#ups-connectivity-test) -* [⇢ ⇢ APC Info on Partner Nodes:](#apc-info-on-partner-nodes) -* [⇢ ⇢ ⇢ Installation on partners](#installation-on-partners) -* [⇢ ⇢ Power outage simulation](#power-outage-simulation) -* [⇢ ⇢ ⇢ Pulling the plug](#pulling-the-plug) -* [⇢ ⇢ ⇢ Restoring power](#restoring-power) -* [⇢ ⇢ Conclusion](#conclusion) - -## Introduction - -In this blog post, we are setting up the UPS for the cluster. A UPS, or Uninterruptible Power Supply, safeguards my cluster from unexpected power outages and surges. It acts as a backup battery that kicks in when the electricity cuts out—especially useful in my area, where power cuts are frequent—allowing for a graceful system shutdown and preventing data loss and corruption. This is especially important since I will also store some of my data on the f3s nodes. - -## Changes since last time - -### FreeBSD upgrade from 14.1 to 14.2 - -There has been a new release since the last blog post in this series. The upgrade from 14.1 was as easy as: - -```sh -paul@f0: ~ % doas freebsd-update fetch -paul@f0: ~ % doas freebsd-update install -paul@f0: ~ % doas freebsd-update -r 14.2-RELEASE upgrade -paul@f0: ~ % doas freebsd-update install -paul@f0: ~ % doas shutdown -r now -``` - -And after rebooting, I ran: - -```sh -paul@f0: ~ % doas freebsd-update install -paul@f0: ~ % doas pkg update -paul@f0: ~ % doas pkg upgrade -paul@f0: ~ % doas shutdown -r now -``` - -And after another reboot, I was on 14.2: - -```sh -paul@f0:~ % uname -a -FreeBSD f0.lan.buetow.org 14.2-RELEASE FreeBSD 14.2-RELEASE - releng/14.2-n269506-c8918d6c7412 GENERIC amd64 -``` - -And, of course, I ran this on all 3 nodes! - -### A new home (behind the TV) - -I've put all the infrastructure behind my TV, as plenty of space is available. The TV hides most of the setup, which drastically improved the SAF (spouse acceptance factor). - -[](./f3s-kubernetes-with-freebsd-part-3/f3s-changes.jpg) - -I got rid of the mini-switch I mentioned in the previous blog post. I have the TP-Link EAP615-Wall mounted on the wall nearby, which is my OpenWrt-powered Wi-Fi hotspot. It also has 3 Ethernet ports, to which I connected the Beelink nodes. That's the device you see at the very top. - -The Ethernet cables go downward through the cable boxes to the Beelink nodes. In addition to the Beelink f3s nodes, I connected the TP-Link to the UPS as well (not discussed further in this blog post, but the positive side effect is that my Wi-Fi will still work during a power loss for some time—and during a power cut, the Beelink nodes will still be able to communicate with each other). - -On the very left (the black box) is the UPS, with four power outlets. Three go to the Beelink nodes, and one goes to the TP-Link. A USB output is also connected to the first Beelink node, `f0`. - -On the very right (halfway hidden behind the TV) are the 3 Beelink nodes stacked on top of each other. The only downside (or upside?) is that my 14-month-old daughter is now chaos-testing the Beelink nodes, as the red power buttons (now reachable for her) are very attractive for her to press when passing by randomly. :-) Luckily, that will only cause graceful system shutdowns! - -## The UPS hardware - -I wanted a UPS that I could connect to via FreeBSD, and that would provide enough backup power to operate the cluster for a couple of minutes (it turned out to be around an hour, but this time will likely be shortened after future hardware upgrades, like additional drives and a backup enclosure) and to automatically initiate the shutdown of all the f3s nodes. - -I decided on the APC Back-UPS BX750MI model because: - -* Zero noise level when there is no power cut (some light noise when the battery is in operation during a power cut). -* Cost: It is relatively affordable (not costing thousands). -* USB connectivity: Can be connected via USB to one of the FreeBSD hosts to read the UPS status. -* A power output of 750VA (or 410 watts), suitable for an hour of runtime for my f3s nodes (plus the Wi-Fi router). -* Multiple power outlets: Can connect all 3 f3s nodes directly. -* User-replaceable batteries: I can replace the batteries myself after two years or more (depending on usage). -* Its compact design. Overall, I like how it looks. - -[](./f3s-kubernetes-with-freebsd-part-3/apc-back-ups.jpg) - -## Configuring FreeBSD to Work with the UPS - -### USB Device Detection - -Once plugged in via USB on FreeBSD, I could see the following in the kernel messages: - -```sh -paul@f0: ~ % doas dmesg | grep UPS -ugen0.2: <American Power Conversion Back-UPS BX750MI> at usbus0 -``` - -### `apcupsd` Installation - -To make use of the USB connection, the `apcupsd` package had to be installed: - -```sh -paul@f0: ~ % doas install apcupsd -``` - -I have made the following modifications to the configuration file so that the UPS can be used via the USB interface: - -```sh -paul@f0:/usr/local/etc/apcupsd % diff -u apcupsd.conf.sample apcupsd.conf ---- apcupsd.conf.sample 2024-11-01 16:40:42.000000000 +0200 -+++ apcupsd.conf 2024-12-03 10:58:24.009501000 +0200 -@@ -31,7 +31,7 @@ - # 940-1524C, 940-0024G, 940-0095A, 940-0095B, - # 940-0095C, 940-0625A, M-04-02-2000 - # --UPSCABLE smart -+UPSCABLE usb - - # To get apcupsd to work, in addition to defining the cable - # above, you must also define a UPSTYPE, which corresponds to -@@ -88,8 +88,10 @@ - # that apcupsd binds to that particular unit - # (helpful if you have more than one USB UPS). - # --UPSTYPE apcsmart --DEVICE /dev/usv -+UPSTYPE usb -+DEVICE - - # POLLTIME <int> - # Interval (in seconds) at which apcupsd polls the UPS for status. This -``` - -I left the remaining settings as the default ones; for example, the following are of main interest: - -``` -# If during a power failure, the remaining battery percentage -# (as reported by the UPS) is below or equal to BATTERYLEVEL, -# apcupsd will initiate a system shutdown. -BATTERYLEVEL 5 - -# If during a power failure, the remaining runtime in minutes -# (as calculated internally by the UPS) is below or equal to MINUTES, -# apcupsd, will initiate a system shutdown. -MINUTES 3 -``` - -I then enabled and started the daemon: - -```sh -paul@f0:/usr/local/etc/apcupsd % doas sysrc apcupsd_enable=YES -apcupsd_enable: -> YES -paul@f0:/usr/local/etc/apcupsd % doas service apcupsd start -Starting apcupsd. -``` - -### UPS Connectivity Test - -And voila, I could now access the UPS information via the `apcaccess` command; how convenient :-) (I also read through the manual page, which provides a good understanding of what else can be done with it!). - -```sh -paul@f0:~ % apcaccess -APC : 001,035,0857 -DATE : 2025-01-26 14:43:27 +0200 -HOSTNAME : f0.lan.buetow.org -VERSION : 3.14.14 (31 May 2016) freebsd -UPSNAME : f0.lan.buetow.org -CABLE : USB Cable -DRIVER : USB UPS Driver -UPSMODE : Stand Alone -STARTTIME: 2025-01-26 14:43:25 +0200 -MODEL : Back-UPS BX750MI -STATUS : ONLINE -LINEV : 230.0 Volts -LOADPCT : 4.0 Percent -BCHARGE : 100.0 Percent -TIMELEFT : 65.3 Minutes -MBATTCHG : 5 Percent -MINTIMEL : 3 Minutes -MAXTIME : 0 Seconds -SENSE : Medium -LOTRANS : 145.0 Volts -HITRANS : 295.0 Volts -ALARMDEL : No alarm -BATTV : 13.6 Volts -LASTXFER : Automatic or explicit self test -NUMXFERS : 0 -TONBATT : 0 Seconds -CUMONBATT: 0 Seconds -XOFFBATT : N/A -SELFTEST : NG -STATFLAG : 0x05000008 -SERIALNO : 9B2414A03599 -BATTDATE : 2001-01-01 -NOMINV : 230 Volts -NOMBATTV : 12.0 Volts -NOMPOWER : 410 Watts -END APC : 2025-01-26 14:44:06 +0200 -``` - -## APC Info on Partner Nodes: - -So far, so good. Host `f0` would shut down itself when short on power. But what about the `f1` and `f2` nodes? They aren't connected directly to the UPS and, therefore, wouldn't know that their power is about to be cut off. For this, `apcupsd` running on the `f1` and `f2` nodes can be configured to retrieve UPS information via the network from the `apcupsd` server running on the `f0` node, which is connected directly to the APC via USB. - -Of course, this won't work when `f0` is down. In this case, no operational node would be connected to the UPS via USB; therefore, the current power status would not be known. However, I consider this a rare circumstance. Furthermore, in case of an `f0` system crash, sudden power outages on the two other nodes would occur at different times making real data loss (the main concern here) less likely. - -And if `f0` is down and `f1` and `f2` receive new data and crash midway, it's likely that a client (e.g., an Android app or another laptop) still has the data stored on it, making data recoverable and data loss overall nearly impossible. I'd receive an alert if any of the nodes go down (more on monitoring later in this blog series). - -### Installation on partners - -To do this, I installed `apcupsd` via `doas pkg install apcupsd` on `f1` and `f2`, and then I could connect to it this way: - -```sh -paul@f1:~ % apcaccess -h f0.lan.buetow.org | grep Percent -LOADPCT : 12.0 Percent -BCHARGE : 94.0 Percent -MBATTCHG : 5 Percent -``` - -But I want the daemon to be configured and enabled in such a way that it connects to the master UPS node (the one with the UPS connected via USB) so that it can also initiate a system shutdown when the UPS battery reaches low levels. For that, `apcupsd` itself needs to be aware of the UPS status. - -On `f1` and `f2`, I changed the configuration to use `f0` (where `apcupsd` is listening) as a remote device. I also changed the `MINUTES` setting from 3 to 6 and the `BATTERYLEVEL` setting from 5 to 10 to ensure that the `f1` and `f2` nodes could still connect to the `f0` node for UPS information before `f0` decides to shut down itself. So `f1` and `f2` must shut down earlier than `f0`: - -```sh -paul@f2:/usr/local/etc/apcupsd % diff -u apcupsd.conf.sample apcupsd.conf ---- apcupsd.conf.sample 2024-11-01 16:40:42.000000000 +0200 -+++ apcupsd.conf 2025-01-26 15:52:45.108469000 +0200 -@@ -31,7 +31,7 @@ - # 940-1524C, 940-0024G, 940-0095A, 940-0095B, - # 940-0095C, 940-0625A, M-04-02-2000 - # --UPSCABLE smart -+UPSCABLE ether - - # To get apcupsd to work, in addition to defining the cable - # above, you must also define a UPSTYPE, which corresponds to -@@ -52,7 +52,6 @@ - # Network Information Server. This is used if the - # UPS powering your computer is connected to a - # different computer for monitoring. --# - # snmp hostname:port:vendor:community - # SNMP network link to an SNMP-enabled UPS device. - # Hostname is the ip address or hostname of the UPS -@@ -88,8 +87,8 @@ - # that apcupsd binds to that particular unit - # (helpful if you have more than one USB UPS). - # --UPSTYPE apcsmart --DEVICE /dev/usv -+UPSTYPE net -+DEVICE f0.lan.buetow.org:3551 - - # POLLTIME <int> - # Interval (in seconds) at which apcupsd polls the UPS for status. This -@@ -147,12 +146,12 @@ - # If during a power failure, the remaining battery percentage - # (as reported by the UPS) is below or equal to BATTERYLEVEL, - # apcupsd will initiate a system shutdown. --BATTERYLEVEL 5 -+BATTERYLEVEL 10 - - # If during a power failure, the remaining runtime in minutes - # (as calculated internally by the UPS) is below or equal to MINUTES, - # apcupsd, will initiate a system shutdown. --MINUTES 3 -+MINUTES 6 - - # If during a power failure, the UPS has run on batteries for TIMEOUT - # many seconds or longer, apcupsd will initiate a system shutdown. - -``` -So I also ran the following commands on `f1` and `f2`: - -```sh -paul@f1:/usr/local/etc/apcupsd % doas sysrc apcupsd_enable=YES -apcupsd_enable: -> YES -paul@f1:/usr/local/etc/apcupsd % doas service apcupsd start -Starting apcupsd. -``` - -And then I was able to connect to localhost via the `apcaccess` command: - -```sh -paul@f1:~ % doas apcaccess | grep Percent -LOADPCT : 5.0 Percent -BCHARGE : 95.0 Percent -MBATTCHG : 5 Percent -``` - -## Power outage simulation - -### Pulling the plug - -I simulated a power outage by removing the power input from the APC. Immediately, the following message appeared on all the nodes: - -```` -Broadcast Message from root@f0.lan.buetow.org - (no tty) at 15:03 EET... - -Power failure. Running on UPS batteries. -``` - -I ran the following command to confirm the available battery time: - -```sh -paul@f0:/usr/local/etc/apcupsd % apcaccess -p TIMELEFT -63.9 Minutes -``` - -And after around one hour (`f1` and `f2` a bit earlier, `f0` a bit later due to the different `BATTERYLEVEL` and `MINUTES` settings outlined earlier), the following broadcast was sent out: - -``` -Broadcast Message from root@f0.lan.buetow.org - (no tty) at 15:08 EET... - - *** FINAL System shutdown message from root@f0.lan.buetow.org *** - -System going down IMMEDIATELY - -apcupsd initiated shutdown -``` - -And all the nodes shut down safely before the UPS ran out of battery! - -### Restoring power - -After restoring power, I checked the logs in `/var/log/daemon.log` and found the following on all 3 nodes: - -``` -Jan 26 17:36:24 f2 apcupsd[2159]: Power failure. -Jan 26 17:36:30 f2 apcupsd[2159]: Running on UPS batteries. -Jan 26 17:36:30 f2 apcupsd[2159]: Battery charge below low limit. -Jan 26 17:36:30 f2 apcupsd[2159]: Initiating system shutdown! -Jan 26 17:36:30 f2 apcupsd[2159]: User logins prohibited -Jan 26 17:36:32 f2 apcupsd[2159]: apcupsd exiting, signal 15 -Jan 26 17:36:32 f2 apcupsd[2159]: apcupsd shutdown succeeded -``` - -All good :-) - -## Conclusion - -I have the same UPS (but with a bit more capacity) for my main work setup, which powers my 28" screen, music equipment, etc. It has already been helpful a couple of times during power outages here, so I am sure that the smaller UPS for the F3s setup will be of great use. - -Read the next post of this series: - -[f3s: Kubernetes with FreeBSD - Part 4: Rocky Linux Bhyve VMs](./2025-04-05-f3s-kubernetes-with-freebsd-part-4.md) - -Other BSD related posts are: - -[2025-07-14 f3s: Kubernetes with FreeBSD - Part 6: Storage](./2025-07-14-f3s-kubernetes-with-freebsd-part-6.md) -[2025-05-11 f3s: Kubernetes with FreeBSD - Part 5: WireGuard mesh network](./2025-05-11-f3s-kubernetes-with-freebsd-part-5.md) -[2025-04-05 f3s: Kubernetes with FreeBSD - Part 4: Rocky Linux Bhyve VMs](./2025-04-05-f3s-kubernetes-with-freebsd-part-4.md) -[2025-02-01 f3s: Kubernetes with FreeBSD - Part 3: Protecting from power cuts (You are currently reading this)](./2025-02-01-f3s-kubernetes-with-freebsd-part-3.md) -[2024-12-03 f3s: Kubernetes with FreeBSD - Part 2: Hardware and base installation](./2024-12-03-f3s-kubernetes-with-freebsd-part-2.md) -[2024-11-17 f3s: Kubernetes with FreeBSD - Part 1: Setting the stage](./2024-11-17-f3s-kubernetes-with-freebsd-part-1.md) -[2024-04-01 KISS high-availability with OpenBSD](./2024-04-01-KISS-high-availability-with-OpenBSD.md) -[2024-01-13 One reason why I love OpenBSD](./2024-01-13-one-reason-why-i-love-openbsd.md) -[2022-10-30 Installing DTail on OpenBSD](./2022-10-30-installing-dtail-on-openbsd.md) -[2022-07-30 Let's Encrypt with OpenBSD and Rex](./2022-07-30-lets-encrypt-with-openbsd-and-rex.md) [2016-04-09 Jails and ZFS with Puppet on FreeBSD](./2016-04-09-jails-and-zfs-on-freebsd-with-puppet.md) E-Mail your comments to `paul@nospam.buetow.org` :-) diff --git a/gemfeed/2025-05-11-f3s-kubernetes-with-freebsd-part-5.md b/gemfeed/2025-05-11-f3s-kubernetes-with-freebsd-part-5.md index 67bc6c50..1dca3454 100644 --- a/gemfeed/2025-05-11-f3s-kubernetes-with-freebsd-part-5.md +++ b/gemfeed/2025-05-11-f3s-kubernetes-with-freebsd-part-5.md @@ -89,97 +89,6 @@ We could have used Tailscale for an easy to set up and manage the WireGuard netw [https://www.wireguard.com/](https://www.wireguard.com/) [https://tailscale.com/](https://tailscale.com/) -# f3s: Kubernetes with FreeBSD - Part 5: WireGuard mesh network - -> Published at 2025-05-11T11:35:57+03:00 - -This is the fifth blog post about my f3s series for my self-hosting demands in my home lab. f3s? The "f" stands for FreeBSD, and the "3s" stands for k3s, the Kubernetes distribution I will use on FreeBSD-based physical machines. - -I will post a new entry every month or so (there are too many other side projects for more frequent updates — I bet you can understand). - -These are all the posts so far: - -[2024-11-17 f3s: Kubernetes with FreeBSD - Part 1: Setting the stage](./2024-11-17-f3s-kubernetes-with-freebsd-part-1.md) -[2024-12-03 f3s: Kubernetes with FreeBSD - Part 2: Hardware and base installation](./2024-12-03-f3s-kubernetes-with-freebsd-part-2.md) -[2025-02-01 f3s: Kubernetes with FreeBSD - Part 3: Protecting from power cuts](./2025-02-01-f3s-kubernetes-with-freebsd-part-3.md) -[2025-04-05 f3s: Kubernetes with FreeBSD - Part 4: Rocky Linux Bhyve VMs](./2025-04-05-f3s-kubernetes-with-freebsd-part-4.md) -[2025-05-11 f3s: Kubernetes with FreeBSD - Part 5: WireGuard mesh network (You are currently reading this)](./2025-05-11-f3s-kubernetes-with-freebsd-part-5.md) -[2025-07-14 f3s: Kubernetes with FreeBSD - Part 6: Storage](./2025-07-14-f3s-kubernetes-with-freebsd-part-6.md) - -[](./f3s-kubernetes-with-freebsd-part-1/f3slogo.png) - -> ChatGPT generated logo. - -Let's begin... - -## Table of Contents - -* [⇢ f3s: Kubernetes with FreeBSD - Part 5: WireGuard mesh network](#f3s-kubernetes-with-freebsd---part-5-wireguard-mesh-network) -* [⇢ ⇢ Introduction](#introduction) -* [⇢ ⇢ ⇢ Expected traffic flow](#expected-traffic-flow) -* [⇢ ⇢ Deciding on WireGuard](#deciding-on-wireguard) -* [⇢ ⇢ Base configuration](#base-configuration) -* [⇢ ⇢ ⇢ FreeBSD](#freebsd) -* [⇢ ⇢ ⇢ Rocky Linux](#rocky-linux) -* [⇢ ⇢ ⇢ OpenBSD](#openbsd) -* [⇢ ⇢ WireGuard configuration](#wireguard-configuration) -* [⇢ ⇢ ⇢ Example `wg0.conf`](#example-wg0conf) -* [⇢ ⇢ ⇢ NAT traversal and keepalive](#nat-traversal-and-keepalive) -* [⇢ ⇢ ⇢ Preshared key](#preshared-key) -* [⇢ ⇢ Mesh network generator](#mesh-network-generator) -* [⇢ ⇢ ⇢ `wireguardmeshgenerator.yaml`](#wireguardmeshgeneratoryaml) -* [⇢ ⇢ ⇢ `wireguardmeshgenerator.rb` overview](#wireguardmeshgeneratorrb-overview) -* [⇢ ⇢ Invoking the mesh network generator](#invoking-the-mesh-network-generator) -* [⇢ ⇢ ⇢ Generating the `wg0.conf` files and keys](#generating-the-wg0conf-files-and-keys) -* [⇢ ⇢ ⇢ Installing the `wg0.conf` files](#installing-the-wg0conf-files) -* [⇢ ⇢ ⇢ Re-generating mesh and installing the `wg0.conf` files again](#re-generating-mesh-and-installing-the-wg0conf-files-again) -* [⇢ ⇢ Happy WireGuard-ing](#happy-wireguard-ing) -* [⇢ ⇢ Conclusion](#conclusion) - -## Introduction - -By default, traffic within my home LAN, including traffic inside a k3s cluster, is not encrypted. While it resides in the "secure" home LAN, adopting a zero-trust policy means encryption is still preferable to ensure confidentiality and security. So we decide to secure all the traffic of all f3s participating hosts by building a mesh network of all participating hosts: - -[](./f3s-kubernetes-with-freebsd-part-5/wireguard-full-mesh.svg) - -Whereas `f0`, `f1`, and `f2` are the FreeBSD base hosts, `r0`, `r1`, and `r2` are the Rocky Linux Bhyve VMs, and `blowfish` and `fishfinger` are two OpenBSD systems running on the internet (as mentioned in the first blog of this series—these systems are already built; in fact, this very blog is served by those OpenBSD systems). - -As we can see from the graph, it is a true full-mesh network, where every host has a VPN tunnel to every other host. The benefit is that we do not need to route traffic through intermediate hosts (significantly simplifying the routing configuration). However, the downside is that there is some overhead in configuring and managing all the tunnels. - -For simplicity, we also establish VPN tunnels between `f0 <-> r0`, `f1 <-> r1`, and `f2 <-> r2`. Technically, this wouldn't be strictly required since the VMs `rN` are running on the hosts `fN`, and no network traffic is leaving the box. However, it simplifies the configuration as we don't have to account for exceptions, and we are going to automate the mesh network configuration anyway (read on). - -### Expected traffic flow - -The traffic is expected to flow between the host groups through the mesh network as follows: - -* `fN <-> rN`: The traffic between the FreeBSD hosts and the Rocky Linux VMs will be routed through the VPN tunnels for persistent storage. In a later post in this series, we will set up an NFS server on the `fN` hosts. -* `fN <-> blowfish,fishfinger`: The traffic between the FreeBSD hosts and the OpenBSD host `blowfish,fishfinger` will be routed through the VPN tunnels for management. We may want to log in via the internet to set it up remotely. The VPN tunnel will also be used for monitoring purposes. -* `rN <-> blowfish,fishfinger`: The traffic between the Rocky Linux VMs and the OpenBSD host `blowfish,fishfinger` will be routed through the VPN tunnels for usage traffic. Since k3s will be running on the `rN` hosts, the OpenBSD servers will route the traffic through `relayd` to the services running in Kubernetes. -* `fN <-> fM`: The traffic between the FreeBSD hosts may be later used for data replication for the NFS storage. -* `rN <-> rM`: The traffic between the Rocky Linux VMs will later be used by the k3s cluster itself, as every `rN` will be a Kubernetes worker node. -* `blowfish <-> fishfinger`: The traffic between the OpenBSD hosts isn't strictly required for this setup, but I set it up anyway for future use cases. - -We won't cover all the details in this blog post, as we only focus on setting up the Mesh network in this blog post. Subsequent posts in this series will cover the other details. - -## Deciding on WireGuard - -I have decided to use WireGuard as the VPN technology for this purpose. - -WireGuard is a lightweight, modern, and secure VPN protocol designed for simplicity, speed, and strong cryptography. It is an excellent choice due to its minimal codebase, ease of configuration, high performance, and robust security, utilizing state-of-the-art encryption standards. WireGuard is supported on various operating systems, and its implementations are compatible with each other. Therefore, establishing WireGuard VPN tunnels between FreeBSD, Linux, and OpenBSD is seamless. This cross-platform availability makes it suitable for setups like the one described in this blog series. - -We could have used Tailscale for an easy to set up and manage the WireGuard network, but the benefits of creating our own mesh network are: - -* Learning about WireGuard configuration details -* Have full control over the setup -* Don't rely on an external provider like Tailscale (even if some of the components are open-source) -* Have even more fun along the way -* WireGuard is easy to configure on my target operating systems and, therefore, easier to maintain in the long run. -* There are no official Tailscale packages available for OpenBSD and FreeBSD. However, getting Tailscale running on these systems is still possible, though some tinkering would be required. Instead, we use that tinkering time to set up WireGuard tunnels ourselves. - -[https://en.wikipedia.org/wiki/WireGuard](https://en.wikipedia.org/wiki/WireGuard) -[https://www.wireguard.com/](https://www.wireguard.com/) -[https://tailscale.com/](https://tailscale.com/) - [](./f3s-kubernetes-with-freebsd-part-5/wireguard.svg) ## Base configuration diff --git a/gemfeed/2025-07-01-posts-from-january-to-june-2025.md b/gemfeed/2025-07-01-posts-from-january-to-june-2025.md index ca5b8816..0620a68b 100644 --- a/gemfeed/2025-07-01-posts-from-january-to-june-2025.md +++ b/gemfeed/2025-07-01-posts-from-january-to-june-2025.md @@ -50,58 +50,6 @@ These are from Mastodon and LinkedIn. Have a look at my about page for my social * [⇢ ⇢ ⇢ Neat little blog post, showcasing various ...](#neat-little-blog-post-showcasing-various-) * [⇢ ⇢ ⇢ The smallest thing in Go `#golang` ...](#the-smallest-thing-in-go-golang-) * [⇢ ⇢ ⇢ Fun with defer in `#golang`, I did't know, that ...](#fun-with-defer-in-golang-i-did-t-know-that-) -* # Posts from January to June 2025 - -> Published at 2025-07-01T22:39:29+03:00 - -These are my social media posts from the last six months. I keep them here to reflect on them and also to not lose them. Social media networks come and go and are not under my control, but my domain is here to stay. - -These are from Mastodon and LinkedIn. Have a look at my about page for my social media profiles. This list is generated with Gos, my social media platform sharing tool. - -[My about page](../about/index.md) -[https://codeberg.org/snonux/gos](https://codeberg.org/snonux/gos) - -## Table of Contents - -* [⇢ Posts from January to June 2025](#posts-from-january-to-june-2025) -* [⇢ ⇢ January 2025](#january-2025) -* [⇢ ⇢ ⇢ I am currently binge-listening to the Google ...](#i-am-currently-binge-listening-to-the-google-) -* [⇢ ⇢ ⇢ Recently, there was a >5000 LOC `#bash` ...](#recently-there-was-a-5000-loc-bash-) -* [⇢ ⇢ ⇢ Ghostty is a terminal emulator that was ...](#ghostty-is-a-terminal-emulator-that-was-) -* [⇢ ⇢ ⇢ Go is not an easy programming language. Don't ...](#go-is-not-an-easy-programming-language-don-t-) -* [⇢ ⇢ ⇢ How will AI change software engineering (or has ...](#how-will-ai-change-software-engineering-or-has-) -* [⇢ ⇢ ⇢ Eliminating toil - Toil is not always a bad ...](#eliminating-toil---toil-is-not-always-a-bad-) -* [⇢ ⇢ ⇢ Fun read. How about using the character ...](#fun-read-how-about-using-the-character-) -* [⇢ ⇢ ⇢ Thats unexpected, you cant remove a NaN key ...](#thats-unexpected-you-cant-remove-a-nan-key-) -* [⇢ ⇢ ⇢ Nice refresher for `#shell` `#bash` `#zsh` ...](#nice-refresher-for-shell-bash-zsh-) -* [⇢ ⇢ ⇢ I think discussing action items in incident ...](#i-think-discussing-action-items-in-incident-) -* [⇢ ⇢ ⇢ At first, functional options add a bit of ...](#at-first-functional-options-add-a-bit-of-) -* [⇢ ⇢ ⇢ In the "Working with an SRE Interview" I have ...](#in-the-working-with-an-sre-interview-i-have-) -* [⇢ ⇢ ⇢ Small introduction to the `#Android` ...](#small-introduction-to-the-android-) -* [⇢ ⇢ ⇢ Helix 2025.01 has been released. The completion ...](#helix-202501-has-been-released-the-completion-) -* [⇢ ⇢ ⇢ I found these are excellent examples of how ...](#i-found-these-are-excellent-examples-of-how-) -* [⇢ ⇢ ⇢ LLMs for Ops? Summaries of logs, probabilities ...](#llms-for-ops-summaries-of-logs-probabilities-) -* [⇢ ⇢ ⇢ Enjoying an APC Power-UPS BX750MI in my ...](#enjoying-an-apc-power-ups-bx750mi-in-my-) -* [⇢ ⇢ ⇢ "Even in the projects where I'm the only ...](#even-in-the-projects-where-i-m-the-only-) -* [⇢ ⇢ ⇢ Connecting an `#UPS` to my `#FreeBSD` cluster ...](#connecting-an-ups-to-my-freebsd-cluster-) -* [⇢ ⇢ ⇢ So, the Co-founder and CTO of honeycomb.io and ...](#so-the-co-founder-and-cto-of-honeycombio-and-) -* [⇢ ⇢ February 2025](#february-2025) -* [⇢ ⇢ ⇢ I don't know about you, but at work, I usually ...](#i-don-t-know-about-you-but-at-work-i-usually-) -* [⇢ ⇢ ⇢ Great proposal (got accepted by the Goteam) for ...](#great-proposal-got-accepted-by-the-goteam-for-) -* [⇢ ⇢ ⇢ My Gemtexter has only 1320 LOC.... The Biggest ...](#my-gemtexter-has-only-1320-loc-the-biggest-) -* [⇢ ⇢ ⇢ Against /tmp - He is making a point `#unix` ...](#against-tmp---he-is-making-a-point-unix-) -* [⇢ ⇢ ⇢ Random Weird Things Part 2: `#blog` ...](#random-weird-things-part-2-blog-) -* [⇢ ⇢ ⇢ As a former `#Pebble` user and fan, thats ...](#as-a-former-pebble-user-and-fan-thats-) -* [⇢ ⇢ ⇢ I think I am slowly getting the point of Cue. ...](#i-think-i-am-slowly-getting-the-point-of-cue-) -* [⇢ ⇢ ⇢ Jonathan's reflection of 10 years of ...](#jonathan-s-reflection-of-10-years-of-) -* [⇢ ⇢ ⇢ Really enjoyed reading this. Easily digestible ...](#really-enjoyed-reading-this-easily-digestible-) -* [⇢ ⇢ ⇢ Some great advice from 40 years of experience ...](#some-great-advice-from-40-years-of-experience-) -* [⇢ ⇢ ⇢ I enjoyed this talk, some recipes I knew ...](#i-enjoyed-this-talk-some-recipes-i-knew-) -* [⇢ ⇢ ⇢ A way of how to add the version info to the Go ...](#a-way-of-how-to-add-the-version-info-to-the-go-) -* [⇢ ⇢ ⇢ In other words, using t.Parallel() for ...](#in-other-words-using-tparallel-for-) -* [⇢ ⇢ ⇢ Neat little blog post, showcasing various ...](#neat-little-blog-post-showcasing-various-) -* [⇢ ⇢ ⇢ The smallest thing in Go `#golang` ...](#the-smallest-thing-in-go-golang-) -* [⇢ ⇢ ⇢ Fun with defer in `#golang`, I did't know, that ...](#fun-with-defer-in-golang-i-did-t-know-that-) * [⇢ ⇢ ⇢ What I like about Go is that it is still ...](#what-i-like-about-go-is-that-it-is-still-) * [⇢ ⇢ March 2025](#march-2025) * [⇢ ⇢ ⇢ Television has somewhat transformed how I work ...](#television-has-somewhat-transformed-how-i-work-) diff --git a/gemfeed/2025-07-14-f3s-kubernetes-with-freebsd-part-6.md b/gemfeed/2025-07-14-f3s-kubernetes-with-freebsd-part-6.md index 961b54d2..490ae012 100644 --- a/gemfeed/2025-07-14-f3s-kubernetes-with-freebsd-part-6.md +++ b/gemfeed/2025-07-14-f3s-kubernetes-with-freebsd-part-6.md @@ -50,58 +50,6 @@ This is the sixth blog post about the f3s series for self-hosting demands in a h * [⇢ ⇢ Client Configuration for NFS via Stunnel](#client-configuration-for-nfs-via-stunnel) * [⇢ ⇢ ⇢ Configuring Rocky Linux Clients (`r0`, `r1`, `r2`)](#configuring-rocky-linux-clients-r0-r1-r2) * [⇢ ⇢ ⇢ NFSv4 user mapping config on Rocky](#nfsv4-user-mapping-config-on-rocky) -* # f3s: Kubernetes with FreeBSD - Part 6: Storage - -> Published at 2025-07-13T16:44:29+03:00, last updated: 08.08.2025 - -This is the sixth blog post about the f3s series for self-hosting demands in a home lab. f3s? The "f" stands for FreeBSD, and the "3s" stands for k3s, the Kubernetes distribution used on FreeBSD-based physical machines. - -[2024-11-17 f3s: Kubernetes with FreeBSD - Part 1: Setting the stage](./2024-11-17-f3s-kubernetes-with-freebsd-part-1.md) -[2024-12-03 f3s: Kubernetes with FreeBSD - Part 2: Hardware and base installation](./2024-12-03-f3s-kubernetes-with-freebsd-part-2.md) -[2025-02-01 f3s: Kubernetes with FreeBSD - Part 3: Protecting from power cuts](./2025-02-01-f3s-kubernetes-with-freebsd-part-3.md) -[2025-04-05 f3s: Kubernetes with FreeBSD - Part 4: Rocky Linux Bhyve VMs](./2025-04-05-f3s-kubernetes-with-freebsd-part-4.md) -[2025-05-11 f3s: Kubernetes with FreeBSD - Part 5: WireGuard mesh network](./2025-05-11-f3s-kubernetes-with-freebsd-part-5.md) -[2025-07-14 f3s: Kubernetes with FreeBSD - Part 6: Storage (You are currently reading this)](./2025-07-14-f3s-kubernetes-with-freebsd-part-6.md) - -[](./f3s-kubernetes-with-freebsd-part-1/f3slogo.png) - -## Table of Contents - -* [⇢ f3s: Kubernetes with FreeBSD - Part 6: Storage](#f3s-kubernetes-with-freebsd---part-6-storage) -* [⇢ ⇢ Introduction](#introduction) -* [⇢ ⇢ Additional storage capacity](#additional-storage-capacity) -* [⇢ ⇢ ZFS encryption keys](#zfs-encryption-keys) -* [⇢ ⇢ ⇢ UFS on USB keys](#ufs-on-usb-keys) -* [⇢ ⇢ ⇢ Generating encryption keys](#generating-encryption-keys) -* [⇢ ⇢ ⇢ Configuring `zdata` ZFS pool encryption](#configuring-zdata-zfs-pool-encryption) -* [⇢ ⇢ ⇢ Migrating Bhyve VMs to an encrypted `bhyve` ZFS volume](#migrating-bhyve-vms-to-an-encrypted-bhyve-zfs-volume) -* [⇢ ⇢ ZFS Replication with `zrepl`](#zfs-replication-with-zrepl) -* [⇢ ⇢ ⇢ Understanding Replication Requirements](#understanding-replication-requirements) -* [⇢ ⇢ ⇢ Installing `zrepl`](#installing-zrepl) -* [⇢ ⇢ ⇢ Configuring `zrepl` on `f1` (sink)](#configuring-zrepl-on-f1-sink) -* [⇢ ⇢ ⇢ Enabling and starting `zrepl` services](#enabling-and-starting-zrepl-services) -* [⇢ ⇢ ⇢ Monitoring replication](#monitoring-replication) -* [⇢ ⇢ ⇢ Verifying replication after reboot](#verifying-replication-after-reboot) -* [⇢ ⇢ ⇢ Understanding Failover Limitations and Design Decisions](#understanding-failover-limitations-and-design-decisions) -* [⇢ ⇢ ⇢ Mounting the NFS datasets](#mounting-the-nfs-datasets) -* [⇢ ⇢ ⇢ Troubleshooting: Files not appearing in replication](#troubleshooting-files-not-appearing-in-replication) -* [⇢ ⇢ ⇢ Configuring automatic key loading on boot](#configuring-automatic-key-loading-on-boot) -* [⇢ ⇢ CARP (Common Address Redundancy Protocol)](#carp-common-address-redundancy-protocol) -* [⇢ ⇢ ⇢ How CARP Works](#how-carp-works) -* [⇢ ⇢ ⇢ Configuring CARP](#configuring-carp) -* [⇢ ⇢ ⇢ CARP State Change Notifications](#carp-state-change-notifications) -* [⇢ ⇢ NFS Server Configuration](#nfs-server-configuration) -* [⇢ ⇢ ⇢ Setting up NFS on `f0` (Primary)](#setting-up-nfs-on-f0-primary) -* [⇢ ⇢ ⇢ Configuring Stunnel for NFS Encryption with CARP Failover](#configuring-stunnel-for-nfs-encryption-with-carp-failover) -* [⇢ ⇢ ⇢ Creating a Certificate Authority for Client Authentication](#creating-a-certificate-authority-for-client-authentication) -* [⇢ ⇢ ⇢ Install and Configure Stunnel on `f0`](#install-and-configure-stunnel-on-f0) -* [⇢ ⇢ ⇢ Setting up NFS on `f1` (Standby)](#setting-up-nfs-on-f1-standby) -* [⇢ ⇢ ⇢ CARP Control Script for Clean Failover](#carp-control-script-for-clean-failover) -* [⇢ ⇢ ⇢ CARP Management Script](#carp-management-script) -* [⇢ ⇢ ⇢ Automatic Failback After Reboot](#automatic-failback-after-reboot) -* [⇢ ⇢ Client Configuration for NFS via Stunnel](#client-configuration-for-nfs-via-stunnel) -* [⇢ ⇢ ⇢ Configuring Rocky Linux Clients (`r0`, `r1`, `r2`)](#configuring-rocky-linux-clients-r0-r1-r2) -* [⇢ ⇢ ⇢ NFSv4 user mapping config on Rocky](#nfsv4-user-mapping-config-on-rocky) * [⇢ ⇢ ⇢ Testing NFS Mount with Stunnel](#testing-nfs-mount-with-stunnel) * [⇢ ⇢ ⇢ Testing CARP Failover with mounted clients and stale file handles:](#testing-carp-failover-with-mounted-clients-and-stale-file-handles) * [⇢ ⇢ ⇢ Complete Failover Test](#complete-failover-test) diff --git a/gemfeed/2025-08-05-local-coding-llm-with-ollama.md b/gemfeed/2025-08-05-local-coding-llm-with-ollama.md index 3e4a06de..bb8f11a5 100644 --- a/gemfeed/2025-08-05-local-coding-llm-with-ollama.md +++ b/gemfeed/2025-08-05-local-coding-llm-with-ollama.md @@ -155,163 +155,6 @@ aider --model ollama_chat/qwen2.5-coder:14b-instruct [https://aider.chat](https://aider.chat) [https://opencode.ai](https://opencode.ai) -# Local LLM for Coding with Ollama on macOS - -> Published at 2025-08-04T16:43:39+03:00 - -``` - [::] - _| |_ - / o o \ | - | ∆ | <-- Ollama / \ - | \___/ | / \ - \_______/ LLM --> / 30B \ - | | / Qwen3 \ - /| |\ / Coder \ - /_| |_\_________________/ quantised \ -``` - -## Table of Contents - -* [⇢ Local LLM for Coding with Ollama on macOS](#local-llm-for-coding-with-ollama-on-macos) -* [⇢ ⇢ Why Local LLMs?](#why-local-llms) -* [⇢ ⇢ Hardware Considerations](#hardware-considerations) -* [⇢ ⇢ Basic Setup and Manual Code Prompting](#basic-setup-and-manual-code-prompting) -* [⇢ ⇢ ⇢ Installing Ollama and a Model](#installing-ollama-and-a-model) -* [⇢ ⇢ ⇢ Example Usage](#example-usage) -* [⇢ ⇢ Agentic Coding with Aider](#agentic-coding-with-aider) -* [⇢ ⇢ ⇢ Installation](#installation) -* [⇢ ⇢ ⇢ Agentic coding prompt](#agentic-coding-prompt) -* [⇢ ⇢ ⇢ Compilation & Execution](#compilation--execution) -* [⇢ ⇢ ⇢ The code](#the-code) -* [⇢ ⇢ In-Editor Code Completion](#in-editor-code-completion) -* [⇢ ⇢ ⇢ Installation of `lsp-ai`](#installation-of-lsp-ai) -* [⇢ ⇢ ⇢ Helix Configuration](#helix-configuration) -* [⇢ ⇢ ⇢ Code completion in action](#code-completion-in-action) -* [⇢ ⇢ Conclusion](#conclusion) - -With all the AI buzz around coding assistants, and being a bit concerned about being dependent on third-party cloud providers here, I decided to explore the capabilities of local large language models (LLMs) using Ollama. - -Ollama is a powerful tool that brings local AI capabilities directly to your local hardware. By running AI models locally, you can enjoy the benefits of intelligent assistance without relying on cloud services. This document outlines my initial setup and experiences with Ollama, with a focus on coding tasks and agentic coding. - -[https://ollama.com/](https://ollama.com/) - -## Why Local LLMs? - -Using local AI models through Ollama offers several advantages: - -* Data Privacy: Keep your code and data completely private by processing everything locally. -* Cost-Effective: Reduce reliance on expensive cloud API calls. -* Reliability: Works seamlessly even with spotty internet or offline. -* Speed: Avoid network latency and enjoy instant responses while coding. Although I mostly found Ollama slower than commercial LLM providers. However, that may change with the evolution of models and hardware. - -## Hardware Considerations - -Running large language models locally is currently limited by consumer hardware capabilities: - -* GPU Memory: Most consumer-grade GPUs (even in 2025) top out at 16–24GB of VRAM, making it challenging to run larger models like the 30B (30 billion) parameter LLMs (they go up to the 100 billion and more). -* RAM Constraints: On my MacBook Pro with M3 CPU and 36GB RAM, I chose a 14B model (`qwen2.5-coder:14b-instruct`) as it represents a practical balance between capability and resource requirements. - -For reference, here are some key points about running large LLMs locally: - -* Models larger than 30B: I don't even think about running them locally. One (e.g. from Qwen, Deepseek or Kimi K2) with several hundred billion parameters could match the "performance" of commercial LLMs (Claude Sonnet 4, etc). Still, for personal use, the hardware demands are just too high (or temporarily "rent" it via the public cloud?). -* 30B models: Require at least 48GB of GPU VRAM for full inference without quantisation. Currently only feasible on high-end professional GPUs (or an Apple-silicone Mac with enough unified RAM). -* 14B models: Can run with 16-24GB GPU memory (VRAM), suitable for consumer-grade hardware (or use a quantised larger model) -* 7B-13B models: Best fit for mainstream consumer hardware, requiring minimal VRAM and running smoothly on mid-range GPUs, but with limited capabilities compared to larger models and more hallucinations. - -The model I'll be mainly using in this blog post (`qwen2.5-coder:14b-instruct`) is particularly interesting as: - -* `instruct`: Indicates this is the instruction-tuned variant, optimised for diverse tasks including coding -* `coder`: Tells me that this model was trained on a mix of code and text data, making it especially effective for programming assistance - -[https://ollama.com/library/qwen2.5-coder](https://ollama.com/library/qwen2.5-coder) -[https://huggingface.co/Qwen/Qwen2.5-Coder-14B-Instruct](https://huggingface.co/Qwen/Qwen2.5-Coder-14B-Instruct) - -For general thinking tasks, I found `deepseek-r1:14b` to be useful (in the future, I also want to try other `qwen` models here). For instance, I utilised `deepseek-r1:14b` to format this blog post and correct some English errors, demonstrating its effectiveness in natural language processing tasks. Additionally, it has proven invaluable for adding context and enhancing clarity in technical explanations, all while running locally on the MacBook Pro. Admittedly, it was a lot slower than "just using ChatGPT", but still within a minute or so. - -[https://ollama.com/library/deepseek-r1:14b](https://ollama.com/library/deepseek-r1:14b) -[https://huggingface.co/deepseek-ai/DeepSeek-R1](https://huggingface.co/deepseek-ai/DeepSeek-R1) - -A quantised (as mentioned above) LLM which has been converted from high-precision connection (typically 16- or 32-bit floating point) representations to lower-precision formats, such as 8-bit integers. This reduces the overall memory footprint of the model, making it significantly smaller and enabling it to run more efficiently on hardware with limited resources or to allow higher throughput on GPUs and CPUs. The benefits of quantisation include reduced storage and faster inference times due to simpler computations and better memory bandwidth utilisation. However, quantisation can introduce a drop in model accuracy because the lower numerical precision means the model cannot represent parameter values as precisely. In some cases, it may lead to instability or unexpected outputs in specific tasks or edge cases. - -## Basic Setup and Manual Code Prompting - -### Installing Ollama and a Model - -To install Ollama, performed these steps (this assumes that you have already installed Homebrew on your macOS system): - -```sh -brew install ollama -rehash -ollama serve -``` - -Which started up the Ollama server with something like this (the screenshots shows already some requests made): - -[](./local-coding-LLM-with-ollama/ollama-serve.png) - -And then, in a new terminal, I pulled the model with: - -```sh -ollama pull qwen2.5-coder:14b-instruct -``` - -Now, I was ready to go! It wasn't so difficult. Now, let's see how I used this model for coding tasks. - -### Example Usage - -I run the following command to get a Go function for calculating Fibonacci numbers: - -```sh -time echo "Write a function in golang to print out the Nth fibonacci number, \ - only the function without the boilerplate" | ollama run qwen2.5-coder:14b-instruct - -Output: - -func fibonacci(n int) int { - if n <= 1 { - return n - } - a, b := 0, 1 - for i := 2; i <= n; i++ { - a, b = b, a+b - } - return b -} - -Execution Metrics: - -Executed in 4.90 secs fish external - usr time 15.54 millis 0.31 millis 15.24 millis - sys time 19.68 millis 1.02 millis 18.66 millis -``` - -> Note, after having written this blog post, I tried the same with the newer model `qwen3-coder:30b-a3b-q4_K_M` (which "just" came out, and it's a quantised 30B model), and it was much faster: - -``` -Executed in 1.83 secs fish external - usr time 17.82 millis 4.40 millis 13.42 millis - sys time 17.07 millis 1.57 millis 15.50 millis -``` - -[https://ollama.com/library/qwen3-coder:30b-a3b-q4_K_M](https://ollama.com/library/qwen3-coder:30b-a3b-q4_K_M) - -## Agentic Coding with Aider - -### Installation - -Aider is a tool that enables agentic coding by leveraging AI models (also local ones, as in our case). While setting up OpenAI Codex and OpenCode with Ollama proved challenging (those tools either didn't know how to work with the "tools" (the capability to execute external commands or to edit files for example) or didn't connect at all to Ollama for some reason), Aider worked smoothly. - -To get started, the only thing I had to do was to install it via Homebrew, initialise a Git repository, and then start Aider with the Ollama model `ollama_chat/qwen2.5-coder:14b-instruct`: - -```sh -brew install aider -mkdir -p ~/git/aitest && cd ~/git/aitest && git init -aider --model ollama_chat/qwen2.5-coder:14b-instruct -``` - -[https://aider.chat](https://aider.chat) -[https://opencode.ai](https://opencode.ai) [https://github.com/openai/codex](https://github.com/openai/codex) ### Agentic coding prompt diff --git a/gemfeed/2025-08-15-random-weird-things-iii.md b/gemfeed/2025-08-15-random-weird-things-iii.md index 4b7664df..85c19afc 100644 --- a/gemfeed/2025-08-15-random-weird-things-iii.md +++ b/gemfeed/2025-08-15-random-weird-things-iii.md @@ -83,7 +83,7 @@ Resources are rows; columns map to fields; the tool renders YAML and applies it ## 27. SRE means “Sorry…” -An industry joke (or truth?) that SRE stands for “Sorry…”. +An industry joke (or truth?) that SRE (short for Site Reliability Engineer) stands for “Sorry…”. Anecdotes are a good reminder that failure is inevitable and empathy is essential. The best takeaways are about clear communication, graceful degradation, and blameless postmortems. Laughing helps, but guardrails and good on‑call hygiene help even more. diff --git a/gemfeed/DRAFT-kubernetes-with-freebsd-part-7.md b/gemfeed/DRAFT-kubernetes-with-freebsd-part-7.md index e40a4a32..94e45007 100644 --- a/gemfeed/DRAFT-kubernetes-with-freebsd-part-7.md +++ b/gemfeed/DRAFT-kubernetes-with-freebsd-part-7.md @@ -561,569 +561,6 @@ TODO: how to set up the users for the NFSv4 user mapping (same user with same UI Other *BSD-related posts: [2025-07-14 f3s: Kubernetes with FreeBSD - Part 6: Storage](./2025-07-14-f3s-kubernetes-with-freebsd-part-6.md) -# f3s: Kubernetes with FreeBSD - Part 7: First pod deployments - -This is the seventh blog post about the f3s series for self-hosting demands in a home lab. f3s? The "f" stands for FreeBSD, and the "3s" stands for k3s, the Kubernetes distribution used on FreeBSD-based physical machines. - -[2024-11-17 f3s: Kubernetes with FreeBSD - Part 1: Setting the stage](./2024-11-17-f3s-kubernetes-with-freebsd-part-1.md) -[2024-12-03 f3s: Kubernetes with FreeBSD - Part 2: Hardware and base installation](./2024-12-03-f3s-kubernetes-with-freebsd-part-2.md) -[2025-02-01 f3s: Kubernetes with FreeBSD - Part 3: Protecting from power cuts](./2025-02-01-f3s-kubernetes-with-freebsd-part-3.md) -[2025-04-05 f3s: Kubernetes with FreeBSD - Part 4: Rocky Linux Bhyve VMs](./2025-04-05-f3s-kubernetes-with-freebsd-part-4.md) -[2025-05-11 f3s: Kubernetes with FreeBSD - Part 5: WireGuard mesh network](./2025-05-11-f3s-kubernetes-with-freebsd-part-5.md) -[2025-07-14 f3s: Kubernetes with FreeBSD - Part 6: Storage](./2025-07-14-f3s-kubernetes-with-freebsd-part-6.md) - -[](./f3s-kubernetes-with-freebsd-part-1/f3slogo.png) - -## Table of Contents - -* [⇢ f3s: Kubernetes with FreeBSD - Part 7: First pod deployments](#f3s-kubernetes-with-freebsd---part-7-first-pod-deployments) -* [⇢ ⇢ Introduction](#introduction) -* [⇢ ⇢ Updating](#updating) -* [⇢ ⇢ Installing k3s](#installing-k3s) -* [⇢ ⇢ ⇢ Generating `K3S_TOKEN` and starting first k3s node](#generating-k3stoken-and-starting-first-k3s-node) -* [⇢ ⇢ ⇢ Adding the remaining nodes to the cluster](#adding-the-remaining-nodes-to-the-cluster) -* [⇢ ⇢ Test deployments](#test-deployments) -* [⇢ ⇢ ⇢ Test deployment to Kubernetes](#test-deployment-to-kubernetes) -* [⇢ ⇢ ⇢ Test deployment with persistent volume claim](#test-deployment-with-persistent-volume-claim) -* [⇢ ⇢ Make it accessible from the public internet](#make-it-accessible-from-the-public-internet) -* [⇢ ⇢ Failure test](#failure-test) - -## Introduction - -## Updating - -On all three Rocky Linux 9 boxes `r0`, `r1`, and `r2`: - -```sh -dnf update -y -reboot -``` - -On the FreeBSD hosts, upgrading from FreeBSD 14.2 to 14.3-RELEASE, running this on all three hosts `f0`, `f1` and `f2`: - -```sh -paul@f0:~ % doas freebsd-update fetch -paul@f0:~ % doas freebsd-update install -paul@f0:~ % doas reboot -. -. -. -paul@f0:~ % doas freebsd-update -r 14.3-RELEASE upgrade -paul@f0:~ % doas freebsd-update install -paul@f0:~ % doas freebsd-update install -paul@f0:~ % doas reboot -. -. -. -paul@f0:~ % doas freebsd-update install -paul@f0:~ % doas pkg update -paul@f0:~ % doas pkg upgrade -paul@f0:~ % doas reboot -. -. -. -paul@f0:~ % uname -a -FreeBSD f0.lan.buetow.org 14.3-RELEASE FreeBSD 14.3-RELEASE - releng/14.3-n271432-8c9ce319fef7 GENERIC amd64 -``` - -## Installing k3s - -### Generating `K3S_TOKEN` and starting first k3s node - -Generating the k3s token on my Fedora Laptop with `pwgen -n 32` and selected one. And then on all 3 `r` hosts (replace SECRET_TOKEN with the actual secret!! before running the following command) run: - -```sh -[root@r0 ~]# echo -n SECRET_TOKEN > ~/.k3s_token -``` - -The following steps are also documented on the k3s website: - -[https://docs.k3s.io/datastore/ha-embedded](https://docs.k3s.io/datastore/ha-embedded) - -So on `r0` we run: - -```sh -[root@r0 ~]# curl -sfL https://get.k3s.io | K3S_TOKEN=$(cat ~/.k3s_token) \ - sh -s - server --cluster-init --tls-san=r0.wg0.wan.buetow.org -[INFO] Finding release for channel stable -[INFO] Using v1.32.6+k3s1 as release -. -. -. -[INFO] systemd: Starting k3s -``` - -### Adding the remaining nodes to the cluster - -And we run on the other two nodes `r1` and `r2`: - -```sh -[root@r1 ~]# curl -sfL https://get.k3s.io | K3S_TOKEN=$(cat ~/.k3s_token) \ - sh -s - server --server https://r0.wg0.wan.buetow.org:6443 \ - --tls-san=r1.wg0.wan.buetow.org - -[root@r2 ~]# curl -sfL https://get.k3s.io | K3S_TOKEN=$(cat ~/.k3s_token) \ - sh -s - server --server https://r0.wg0.wan.buetow.org:6443 \ - --tls-san=r2.wg0.wan.buetow.org -. -. -. - -``` - -Once done, we've got a 3 node Kubernetes cluster control plane: - -```sh -[root@r0 ~]# kubectl get nodes -NAME STATUS ROLES AGE VERSION -r0.lan.buetow.org Ready control-plane,etcd,master 4m44s v1.32.6+k3s1 -r1.lan.buetow.org Ready control-plane,etcd,master 3m13s v1.32.6+k3s1 -r2.lan.buetow.org Ready control-plane,etcd,master 30s v1.32.6+k3s1 - -[root@r0 ~]# kubectl get pods --all-namespaces -NAMESPACE NAME READY STATUS RESTARTS AGE -kube-system coredns-5688667fd4-fs2jj 1/1 Running 0 5m27s -kube-system helm-install-traefik-crd-f9hgd 0/1 Completed 0 5m27s -kube-system helm-install-traefik-zqqqk 0/1 Completed 2 5m27s -kube-system local-path-provisioner-774c6665dc-jqlnc 1/1 Running 0 5m27s -kube-system metrics-server-6f4c6675d5-5xpmp 1/1 Running 0 5m27s -kube-system svclb-traefik-411cec5b-cdp2l 2/2 Running 0 78s -kube-system svclb-traefik-411cec5b-f625r 2/2 Running 0 4m58s -kube-system svclb-traefik-411cec5b-twrd7 2/2 Running 0 4m2s -kube-system traefik-c98fdf6fb-lt6fx 1/1 Running 0 4m58s -``` - -In order to connect with `kubect` from my Fedora Laptop, I had to copy `/etc/rancher/k3s/k3s.yaml` from `r0` to `~/.kube/config` and then replace the value of the server field with `r0.lan.buetow.org`. kubectl can now manage the cluster. Note this step has to be repeated when we want to connect to another node of the cluster (e.g. when `r0` is down). - -## Test deployments - -### Test deployment to Kubernetes - -Let's create a test namespace: - -```sh -> ~ kubectl create namespace test -namespace/test created - -> ~ kubectl get namespaces -NAME STATUS AGE -default Active 6h11m -kube-node-lease Active 6h11m -kube-public Active 6h11m -kube-system Active 6h11m -test Active 5s - -> ~ kubectl config set-context --current --namespace=test -Context "default" modified. -``` - -And let's also create an apache test pod: - -```sh -> ~ cat <<END > apache-deployment.yaml -# Apache HTTP Server Deployment -apiVersion: apps/v1 -kind: Deployment -metadata: - name: apache-deployment -spec: - replicas: 1 - selector: - matchLabels: - app: apache - template: - metadata: - labels: - app: apache - spec: - containers: - - name: apache - image: httpd:latest - ports: - # Container port where Apache listens - - containerPort: 80 -END - -> ~ kubectl apply -f apache-deployment.yaml -deployment.apps/apache-deployment created - -> ~ kubectl get all -NAME READY STATUS RESTARTS AGE -pod/apache-deployment-5fd955856f-4pjmf 1/1 Running 0 7s - -NAME READY UP-TO-DATE AVAILABLE AGE -deployment.apps/apache-deployment 1/1 1 1 7s - -NAME DESIRED CURRENT READY AGE -replicaset.apps/apache-deployment-5fd955856f 1 1 1 7s -``` - -Let's also create a service: - -```sh -> ~ cat <<END > apache-service.yaml -apiVersion: v1 -kind: Service -metadata: - labels: - app: apache - name: apache-service -spec: - ports: - - name: web - port: 80 - protocol: TCP - # Expose port 80 on the service - targetPort: 80 - selector: - # Link this service to pods with the label app=apache - app: apache -END - -> ~ kubectl apply -f apache-service.yaml -service/apache-service created - -> ~ kubectl get service -NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE -apache-service ClusterIP 10.43.249.165 <none> 80/TCP 4s -``` - -And also an ingress: - -> Note: I've modified the hosts listed in this example after I've published this blog post. This is to ensure that there aren't any bots scarping it. - -```sh -> ~ cat <<END > apache-ingress.yaml - -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: apache-ingress - namespace: test - annotations: - spec.ingressClassName: traefik - traefik.ingress.kubernetes.io/router.entrypoints: web -spec: - rules: - - host: f3s.foo.zone - http: - paths: - - path: / - pathType: Prefix - backend: - service: - name: apache-service - port: - number: 80 - - host: standby.f3s.foo.zone - http: - paths: - - path: / - pathType: Prefix - backend: - service: - name: apache-service - port: - number: 80 - - host: www.f3s.foo.zone - http: - paths: - - path: / - pathType: Prefix - backend: - service: - name: apache-service - port: - number: 80 -END - -> ~ kubectl apply -f apache-ingress.yaml -ingress.networking.k8s.io/apache-ingress created - -> ~ kubectl describe ingress -Name: apache-ingress -Labels: <none> -Namespace: test -Address: 192.168.1.120,192.168.1.121,192.168.1.122 -Ingress Class: traefik -Default backend: <default> -Rules: - Host Path Backends - ---- ---- -------- - f3s.foo.zone - / apache-service:80 (10.42.1.11:80) - standby.f3s.foo.zone - / apache-service:80 (10.42.1.11:80) - www.f3s.foo.zone - / apache-service:80 (10.42.1.11:80) -Annotations: spec.ingressClassName: traefik - traefik.ingress.kubernetes.io/router.entrypoints: web -Events: <none> -``` - -Notes: - -* I've modified the ingress hosts after I'd published this blog post. This is to ensure that there aren't any bots scarping it. -* In the ingress we use plain http (web) for the traefik rule, as all the "production" traefic will routed through a WireGuard tunnel anyway as we will see later. - -So let's test the Apache webserver through the ingress rule: - -```sh -> ~ curl -H "Host: www.f3s.foo.zone" http://r0.lan.buetow.org:80 -<html><body><h1>It works!</h1></body></html> -``` - -### Test deployment with persistent volume claim - -So let's modify the Apache example to serve the `htdocs` directory from the NFS share we created in the previous blog post. We are using the following manifests. The majority of the manifests are the same as before, except for the persistent volume claim and the volume mount in the Apache deployment. - -```sh -> ~ cat <<END > apache-deployment.yaml -# Apache HTTP Server Deployment -apiVersion: apps/v1 -kind: Deployment -metadata: - name: apache-deployment - namespace: test -spec: - replicas: 2 - selector: - matchLabels: - app: apache - template: - metadata: - labels: - app: apache - spec: - containers: - - name: apache - image: httpd:latest - ports: - # Container port where Apache listens - - containerPort: 80 - readinessProbe: - httpGet: - path: / - port: 80 - initialDelaySeconds: 5 - periodSeconds: 10 - livenessProbe: - httpGet: - path: / - port: 80 - initialDelaySeconds: 15 - periodSeconds: 10 - volumeMounts: - - name: apache-htdocs - mountPath: /usr/local/apache2/htdocs/ - volumes: - - name: apache-htdocs - persistentVolumeClaim: - claimName: example-apache-pvc -END - -> ~ cat <<END > apache-ingress.yaml -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: apache-ingress - namespace: test - annotations: - spec.ingressClassName: traefik - traefik.ingress.kubernetes.io/router.entrypoints: web -spec: - rules: - - host: f3s.buetow.org - http: - paths: - - path: / - pathType: Prefix - backend: - service: - name: apache-service - port: - number: 80 - - host: standby.f3s.buetow.org - http: - paths: - - path: / - pathType: Prefix - backend: - service: - name: apache-service - port: - number: 80 - - host: www.f3s.buetow.org - http: - paths: - - path: / - pathType: Prefix - backend: - service: - name: apache-service - port: - number: 80 -END - -> ~ cat <<END > apache-persistent-volume.yaml -apiVersion: v1 -kind: PersistentVolume -metadata: - name: example-apache-pv -spec: - capacity: - storage: 1Gi - volumeMode: Filesystem - accessModes: - - ReadWriteOnce - persistentVolumeReclaimPolicy: Retain - hostPath: - path: /data/nfs/k3svolumes/example-apache-volume-claim - type: Directory ---- -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: example-apache-pvc - namespace: test -spec: - storageClassName: "" - accessModes: - - ReadWriteOnce - resources: - requests: - storage: 1Gi -END - -> ~ cat <<END > apache-service.yaml -apiVersion: v1 -kind: Service -metadata: - labels: - app: apache - name: apache-service - namespace: test -spec: - ports: - - name: web - port: 80 - protocol: TCP - # Expose port 80 on the service - targetPort: 80 - selector: - # Link this service to pods with the label app=apache - app: apache -END -``` - -And let's apply the manifests: - -```sh -> ~ kubectl apply -f apache-persistent-volume.yaml - kubectl apply -f apache-service.yaml - kubectl apply -f apache-deployment.yaml - kubectl apply -f apache-ingress.yaml -``` - -So looking at the deployment, it failed now, as the directory doesn't exist yet on the NFS share (note, we also increased the replica count to 2, so in case one node goes down, that there is already a replica running on another node for faster failover): - -```sh -> ~ kubectl get pods -NAME READY STATUS RESTARTS AGE -apache-deployment-5b96bd6b6b-fv2jx 0/1 ContainerCreating 0 9m15s -apache-deployment-5b96bd6b6b-ax2ji 0/1 ContainerCreating 0 9m15s - -> ~ kubectl describe pod apache-deployment-5b96bd6b6b-fv2jx | tail -n 5 -Events: - Type Reason Age From Message - ---- ------ ---- ---- ------- - Normal Scheduled 9m34s default-scheduler Successfully - assigned test/apache-deployment-5b96bd6b6b-fv2jx to r2.lan.buetow.org - Warning FailedMount 80s (x12 over 9m34s) kubelet MountVolume.SetUp - failed for volume "example-apache-pv" : hostPath type check failed: - /data/nfs/k3svolumes/example-apache is not a directory -``` - -This is on purpose! We need to create the directory on the NFS share first, so let's do that (e.g. on `r0`): - -```sh -[root@r0 ~]# mkdir /data/nfs/k3svolumes/example-apache-volume-claim/ - -[root@r0 ~ ] cat <<END > /data/nfs/k3svolumes/example-apache-volume-claim/index.html -<!DOCTYPE html> -<html> -<head> - <title>Hello, it works</title> -</head> -<body> - <h1>Hello, it works!</h1> - <p>This site is served via a PVC!</p> -</body> -</html> -END -``` - -The `index.html` file was also created to serve content along the way. After deleting the pod, it recreates itself, and the volume mounts correctly: - -```sh -> ~ kubectl delete pod apache-deployment-5b96bd6b6b-fv2jx - -> ~ curl -H "Host: www.f3s.buetow.org" http://r0.lan.buetow.org:80 -<!DOCTYPE html> -<html> -<head> - <title>Hello, it works</title> -</head> -<body> - <h1>Hello, it works!</h1> - <p>This site is served via a PVC!</p> -</body> -</html> -``` - -## Make it accessible from the public internet - -Next, this should be made accessible through the public internet via the `www.f3s.foo.zone` hosts. As a reminder, refer back to part 1 of this series and review the section titled "OpenBSD/relayd to the rescue for external connectivity": - -[f3s: Kubernetes with FreeBSD - Part 1: Setting the stage](./2024-11-17-f3s-kubernetes-with-freebsd-part-1.md) - -> All apps should be reachable through the internet (e.g., from my phone or computer when travelling). For external connectivity and TLS management, I've got two OpenBSD VMs (one hosted by OpenBSD Amsterdam and another hosted by Hetzner) handling public-facing services like DNS, relaying traffic, and automating Let's Encrypt certificates. - -> All of this (every Linux VM to every OpenBSD box) will be connected via WireGuard tunnels, keeping everything private and secure. There will be 6 WireGuard tunnels (3 k3s nodes times two OpenBSD VMs). - -> So, when I want to access a service running in k3s, I will hit an external DNS endpoint (with the authoritative DNS servers being the OpenBSD boxes). The DNS will resolve to the master OpenBSD VM (see my KISS highly-available with OpenBSD blog post), and from there, the relayd process (with a Let's Encrypt certificate—see my Let's Encrypt with OpenBSD and Rex blog post) will accept the TCP connection and forward it through the WireGuard tunnel to a reachable node port of one of the k3s nodes, thus serving the traffic. - -```sh -> ~ curl https://f3s.foo.zone -<html><body><h1>It works!</h1></body></html> - -> ~ curl https://www.f3s.foo.zone -<html><body><h1>It works!</h1></body></html> - -> ~ curl https://standby.f3s.foo.zone -<html><body><h1>It works!</h1></body></html> -``` - -## Failure test - -Shutting down `f0` and let NFS failing over for the Apache content. - - -TODO: openbsd relayd config -TODO: registry howto -TODO: anki-droid deployment -TODO: include k9s screenshot -TODO: include a diagram again? -TODO: increase replica of traefik to 2, persist config surviving reboots -TODO: fix check-mounts script (mountpoint command and stale mounts... differentiate better) -TODO: remove traefic metal lb pods? persist the change? -TODO: use helm charts examples, but only after the initial apache example... -TODO: how to set up the users for the NFSv4 user mapping (same user with same UIDs i ncontainer, on Rocky and on FreeBSD). also ensure, that the `id` command shows all the same. as there may be already entries/duplicates in the passwd files (e.g. tape group, etc) - -Other *BSD-related posts: - -[2025-07-14 f3s: Kubernetes with FreeBSD - Part 6: Storage](./2025-07-14-f3s-kubernetes-with-freebsd-part-6.md) [2025-05-11 f3s: Kubernetes with FreeBSD - Part 5: WireGuard mesh network](./2025-05-11-f3s-kubernetes-with-freebsd-part-5.md) [2025-04-05 f3s: Kubernetes with FreeBSD - Part 4: Rocky Linux Bhyve VMs](./2025-04-05-f3s-kubernetes-with-freebsd-part-4.md) [2025-02-01 f3s: Kubernetes with FreeBSD - Part 3: Protecting from power cuts](./2025-02-01-f3s-kubernetes-with-freebsd-part-3.md) diff --git a/gemfeed/DRAFT-totalrecall.md b/gemfeed/DRAFT-totalrecall.md index bd90e25d..4d1684d1 100644 --- a/gemfeed/DRAFT-totalrecall.md +++ b/gemfeed/DRAFT-totalrecall.md @@ -269,275 +269,4 @@ E-Mail your comments to `paul@nospam.buetow.org` :-) Other related posts are: -# TotalRecall: Learning Bulgarian with AI and Anki - -> Published at 2025-01-22T10:30:00+02:00 - -Learning a new language is hard. Learning Bulgarian? That's a special kind of challenge. The Cyrillic script, the complex grammar, the pronunciation - it all adds up. But what if we could leverage AI to make flashcard creation instant and effortless? That's where TotalRecall comes in. - -[TotalRecall on GitHub](https://github.com/yourusername/totalrecall) - -``` - ╔══════════════════════════════╗ - ║ 🇧🇬 TOTALRECALL 🧠 ║ - ║ ┌─────────┐ ┌─────────┐ ║ - ║ │ ябълка │→ │ 🍎 │ ║ - ║ │ [audio] │ │ "apple" │ ║ - ║ └─────────┘ └─────────┘ ║ - ╚══════════════════════════════╝ -``` - -## Table of Contents - -* [⇢ TotalRecall: Learning Bulgarian with AI and Anki](#totalrecall-learning-bulgarian-with-ai-and-anki) -* [⇢ ⇢ Why TotalRecall exists](#why-totalrecall-exists) -* [⇢ ⇢ ⇢ Learning Bulgarian](#learning-bulgarian) -* [⇢ ⇢ ⇢ Practicing agentic coding](#practicing-agentic-coding) -* [⇢ ⇢ How it works](#how-it-works) -* [⇢ ⇢ ⇢ The AI pipeline](#the-ai-pipeline) -* [⇢ ⇢ ⇢ Why OpenAI for everything?](#why-openai-for-everything) -* [⇢ ⇢ The science of memorable flashcards](#the-science-of-memorable-flashcards) -* [⇢ ⇢ ⇢ No English on the front](#no-english-on-the-front) -* [⇢ ⇢ ⇢ The power of personal connection](#the-power-of-personal-connection) -* [⇢ ⇢ ⇢ Sound comes first](#sound-comes-first) -* [⇢ ⇢ ⇢ Images over translations](#images-over-translations) -* [⇢ ⇢ ⇢ IPA for precision](#ipa-for-precision) -* [⇢ ⇢ Spaced repetition: The secret sauce](#spaced-repetition-the-secret-sauce) -* [⇢ ⇢ ⇢ Start small, stay consistent](#start-small-stay-consistent) -* [⇢ ⇢ ⇢ Review first, add new cards second](#review-first-add-new-cards-second) -* [⇢ ⇢ ⇢ Trust the algorithm](#trust-the-algorithm) -* [⇢ ⇢ ⇢ Quality over quantity](#quality-over-quantity) -* [⇢ ⇢ The technical bits](#the-technical-bits) -* [⇢ ⇢ Agentic coding insights](#agentic-coding-insights) -* [⇢ ⇢ ⇢ Clear communication is crucial](#clear-communication-is-crucial) -* [⇢ ⇢ ⇢ AI excels at boilerplate and testing](#ai-excels-at-boilerplate-and-testing) -* [⇢ ⇢ ⇢ The scaling challenge](#the-scaling-challenge) -* [⇢ ⇢ ⇢ Code duplication becomes a real problem](#code-duplication-becomes-a-real-problem) -* [⇢ ⇢ ⇢ Tests are your safety net](#tests-are-your-safety-net) -* [⇢ ⇢ ⇢ The context window problem](#the-context-window-problem) -* [⇢ ⇢ My learning workflow](#my-learning-workflow) -* [⇢ ⇢ ⇢ Morning routine](#morning-routine) -* [⇢ ⇢ ⇢ Encountering new words](#encountering-new-words) -* [⇢ ⇢ ⇢ Weekly maintenance](#weekly-maintenance) -* [⇢ ⇢ Future plans](#future-plans) -* [⇢ ⇢ Tips for language learners](#tips-for-language-learners) -* [⇢ ⇢ ⇢ Focus on frequency](#focus-on-frequency) -* [⇢ ⇢ ⇢ Use memory palaces](#use-memory-palaces) -* [⇢ ⇢ ⇢ Study before sleep](#study-before-sleep) -* [⇢ ⇢ ⇢ Embrace the mess](#embrace-the-mess) -* [⇢ ⇢ Try it yourself](#try-it-yourself) - -## Why TotalRecall exists - -Two motivations drove me to create this tool: - -### Learning Bulgarian - -I've been fascinated by the Bulgarian language for a while now. It's the oldest written Slavic language, and Sofia has become quite the tech hub. But finding good learning materials? That's tough. Most apps focus on the big languages - Spanish, French, German. Bulgarian gets the short end of the stick. - -AnkiDroid has been my go-to for spaced repetition learning. It's powerful, customizable, and works offline. But creating cards manually? That's tedious. Type the word, find an image, record audio, format everything... By the time you've made 10 cards, you're exhausted. - -### Practicing agentic coding - -The second reason is more technical. I wanted to explore agentic coding - letting AI assistants help write and refactor code. TotalRecall became my playground for this experiment. Could I build something useful while learning how to effectively collaborate with AI coding assistants? - -Turns out, yes. The combination of human creativity and AI assistance is powerful. I set the architecture, made design decisions, and the AI helped with implementation details, test writing, and refactoring. - -## How it works - -TotalRecall is beautifully simple: - -```bash -totalrecall "ябълка" -``` - -That's it. One command, and you get a complete flashcard with everything you need. But there's sophisticated AI magic happening behind the scenes. - -### The AI pipeline - -When you run that command, TotalRecall orchestrates multiple OpenAI API calls: - -1. **Translation** - Bidirectional translation (Bulgarian ↔ English) to understand the word's meaning -2. **Phonetic transcription** - IPA notation for precise pronunciation guidance -3. **Scene description** - AI generates a culturally appropriate scene description for the image -4. **Image generation** - DALL-E creates a memorable visual based on the scene description -5. **Audio synthesis** - High-quality TTS pronunciation that can be regenerated with different voices - -All this happens in seconds. The result? A rich, multi-sensory flashcard that engages visual, auditory, and linguistic memory systems. - -### Why OpenAI for everything? - -I could have used Google Translate for translations, or pulled IPA from Wiktionary. But OpenAI's models understand context. When you input "банка", it knows whether you mean "bank" (financial) or "jar" based on usage patterns. The scene descriptions are culturally aware - Bulgarian bread looks different from American bread, and the AI knows this. - -## The science of memorable flashcards - -After reading extensively about language learning and memory techniques, I've built TotalRecall to create cards that stick. Here's why our approach works: - -### No English on the front - -The cards show only Bulgarian text and images - no English translations on the front. This forces your brain to recall meaning from context and imagery, creating stronger neural pathways. When you see "ябълка" with an apple image, your brain learns to connect the Bulgarian word directly to the concept, not to the English word "apple." - -### The power of personal connection - -The best flashcards include personal context. While TotalRecall generates generic images, I recommend adding your own notes about where you first encountered the word. Did you see "хляб" (bread) at a Bulgarian bakery? Add that story. Personal connections make memories stick. So at will, a custom image prompt (not AI generated) can be specified. - -### Sound comes first - -Native pronunciation from day one is crucial. That's why every card includes audio. Your brain needs to hear the rhythm and melody of Bulgarian, not your English-accented approximation. The OpenAI voices aren't perfect, but they're leagues better than text-to-speech engines of the past. Plus, you can regenerate audio with different voices if one doesn't sound quite right. - -### Images over translations - -A picture of bread teaches "хляб" better than the word "bread" ever could. Images bypass linguistic processing and create direct conceptual links. DALL-E generates contextually appropriate images - Bulgarian bread looks different from Wonder Bread, and these cultural nuances matter. - -### IPA for precision - -The phonetic transcriptions are gold for pronunciation. Bulgarian has sounds that don't exist in English. The IPA shows you exactly where to place your tongue, how to shape your lips. It's the difference between sounding foreign and sounding fluent. - -## Spaced repetition: The secret sauce - -Anki's algorithm is based on the spacing effect - we remember things better when we review them at increasing intervals. Here's how to maximize it: - -### Start small, stay consistent - -Don't add 100 words on day one. Start with 10-15 new cards daily. Consistency beats intensity. Your brain needs time to consolidate memories during sleep. - -### Review first, add new cards second - -Always clear your review queue before adding new cards. Reviews are where the real learning happens. New cards are just seeds - reviews make them grow. - -### Trust the algorithm - -When Anki says to review a card in 4 months, trust it. The urge to over-review is strong, but it actually weakens memory formation. Let your brain struggle a bit - that's where learning happens. - -### Quality over quantity - -One well-made card beats ten mediocre ones. TotalRecall ensures quality with: -- Clear, native audio with regeneration options -- Relevant, memorable images from scene-aware descriptions -- IPA transcriptions for pronunciation precision -- Clean, distraction-free formatting - -## The technical bits - -Written in Go because I wanted something fast and portable. The architecture is clean: - -``` -internal/ -├── audio/ # OpenAI TTS integration -├── image/ # DALL-E image generation -├── anki/ # Card formatting -├── phonetic/ # IPA transcription fetching -├── translation/ # Bidirectional translation -└── config/ # YAML configuration -``` - -Each package has a single responsibility. The audio package doesn't know about images. The image package doesn't know about Anki. Clean interfaces everywhere. - -## Agentic coding insights - -Working with AI assistants taught me several valuable lessons: - -### Clear communication is crucial - -Vague requests get vague results. "Make it better" doesn't work. "Refactor this 80-line function into smaller functions, each handling one responsibility" does. The AI needs specific, actionable instructions. - -### AI excels at boilerplate and testing - -Writing comprehensive test suites? Perfect AI task. Implementing error handling patterns? Also great. Creative architecture decisions? Still very much a human job. The AI is your implementation partner, not your architect. - -### The scaling challenge - -Here's the hard truth about agentic coding: it gets exponentially harder as your codebase grows. When TotalRecall was 500 lines, the AI could keep everything in context. At 2000 lines? Not so much. - -Features start colliding in unexpected ways. You add batch processing, and suddenly the GUI breaks because it assumes single-word input. You change the default output directory, and it updates in the GUI but not in the CLI batch mode. The AI doesn't see these connections because it can't hold your entire codebase in memory. - -### Code duplication becomes a real problem - -The AI tends to solve problems locally. Need to validate Bulgarian input? It'll write a validation function right where you need it. Need it again elsewhere? It'll write another one. Before you know it, you have three different ways to validate Cyrillic text. - -This isn't the AI being dumb - it's optimizing for the local context you've given it. The burden of architectural consistency falls on you, the human. - -### Tests are your safety net - -The larger the codebase, the more critical comprehensive tests become. Every time the AI touches code, it might break something three files away. Without tests, you won't know until a user complains. - -My rule: before any AI-assisted refactoring, ensure test coverage. The AI is great at writing tests, so use it! Have it write tests for existing code before modifying anything. Then, when it inevitably breaks something, you'll know immediately. - -### The context window problem - -Modern AI assistants have impressive context windows, but they're not infinite. As TotalRecall grew, I had to become strategic about what context to provide. The entire codebase? Too much. Just the current file? Too little. - -The sweet spot: provide the interface definitions, the specific module you're working on, and any directly dependent code. Let the AI know about the broader architecture through comments and documentation, not by dumping everything into context. - -So after every feature, clear the context window and/or compact it to start fresh. - -## My learning workflow - -Here's how I use TotalRecall in practice: - -### Morning routine - -* Review all due cards in Anki (usually 50-100) -* which includes the review of failed cards -* Add 10-15 new words I encountered yesterday - -### Encountering new words - -When I find a new Bulgarian word (in articles, videos, conversations): - -1. Immediately run `totalrecall "word"` -2. Add personal context in Anki notes -3. Tag it with source (e.g., #news, #conversation) - -### Weekly maintenance -- Delete cards for words I'll never use -- Suspend cards I've truly mastered -- Adjust ease factors for consistently hard cards - -## Future plans - -TotalRecall already packs a lot of features, but I'm planning more: -- Batch processing for word lists -- Support for phrases and sentences -- Grammar pattern recognition -- Integration with Bulgarian dictionaries -- Automatic difficulty scoring based on word frequency -- Multiple image generation options per word -- Voice selection preferences per word - -But the real goal? Building a comprehensive Bulgarian deck for AnkiDroid. One command at a time, one word at a time. - -## Tips for language learners - -### Focus on frequency -Learn the most common 1000 words first. In any language, the top 1000 words cover ~80% of everyday conversation. TotalRecall will eventually include frequency data to help prioritize. - -### Use memory palaces -Assign Bulgarian words to locations in your home. Put "хладилник" (refrigerator) on your actual fridge. Spatial memory is incredibly powerful. - -### Study before sleep -Review your hardest cards right before bed. Your brain consolidates memories during sleep, especially from the last hour before sleeping. - -### Embrace the mess -Language learning is messy. You'll mix up cases, forget words you "knew" yesterday, and butcher pronunciation. That's normal. TotalRecall makes it easy to try again tomorrow. - -## Try it yourself - -If you're learning Bulgarian (or want to experiment with agentic coding), give TotalRecall a spin: - -```bash -go install github.com/yourusername/totalrecall@latest -export OPENAI_API_KEY="your-key" -totalrecall "котка" # cat -totalrecall "куче" # dog -totalrecall "вода" # water -``` - -Learning languages should be fun, not tedious. Let's make better tools. - -E-Mail your comments to `paul@nospam.buetow.org` :-) - -Other related posts are: - - [Back to the main site](../) @@ -1,6 +1,6 @@ # Hello! -> This site was generated at 2025-08-14T23:22:50+03:00 by `Gemtexter` +> This site was generated at 2025-08-14T23:30:12+03:00 by `Gemtexter` Welcome to the foo.zone! diff --git a/notes/97-things-every-sre-should-know.md b/notes/97-things-every-sre-should-know.md index a5797a03..2d20a19a 100644 --- a/notes/97-things-every-sre-should-know.md +++ b/notes/97-things-every-sre-should-know.md @@ -16,24 +16,6 @@ These are my personal book notes of Emil Stolarsky's and Jaime Woo's "97 Things * [⇢ ⇢ Runbooks](#runbooks) * [⇢ ⇢ Alerts per shift](#alerts-per-shift) * [⇢ ⇢ Balancing velocity](#balancing-velocity) -* # "97 Things Every SRE Should Know" book notes - -These are my personal book notes of Emil Stolarsky's and Jaime Woo's "97 Things Every SRE Should Know". They are for myself, but I hope they might be useful to you too. - -## Table of Contents - -* [⇢ "97 Things Every SRE Should Know" book notes](#97-things-every-sre-should-know-book-notes) -* [⇢ ⇢ Introduction](#introduction) -* [⇢ ⇢ Observability](#observability) -* [⇢ ⇢ The ancient art of writing things down](#the-ancient-art-of-writing-things-down) -* [⇢ ⇢ The teams health](#the-teams-health) -* [⇢ ⇢ Sharing responsibilities](#sharing-responsibilities) -* [⇢ ⇢ The roles and the solo SRE](#the-roles-and-the-solo-sre) -* [⇢ ⇢ Being customer-focused](#being-customer-focused) -* [⇢ ⇢ Don't have all the answers](#don-t-have-all-the-answers) -* [⇢ ⇢ Runbooks](#runbooks) -* [⇢ ⇢ Alerts per shift](#alerts-per-shift) -* [⇢ ⇢ Balancing velocity](#balancing-velocity) * [⇢ ⇢ The power in knowing how to be self-sufficient](#the-power-in-knowing-how-to-be-self-sufficient) * [⇢ ⇢ Prioritize towards the overall reliability goal](#prioritize-towards-the-overall-reliability-goal) * [⇢ ⇢ The quiet time vs the burnout](#the-quiet-time-vs-the-burnout) diff --git a/notes/career-guide-and-soft-skills.md b/notes/career-guide-and-soft-skills.md index eab91021..27358a82 100644 --- a/notes/career-guide-and-soft-skills.md +++ b/notes/career-guide-and-soft-skills.md @@ -37,45 +37,6 @@ These notes are of two books by "John Sommez" I found helpful. I also added some * [⇢ Personal brand](#personal-brand) * [⇢ ⇢ Market yourself](#market-yourself) * [⇢ ⇢ Networking](#networking) -* # "Software Developmers Career Guide and Soft Skills" book notes - -> Published at 2023-07-17T04:56:20+03:00 - -These notes are of two books by "John Sommez" I found helpful. I also added some of my own keypoints to it. These notes are mainly for my own use, but you might find them helpful, too. - -``` - ,.......... .........., - ,..,' '.' ',.., - ,' ,' : ', ', - ,' ,' : ', ', - ,' ,' : ', ', - ,' ,'............., : ,.............', ', -,' '............ '.' ............' ', - '''''''''''''''''';''';'''''''''''''''''' - ''' -``` - -## Table of Contents - -* [⇢ "Software Developmers Career Guide and Soft Skills" book notes](#software-developmers-career-guide-and-soft-skills-book-notes) -* [⇢ ⇢ Improve](#improve) -* [⇢ ⇢ ⇢ Always learn new things](#always-learn-new-things) -* [⇢ ⇢ ⇢ Set goals](#set-goals) -* [⇢ ⇢ ⇢ Ratings](#ratings) -* [⇢ ⇢ ⇢ Promotions](#promotions) -* [⇢ ⇢ ⇢ Finish things](#finish-things) -* [⇢ ⇢ Expand the empire](#expand-the-empire) -* [⇢ ⇢ Be pragmatic and also manage your time](#be-pragmatic-and-also-manage-your-time) -* [⇢ ⇢ ⇢ The quota system](#the-quota-system) -* [⇢ ⇢ ⇢ Don't waste time](#don-t-waste-time) -* [⇢ ⇢ ⇢ Habits](#habits) -* [⇢ Work-life balance](#work-life-balance) -* [⇢ ⇢ Mental health](#mental-health) -* [⇢ ⇢ Physical health](#physical-health) -* [⇢ ⇢ No drama](#no-drama) -* [⇢ Personal brand](#personal-brand) -* [⇢ ⇢ Market yourself](#market-yourself) -* [⇢ ⇢ Networking](#networking) * [⇢ ⇢ Public speaking](#public-speaking) * [⇢ New job](#new-job) * [⇢ ⇢ For the interview](#for-the-interview) diff --git a/notes/implementing-service-level-objectives.md b/notes/implementing-service-level-objectives.md index acdd9324..899a4722 100644 --- a/notes/implementing-service-level-objectives.md +++ b/notes/implementing-service-level-objectives.md @@ -11,19 +11,6 @@ These are my personal book notes of Alex Hidalgo's "Implementing Service Level O * [⇢ ⇢ ⇢ The Three Phases of SLO Implementation](#the-three-phases-of-slo-implementation) * [⇢ ⇢ ⇢ Phase 1: Defining SLOs](#phase-1-defining-slos) * [⇢ ⇢ ⇢ Phase 2: Collecting SLIs](#phase-2-collecting-slis) -* # "Implementing Service Level Objectives" book notes - -These are my personal book notes of Alex Hidalgo's "Implementing Service Level Objectives: A Pratical Guide to SLIs, SLOs, and Error Budgets" They are for myself, but I hope they might be useful to you too. - -## Table of Contents - -* [⇢ "Implementing Service Level Objectives" book notes](#implementing-service-level-objectives-book-notes) -* [⇢ ⇢ Introduction](#introduction) -* [⇢ ⇢ Importance of Documentation](#importance-of-documentation) -* [⇢ ⇢ Implementation Phases](#implementation-phases) -* [⇢ ⇢ ⇢ The Three Phases of SLO Implementation](#the-three-phases-of-slo-implementation) -* [⇢ ⇢ ⇢ Phase 1: Defining SLOs](#phase-1-defining-slos) -* [⇢ ⇢ ⇢ Phase 2: Collecting SLIs](#phase-2-collecting-slis) * [⇢ ⇢ ⇢ Phase 3: Utilizing SLOs](#phase-3-utilizing-slos) * [⇢ ⇢ Best Practices](#best-practices) diff --git a/notes/joy-on-demand.md b/notes/joy-on-demand.md index 986e2520..db98f55c 100644 --- a/notes/joy-on-demand.md +++ b/notes/joy-on-demand.md @@ -18,26 +18,6 @@ * [⇢ ⇢ Confidence and Equanimity](#confidence-and-equanimity) * [⇢ ⇢ Resilience and Growth](#resilience-and-growth) * [⇢ ⇢ Experiencing Joy](#experiencing-joy) -* # "Joy On Domand" book notes - -## Table of Contents - -* [⇢ "Joy On Domand" book notes](#joy-on-domand-book-notes) -* [⇢ ⇢ Mindfulness and Joy](#mindfulness-and-joy) -* [⇢ ⇢ Joy and Happiness](#joy-and-happiness) -* [⇢ ⇢ Training Joy: Easing, Inclining, and Uplifting](#training-joy-easing-inclining-and-uplifting) -* [⇢ ⇢ Joy and Pain](#joy-and-pain) -* [⇢ ⇢ Path to Happiness](#path-to-happiness) -* [⇢ ⇢ Difference Between Joy and Happiness](#difference-between-joy-and-happiness) -* [⇢ ⇢ The Spiral of Joy and Practice](#the-spiral-of-joy-and-practice) -* [⇢ ⇢ Inner Peace and Pain](#inner-peace-and-pain) -* [⇢ ⇢ Benefits of Mind Training](#benefits-of-mind-training) -* [⇢ ⇢ Practicing Mind Training](#practicing-mind-training) -* [⇢ ⇢ Creativity and Mindfulness](#creativity-and-mindfulness) -* [⇢ ⇢ The Joyful Mind and Creativity](#the-joyful-mind-and-creativity) -* [⇢ ⇢ Confidence and Equanimity](#confidence-and-equanimity) -* [⇢ ⇢ Resilience and Growth](#resilience-and-growth) -* [⇢ ⇢ Experiencing Joy](#experiencing-joy) * [⇢ ⇢ Compassion and Joy](#compassion-and-joy) * [⇢ ⇢ Meditation and Mindfulness](#meditation-and-mindfulness) * [⇢ ⇢ The Joy of Exercise](#the-joy-of-exercise) diff --git a/notes/mind-management.md b/notes/mind-management.md index 1b6f35c2..80dcd6ac 100644 --- a/notes/mind-management.md +++ b/notes/mind-management.md @@ -113,121 +113,6 @@ Other book notes of mine are: [2025-06-07 "A Monk's Guide to Happiness" book notes](./a-monks-guide-to-happiness.md) [2025-04-19 "When: The Scientific Secrets of Perfect Timing" book notes](./when.md) [2024-10-24 "Staff Engineer" book notes](./staff-engineer.md) -# "Mind Management" book notes - -> Published at 2023-11-11T22:21:47+02:00 - -These are my personal takeaways after reading "Mind Management" by David Kadavy. Note that the book contains much more knowledge wisdom and that these notes only contain points I personally found worth writing down. This is mainly for my own use, but you might find it helpful too. - -``` - ,.......... .........., - ,..,' '.' ',.., - ,' ,' : ', ', - ,' ,' : ', ', - ,' ,' : ', ', - ,' ,'............., : ,.............', ', -,' '............ '.' ............' ', - '''''''''''''''''';''';'''''''''''''''''' - ''' -``` - -## Table of Contents - -* [⇢ "Mind Management" book notes](#mind-management-book-notes) -* [⇢ ⇢ It's not about time management](#it-s-not-about-time-management) -* [⇢ ⇢ Empty slots in the calendar](#empty-slots-in-the-calendar) -* [⇢ ⇢ When you safe time...](#when-you-safe-time) -* [⇢ ⇢ Follow your mood](#follow-your-mood) -* [⇢ ⇢ Boosting creativity](#boosting-creativity) -* [⇢ ⇢ The right mood for the task at hand](#the-right-mood-for-the-task-at-hand) -* [⇢ ⇢ Creativity hacks](#creativity-hacks) -* [⇢ ⇢ Planning and strategizing](#planning-and-strategizing) -* [⇢ ⇢ Fake it until you make it. ](#fake-it-until-you-make-it-) - -## It's not about time management - -Productivity isn't about time management - it's about mind management. When you put a lot of effort into something, there are: - -* The point of diminishing returns -* The point of negative return - -## Empty slots in the calendar - -If we do more things in less time and use all possible slots, speed read, etc., we are more productive. But in reality, that's not the entire truth. You also exchange one thing against everything else.... You cut out too much from your actual life. - -## When you safe time... - -...keep it. - -* stare out of the window; that's good for you. -* Creative thinking needs space. It will pay dividends tomorrow. -* You will be rewarded with the "Eureka effect" - a sudden new insight. - -## Follow your mood - -Ask yourself: what is my mood now? We never have the energy to do anything, so the better strategy is to follow your current mode and energy. E.g.: - -* Didn't sleep enough today? Then, do simple, non-demanding tasks at work -* Had a great sleep, and there is even time before work starts? Pull in a workout... - -## Boosting creativity - -The morning without coffee is a gift for creativity, but you often get distracted. Minimize distractions, too. I have no window to stare out but a plain blank wall. - -* The busier you are, the less creative you will be. -* Event time (divergent thinking) vs clock time (convergent thinking) -* Don't race with time but walk alongside it as rough time lines. -* Don't judge every day after the harvest, but the seed you lay - -## The right mood for the task at hand - -We need to try many different combinations. Limiting ourselves and trying too hard makes us frustrated and burn out. Creativity requires many iterations. - -I can only work according to my available brain power. - -I can also change my mood according to what needs improvement. Just imagine the last time you were in that mood and then try to get into it. It can take several tries to hit a working mood. Try to replicate that mental state. This can also be by location or by another habit, e.g. by a beer. - -Once you are in a mental state, don't try to change it. It will take a while for your brain to switch to a completely different state. - -Week of want. For a week, only do what you want and not what you must do. Your ideas will get much more expansive. - -It gives you pleasure and is in a good mood. This increases creativity if you do what you want to do. - -## Creativity hacks - -* Coffee can cause anxiety. -* Take phentermine with coffee to take off the edge and have a relaxed focus -* Green tea, which tastes sweet plus supplement boost. -* Also wine. But be careful with alcohol. Don't drink a whole bottle. -* Have a machine without distractions and internet access for writing. -* Go to open spaces for creativity. -* Go to closed spaces for polishing. - -## Planning and strategizing - -Minds work better in sprints and not in marathons. Have a weekly plan, not a daily one. - -* Alternating incubation to avoid blocks. -* Build on systems that use chaos for growth, e.g. unplanned disasters. -* Things don't go after the plan is the plan. Be anti-fragile. - -Organize by mental state. In the time management context, the mental state doesn't exist. You schedule as many things as possible by project. In the mind management context, mental state is everything. You could prepare by mental state and not by assignment. - -You could schedule exploratory tasks when you are under grief. Sound systems should create slack for creativity. Plan only for a few minutes. - -## Fake it until you make it. - -* E.g. act calm if you want to be calm. -* Talk slowly and deepen your voice a bit to appear more confident. You will also become more confident. -* Also, use power positions for better confidence. - -E-Mail your comments to `paul@nospam.buetow.org` :-) - -Other book notes of mine are: - -[2025-06-07 "A Monk's Guide to Happiness" book notes](./a-monks-guide-to-happiness.md) -[2025-04-19 "When: The Scientific Secrets of Perfect Timing" book notes](./when.md) -[2024-10-24 "Staff Engineer" book notes](./staff-engineer.md) [2024-07-07 "The Stoic Challenge" book notes](./the-stoic-challenge.md) [2024-05-01 "Slow Productivity" book notes](./slow-productivity.md) [2023-11-11 "Mind Management" book notes (You are currently reading this)](./mind-management.md) diff --git a/notes/search-inside-yourself.md b/notes/search-inside-yourself.md index 522befb2..b5659897 100644 --- a/notes/search-inside-yourself.md +++ b/notes/search-inside-yourself.md @@ -22,30 +22,6 @@ * [⇢ ⇢ ⇢ High-Resolution Perception](#high-resolution-perception) * [⇢ ⇢ Mindfulness in Two Minutes](#mindfulness-in-two-minutes) * [⇢ ⇢ ⇢ Meditation is Exercise](#meditation-is-exercise) -* # "Search Inside Yourself" book notes - -> Last updated 23.7.2024 - -## Table of Contents - -* [⇢ "Search Inside Yourself" book notes](#search-inside-yourself-book-notes) -* [⇢ ⇢ How to Master Your Mind in 100 Minutes](#how-to-master-your-mind-in-100-minutes) -* [⇢ ⇢ Mindfulness and Personal Development](#mindfulness-and-personal-development) -* [⇢ ⇢ Three Steps of "Search Inside Yourself"](#three-steps-of-search-inside-yourself) -* [⇢ ⇢ Even an Engineer Can Thrive on Emotional Intelligence](#even-an-engineer-can-thrive-on-emotional-intelligence) -* [⇢ ⇢ Emotional Intelligence Enables Three Important Skills](#emotional-intelligence-enables-three-important-skills) -* [⇢ ⇢ ⇢ 1. Stellar Work Performance](#1-stellar-work-performance) -* [⇢ ⇢ ⇢ 2. Outstanding Leadership](#2-outstanding-leadership) -* [⇢ ⇢ ⇢ 3. The Ability to Create the Conditions for Happiness](#3-the-ability-to-create-the-conditions-for-happiness) -* [⇢ ⇢ Attention Training](#attention-training) -* [⇢ ⇢ ⇢ Train Attention](#train-attention) -* [⇢ ⇢ Self-Knowledge and Self-Mastery](#self-knowledge-and-self-mastery) -* [⇢ ⇢ Creating Useful Mental Habits](#creating-useful-mental-habits) -* [⇢ ⇢ Optimize Thyself](#optimize-thyself) -* [⇢ ⇢ Train at the Level of Physiology](#train-at-the-level-of-physiology) -* [⇢ ⇢ ⇢ High-Resolution Perception](#high-resolution-perception) -* [⇢ ⇢ Mindfulness in Two Minutes](#mindfulness-in-two-minutes) -* [⇢ ⇢ ⇢ Meditation is Exercise](#meditation-is-exercise) * [⇢ ⇢ ⇢ Sustaining Your Practice](#sustaining-your-practice) * [⇢ ⇢ Breathing as if Your Life Depends on It](#breathing-as-if-your-life-depends-on-it) * [⇢ ⇢ Happiness is the Default State of Mind](#happiness-is-the-default-state-of-mind) diff --git a/notes/site-reliability-engineering.md b/notes/site-reliability-engineering.md index 2785f3d5..9e5773e3 100644 --- a/notes/site-reliability-engineering.md +++ b/notes/site-reliability-engineering.md @@ -5,13 +5,6 @@ These are my personal book notes of Niall Richard Murphy's "Site Reliability Eng ## Table of Contents * [⇢ "Site Reliability Engineering" book notes](#site-reliability-engineering-book-notes) -* # "Site Reliability Engineering" book notes - -These are my personal book notes of Niall Richard Murphy's "Site Reliability Engineering: How Google Runs Production systems". They are for myself, but I hope they might be useful to you too. - -## Table of Contents - -* [⇢ "Site Reliability Engineering" book notes](#site-reliability-engineering-book-notes) * [⇢ ⇢ Key Concepts in SRE](#key-concepts-in-sre) * [⇢ ⇢ ⇢ Role of an SRE:](#role-of-an-sre) * [⇢ ⇢ ⇢ Error Budget](#error-budget) diff --git a/notes/staff-engineer.md b/notes/staff-engineer.md index 4309d37d..41b4525a 100644 --- a/notes/staff-engineer.md +++ b/notes/staff-engineer.md @@ -24,32 +24,6 @@ These are my personal takeaways after reading "Staff Engineer" by Will Larson. N * [⇢ ⇢ Breadth and Depth of Knowledge](#breadth-and-depth-of-knowledge) * [⇢ ⇢ Mentorship and Sponsorship](#mentorship-and-sponsorship) * [⇢ ⇢ Managing Up and Across](#managing-up-and-across) -* # "Staff Engineer" book notes - -> Published at 2024-10-24T20:57:44+03:00 - -These are my personal takeaways after reading "Staff Engineer" by Will Larson. Note that the book contains much more knowledge wisdom and that these notes only contain points I personally found worth writing down. This is mainly for my own use, but you might find it helpful too. - -``` - ,.......... .........., - ,..,' '.' ',.., - ,' ,' : ', ', - ,' ,' : ', ', - ,' ,' : ', ', - ,' ,'............., : ,.............', ', -,' '............ '.' ............' ', - '''''''''''''''''';''';'''''''''''''''''' - ''' -``` - -## Table of Contents - -* [⇢ "Staff Engineer" book notes](#staff-engineer-book-notes) -* [⇢ ⇢ The Four Archetypes of a Staff Engineer](#the-four-archetypes-of-a-staff-engineer) -* [⇢ ⇢ Influence and Impact over Authority](#influence-and-impact-over-authority) -* [⇢ ⇢ Breadth and Depth of Knowledge](#breadth-and-depth-of-knowledge) -* [⇢ ⇢ Mentorship and Sponsorship](#mentorship-and-sponsorship) -* [⇢ ⇢ Managing Up and Across](#managing-up-and-across) * [⇢ ⇢ Strategic Thinking](#strategic-thinking) * [⇢ ⇢ Emotional Intelligence](#emotional-intelligence) * [⇢ ⇢ Navigating Ambiguity](#navigating-ambiguity) diff --git a/notes/the-power-of-neuroplasticity.md b/notes/the-power-of-neuroplasticity.md index cd44d7fe..0b1a115c 100644 --- a/notes/the-power-of-neuroplasticity.md +++ b/notes/the-power-of-neuroplasticity.md @@ -10,18 +10,6 @@ These notes capture key points from "The Power of Neuroplasticity" by Shad Helms * [⇢ ⇢ Choose the friends you spend time woth carefully](#choose-the-friends-you-spend-time-woth-carefully) * [⇢ ⇢ Beware of the brain's autopilot](#beware-of-the-brain-s-autopilot) * [⇢ ⇢ Cultiate a positive mindset](#cultiate-a-positive-mindset) -* # "The Power of Neuroplasticity" book notes - -These notes capture key points from "The Power of Neuroplasticity" by Shad Helmstetter. These are for my personal use, but you might find them useful, too. - -## Table of Contents - -* [⇢ "The Power of Neuroplasticity" book notes](#the-power-of-neuroplasticity-book-notes) -* [⇢ ⇢ Your thoughts can influence changes in your brain](#your-thoughts-can-influence-changes-in-your-brain) -* [⇢ ⇢ Wire on what we can do and not what we can't](#wire-on-what-we-can-do-and-not-what-we-can-t) -* [⇢ ⇢ Choose the friends you spend time woth carefully](#choose-the-friends-you-spend-time-woth-carefully) -* [⇢ ⇢ Beware of the brain's autopilot](#beware-of-the-brain-s-autopilot) -* [⇢ ⇢ Cultiate a positive mindset](#cultiate-a-positive-mindset) * [⇢ ⇢ The monkey mind](#the-monkey-mind) * [⇢ ⇢ Wiring good attitudes](#wiring-good-attitudes) * [⇢ ⇢ Techniques to train the brain](#techniques-to-train-the-brain) diff --git a/notes/when.md b/notes/when.md index 490d5b25..d7af1e0f 100644 --- a/notes/when.md +++ b/notes/when.md @@ -18,26 +18,6 @@ __ejm\___/________dwb`---`______________________ ## Table of Contents -* # "When: The Scientific Secrets of Perfect Timing" book notes - -> Published at 2025-04-19T10:26:05+03:00 - -These are my personal book notes from Daniel Pink's "When: The Scientific Secrets of Perfect Timing." They are for me, but I hope they might be useful to you too. - -``` - __ - (`/\ - `=\/\ __...--~~~~~-._ _.-~~~~~--...__ - `=\/\ \ / \\ - `=\/ V \\ - //_\___--~~~~~~-._ | _.-~~~~~~--...__\\ - // ) (..----~~~~._\ | /_.~~~~----.....__\\ - ===( INK )==========\\|//==================== -__ejm\___/________dwb`---`______________________ -``` - -## Table of Contents - * [⇢ "When: The Scientific Secrets of Perfect Timing" book notes](#when-the-scientific-secrets-of-perfect-timing-book-notes) * [⇢ ⇢ Daily Rhythms](#daily-rhythms) * [⇢ ⇢ Optimal Task Timing](#optimal-task-timing) diff --git a/uptime-stats.md b/uptime-stats.md index cc45bd45..eb45c61a 100644 --- a/uptime-stats.md +++ b/uptime-stats.md @@ -1,6 +1,6 @@ # My machine uptime stats -> This site was last updated at 2025-08-14T23:22:49+03:00 +> This site was last updated at 2025-08-14T23:30:11+03:00 The following stats were collected via `uptimed` on all of my personal computers over many years and the output was generated by `guprecords`, the global uptime records stats analyser of mine. |
