Articoli per sviluppatori

Spiegazioni sui formati di codifica, sul lavoro con JSON e su altri argomenti utili agli sviluppatori, con link agli strumenti online di tulzy corrispondenti.

Codifica

Base64: a cosa serve la codifica e come funziona

Come Base64 trasforma dati binari in testo ASCII e quando serve davvero.

Base32: come si differenzia da Base64 e quando è più comodo

L'alfabeto di Base32, insensibile a maiuscole/minuscole, e i casi in cui è più comodo di Base64.

URL Encode/Decode: il percent-encoding nei link

Come i caratteri speciali negli indirizzi e nei parametri diventano sequenze %XX.

HTML Entities: come mostrare caratteri speciali in sicurezza

Perché i caratteri < > & vanno escapati e come questo evita di rompere il markup.

JWT: struttura del token e cosa significa "decodificare" un JWT

Header, payload e signature di un JWT, e perché decodificare non equivale a verificare la firma.

Unicode Escape: cosa significano le sequenze \uXXXX

Da dove vengono sequenze come \u0041 in JSON e nelle stringhe JS, e cosa significano.

ROT13 e il cifrario di Cesare: semplice sostituzione di caratteri

Perché uno scorrimento di 13 lettere rende ROT13 auto-inverso, e perché si usa ancora oggi.

Punycode: come funzionano i domini internazionalizzati nel DNS

Come un dominio con caratteri non latini diventa una forma ASCII con il prefisso xn--.

Il codice Morse: come il testo diventa punti e linee

Il principio di codifica delle lettere in punti e linee, e dove si usa ancora oggi il Morse.

Data URI: quando incorporare immagini direttamente nel codice

Come un Data URI incorpora il contenuto di un file direttamente in HTML o CSS, e quando conviene.

Gzip + Base64: comprimere dati per trasmetterli come testo

Perché i dati binari compressi vengono anche codificati in Base64 prima di finire in un campo di testo.

XML Entities: escapare i caratteri nei documenti XML

Le cinque entity XML obbligatorie senza le quali il documento si rompe durante il parsing.

Testo

Case Converter: perché esistono stili di denominazione diversi

Perché in uno stesso progetto le variabili si scrivono in camelCase ma i file in kebab-case, e da dove vengono queste regole.

Text Diff: come gli algoritmi trovano la differenza tra due testi

Come un algoritmo di diff trova l'insieme minimo di modifiche tra due versioni di un testo.

Espressioni regolari: sintassi di base e pattern comuni

Come leggere un'espressione regolare e in cosa la corrispondenza greedy differisce da quella lazy.

Ordinare e deduplicare righe: a cosa serve

Perché un ordinamento numerico che mette "10" prima di "9" è un errore, e come evitarlo.

String Escape: perché lo stesso testo va escapato in modo diverso

Perché la stessa virgoletta viene escapata in modo diverso in una stringa JS, in JSON e in un comando shell.

CRLF contro LF: perché i caratteri di fine riga contano ancora

Perché un file scritto su Windows può apparire "completamente modificato" in git su Linux.

Contare caratteri e parole: perché non è sempre banale

Perché un'emoji o una lettera accentata possono contare come più caratteri contemporaneamente.

Lorem Ipsum: da dove viene il testo segnaposto e a cosa serve

Perché i designer usano deliberatamente testo "senza senso" invece di contenuti reali nei mockup.

Slugify: come trasformare un testo qualsiasi in un URL

Come un titolo come "Ciao, Mondo!" diventa una stringa compatibile con gli URL come ciao-mondo.

Markdown: perché una sintassi di testo semplice ha battuto gli editor ricchi

Perché gli sviluppatori preferiscono scrivere la documentazione in Markdown invece che in un editor di testo ricco.

Spazi e caratteri invisibili: la causa nascosta di bug strani

Perché due stringhe apparentemente identiche possono non corrispondere a causa di un carattere invisibile.

Text Reverse: perché "invertire un testo" è più difficile di quanto sembri

Perché un'inversione ingenua di una stringa può trasformare un'emoji in byte inutilizzabili.

Analisi di frequenza del testo: a cosa serve contare le ripetizioni delle parole

Come la frequenza delle lettere in un testo cifrato aiuta a violare i cifrari a sostituzione più semplici.

Hash/Crittografia

Hash Generator: in cosa differiscono MD5, SHA-1 e SHA-256

Perché MD5 viene ancora usato per verificare l'integrità dei file, ma non per le password.

Checksum Verifier: come verificare che un file non sia danneggiato

Perché un checksum corrispondente conferma l'integrità di un file, ma non chi lo ha creato.

HMAC: in cosa differisce un hash con chiave da un hash normale

Perché un semplice SHA-256 non protegge dalla manomissione di un messaggio, ma HMAC sì.

Bcrypt: perché le password vengono hashate lentamente, non velocemente

Perché un SHA-256 veloce è una cattiva scelta per le password, e un bcrypt lento è quella giusta.

UUID: come vengono generati identificatori che quasi non si ripetono mai

Perché un UUID v4 può essere generato in modo indipendente su milioni di macchine senza rischio di collisione.

Generatore di password: cosa rende davvero forte una password

Perché una password lunga fatta di parole del dizionario è più forte di una corta con simboli e numeri.

