This is one of my favorite and underrated patterns in Go.
Let’s assume a format based on Lua tables, let’s just call it LTRN (Lua Table Resource Notation) and I was imagining a mock value generator for that format.
Now is the perfect time to use a struct of function types!
Imagine we have a simple spec for a property in our imaginary resource:
The generator would be a concrete struct that contains functions that we can swap as we like. We need a seam to insert our mock data during testing. Injecting a struct of functions makes this code easily testable.
Why, oh why, is this not an interface, I hear you ask?
My argument here is that fill is an un-exported function. It won’t be used by 3rd party developers.
This is very flexible for low state structs that you want to heavily test. Ideally it would not have any fields at all. (Please don’t store your db connection in the generator!)
Back to my argument: The advantage of using a struct over an interface. When we implement the interface for a test mock we have to implement every single function even though we might only need one of them for the particular test. For large interfaces, this sucks! Add that to the reasons why large interfaces are generally discouraged and not idiomatic Go.
With a struct with function types we can provide only the functions that we actually need. To be honest, function types are reference types. But for our purpose we can think of them as pointers. They can be nil! This saves us from writing a lot of unnecessary code in our tests. (don’t forget to check you nils or you might run into panic)
From time to time I catch myself listening to a podcast and also reading a book at the same time. It’s not a good habit because I probably won’t get into either. It’s easier when it’s a both in english. If one is my native language then I do get tripped up.
I wrote about last liminal year and the effects it had on me. I did not mention self-respect. I think engaging in behavior of disrespect towards yourself or in this case disrespecting the attention is in the context of virtue ethics a profound immoral act
. This aligns with my feeling when I catch myself engaging in the aforementioned multimedial overload. The feeling itself might be thought pattern stemming from early childhood and parental amplification but I think it rings true on an intellectual level as well.
I do think self-respect leads to happiness and have seen the fruits of that every time I stay true to it. And on the flip side I can see the decrease in happiness when I have engaged in less self-respecting activities. That goes against a grain of maybe a fundamental part of my psyche. An aspect probably best described by Freud’s Autothanatos or the drive to regressively search for self-destruction. That might be an oversimplified model but it at least begins to shed a light on these dark corners and pulls them into the light to be examined and scrutinized without it becoming a criticism of my own character. And I don’t think it is universal.
Other people might see this behavior in themselves and not feel it to be disrespecting. So it might be a highly subjective valuation. But my valuation for myself is now clearer. It’s just something I have to deal with to be happy. It should be part of my psychological hygiene. Like brushing teeth. It should just be part of my life to keep media consumption separated.
I think of Glen Gould’s eccentricities when I catch myself reading and listening. He famously left the vacuum running while playing the piano.
This text is not really about reading or listening. I chose it as a digestible example because it might be a harmless self disrespecting behavior.
I have been using Markdown for over a decade in all kinds of projects and also for note-taking. It’s far from being niche anymore in software development and computing circles. I do forget image and link syntax often but since I use wikilinks in most of my notes that’s not a big problem.
Still, I feel we come to end of the Markdown-era. Let’s try to collect some requirements or a wishlist for “Markdown2”:
Stay close to plain plaintext: We want to keep it light on the clutter so that the cruft doesn’t obscure reading the actual text of the file even when you don’t have a render at hand.
Extensions instead of flavors: Having to remember quirks of Markdown flavors leads to all kinds of issues. Could we just have a ‘base’ markdown2 and then have extensions?
Frontmatter is ugly. Metadata the first thing you pop into your eye is distracting and ugly. I don’t have a solution here. Sidecars and metadata DBs seem too decoupled and will get forgotten when copied. Maybe just keep metadata out of text files all together?
What are you missing? Is orgdown or ge
mtext the answer?
I have been thinking about time again. More in terms of programming practices and less as in technical scheduling. This is just a point I try to remember when working on scheduling related problems. That being said: engineering reality often forces you make tradeoffs of course.
Moments slip by
In logical time we are starting from identity: We can tell points in time (also called moments) apart from another by them being distinct. M1 has an unique identity and M2 has an unique identity. These moments are different from each other. This ontology is not just philosophically relevant but gives us great power to create machines to perform work at certain moments. I would argue that logical moments are also persistent in state. A crontab file is not going to change unless you change it. Logical time is always discrete but two moments might have a relationship to each other.
Chronological time is a lot more analog, dynamic and “fuzzy”. A moment in chronological time is an observation of a stream. A sample if you will of a continuous function. The stream is continuous but the observer is discrete.
I should remember: A lot of problems arise when dealing with chronological time from logical time and vice versa.
Category error: Time as approximated state
Time in a sequential procedure is a most always the worst indicator for a state change.
put pasta water on stove -> wait 5 minutes -> put in pasta
Obviously the pasta water might not be boiling after 5 minutes(stove might be turned too low or even off). The correct way would be to verify the state by looking at data or features. The water is bubbling and steaming? Or a thermometer shows actual degrees? We often combine time and state checking in polling to wait and check. But a blind timer is almost always the wrong answer. Timeouts are a special term for blind timers. State relations triggered by timeouts depend on chronological time and can be helpful as a last resort. But think about this: Would you add a “just-in-case” clause to a while loop just because you are afraid about it not terminating?
Don’t use time as a scapegoat for unsharp thinking or being lazy:
If the e2e test runs more than 5 minutes it might be safe to assume “something” has timed out and therefor we can time out the whole test? No, I should at least make sure that the systems and environment is handled.
2025: the liminal year. Inside of a Zwischenzustand, a chapter already finished a new one not yet started. My round-the-world trip. New experiences. Meeting most interesting people and moments of deep self examination.
My moral compass realigned to a hard north and resuming the search for honesty with my self. Eventually coming back to generous leniency as the maxim of my interactions with others. The dialectic has dominated my personal thoughts in most of 2025. It’s not easy to always hold on to both leniency and honesty when exhausted from rough nights traveling.
Saying no the wrong things is the first step of saying yes to the right things. Do I trust my gut? And Taste. Taste is my reflective intuition in application of internal honesty. So I try to hone my taste.
Of course plenty of missteps happened and will continue to happen. It is now clear to me that honesty as the foundation is oftentimes obscured by the typical hedonistic pleasure and comforts. But those come with an internal dissonance that made me deviate from my values. But I see the source again. It feels authentic to be in touch with my honesty again and can’t wait to see how it will evolve. I hope to stay in touch into the next year which will be filled with lots of new challenges.
A couple of words about gear and technology I used this year. This isn’t a top 10 list of things I liked, but just a few thoughts about artifacts that resonated with me in one way or another.
Smartphones
This might seem counterintuitive. I know that these days everyone wants to “be more offline” or “stop doomscrolling”. But in my travels and in my daily life, this is such an invaluable tool. Navigating and finding accommodation, having basically infinite entertainment while waiting 6 hours in an airport for your connecting flight, staying in touch with friends and family, getting information about a place, taking pictures or recording sounds etc. It is convenient as heck while traveling. Don’t get me wrong: I do think the current state of enshittified iOS and Android is awful. And planned obsolescence of the hardware is even worse. I hope we do better in the future. But don’t get it twisted: miniaturized all-purpose computers with all kinds of sensors and interfaces that fit in our pockets are an absolutely great thing.
AWK
I tried to use AWK a lot more and really get a feel for the language. Reading the book helped a ton. I already had tons of applications for it. It feels to me like a real boost to my shell fu.
Obsidian
This is still one of my absolute favorite tools for note-taking. Linking thoughts and notes is very much how I think. It’s also a real good WYSIWYG Markdown editor. The abundant ecosystem provides high quality plugins, and you can customize your vault into oblivion. I did set up a couple of global shortcuts like CMD/CTRL+Shift+B to open a quick note. I also used it for writing my blog posts. The browser extension is awesome to save quotes from pages. All in all - I wish this was around when I was studying in university. It is such a great tool. And even if one day I get tired of Obsidian itself: it’s just markdown and I could port it to vimwiki, Org Mode or Zed easily.
Speaking of …
Zed
This one is a bit more nuanced. I tried this code editor late in 2024 and loved it immediately. It’s superfast and felt just right. I used VSCode and Vim before, but I always felt that VSCode was slow, especially when used with lots of plugins. And Vim/NeoVim has problems with some systems clipboards when run in the terminal. I still use vim for shorter editing of code almost every day. But for bigger projects I began to use Zed heavily in the first half of 2025.
I ran in a lot of issues this last half year with Zed and at this point I am looking for an alternative. Issues I experienced were related to the Agentic/AI Integrations, the Git integration and sometimes even with saving files to different file systems or symlinked files. Maybe I just need a fresh install, but it seems that this editor is struggling a little bit.
Steam Deck
Kind of late to the party, I bought this around September 2025. There has only been a couple of days since then where I did not use it. What else is there to say that hasn’t been said already? It’s a great linux based handheld.
Circuit Tracks
It’s just such a great and intuitive little portable groovebox. Can’t wait to use it for a gig. Thinking about getting the Rhythm as well.
Travelers Notebook
I have yet to use it at work but I really like the refillable notebooks from Travelers Company.
Codeberg
Similar to Zed: I am not sure If I will stay on CB or if I will finally move away from it. It works great as a Githoster, but my experience with the workflows has been hit-and-miss. I might need to set up my own runner. I am not sure. I also should take a look at setting up my own instance of forgejo.
Bambu Lab A1 Mini
It might be a toy but oh boy it’s a really enjoyable toy. Be it risers, stands, knock boxes, housing for synths, cookie cutters, Christmas decorations and so, so much more. My brain is now wired to see a physical problem and somehow find a way to use the 3D Printer to solve it. Yeah, yeah, I know, everything looks like a nail.
I noticed my vacbot struggling with the height of my sofa and bumping into the side or getting caught underneath it. I decided to fix it using 3D printing.
I am still new to my A1 mini and even though I worked for a CAD-related software company for a while I actually don’t have a lot of experience creating parts. I heard good things about fusion and after reading a little bit and watching some tutorials I started to design my part.
It is a very basic height extender. A cylinder with a rectangular cut-out as a slot in the dimensions of the sofa foot.
I iterated over the design. Each time using the low 10% lightning type infill and a 0.20 mm layer height preset to speed up printing of these prototypes. My first attempt would have used way too much filament because the cylinder’s diameter surrounding the slot was way too big. Since I am such a 3D printing newbie, I could only appreciate these problems once the prototypes were printed. At least the slot fit perfectly from the start. When I got the diameter down to a more reasonable size, I finally used the fillet tool to round off the top to save on material and because I thought it looked cool.
Then it was time to slice: I was unsure what kind of infill to take so it could bear the load of the sofa and 1 to 2 people. I went for the triangle and 40% infill, which seemed a pretty good tradeoff between printing time and sturdiness. I printed two Sofadisks on a plate with the ‘by-object’ setting and used the auto-arrangement to make sure that the tools path between those two Sofadisks don’t intersect. I also added a brim because I wanted to have the best first layer adhesion possible.
And it worked great! The Sofadisk was a fun and easy afternoon project. From idea over prototypes that could be printed in 30 minutes to the final print in 3 hours.
Let’s see how it holds up or if I need to print it again with higher infill percentage.
All signs are pointing into the direction that my long term travel seems to be coming to an end. I am giddy as I’m getting to the point where I can finally unpack all my collected goodies in the new apartment. What makes me especially happy are the notebooks from travelers factory
and the leather keychain holders I found in Thailand. I still need a lot of time to furnish the apartment. But today I put down my first rug, and it really tied the room together.
I am sure my travels will continue but now in a more interlaced pattern between different obligations here. The default feed of the blog will be linking not just to travel in the future as I want to write about other topics as well. Life is still filled a lot of question marks at this point, but I am happy to have a place again.
I moved most of my repos away from GitHub. Forks that were used for contributions will stay on GitHub. Some repos emptied and now only contain a README.md with a link to the new location.
I also took a look at sourcehut
but in the end decided for codeberg.org
. I really like the idea of my open source code being hosted on a platform run by a non-profit organization. Codeberg is a German e.V. and well funded
is also inspiring confidence in the project.
The move was a great moment to take inventory of all the little repositories I have over the years on GitHub. I found a lot of one-off projects and tiny little tools. I decided to merge a big chunk of the repositories into mainly two monorepos(belt
and labs
).
git filter-repo --to-subdirectory-filter and git remotes were incredibly helpful to sort this out. I am not sure if I will continue using git lfs because it creates many problems. I might put the images on a storage and copy them directly from the store to my VPS.
All in all I am happy with my decision to move and Codeberg is very stable and usable.