Blog

What I think about...

Oct 2026AI-generated

Building a Custom Data-Fetching Hook in React

Every React codebase eventually accumulates a dozen near-identical blocks that fetch data, track loading state, and handle errors. Extracting that pattern into a single reusable…

Read post
Sep 2026AI-generated

CSS Container Queries: A Practical Guide

Media queries answer one question: how big is the viewport? That's the wrong question for most components, because a card, a sidebar widget, or a product tile doesn't care how w…

Read post
Sep 2026AI-generated

How the Virtual DOM Actually Works

"The virtual DOM makes React fast" is one of those phrases everyone repeats without quite being able to explain. It's not magic, and it's not even always faster than touching th…

Read post
Sep 2026AI-generated

Understanding Web Workers for Heavy Computation

JavaScript runs on a single thread, which means a computation-heavy task — parsing a huge JSON blob, resizing an image, running a pathfinding algorithm — blocks everything else…

Read post
Aug 2026AI-generated

Debouncing and Throttling: Taming High-Frequency Events in JavaScript

Every frontend developer eventually hits the same wall: a scroll handler firing hundreds of times a second, a search input triggering a network request on every keystroke, or a…

Read post
Aug 2026AI-generated

Writing a Simple Command-Line Tool in Node.js

Most internal CLI tools don't need a framework. A script that renames a batch of files, hits an internal API, or wraps a repetitive sequence can be a single Node file with a she…

Read post
Aug 2026AI-generated

Web Accessibility Basics: ARIA Without the Guesswork

