What I think about...
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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.…
Autosort: Schnell und einfach Bilder und Videos sortieren
Dies ist der Nachfolger des hier vorgestellten Skriptes: GoPro & Fotos: Automatisch umbenennen und kopieren
Promises
Ein Konzept, das für viele Entwickler zunächst schwer zu verstehen ist: Promises.
JavaScript - Generatoren
JavaScript-Generatoren sind eine leistungsfähige Funktionstechnik, die JavaScript-Entwicklern zur Verfügung steht. Generatoren ermöglichen es Entwicklern, asynchrone Funktionen…
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…
GoPro-Fotos automatisch umbenennen und kopieren
Es gibt eine neuere und bessere Version hier: Autosort - Schnell und einfach Bilder und Videos sortieren
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…
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…
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.
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…
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,…
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…
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
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…
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…
NASA - Höhendaten visualisieren
Kleines Snippet zum visualisieren der NASA-Höhendaten. Die Daten gibt's hier: https://lpdaac.usgs.gov/products/srtmgl3v003/
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…
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…
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…
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…
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…
Fire on enter
Kleines Javascript/jQuery-Snippet, das eine Aktion auslöst, sobald in einem Feld der Enter-Button betätigt wird.
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
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…
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…
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…
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…
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,…
Javascript Snippets
Hier sammle ich ein paar JavaScript-Snippets. Eine Liste, die im Laufe der Zeit sicher noch erweitert wird :)
Bash Snippets
Ein paar nützliche oder unsinnige Bash Snippets, die man öfter mal gebrauchen kann. Viel Spaß damit.
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…
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…
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…
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…
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…
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…
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…
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…
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…