I prefer Djot over Markdown Why Djot? Markdown is very useful, widely adopted and at a first glance simple. But the simplicity falls apart when you look at edge cases, compatibility across applications and non-basic features. And despite the heroic effort of CommonMark, the fragmentation seems to grow with more dialects and extensions rather than consolidating. Even strict adherence to CommonMark…
Can We Make Simpler Software With LLMs? Growing numbers of abstraction layers, vast amounts of dependencies and general complexity are what annoy me most about modern software development. LLMs are powerful tools, but in practice they often lead to even larger, more complex projects with even more dependencies. Can we use them for the opposite: small, simple software without dependencies? I tried…
Raising Notifications From Terminal When executing long-running jobs in the terminal, it’s useful to get notified when they complete so you can do other things while waiting. Here are a few ways to achieve this. Using notify-send (Linux) The simplest approach is to chain your command with notify-send : slow-job; notify-send "done" If You Already Started the Job If you’ve already started a…
Stack Traces are Underrated I Love Stack Traces When something goes wrong in a program, many languages will spit out a stack trace with lots of useful information. Here’s an example from one of my Python programs: Traceback (most recent call last): File "/home/piku/.piku/envs/wikdict/lib/python3.11/site-packages/flask/app.py", line 1511, in wsgi_app response = self.full_dispatch_request()…
Easily Entering Umlauts With a US Keyboard Layout As a software developer, a US keyboard layout is great for entering all the special characters you need while coding and for using certain applications like vim. But as a German speaker, I also frequently need to enter German characters that don’t exist in English: the Umlauts äÄöÖüÜ and ß. I want to do this without giving up the US layout and…
Consistent Handling of Git Repositories With Different Default Branches Why Do I Care About Default Branches? Typically, I develop on a feature branch, and when the feature is ready, there is an obvious branch into which I want to merge the branch. This branch is often called master , main or develop . During development, I will occasionally rebase my feature branch on top of this branch, to…
Simple Testing with git diff Automatic tests are great, but creating and maintaining them is time consuming and sometimes really complicated. Often, getting a moderate test coverage to prevent regressions is important, but written a “proper” test suite is more work than you can justify. Let me show you how to solve this in a way that is easy to apply and does not rely on any specific programming…
make as a Static Site Generator Static site generators are in fashion for good reasons. The resulting pages are easy to host, fast and extremely low on maintenance while being sufficient for many use cases. As I learned when setting up my blog , writing a simple script myself is faster and more satisfying than learning one of the other site builders and customizing it to my needs. This time, I…
When Is Complexity OK? We all known complexity is bad. It slows down development, makes bugs more likely, increases the maintenance burden and makes it harder to onboard new developers. So why do we still have complex software everywhere? Legacy code, misaligned incentives, unclear goals, bad development practices or sheer incompetence can be causes. But even well run projects often get very…
Formatting Numbers of Unknown Order of Magnitude Sometimes, I write programs that need to display numbers where I don’t know how big or small they will be. The most common approaches of printing numbers won’t be very helpful in such a case. # Default print: more decimal places than useful >>> print(1324325425.3254435363463) 1324325425.3254435 # Fixed amount of decimal places: better, but ... >>>…
Adding Gemini Support With Just a Few Lines of Code The Gemini protocol nicely matches my preference for simplicity, so I want to start providing content for it to show my support. The first step for doing that is providing this blog via Gemini. I’ll quickly summarize the steps that were necessary to do this in this post. What is Gemini? Gemini is an extremely simplified version of the web. It…
Tcl as a Shell Scripting Replacement Summary: I got interested in the old scripting language Tcl , rewrote my blog generator in it as an exercise and compare it to shell scripting. Motivation Every once in a while, the “ Tcl the Misunderstood ” article by antirez gets to the front page of Hacker News . I’ve read it at least two of those times, since I appreciate antirez’ opinions and I’m generally…
My Simple Custom Blog Software The pages on this site are generated by my own primitive blog engine. This post summarizes why I wrote my own, what my priorities for it were and how I went about achieving them. Why Something Custom? Originally I wanted to use Hugo for this blog. I started to look for a simple theme that did not involve many dependencies and provided clean output. This quickly…
Hacking on “smu”, a Minimal Markdown Parser Introduction I wanted to get my hands dirty and improve a suckless related program. So I had a look at the project ideas page and picked out something simple: Improve the Markdown parser used by the suckless wiki called “smu” to conform more to Markdown. for example for nested codeblocks. Difficulty: trivial-medium. Specs:…
Suckless Software on My Desktop I took a look at which simple programs I could use as a desktop environment instead of Gnome and picked out the following ones st as a terminal dwm as a window manager, along with slstatus slock for screen locking Initial Impression The suckless tools are configured by editing C header files before compilation. This is pretty straightforward to do in most cases, but…
Exercises in Simplicity The more time I spent on software development, the more I come to appreciate simplicity. When software is buggy, slow or lacking features, that is annoying. But as long as it is simple, I can still understand the limitations and work around them or even fix them. When something goes wrong in a complex program, it is often not worth spending the huge amount of time necessary…