The most common ARIA mistake isn't using the wrong attribute — it's reaching for ARIA at all when a native HTML element would have solved the problem for free. ARIA (Accessible…

Read post
Aug 2026AI-generated

A Practical Guide to Git Branching Strategies

Most teams don't choose a branching strategy — they inherit whatever the founding engineers happened to do, and it calcifies before anyone questions whether it fits the team's a…

Read post
Aug 2026AI-generated

Building a Simple State Machine in TypeScript

If you've ever written a component with , , , and as separate booleans, you've probably also shipped a bug where two of them were true at the same time and the UI showed a spinn…

Read post
Aug 2026AI-generated

Reflows and Repaints: Why Your Page Feels Janky

You measure an element's height with , use it to set another element's width, read that width back, and set a third element's height — and somehow this fifteen-line function is…

Read post
Jul 2026AI-generated

Understanding HTTP Caching Headers

Most performance problems people try to solve with a CDN or a caching layer are actually solved for free by three HTTP headers, set correctly, that most apps get wrong by accide…

Read post
Jul 2026AI-generated

A Practical Guide to API Pagination

Return every row from a growing table in a single response and you've built a feature that works fine in development and falls over in production the day a customer has 50,000 r…

Read post
Jul 2026AI-generated

Understanding Database Connection Pooling

Opening a database connection is expensive: a TCP handshake, authentication, sometimes TLS negotiation — commonly tens of milliseconds before a single query runs. Open one conne…

Read post
Jul 2026AI-generated

Writing Your First GitHub Action

Most teams start with GitHub Actions by copy-pasting a workflow from another repo and hoping it still applies. That works until the day it doesn't, and you need to actually unde…

Read post
Jun 2026AI-generated

Understanding the JavaScript Event Loop

JavaScript runs on a single thread, yet somehow handles thousands of concurrent network requests, timers, and UI events without blocking. The event loop is the mechanism that ma…

Read post
Jun 2026AI-generated

Debugging Memory Leaks in Node.js

A Node process that slowly climbs in memory usage over hours or days, then eventually gets OOM-killed by the container orchestrator, is one of the more frustrating classes of bu…

Read post
Jun 2026AI-generated

A Practical Guide to Semantic Versioning

in a looks precise, but that caret changes what it means depending on whether the maintainer on the other end actually followed the rules it's built on. Semantic Versioning (sem…

Read post
Jun 2026AI-generated

Big O Notation, Explained with Real Code

Big O notation gets taught with abstract examples — sorting arrays of integers, searching balanced trees — and then quietly dropped once people start shipping actual features. T…

Read post
Jun 2026AI-generated

Feature Toggling with Environment-Based Config

The simplest way to ship a half-finished feature to production without exposing it is also the most commonly reinvented badly: a boolean, read from config, checked in an . Befor…

Read post
Jun 2026AI-generated

Building a Rate Limiter Middleware in Express

An unprotected API endpoint is an invitation: one misbehaving client script, one retry loop without backoff, one scraper, and your server spends all its time serving the same ha…

Read post
Jun 2026AI-generated

Understanding Content Security Policy (CSP)

Content Security Policy is a browser feature that limits where a page is allowed to load scripts, styles, images, and other resources from — and it's one of the few defenses tha…

Read post
Jun 2026AI-generated

Building a Simple Job Queue with Redis

Sending a welcome email, resizing an uploaded image, generating a PDF report — none of these should happen inside the HTTP request that triggered them. A job queue lets you hand…

Read post
May 2026AI-generated

The Repository Pattern: Pros, Cons, and When to Skip It

The repository pattern gets recommended by default in a lot of backend tutorials, right alongside dependency injection, as if skipping it were obviously wrong. It isn't. It's a…

Read post
May 2026AI-generated

Database Transactions and Isolation Levels Explained

"Just wrap it in a transaction" is common advice, but a transaction alone doesn't guarantee two concurrent operations won't step on each other — that depends on the isolation le…

Read post
May 2026AI-generated

Retry Strategies: Exponential Backoff and Jitter

A network call fails. The obvious fix is "just retry it" — but retrying naively is how a brief blip turns into a full outage, because every client hammers the recovering service…

Read post
May 2026AI-generated

A Gentle Introduction to WebSockets

HTTP is request-response: the client asks, the server answers, the connection's job is done. That model breaks down the moment the server needs to tell the client something with…

Read post
Apr 2026AI-generated

Async Iterators and Generators in JavaScript

loops over arrays and other iterables one value at a time. does the same thing when each value takes time to produce — reading paginated API results, streaming a large file, or…

Read post
Apr 2026AI-generated

Memoization in JavaScript, Beyond useMemo

Memoization caches the result of a function call keyed by its arguments, so calling it again with the same arguments returns the cached value instead of redoing the work. Most J…

Read post
Apr 2026AI-generated

Building a Simple Pub/Sub System in Node.js

Publish/subscribe decouples the code that produces an event from the code that reacts to it — the publisher doesn't know or care who's listening, and subscribers don't know or c…

Read post
Apr 2026AI-generated

The CAP Theorem, Explained with Real Examples

Every distributed database vendor claims to be fast, consistent, and always available. The CAP theorem is the reason you should be suspicious of that pitch: in the presence of a…

Read post
Mar 2026AI-generated

A Practical Guide to JWT Authentication

JSON Web Tokens get reached for by default in a lot of new backends, often without anyone stopping to check whether a token is actually the right fit, or what happens the day yo…

Read post
Mar 2026AI-generated

Event Sourcing vs Traditional CRUD

A traditional CRUD table tells you the current state of a row and nothing about how it got there. Event sourcing inverts that: it stores every change that ever happened, and cur…

Read post
Mar 2026AI-generated

Structured Logging: Why printf Debugging Doesn't Scale

works fine until you have ten servers, a thousand log lines a second, and an incident where you need to find every request from one customer across three services in the last tw…

Read post
Mar 2026AI-generated

Understanding CORS Once and For All

CORS errors show up in the console at the worst possible time, say almost nothing useful about how to fix them, and get "solved" by copy-pasting from Stack Overflow without anyo…

Read post
Mar 2026AI-generated

Rate Limiting Algorithms: Token Bucket vs Sliding Window

Every public API eventually needs rate limiting, and the algorithm you pick decides whether "100 requests per minute" actually means what it sounds like. Two approaches dominate…

Read post
Mar 2026AI-generated

The N+1 Query Problem and How to Avoid It

A page that lists 50 blog posts along with each author's name feels instant in development, with a handful of test rows, and then falls over in production the moment real data s…

Read post
Feb 2026AI-generated

Git Rebase vs Merge: When to Use Which

and both get your feature branch's changes onto , and that surface-level similarity is exactly why people mix them up and end up with either a tangled history or a rewritten one…

Read post
Feb 2026AI-generated

Writing Safe, Idempotent Database Migrations

A migration that ran successfully in staging and then fails halfway through in production leaves you in the worst possible spot: a schema that's neither the old version nor the…

Read post
Feb 2026AI-generated

How Database Indexes Actually Work

"Just add an index" is the most common piece of database advice, and also the most commonly misapplied — thrown at slow queries without understanding what the index actually doe…

Read post
Feb 2026AI-generated

Optimistic vs Pessimistic Locking in Databases

Two requests read the same row, both compute a new value from what they read, and both write it back — the second write silently overwrites the first as if it never happened. Th…

Read post
Feb 2026AI-generated

The Circuit Breaker Pattern for Resilient Services

When a downstream service starts failing, the naive response — keep retrying every request as it comes in — is exactly the wrong move. Every retry is another request piling onto…

Read post
Jan 2026AI-generated

Feature Flags: A Practical Guide

A feature flag is a conditional wrapped around a piece of code that lets you turn that code on or off — for everyone, for a subset of users, or gradually — without shipping a ne…

Read post
Jan 2026AI-generated

Understanding TypeScript Generics

Generics are the feature that trips people up right after they've gotten comfortable with basic TypeScript types — and then, once it clicks, becomes one of the most-used tools i…

Read post
Jan 2026AI-generated

Building an LRU Cache From Scratch

An LRU (least-recently-used) cache keeps a fixed number of items and, when it's full and a new item needs to be added, evicts whichever item hasn't been touched in the longest t…

Read post
Jan 2026AI-generated

Idempotency Keys in REST APIs

A client sends a payment request, the network times out before the response comes back, and the client — reasonably — retries. If your endpoint just runs the charge again, the c…

Read post
Feb 2024

Python3 - Dateien mit gleichen Namen umbenennen

Wer schnell und komfortabel seine Dateien von einem Dateisystem, das Groß-/Kleinschreibung respektiert in ein Dateisystem, welches Groß-/Kleinschreibung nicht respektiert versch…

Read post
Feb 2024

Mailmanagement / Spam Protection

Ich hasse SPAM. Man sieht es vermutlich an der Anzahl an Blogposts (man könnte fast meinen, der ganze Blog bezieht sich nur auf das Thema Spam). Inzwischen habe ich aber eine re…

Read post
Feb 2024

Die Bedeutung von barrierefreiem Webdesign: Ein Tor zu Inklusivität und Benutzerfreundlichkeit

In einer Welt, die immer stärker von digitalen Technologien geprägt ist, ist die Zugänglichkeit von Websites und Anwendungen für alle Nutzer von entscheidender Bedeutung. Barrie…

Read post
Feb 2024

Die unsichtbare Bedrohung: XSRF - Wenn das Web gegen dich arbeitet

In einer Welt, in der unsere persönlichen Informationen und Online-Aktivitäten immer mehr an Bedeutung gewinnen, ist die Sicherheit im Cyberspace von entscheidender Bedeutung. E…

Read post
Sep 2023

Erkennen von Brute - Force Angriffen

Im Rahmen eines samstäglichen Kaffeehaus Aufenthaltes und der Info meines Providers OVH, dass aktuell ein DDOS Angriff auf meinen vServer stattfindet habe ich mir mal ein paar G…

Read post
Apr 2023

React Native - What?

Bevor wir richtig loslegen, möchte ich dir erstmal einen Witz erzählen: Wusstest du schon, warum Entwickler so gerne mit React Native arbeiten? Weil sie dabei zwei Fliegen mit e…

Read post
Apr 2023

JavaScript - THIS Keyword

In der Welt der Webentwicklung ist Javascript eine der am häufigsten verwendeten Programmiersprachen. Trotz seiner Beliebtheit gibt es jedoch einige schwierige Konzepte, mit den…

Read post
Mar 2023

Dependency Injection

In der Welt der Softwareentwicklung gibt es viele Konzepte, die essentiell sind, um robuste, skalierbare und leicht wartbare Anwendungen zu erstellen. Eines dieser Konzepte, das…

Read post
Feb 2023

Die Macht des Method Chaining in C#: Ein Leitfaden für effizienten Code

In der Welt der Softwareentwicklung ist Effizienz ein Schlüsselkonzept. Effizienter Code ist nicht nur leichter zu lesen und zu warten, sondern trägt auch dazu bei, die Produkti…

Read post
Jan 2023

Scriptable: Kontaktlinsenstatus prüfen

Ein kleines Scriptable Widget zum tracken des aktuellen Kontaktlinsen / Kontaktlinsenbehälter Status. Da ich immer wieder vergesse, nach 30-40 Tagen meine Kontaktlinsen zu wechs…

Read post
Sep 2022

Marlin Firmware: SKR Mini e3 v3

Vielleicht mag sich der ein oder andere unter uns ja den Ärger sparen, sich die Marlin Bugfix Version 2.1.X für den Creality Ender 5 selbst zu kompilieren bzw. zu konfigurieren.…

Read post
Aug 2022

Autosort: Schnell und einfach Bilder und Videos sortieren

Dies ist der Nachfolger des hier vorgestellten Skriptes: GoPro & Fotos: Automatisch umbenennen und kopieren

Read post
Aug 2022

Promises

Ein Konzept, das für viele Entwickler zunächst schwer zu verstehen ist: Promises.

Read post
Mar 2022

JavaScript - Generatoren

JavaScript-Generatoren sind eine leistungsfähige Funktionstechnik, die JavaScript-Entwicklern zur Verfügung steht. Generatoren ermöglichen es Entwicklern, asynchrone Funktionen…

Read post
Feb 2022

JavaScript - Closures

Eine Closure entsteht, wenn eine Funktion auf eine Variable oder Funktion außerhalb ihres eigenen Scope zugreift. Im Grunde genommen ist eine Closure eine Funktion, die sich an…

Read post
Jan 2022

GoPro-Fotos automatisch umbenennen und kopieren

Es gibt eine neuere und bessere Version hier: Autosort - Schnell und einfach Bilder und Videos sortieren

Read post
Jan 2022

C# Delegates

Ein Delegate ist eine Art Zeiger auf eine Methode oder eine Gruppe von Methoden, die aufgerufen werden können, ohne dass du Details über die zugrunde liegenden Implementierungen…

Read post
Dec 2021

Auto-Backup to Amazon S3

Ich bin in letzter Zeit sehr kritisch geworden, was die Sicherheit meiner Backups angeht. Gerade auch, da ich mit meinem V-Server (auf dem unter Anderem auch diese Webseite geho…

Read post
Nov 2021

Udemy Autoenroll Skript für Tampermonkey

Auf myDealz finden sich regelmäßig threads welche kostenlose Udemy Kurse auflisten. Einmal für einen Kurs angemeldet kann man ihn - solange er online steht - jederzeit anschauen.

Read post
Nov 2021

JavaScript Object Notation mit SQL

Datenbanken eignen sich wunderbar zum strukturierten Speichern von Daten. Manchmal kann es jedoch vorkommen, dass dies aus diversen Gründen nicht ausreicht und man stattdessen k…

Read post
Jul 2021

null Conditional Operator

Der "null-conditional operator" ist ein Feature, das mit C 6.0 eingeführt wurde und es Entwicklern ermöglicht, sicherer mit Nullwerten umzugehen. Es ist ein einfacher Operator,…

Read post
Dec 2020

E-Mail Adressen validieren

Eine (zugegeben: auch von mir) oft verwendete Methode um sich vor E-Mail Spam zu schützen ist es, bei einer Registrierung einfach keine valide Mailadresse anzugeben. Unsagbar of…

Read post
Jun 2020

MySQL Null als 0 ausgeben

Für ein kleines Projekt musste ich die Werte einer Spalte in MySQL summieren und nach den summierten Werten sortieren. Sowas wie

Read post
May 2020

Alpha-Go

Wer sich für KI interessiert und einen leicht verdaulichen, fast schon "Spielfilm" zum Thema sucht, sollte sich auf jeden Fall die Dokumentation zum Alpha-Go Match reinziehen. A…

Read post
May 2020

Simultanschach

Als großer Schachfan bin ich natürlich auch Abonnent von GM Huschenbeth. Spannend fand ich sein 40k special, in welchem er simultan gegen mehrere Abonnenten spielt. Leider schei…

Read post
Mar 2020

NASA - Höhendaten visualisieren

Kleines Snippet zum visualisieren der NASA-Höhendaten. Die Daten gibt's hier: https://lpdaac.usgs.gov/products/srtmgl3v003/

Read post
Sep 2019

Youtube-DL Download MP3 (fast!)

Seit einiger Zeit nutze ich schon das wundervolle Tool youtube-dl. Wer es nicht kennt: Hiermit kann man von vielen Seiten Videos/Musik etc. herunterladen. Der Funktionsumfang is…

Read post
Sep 2019

Brute Force Protection

Brute Force Angriffe auf Webanwendungen stellen gerade bei größeren Webseiten mit vielen Nutzern ein ernsthaftes Problem dar. Dabei versucht ein Angreifer entweder mit zufällige…

Read post
Sep 2019

Brandneues MacBook schaltet sich einfach aus

Eine kleine Story über Apple oder das schlechteste und frustrierendste Kauferlebnis das ich jemals hatte. Vielleicht hilft es dem ein oder anderen Nutzer ja weiter. Ich teile de…

Read post
Jun 2019

Autopush - Einfach geänderte Dateien hochladen

Ich habe mir zur Vereinfachung des Webdesign/Webdevelopment-Workflows ein kleines Autopush-Skript geschrieben. Das Skript überwacht einen bestimmten Ordner und alle seine Untero…

Read post
Apr 2019

CentOS - Server essentials

Ab und an muss ich meinen CentOS-Server neu aufsetzen (entweder weil wieder irgendwas schief gelaufen ist oder weil ich das befriedigende Gefühl eines neuen, sauberen Systems ve…

Read post
Apr 2019

Fire on enter

Kleines Javascript/jQuery-Snippet, das eine Aktion auslöst, sobald in einem Feld der Enter-Button betätigt wird.

Read post
Aug 2018

Diese Version des Programms „OS X Sierra installieren“ kann nicht verifiziert werden.

Heute wollte ich meinen alten Mac an einen Freund weitergeben, und als gewissenhafter Nutzer wird davor natürlich alles erstmal auf Null zurück gesetzt. Also schnell via

Read post
Jul 2018

Einfaches Imageresize + Caching

Ab und an kommt es vor, dass ein bereits existierendes Bild in einer anderen Größe benötigt wird. Dann kann man entweder mit Photoshop für jede Version des Bildes eine individue…

Read post
Jul 2018

Simple Template Engine

Für ein etwas größeres Projekt habe ich eine einfache TemplateEngine gesucht. Ich wollte nicht sowohl für meine serverseitigen als auch meine clientseitigen Skripte immer wieder…

Read post
Jun 2018

Sekunden in Tage, Stunden, Minuten, Sekunden umrechnen

Bei einem aktuellen Projekt an dem ich heute morgen saß hatte ich etwas Kopfschmerzen dabei, einen Sekundenwert in Tage, Stunden, Minuten und Sekunden umzurechnen. Eigentlich si…

Read post
Jun 2018

Timemachine -5058

Worst Case Szenario: Das Backup spinnt. Normalerweise backupe ich IT Projekte zweifach. Mein Cronjob läuft automatisch täglich um 24:00 und erstellt ein lokales Backup meines lo…

Read post
Jun 2018

Scrollblur

Als "Designfreak" suche ich natürlich immer nach geeigneter Inspiration, und was bietet sich da besser an als ab und an auf den Webseiten der großen Agenturen vorbei zu schauen,…

Read post
Jun 2018

Javascript Snippets

Hier sammle ich ein paar JavaScript-Snippets. Eine Liste, die im Laufe der Zeit sicher noch erweitert wird :)

Read post
Jun 2018

Bash Snippets

Ein paar nützliche oder unsinnige Bash Snippets, die man öfter mal gebrauchen kann. Viel Spaß damit.

Read post
Jun 2018

Traue keinem Scan, den du nicht selbst gefälscht hast

Ein durchaus interessanter Vortrag welcher einen (recht amüsanten dramatischen) Bug der Xerox Kopierer aufzeigt. Kurz zusammengefasst geht es darum, dass Xerox Kopierer ähnliche…

Read post
May 2018

SPAM protection methods N° 2: Timing ist alles

Im Rahmen der Reihe "SPAM protection methods" geht es weiter mit Teil 2 und dem ominösen Titel "Timing ist alles". Dem zu Grunde liegt die Überlegung, dass Nutzer, wenn Sie ein…

Read post
May 2018

SPAM protection methods N° 3: Timing ist wiedermal alles

Auch bei der Seitennavigation kann man den Geschwindigkeitsunterschied zwischen Bot und realem Nutzer relativ gut ausnutzen. Während ein Nutzer normalerweise ein paar Sekunden a…

Read post
May 2018

HTTP Range Request mit PHP verarbeiten

Manchmal wollen wir nicht die gesamte Datei vom Server laden, sondern nur einen gewissen Ausschnitt (Range) der Datei. Wir möchten also ein Startbyte und ein Endbyte definieren…

Read post
May 2018

SPAM protection methods N° 1: Honeypot

Ein leidiges Thema seit Anbeginn des Internets ist SPAM (nein, nicht das Dosenfleisch, das gibt es länger als das Internet). An einem gelangweilten Wochenende hatte ich mir mal…

Read post
May 2018

Javascript Promises

Seit Juni 2015 sind Promises mit ES6 auch in Javascript angekommen und können hier nativ genutzt werden. Vielleicht geht es einigen hier so wie mir am Anfang und wissen nicht so…

Read post
May 2018

SPAM vermeiden mit qmail

SPAM. Alle hassen ihn, keiner kann ihn (ernsthaft) vermeiden. Um die Inbox allerdings einigermaßen aufgeräumt zu halten gibt es eine recht komfortable Lösung: Temporäre E-Mail-A…

Read post
May 2018

PHP Snippets

Manchmal muss man schnell mehrere Variablen tauschen und ich hatte mich irgendwann gefragt, ob das nicht auch ohne temp - Variable möglich ist. Seit dem ist das meine best - pra…

Read post
Mar 2018

OpenGeoDB Hürden

Für ein aktuelles Projekt habe ich eine Liste mit allen Postleitzahlen in Deutschland inkl. zugehöriger Städtenamen gebraucht. Es gilt zwar "Je mehr Daten desto besser" ;-) aber…

Read post