Artikel für Entwickler
Erklärungen zu Kodierungsformaten, zur Arbeit mit JSON und zu weiteren Themen, die für Entwickler nützlich sind, mit Links zu den passenden Online-Tools von tulzy.
Kodierung
Base64: wozu Kodierung dient und wie sie funktioniert
Wie Base64 binäre Daten in ASCII-Text verwandelt und wann das wirklich gebraucht wird.
Base32: der Unterschied zu Base64 und wann es praktischer ist
Das case-insensitive Alphabet von Base32 und Fälle, in denen es praktischer ist als Base64.
URL Encode/Decode: Percent-Encoding in Links
Wie Sonderzeichen in Adressen und Query-Parametern zu %XX-Sequenzen werden.
HTML Entities: Sonderzeichen sicher auf einer Seite ausgeben
Warum die Zeichen < > & escapt werden müssen und wie das kaputtes Markup verhindert.
JWT: Aufbau eines Tokens und was „Dekodieren" eines JWT bedeutet
Header, Payload und Signature eines JWT — und warum Dekodieren nicht dasselbe ist wie Signaturprüfung.
Unicode Escape: was \uXXXX-Sequenzen bedeuten
Woher Sequenzen wie \u0041 in JSON und JS-Strings kommen und was sie bedeuten.
ROT13 und die Caesar-Verschlüsselung: einfache Zeichensubstitution
Warum eine Verschiebung um 13 Buchstaben ROT13 selbstinvers macht und wozu man es heute noch nutzt.
Punycode: wie internationalisierte Domains im DNS funktionieren
Wie eine Domain mit nicht-lateinischen Zeichen zu einer ASCII-Form mit dem Präfix xn-- wird.
Morsecode: wie Text zu Punkten und Strichen wird
Das Prinzip der Kodierung von Buchstaben als Punkte und Striche, und wo Morsecode heute noch genutzt wird.
Data URI: wann Bilder direkt in den Code einbetten
Wie ein Data-URI den Inhalt einer Datei direkt in HTML oder CSS einbettet, und wann sich das lohnt.
Gzip + Base64: Daten komprimieren für die Übertragung als Text
Warum komprimierte Binärdaten zusätzlich Base64-kodiert werden, bevor sie in ein Textfeld kommen.
XML Entities: Zeichen in XML-Dokumenten escapen
Die fünf Pflicht-Entities von XML, ohne die das Dokument beim Parsen bricht.
JSON
JSON Formatter: Formatieren, Minifizieren und Validieren
Formatieren für Lesbarkeit, Minifizieren für Größe, Validieren für Korrektheit — drei verschiedene JSON-Aufgaben.
JSONPath: JSON-Daten abfragen ohne manuelles Parsen
Wie JSONPath erlaubt, benötigte Werte aus einem großen JSON mit einem einzigen Ausdruck herauszuholen statt manuell zu durchlaufen.
JSON Diff: wie sich struktureller Vergleich von Textvergleich unterscheidet
Warum die Schlüsselreihenfolge den Vergleich zweier JSON-Dokumente nicht beeinflussen sollte.
JSON Schema: die Struktur von JSON beschreiben und prüfen
Wie JSON Schema erlaubt, automatisch zu prüfen, ob Daten einem erwarteten Vertrag entsprechen.
JSON Flatten: eine verschachtelte Struktur in eine flache Liste verwandeln
Wie tief verschachteltes JSON zu einer flachen Liste von Schlüsseln wie user.address.city wird.
JSON Sort Keys: warum Objektschlüssel sortieren
Warum die JSON-Schlüsselreihenfolge nicht festgelegt ist, Sortierung in der Praxis aber trotzdem nützlich bleibt.
JSON Repair: warum JSON kaputtgeht und wie man es repariert
Häufige Ursachen für „kaputtes" JSON und was eine automatische Reparatur kann und nicht kann.
Mock JSON Generator: wozu Fake-Daten gut sind
Wie Mock-Daten erlauben, mit der UI-Entwicklung zu beginnen, bevor das Backend fertig ist.
JSON ↔ YAML/CSV/XML/TOML: wann und warum konvertieren
Welche Daten bei der Umwandlung von JSON in CSV verloren gehen und warum YAML und TOML für Konfigurationsdateien beliebt sind.
Text
Case Converter: warum es unterschiedliche Namensstile gibt
Warum in einem Projekt Variablen in camelCase, Dateien aber in kebab-case geschrieben werden, und woher diese Regeln stammen.
Text Diff: wie Algorithmen den Unterschied zwischen zwei Texten finden
Wie ein Diff-Algorithmus die minimale Menge an Änderungen zwischen zwei Textversionen findet.
Reguläre Ausdrücke: Grundsyntax und typische Muster
Wie man einen regulären Ausdruck liest und wie sich gieriges von faulem Matching unterscheidet.
Zeilen sortieren und Duplikate entfernen: wozu das gut ist
Warum eine numerische Sortierung, die „10" vor „9" setzt, ein Fehler ist, und wie man das vermeidet.
String Escape: warum derselbe Text unterschiedlich escaped werden muss
Warum dasselbe Anführungszeichen in einem JS-String, in JSON und in einem Shell-Befehl unterschiedlich escaped wird.
CRLF gegen LF: warum Zeilenendezeichen immer noch wichtig sind
Warum eine unter Windows geschriebene Datei in Git unter Linux als „komplett geändert" angezeigt werden kann.
Zeichen und Wörter zählen: warum das nicht immer trivial ist
Warum ein Emoji oder ein Zeichen mit Akzent als mehrere Zeichen auf einmal zählen kann.
Lorem Ipsum: woher der Platzhaltertext stammt und wozu er dient
Warum Designer absichtlich „bedeutungslosen" Text statt echtem Inhalt in Entwürfen verwenden.
Slugify: beliebigen Text in eine URL verwandeln
Wie ein Titel wie „Hallo, Welt!" zu einer URL-tauglichen Zeichenkette wie hallo-welt wird.
Markdown: warum einfache Textsyntax komplexe Editoren geschlagen hat
Warum Entwickler Dokumentation lieber in Markdown als in einem Rich-Text-Editor schreiben.
Leerzeichen und unsichtbare Zeichen: die versteckte Ursache seltsamer Bugs
Warum zwei scheinbar identische Strings wegen eines unsichtbaren Zeichens nicht übereinstimmen können.
Text Reverse: warum „Text umkehren" schwieriger ist, als es klingt
Warum eine naive String-Umkehrung ein Emoji in unbrauchbare Bytes verwandeln kann.
Text-Häufigkeitsanalyse: warum man zählt, wie oft sich Wörter wiederholen
Wie die Buchstabenhäufigkeit in einem Geheimtext hilft, die einfachsten Substitutionschiffren zu knacken.
Hashes/Krypto
Hash Generator: worin sich MD5, SHA-1 und SHA-256 unterscheiden
Warum MD5 immer noch zur Überprüfung der Dateiintegrität verwendet wird, aber nicht für Passwörter.
Checksum Verifier: wie man prüft, ob eine Datei nicht beschädigt ist
Warum eine übereinstimmende Prüfsumme die Integrität einer Datei bestätigt, aber nicht, wer sie erstellt hat.
HMAC: wie sich ein Hash mit Schlüssel von einem gewöhnlichen Hash unterscheidet
Warum ein einfacher SHA-256 nicht vor Manipulation einer Nachricht schützt, HMAC aber schon.
Bcrypt: warum Passwörter langsam gehasht werden, nicht schnell
Warum ein schneller SHA-256 eine schlechte Wahl für Passwörter ist, und ein langsamer bcrypt die richtige.
UUID: wie Kennungen erzeugt werden, die sich fast nie wiederholen
Warum UUID v4 unabhängig auf Millionen von Maschinen ohne Kollisionsrisiko erzeugt werden kann.
Passwortgenerator: was ein Passwort wirklich stark macht
Warum ein langes Passwort aus Wörterbuchwörtern stärker ist als ein kurzes mit Symbolen und Zahlen.
AES: wie symmetrische Verschlüsselung funktioniert
Warum bei AES derselbe Schlüssel Daten verschlüsselt und entschlüsselt, und wie sich das von asymmetrischer Verschlüsselung unterscheidet.
Argon2: warum dieser Algorithmus den Passwort-Hashing-Wettbewerb gewann
Wie Argon2 besser vor Angriffen mit Grafikkarten schützt als ältere Passwort-Hashing-Algorithmen.
Scrypt: warum der Algorithmus so viel Speicher braucht
Warum scrypt absichtlich viel Speicher benötigt, um das Knacken auf ASIC-Geräten zu erschweren.
TOTP: wie Einmalcodes in Authenticator-Apps funktionieren
Warum der Code in Google Authenticator ohne Internet funktioniert und sich nur über die Zeit mit dem Server synchronisiert.
PBKDF2: der älteste Standard zur Schlüsselstreckung
Warum die empfohlene Anzahl der PBKDF2-Iterationen jedes Jahr wächst.
X.509: was in einem SSL-Zertifikat steckt
Was der Browser im Zertifikat einer Website genau prüft, bevor er das grüne Schloss anzeigt.
PGP: wie Verschlüsselung mit öffentlichem und privatem Schlüssel funktioniert
Warum man einen öffentlichen PGP-Schlüssel frei teilen kann, den privaten aber niemals.
Zeit/Zahlen
Unix-Zeit: warum Computer die Zeit ab 1970 zählen
Warum der 1. Januar 1970 zum Bezugspunkt der Zeit für die meisten Computersysteme wurde.
Cron-Ausdrücke: wie man einen Aufgabenzeitplan entschlüsselt
Wie man einen Ausdruck wie */15 * * * * entschlüsselt und genau weiß, wann die Aufgabe ausgeführt wird.
Zahlensysteme: wozu Binär-, Oktal- und Hexadezimalsystem gebraucht werden
Warum die Farbe #FF5733 in CSS mit hexadezimalen statt dezimalen Ziffern geschrieben wird.
Bitweise Operationen: wie AND, OR und XOR auf Bit-Ebene funktionieren
Wie sich bitweises AND von logischem AND unterscheidet, und wozu man überhaupt einzelne Bits einer Zahl manipuliert.
Datumsdifferenz: warum das Zählen von Tagen komplizierter ist, als es scheint
Warum eine naive Subtraktion von Daten wegen Schaltjahren ein falsches Ergebnis liefern kann.
Altersberechnung: warum es nicht einfach eine Subtraktion von Jahren ist
Warum das einfache Subtrahieren der Geburtsjahre ein um eins zu hohes Alter ergeben kann.
Zeitzonen: warum UTC nicht dasselbe ist wie GMT
Warum sich UTC nie zweimal im Jahr ändert, die Londoner Zeit (GMT/BST) aber schon.
Dauerrechner: wie man Stunden, Minuten und Sekunden korrekt addiert
Warum beim Addieren von Minuten und Sekunden der Rest wie bei der Dezimaladdition in die nächste Stelle übertragen werden muss.
ISO 8601 Duration: wie man eine Dauer im Standardformat schreibt
Warum PT1H30M „1 Stunde 30 Minuten" bedeutet, nicht „1 Minute 30 Stunden".
Kalenderwoche: warum verschiedene Länder Wochen unterschiedlich zählen
Warum der 1. Januar nach ISO 8601 manchmal zur Woche 52 oder 53 des Vorjahres gehört.
Römische Zahlen: wie ein System ohne Null und Stellenwert funktioniert
Warum IV für 4 steht und nicht für 6, und wie die Subtraktionsregel bei römischen Zahlen funktioniert.
IEEE 754: warum 0.1 + 0.2 im Code nicht gleich 0.3 ist
Warum fast jede Programmiersprache für 0.1 + 0.2 den Wert 0.30000000000000004 ausgibt.
Zahl in Worten: wozu Ziffern in Text umwandeln
Warum Bankdokumente einen Betrag sowohl in Ziffern als auch in Worten schreiben.
Netzwerk/HTTP
URL-Aufschlüsselung: aus welchen Teilen eine Webadresse besteht
Warum eine URL einen Teil nach dem #-Symbol hat, den der Server nie zu sehen bekommt.
Query-String vs. JSON: warum GET-Parameter so eingeschränkt sind
Warum ein Array oder ein verschachteltes Objekt über einen URL-Query-String zu übergeben nicht so einfach ist wie mit JSON.
User-Agent: warum dieser String ein solches Durcheinander ist
Warum Chrome, Safari und Edge alle gleichzeitig die Wörter „Mozilla" und „Safari" in ihrem User-Agent enthalten.
Basic Authentication: wie die einfachste Methode zum Schutz einer HTTP-Ressource funktioniert
Warum Basic Auth unbedingt HTTPS erfordert, da Base64 Kodierung ist, keine Verschlüsselung.
HTTP-Header: was sich in jeder Anfrage und Antwort verbirgt
Warum der Content-Type-Header bestimmt, wie der Browser den Antwortkörper des Servers interpretiert.
Cookies: wie ein kleines Stück Text den Sitzungsstatus speichert
Warum das HttpOnly-Attribut ein Cookie vor Diebstahl durch bösartigen JavaScript-Code schützt.
CORS: warum der Browser „normal aussehende" Anfragen an eine andere Domain blockiert
Warum ein CORS-Fehler im Browser auftritt, nicht auf dem Server, und wer die Anfrage tatsächlich blockiert.
E-Mail-Header: wie man den Weg einer Nachricht vom Absender bis zu Ihnen zurückverfolgt
Warum man Received-Header von unten nach oben lesen muss, um den Weg einer Nachricht zurückzuverfolgen.
SEO
Meta-Tags: welche wirklich Suche und soziale Netzwerke beeinflussen
Warum eine Suchmaschine Ihre meta description manchmal ignoriert und stattdessen einen eigenen Snippet aus dem Seitentext generiert.
robots.txt: wie Suchbots entscheiden, was sie crawlen dürfen
Warum eine Disallow-Regel in robots.txt eine Seite nicht aus den Suchergebnissen verschwinden lässt, wenn anderswo darauf verlinkt wird.
Sitemap.xml: warum Suchmaschinen eine Karte der Website brauchen
Warum das Auftauchen in sitemap.xml nicht garantiert, dass eine Suchmaschine eine Seite indexiert.
Favicon: warum ein einziges Icon so viele Größen und Formate braucht
Warum ein einzelnes favicon.ico nicht mehr ausreicht, um auf allen Geräten korrekt angezeigt zu werden.
Sitemap.xml generieren: wie man automatisch eine Sitemap erstellt
Warum Suchmaschinen das Feld priority in sitemap.xml größtenteils ignorieren, obwohl es Teil der Spezifikation ist.
Webentwicklung
HEX, RGB, HSL: warum es so viele Arten gibt, eine Farbe zu schreiben
Warum Designer beim manuellen Auswählen eines Farbtons oft HSL statt HEX bevorzugen.
CSS-Minifizierung: was aus der Datei tatsächlich entfernt wird und warum
Warum minifiziertes CSS im Browser exakt gleich funktioniert, obwohl es für Menschen unlesbar wird.
JavaScript-Minifizierung: der Unterschied zwischen Minifizieren und Obfuskieren
Warum minifizierter Code bei Bedarf immer noch lesbar ist, obfuskierter Code dagegen nicht.
HTML-Minifizierung: warum Leerraum im Markup überhaupt eine Rolle spielt
Warum das Entfernen von Leerraum in <pre> oder einem Textarea das Aussehen der Seite zerstören kann, im Gegensatz zu fast überall sonst.
CSS-Verläufe: wie sich linear von radial und conic unterscheidet
Warum sich conic-gradient für Kreisdiagramme eignet, während radial-gradient einen Lichtfleck-Effekt erzeugt.
Der Luhn-Algorithmus: wie eine Kartennummer auf Korrektheit geprüft wird
Warum eine Kartennummer, die die Luhn-Prüfung besteht, nicht bedeutet, dass diese Karte wirklich existiert.
IBAN: wie eine internationale Bankkontonummer aufgebaut ist
Warum die ersten beiden Buchstaben einer IBAN ein Ländercode sind, nicht Teil der Kontonummer selbst.
QR-Codes: wie ein Link in ein Quadrat aus Pixeln passt
Warum ein QR-Code mit einem Logo in der Mitte trotzdem scannbar bleibt, obwohl ein Teil des Musters verdeckt ist.
Barcodes: wie sich Code 128 von EAN-13 unterscheidet
Warum Produkte im Ladenregal fast immer EAN-13 statt Code 128 verwenden.
Placeholder-Bilder: warum Platzhalterbilder während der Entwicklung wichtig sind
Warum Entwickler während des Layout-Aufbaus absichtlich graue Kästen statt echter Fotos einsetzen.