Meine bewusste Entscheidung , keine KI-Werkzeuge zu verwenden, lässt mich verschiedene Beobachtungen machen. Das Schreiben fällt mir beispielsweise immer noch leicht, während viele meiner Mitmenschen mittlerweile die grösste Mühe selbst im Verfassen kleinster Texte bekunden. Die Aufmerksamkeitsspanne und Frustrationstoleranz meiner Schüler hat weiterhin gelitten, wobei auch Apps wie Instagram und…
Having setup the project in the first , implemented the library in the second , and created an interactive program in the third part of this series, the project shall be finished and, wrapped up for release in this fourth and final article, which covers the following ground: Unit tests covering the library portion of the code shall be implemented, documentation shall be written for the package and…
In the second part of this series, the library for the Soccer Table program has been implemented. This library code does not interact with the outside world yet. Therefore, an interactive program needs to be written, which 1) reads in the game results from a folder containing text files, 2) processes those results using said library, and 3) formats the table, which is then printed to the screen.…
In the first part of this series, the project was set up using Cabal. In this second part, the library code shall be written. The library shall only contain pure, i.e. side-effect free functions. Reading the files and printing the table will be part of the executable—to be described in the next article. Working with GHCi Haskell is a compiled language, but thanks to GHCi, it can be programmed…
I have been looking into the Haskell programming language time and again since 2020. However, I never managed to write a complete non-trivial program in Haskell using proper software engineering techniques, e.g. using a proper build tool and writing unit tests. When I have been learning Haskell, I was mostly dealing with functional techniques and the type system. Whereas the Hello, World! program…
Nachdem mein Jahr 2025 zwar einigermassen produktiv aber leider unfokussiert war, möchte ich für 2026 einen anderen Ansatz wählen. Da ich aufgrund meiner beruflichen Situation derzeit nicht längerfristig planen kann, möchte ich zu einer Quartalsplanung übergehen. Erstes Quartal 2026 Das erste Quartal 2026 kann ich jetzt schon grob planen. Ich möchte mich mit folgenden Themen befassen: Das Semester…
Dieses Semester unterrichte(te) ich ein Modul zum Thema Software-Testing . Meine Schüler hatten den Auftrag, in einer TypeScript-Implementierung von Vier Gewinnt (engl. Connect Four ) durch systematisches Testen (dynamischer Test durch Code-Ausführung und statischer Test durch Code-Analyse) Fehler in der Anwendungslogik zu finden. Dies waren einerseits fehlende Eingabeprüfungen, die sehr einfach…
Wieder einmal neigt sich ein Jahr dem Ende zu, und wieder einmal möchte ich auf das Geleistete und Verpasste in diesem Jahr zurückblicken. Ich beginne mit einem Rückblick auf meinen damaligen Ausblick: Meine Vorsätze für 2025. Clojure Zunächst einmal wollte ich mich mit Clojure befassen. Das habe ich getan, wovon mein Clojure Phrasebook zeugt. Hierzu habe ich Getting Clojure von Russ Olsen erneut…
Elixir not only provides the powerful concurrency primitives it inherits from Erlang, but also offers macros to eliminate boiler-plate code from OTP behaviours. In this article, we’re going to discover how a problem involving both synchronous and asynchronous requests can be implemented in a separate BEAM process, and how this implementation can be simplified using GenServer . Working with…
Für das ausgehende Jahr 2024 hatte ich mir einiges vorgenommen . Ende Dezember ist ein guter Zeitpunkt für eine Bilanz, zumal ich mit meinem gegenwärtigen Energielevel während der Festtage kaum noch viel leisten werde. Ich wollte mich mit den Programmiersprachen Erlang, Rust, Haskell, TypeScript und mit Shell-Skripting befassen. Weitere Technologien auf meiner Liste waren Ansible und Hugo. Lesen…
Die Bezeichnung “achim” ist eine Abkürzung für Advanced Cloud Hyperscaling Infrastructure Manager . Dabei handelt es sich um ein kleines Programmierprojekt, das ich diesen Sommer aus der Not heraus ins Leben gerufen habe. Es hier weniger um die Technik gehen als darum, wie man ein praktisches Problem mit etwas Automatisierung pragmatisch und kostengünstig lösen kann. Natürlich kommt…
I’m currently working through A Common-Sense Guide to Data Structures and Algorithms . The examples are in Ruby and Python. But since I’m learning Rust , I implement the examples and exercises as a transfer exercise in that programming language. Node-based data structures such as linked lists, trees, and graphs are chronically harder to implement in Rust than in most other programming…
For the last couple of years, I didn’t care about code formatting at all, as long as it was done automatically. Go ( go fmt ) and Rust ( cargo fmt ) are an absolute pleasure in that respect. The actual format doesn’t matter that much, as long as formatting happens automatically. But more important, there are no unproductive discussions about formatting. I carried over my philosophy of…
It’s Saturday night, and I’m a 37 year old IT guy: let’s deploy a website with TLS using Dehydrated ! Prerequisites To do that, I setup a virtual machine on Exoscale running Debian 12 “Bookworm”; the hostname being webserver for a lack of creativity. I picked the “Micro” option, which is quite minimalistic (and cheap) with a single CPU core, 10 GB of local…
In einem früheren Artikel habe ich gezeigt, wie man Zahlen auf dem DAMPF-Stack in ihre Primfaktoren zerlegt . Die Performance war in der PHP-Implementierung weder mit mod_php noch mit PHP-FPM als Laufzeitumgebung berauschend. Besinnen wir uns also auf das gute, alte C und verzichten wir für einmal auf das Web! Doch wie können wir die Programmlogik dennoch wiederverwendbar machen, zumal wir auf das…
Wer schon unter grösserer Langweile gelitten hat, dürfte mit dem “Spiel” fortune(6) , das sich auf Debian folgendermassen installieren lässt, bekannt sein: # apt install fortunes $ fortune Debug is human, de-fix divine. $ fortune Abraham Lincoln didn't die in vain. He died in Washington, D.C. $ fortune You work very hard. Don't try to think as well. Doch ist diese Art der Bedienung…
Der Artikel zum DAMPF-Stack beschreibt die Inbetriebnahme des LAMP-Stacks bestehend aus Linux, dem Apache HTTP Server, MariaDB und PHP. Das L wurde zu D wie Debian konkretisiert, und PHP wurde um FPM ergänzt: den FastCGI Process Manager. Von einem Leser kam dabei die folgende Frage auf: Ich würde nun gerne wissen, wie viel schneller DAMPF im Gegensatz zu DAMP ist. Kann vielleicht jemand ein Script…
Wer mit Linux unterwegs ist und sich schon etwas mit Web-Entwicklung befasst hat, dem dürfte der LAMP -Stack bestehend aus L inux, A pache, M ySQL und P HP bereits begegnet sein. Wer mit Debian GNU/Linux arbeitet, kann das L mit einem D konkretisieren. Und wer PHP via FastCGI statt mit Apaches mod_php einbindet, dem dürfte PHP-FPM ein Begriff sein, wodurch das P zu PF ergänzt wird. So soll hier…
MinIO ist eine freie Implementierung des Amazon Simple Storage Services (kurz: S3 ), womit sich Dateien als Objekte “kübelweise”, d.h. in sogenannten Buckets , ablegen lassen. Weitere Hierarchiestufen gibt es nicht; auch die Berechtigungen lassen sich nur auf Stufe Bucket festlegen. In diesem Artikel soll gezeigt werden, wie sich MinIO in Betrieb nehmen und mit dem MinIO-Client mc…
Die Huffman-Codierung bildet die Grundlage für die Kompression (und Dekompression) von Daten. In diesem Beitrag geht es um die entsprechende Datenstruktur (den Huffman-Baum) mit den zugehörigen Algorithmen (Aufbau des Baums, Kompression und Dekompression). Dabei soll es ausschliesslich um Text (und nicht um Binärdaten) gehen, womit sich die ganzen Vorgänge leicht veranschaulichen lassen.…
Zur sicheren Datenübertragung einzelner Nachrichten hat sich PGP/GPG etabliert. Für gesicherte, d.h. verschlüsselte Verbindungen gibt es SSH. Eine SSH-Sitzung wird jedoch unterbrochen, wenn die TCP-Verbindung abbricht. Der Secure Pipe Daemon ( spiped ) arbeitet als Daemon, wodurch man es mit einer beständigen, verschlüsselten Datenverbindung zu tun hat. Im Gegensatz zu GPG und SSH kommt jedoch bei…
Finding prime numbers and factorizing numbers into their prime components is one of my stock programs : Whenever I learn a new programming language, I try to solve the following problems: Given a number n , find all prime numbers in the interval [2;n] . Example: The prime numbers up to 20 are [2, 3, 5, 7, 11, 13, 17, 19] . Given a number x , factorize x into its prime components. Example: The…
Dieser Artikel ist der erste in einer Folge von zwölf Beiträgen, die ich für den Adventskalender des deutschen Debianforums geschrieben habe. Die ersten vier stammen vom Adventskalender 2022 . Weitere acht habe ich zum Adventskalender 2023 beigetragen. Diese Artikel möchte ich hier mit leichten Anpassungen einem weiterem Publikum zugänglich machen. (Obwohl ich meine technischen Beiträge…
The Socio-Sexual Hierarchy describes patterns of behaviour of the following types: Sigma : The Lone Wolf Alpha : The Leader Beta / Bravo : The Leader’s Right Hand Delta : The Competent Co-worker Gamma : The Special Boy Omega : The Outcast The enumeration from Alpha to Omega can be understood as ranks in the hierarchy, whereas the Sigma is considered to be a very independent individual…
Praktisch täglich stosse ich auf ein Problem, das ich einfacher lösen könnte, wenn ich dazu die entsprechenden Fähigkeiten hätte. Diese Probleme sind teilweise sehr konkret (z.B. die Suche nach einer Library-Funktion mit einer bestimmten Semantik) und teilweise sehr abstrakt (z.B. wie man die Qualität seines Programmcodes verbessern kann, sodass bei Anpassungen keine Fehler miteingebaut werden).…
In the last couple of years, i.e. since 2020 when I finally got my bachelor’s degree in Computer Science, I was mostly interested in functional programming languages: Erlang, Elixir, Scheme, Clojure, and Haskell. A year before, in 2019, I was trying to learn Rust, but I didn’t get very far. Yet another year before, in 2018, I spent a lot of time with Go, which was quite productive. I…
I just published a small game Gauner Trio (roughly “Scoundrel Trio” in English), where the player must find the three culprits out of seven suspects. We often played the tabletop version of this game at home in my childhood, and I just wanted to implement it on my own in JavaScript. Discrete Mathematics The biggest issue is: How do you generate the cards showing all possible…
Das neue Jahr hat angefangen, und die Gelegenheit ist gut um mir etwas Neues vorzunehmen. Nicht einfach bloss, weil man sich Vorsätze fürs neue Jahr nimmt, sondern weil der Jahreswechsel mit der Arbeitspause mir die Möglichkeit bietet, über meine Prioritäten nachzudenken ‒ und auch gleich mit neuen Sachen anzufangen. Rückblick auf 2023 Auf das Jahr 2023 habe ich bereits andernorts ausführlich…
Ende 2021 aus Frustration angefangen und mit Freude abgeschlossen, habe ich auch für 2022 einen Jahresrückblick geschrieben ‒ und diesen sogleich mit einem Ausblick auf 2023 kombiniert. Ausblick im Rückblick Womit wollte ich mich ursprünglich befassen? Beruflich einerseits mit Containern; genauer mit Container-Registries, mit Podman und mit Kubernetes. Andererseits mit Python; genauer mit…
A year ago, I was stuck in my efforts to properly learn Clojure. So I decided to take a step back and work through SICP : slowly, but steadily. I sticked to it rather well, even finished an exercise on the day I moved. Neither did I take a break on Christmas. However, I had to stop in March, because working on the first project with two colleagues in our own company (Composed GmbH) was too much…
Last summer, I decided to work through SICP, at least through the first two chapters, and probably also through the third. I wrote about my progress after the first month . Back then, I established a daily habit, but was also a bit pessimistic whether or not I’d stick to it. I worked three days for the company, teached two days a week, and on the weekends, I had to prepare the lessons for…
Letztes Jahr habe ich einen Jahresrückblick geschrieben und kurz darauf einige Ideen für 2022 aufgeschrieben. Was ist ‒ ersteres wiederholend ‒ aus letzterem geworden? Ideen umgesetzt? Vorweg: die drei Themen bzw. Programmiersprachen, die ich mir notiert habe ‒ Elixir, Go und JavaScript ‒ haben mich alle beschäftigt. Oberflächlich betrachtet habe ich also 2022 das gemacht, was ich mir vorgenommen…
As soon as you understand Monads, you’re no longer able to explain Monads. — Somebody on the Internet Having read n tutorials on Monads, one must come to the conclusion that tutorial n+1 needs to be written. Not so much in order to explain monads to others, but rather to gain more clarity. So here I write down my current understanding of Monads, and my few readers get the chance to correct…
When I finally got my bachelor’s degree in Computer Science, I set another goal for my further professional development: I wanted to learn functional programming. I got a glimpse of Prolog and Racket during my studies, and used higher-order functions with lambda expressions in Java and JavaScript once in a while. I also peaked into Common LISP on multiple occasions, but I never made it a…
If you are around my age, work as a programmer, and took some classes on the subject since 2009, you probably were subjected to Robert C. Martin’s book Clean Code: A Handbook of Agile Software Craftsmanship . (As of this day, the first edition from 2008 hasn’t been updated. Clearly, Clean Code must be a—nay, the —perfect book, which does not require improvements or adjustments after…
Different Git Server, Different E-Mail Address When you use Git on a daily basis, chances are that you use it with multiple remote servers—and do so with different email addresses. I personally use: My work email address (let’s say patrick@work.xy for the sake of brevity) for my employer’s Git server ( git.work.xy to keep it short). My private email address ( patrick@home.xy ) for…
In der nebenläufigen Programmierung ist Fire and Forget ein Prinzip, bei dem untergeordnete Aufgaben gestartet werden und anschliessend nicht mehr auf deren Beendigung gewartet wird. Man kann davon ausgehen, dass der Task dann irgendwann zu Ende sein wird, und das Ergebnis wird dann schon stimmen. Eine Beispiel hierfür wäre eine Datensicherung, die von einem lang laufenden Server gestartet wird.…
Explanations exist; they have existed for all time; there is always a well-known solution to every human problem — neat, plausible, and wrong. ‒ H. L. Mencken Im Geografieunterricht am Gynmasium kann ich mich an zwei Lehrer erinnern: Der erste war eher ein Haudegen; hatte ein enormes Wissen, versteckte dieses aber teilweise hinter seiner jovialen Art. Bei ihm im Unterricht haben wir angeschaut,…
Bald ist das Jahr zu Ende, und ich habe in den letzten Wochen und Monaten verschiedenste Ideen gehabt, womit ich mich 2022 beschäftigen könnte. Einige Ideen habe ich bald wieder fallen lassen, z.B. diese Webseite nach Hugo zu migrieren (denn die Sache wird damit nicht einfacher, eher komplizierter). Andere Ideen haben sich immer wieder von neuem aufgedrängt, doch konnte ich sie aus Zeitmangel…
Selten war meine Laune am Jahresende so schlecht. Dass ich mitte Dezember erschöpft bin und mich nach einer Pause sehne, ist nichts Neues und war zu erwarten. Leider habe ich aber auch das Gefühl, dass dieses Jahr für mich extrem unproduktiv war, und ich stehenbleibe, ja gar Rückschritte mache ‒ in allen möglichen Lebensbereichen. Ich möchte hier auf mein Jahr zurückblicken, soweit es mein…
Besides a mathematical inclination, an exceptionally good mastery of one’s native tongue is the most vital asset of a competent programmer. — Edsger W. Dijkstra , EWD 498 Sprache ist für mich sehr wichtig, und zwar nicht obwohl , sondern weil ich Informatiker bin. Obwohl ich ohne grössere Probleme in den mathematischen Fächern durch das Studium gekommen bin, sind meine Fähigkeiten in diesem…
In The Clean Coder , Chapter 7 ( Acceptance Tests ), Robert C. Martin writes (p. 109): But the real reason these tests aren’t redundant is that their primary function is not testing . The fact that they are tests is incidental. […] The fact that they automatically verify the design, structure, and behaviour that they specify is wildly useful, but the specification is their true purpose .…
Neulich bin ich auf einer Webseite auf ein Angebot «für Benutzer*innen» gestossen. Dabei handelt es sich nicht etwa um ein Glob-Pattern , worauf der Asterisk schliessen lassen könnte, sondern wohl um ein Gendersternchen . (In der Linguistik wird dieses Zeichen zur Kenntlichmachung von ungrammatischen Konstrukten verwendet. Die Ironie dieses Zufalls dürfte im weiteren Verlauf des Artikels deutlich…
I’ve been using Arch Linux since 2016. I got to understand the system better since then, and installing Arch nowadays is rather a strain on my fingers than on my brain. I automated my personal setup procedure to some extent with a couple of shell scripts, which I’m adjusting as time goes and hardware changes. I collect those scripts and setup instructions in a GitHub repo . Even though…
I have a roughly ten year old Brother HL-5370DW printer on the shelf next to me. This printer is mostly used by my wife to print sewing patterns. When I was studying computer science, I sometimes printed documents I’ve written for proofreading. I often was able to find typos that I didn’t see on the screen even after proofreading the document two or three times. However, I didn’t…
I’ve been using the Swiss keyboard layout for most of my life. Things changed when I first had to work on a Mac Book. If the Swiss keyboard layout is not great for programming on a usual keyboard, because it requires combinations with Alt-Gr to type in braces and brackets, I consider the Mac version of it outright horrible, because braces and brackets are located on the digits row. Those…
A week ago, I’ve installed OpenBSD on my Thinkpad . I’ve been using it now and then, and already have changed a couple of things in respect to the original setup described in the article. I also installed OpenBSD on the Dell Optiplex on which I previously installed FreeBSD a month before. This means that I’m no longer using FreeBSD on the desktop, at least not for the moment.…
Let’s install OpenBSD on a Lenovo Thinkpad X270. I used this computer for my computer science studies. It has both Arch Linux and Windows 10 installed as dual boot. Now that I’m no longer required to run Windows, I can ditch the dual boot and install an operating system of my choice. Preparation First, I grab my work Thinkpad running Arch Linux and some USB dongle big enough for the…
I’m a happy user of Arch Linux both on my private computers and on my work laptop. I even managed to get through four years of university with my setup, and only had to bring a Windows machine on some rare occasions, even though some professors are openly hostile towards a Linux setup. (It doesn’t run Microsoft Project and the real Excel, after all…) Recently, I got interested in the…
In my last article , I outlined the purpose of a stock program : a non-trivial coding exercise to be done in every new programming language somebody is learning. I also stated that «Four in a Row» is becoming my personal stock program, and that I’d like to implement it in Haskell. The main challenge in Haskell is the functional programming paradigm. Immutability is the main difference…