AES: come funziona la crittografia simmetrica

Perché la stessa chiave cifra e decifra i dati in AES, e come questo differisce dalla crittografia asimmetrica.

Argon2: perché questo algoritmo ha vinto il concorso sull'hashing delle password

Come Argon2 si difende meglio dagli attacchi con GPU rispetto agli algoritmi di hashing password più vecchi.

Scrypt: perché l'algoritmo ha bisogno di così tanta memoria

Perché scrypt richiede deliberatamente molta memoria per rendere più difficile il cracking su dispositivi ASIC.

TOTP: come funzionano i codici monouso nelle app di autenticazione

Perché il codice di Google Authenticator funziona senza internet e si sincronizza col server solo tramite l'ora.

PBKDF2: lo standard più vecchio per lo stretching delle chiavi

Perché il numero di iterazioni raccomandato per PBKDF2 cresce ogni anno.

X.509: cosa c'è dentro un certificato SSL

Cosa controlla esattamente il browser nel certificato di un sito prima di mostrare il lucchetto verde.

PGP: come funziona la crittografia a chiave pubblica e privata

Perché si può condividere liberamente una chiave pubblica PGP, ma mai quella privata.

Tempo/Numeri

Tempo Unix: perché i computer contano il tempo dal 1970

Perché il 1° gennaio 1970 è diventato il punto di riferimento del tempo per la maggior parte dei sistemi informatici.

Espressioni cron: come decifrare una pianificazione di attività

Come decifrare un'espressione come */15 * * * * e sapere esattamente quando verrà eseguita l'attività.

Sistemi numerici: a cosa servono binario, ottale ed esadecimale

Perché il colore #FF5733 in CSS è scritto con cifre esadecimali anziché decimali.

Operazioni bit a bit: come funzionano AND, OR e XOR a livello di bit

In cosa l'AND bit a bit differisce da quello logico, e perché operare sui singoli bit di un numero.

Differenza tra date: perché contare i giorni è più complicato di quanto sembri

Perché sottrarre date in modo ingenuo può dare un risultato sbagliato a causa degli anni bisestili.

Calcolo dell'età: perché non è una semplice sottrazione di anni

Perché sottrarre semplicemente gli anni di nascita può dare un'età superiore di uno rispetto a quella reale.

Fusi orari: perché UTC non è la stessa cosa di GMT

Perché UTC non cambia mai due volte all'anno, mentre l'ora di Londra (GMT/BST) sì.

Calcolatrice di durata: come sommare correttamente ore, minuti e secondi

Perché sommando minuti e secondi bisogna "riportare" il resto alla cifra successiva, come nella somma decimale.

ISO 8601 Duration: come scrivere una durata in formato standard

Perché PT1H30M significa «1 ora 30 minuti» e non «1 minuto 30 ore».

Numero di settimana: perché paesi diversi contano le settimane in modo diverso

Perché il 1° gennaio a volte appartiene alla settimana 52 o 53 dell'anno precedente secondo lo standard ISO 8601.

Numeri romani: come funziona un sistema senza zero né posizioni

Perché IV significa 4 e non 6, e come funziona la regola della sottrazione nei numeri romani.

IEEE 754: perché 0.1 + 0.2 non è uguale a 0.3 nel codice

Perché in quasi ogni linguaggio di programmazione 0.1 + 0.2 restituisce 0.30000000000000004.

Numero in lettere: perché trasformare cifre in parole

Perché nei documenti bancari l'importo viene scritto sia in cifre che in lettere contemporaneamente.

Sviluppo Web

HEX, RGB, HSL: perché esistono così tanti modi di scrivere un colore

Perché i designer scelgono spesso HSL invece di HEX quando devono scegliere a mano una tonalità di colore.

Minificazione CSS: cosa viene davvero rimosso dal file e perché

Perché il CSS minificato funziona esattamente allo stesso modo nel browser, pur diventando illeggibile per una persona.

Minificazione JavaScript: la differenza tra minificare e offuscare

Perché il codice minificato resta leggibile se lo si desidera, mentre quello offuscato no.

Minificazione HTML: perché gli spazi nel markup contano davvero

Perché rimuovere gli spazi dentro <pre> o una textarea può rompere l'aspetto della pagina, a differenza di quasi tutti gli altri punti.

Gradienti CSS: in cosa linear differisce da radial e conic

Perché conic-gradient è adatto ai grafici a torta, mentre radial-gradient crea un effetto macchia di luce.

L'algoritmo di Luhn: come si verifica la correttezza di un numero di carta

Perché un numero di carta che supera il controllo di Luhn non significa che quella carta esista realmente.

IBAN: come è strutturato un numero di conto bancario internazionale

Perché le prime due lettere di un IBAN sono un codice paese, non parte del numero di conto vero e proprio.

Codici QR: come un link entra in un quadrato di pixel

Perché un codice QR con un logo al centro si scansiona ancora, anche se parte del disegno è coperta.

Codici a barre: in cosa Code 128 differisce da EAN-13

Perché i prodotti sugli scaffali dei negozi usano quasi sempre EAN-13 invece di Code 128.

Immagini placeholder: perché le immagini finte contano durante lo sviluppo

Perché gli sviluppatori inseriscono deliberatamente rettangoli grigi al posto di foto reali mentre un layout è ancora in costruzione.