Note di Matteo


17 gennaio 2026

ttl è un mtr con qualche funzione in più, tra cui enrichment dei dati ASN e DNS:

Key features of ttl include:

• Multi-flow probing – Enumerates all load-balanced paths (no more seeing just one path through ECMP).

• Path MTU discovery – Pinpoints exactly where fragmentation kills your jumbo frames.

• NAT detection – Reveals when a middlebox is quietly rewriting your source ports.

• Route flap alerts – Catches BGP instability as it happens by detecting path changes in real time.

• PeeringDB integration – Identifies which Internet Exchange (IX) you're crossing in your route.

• MPLS label visibility – Exposes provider LSP paths by decoding MPLS labels from ICMP responses.

• Smart loss detection – Distinguishes real packet loss from routers simply rate-limiting ICMP replies.

• Modern TUI – Features live stats, jitter calculation, ASN/GeoIP enrichment, and a sleek terminal UI (no 1990s look-and-feel).

• Scriptable output – JSON and CSV export for automating analysis or proving that yes, the problem is their network.

(LinkedIn)

#294 /
20:38
/ #reti

The truth is that we and Elon agreed in 2017 that a for-profit structure would be the next phase for OpenAI; negotiations ended when we refused to give him full control; we rejected his offer to merge OpenAI into Tesla; we tried to find another path to achieve the mission together; and then he quit OpenAI, encouraging us to find our own path to raising billions of dollars, without which he gave us a 0% chance⁠ of success.

[...]

He said that he needed full control since he’d been burned by not having it in the past, and when we discussed succession he surprised us by talking about his children controlling AGI.

OpenAI

#293 /
08:59
/ #ai

16 gennaio 2026

Ancora sulla questione Cloudflare-AGCOM: nella delibera c'è scritto che il punto non era Piracy Shield (cioè i blocchi entro 30 minuti), ma ordini di blocco decisi da un tribunale. A quanto pare Cloudflare si è rifiutata di eseguirli, e quindi è evidentemente nel torto.

AGCOM specifica poi questo dato: "Cloudflare appare come fornitore di servizi del 70% dei siti illeciti degli ultimi anni".


2FA for developers

Ho aggiunto il supporto all'autenticazione a due fattori su DMARCwise e ho fatto fatica a trovare informazioni su best practice attorno alla 2FA con OTP, per cui segno quello che ho scoperto qui.

Intanto, l'algoritmo si chiama Time-based One-Time Password (TOTP) e permette di generare un codice di N cifre ogni T secondi partendo da un secret. Non tutte le app "authenticator" supportano tutte le configurazioni, per cui la più comune è:

  • Codici di 6 cifre.
  • Intervallo di tempo T di 30 secondi.
  • Algoritmo HMAC-SHA1.

Il secret nella maggior parte dei casi è di 20 byte (160 bit) e viene codificato in Base32 (es. CVEBO7GKWLFDRBJRPPTOZ7I6VEPDIGIT). Va generato diverso per ogni utente.

Per la verifica del TOTP la RFC consiglia di usare una tolleranza (drift window) di +/- un intervallo di tempo T (quindi vale sia il codice precedente che quello successivo).

Il secret andrebbe cifrato prima di essere inserito nel database. Nel mio caso ho scelto AES-256 GCM. Nel db vanno quindi salvati il secret cifrato (Base64) più il nonce e il tag AES.

Per la validazione dei codici ho usato la libreria Otp.NET per .NET/C#. Per AES ho usato l'implementazione nativa di .NET.

Per la configurazione iniziale del secondo fattore, all'utente vanno forniti il secret e i vari parametri menzionati sopra (o anche no, dato che quelli indicati qui sopra sono di solito il default), oppure un QR code che contiene un URI con questo formato (inizialmente definito da Google ma ora standard de facto):

otpauth://totp/{label}:{accountName}?secret={secret}&issuer={issuer}";

I parametri vanno URL encoded. La prima etichetta viene mostrata nella UI dell'applicazione authenticator di turno (Google Authenticator, Ente Auth, ecc.) assieme al nome dell'account, mentre l'issuer dovrebbe essere a uso interno.

Il codice QR lo genero server-side in SVG con ZXing.QrCode e lo ritorno nella risposta JSON delle API. Probabilmente si può fare anche client-side, ma avevo già generato QR in C# in un altro progetto per cui ho riciclato il codice.

Per confermare l'abilitazione della 2FA l'utente deve inserire un primo codice TOTP generato dall'app authenticator. C'è la possibilità che l'utente abbandoni il processo a metà, per cui ci vuole un cleanup delle configurazioni che non sono ancora state abilitate dopo 24/48 ore.

Andrebbero poi generati e forniti dei codici di backup/recupero. Nel mio caso sono 10 codici di 8 caratteri presi dall'alfabeto ABCDEFGHJKLMNPQRSTUVWXYZ23456789 (es. BVEZ-MMWP). Sono hashati con Argon2id, come le password, e salvati in una tabella del db. Di conseguenza nel momento della verifica del backup code bisogna verificarli tutti uno a uno per trovare se c'è un match, e poi segnare il codice individuato come già usato.

Come si implementa la verifica del secondo fattore in fase di login? Il login restituisce un token di tipo TwoFactorPending e il frontend fa redirect alla pagina di verifica. Questo token temporaneo permette di usare solo l'endpoint di verifica 2FA. Se il codice inserito dall'utente è corretto viene invalidato il token temporaneo (che ha comunque scadenza breve, es. 5 minuti) e ne viene creato uno nuovo "standard".

La disattivazione del secondo fattore deve richiedere la password dell'utente, mentre la rigenerazione dei codici di backup deve richiedere un codice TOTP valido (per verificare che l'utente sia effettivamente ancora in possesso del secondo fattore).

Bonus: il 95% del codice è stato scritto da Claude Code e dall'inizio alla fine ci abbiamo impiegato circa 3 giorni (progettazione, implementazione di 6 endpoint backend, integration test e tutta la UI con SvelteKit).

#291 /
20:25
/ #dev#security

15 gennaio 2026

certs.email

Ho pubblicato certs.email: un mini-servizio per essere notificati all'avvicinamento della scadenza dei certificati SSL/TLS dei propri domini.

È gratis e open source e in realtà mi serve prevalentemente per avere un dominio in più che invia email, per poter testare meglio DMARCwise.

#290 /
17:32
/ #dev#security

TIL ci sono router Cisco che crashano se una risposta DNS contenente CNAME ha i record CNAME nell'ordine sbagliato. Cioè anziché:

;; QUESTION SECTION:
;; www.example.com.        IN    A

;; ANSWER SECTION:
www.example.com.    3600   IN    CNAME  cdn.example.com.
cdn.example.com.    300    IN    A      198.51.100.1

Così:

;; QUESTION SECTION:
;; www.example.com.	       IN    A

;; ANSWER SECTION:
cdn.example.com.    300    IN    A      198.51.100.1
www.example.com.    3600   IN    CNAME  cdn.example.com.

Cloudflare racconta che ha invertito l'ordine dei record nelle risposte DNS come mostrato qui sopra per rendere più efficiente il codice, e i router Cisco hanno iniziato ad andare in crash loop fino al rollback della modifica. Anche la risoluzione DNS nel kernel Linux ha un problema simile, anche se in quel caso la risposta veniva considerata vuota.


AWS European Sovereign Cloud

Da oggi è disponibile AWS European Sovereign Cloud (AWS.eu). Non ci sono tutti i servizi ma è comunque interessante. Account separato e (credo) region separata, per ora in Germania, con staff 100% europeo e nessuna dipendenza "tecnica" sugli USA.

#288 /
11:27
/ #aws#cloud


ChatGPT Translate, interessante (e gratis):

#286 /
10:35
/ #ai#openai

14 gennaio 2026

Siri powered by Gemini

Mi chiedo se il fatto che Siri sarà powered by Gemini si noterà nel concreto. I due principali (o unici) sistemi operativi mobile avranno assistenti AI entrambi dipendenti da Google. È un potenziale grosso bias (le "conoscenze" interne dell'LLM saranno comuni).

Le opzioni comunque erano: Apple prende la tecnologia da OpenAI, che le vuole fare competizione anche nell'hardware, oppure Apple prende la tecnologia da Google, che già le fa competizione non solo sugli assistenti AI e con Android ma anche sull'hardware. Sarà uno degli ultimi atti di Tim Cook prima della pensione, non so se sarà ben ricordato per questo.

EDIT: sarà distillazione, non fine-tuning.


Dev'essere qualcosa che ha a che vedere con le nostre radici culturali, il cristianesimo forse, le favole che ci raccontavano da bambini, i cartoni animati. C'è questo bisogno di eroi, di gente pura, che si immola sull'altare, c'è questo bisogno di trovare persone migliori di noi e queste persone non devono manco vederli i soldi, come se i soldi fossero qualcosa di sporco di brutto. Credo che sia una cosa particolarmente forte in Italia, un po' meno altrove come negli Stati Uniti.

[...] Quello che so è che le favole non esistono, questa cosa dei contenuti gratis che ci sono stati tirati in faccia dai social ci ha avvelenato il cervello. Ha avvelenato il mio canale [YouTube], dalla nascita, e ora sta avvelenando tutto il resto.

[...] Accettiamo l'idea di pagare per i contenuti che vediamo, accettiamo di pagare per il giornale, di pagare per gli articoli che leggiamo, e se invece non vogliamo pagare di tasca nostra, accettiamo l'idea che qualcun altro paghi per il contenuto che ci viene fornito. Quantomeno dobbiamo accettare questo compromesso, dobbiamo accettare che un content creator faccia ogni tanto un contenuto sponsorizzato. Io credo che sia sano e giusto, significa che l'agenda di quel content creator è chiara a tutti, tutti sappiamo chi lo sta finanziando e che la sua attività imprendotirale goda di ottima salute. Impariamo a celebrare questi successi e impariamo ad accettare che viviamo tutti in una società capitalistica e che su questo si fondano una serie di compromessi che faremmo bene ad accettare per il nostro stesso benessere.

Guido Cardinali

#284 /
14:33
/ #social

JPEG XL in Chromium

A sorpresa Google aggiunge il supporto a JPEG XL in Chromium, dopo che nel 2022 aveva detto che non l'avrebbe fatto.

In a significant pivot, Google has officially integrated native JPEG XL support back into the Chromium browser engine as of today. The new implementation is built upon a new, memory-safe Rust-based decoder called jxl-rs, which satisfies long-standing security requirements that previously hindered its adoption.

Questo grazie appunto alla nuova implementazione di riferimento ufficiale di JPEG XL in Rust, che riduce i rischi di aggiungere decine di migliaia di codice nuovo (i bug di memoria sono molto spesso nei decoder di immagini).

JPEG XL è un formato notevole che integra le migliori caratteristiche dei formati moderni, col beneficio aggiuntivo di permettere la conversione lossless da JPEG esistenti.

#283 /
10:45
/ #browser

13 gennaio 2026

"Ho voluto la bicicletta"

Complice la posizione geografica in una pianura senza vento, Milano supera ampiamente la concentrazione di inquinanti atmosferici stabiliti dalle norme europee e dall’OMS. C’è un lento miglioramento sul lungo termine, ma ancora lontano da livelli non a rischio. E poi il 2025 è andato peggio del 2024, che era andato peggio del 2023 (a luglio 2025 si contavano 111 giorni su 181 di superamento delle soglie OMS per il PM2.5). Metà di questi inquinanti vengono dal traffico automobilistico. È un problema di sanità pubblica, e mettere più persone nelle condizioni di spostarsi in bicicletta sarebbe la contromisura più rapida e più economica per intaccarlo (potenziare i mezzi pubblici è più importante, ma molto più costoso). Dunque la paura di un ciclista sulle strade è un guaio anche per tutti gli altri: è un guaio per la città.

[...]

Eppure, Milano è anche una città piena di automobili. Ci sono più di 50 auto ogni cento abitanti, laddove Londra, Parigi e Amsterdam ne hanno tra 20 e 30. E occupano tanto spazio che non sarebbe destinato alle auto. Capita spesso di trovarsi a camminare su un marciapiede dietro a una macchina che cerca parcheggio (sul marciapiede) o fa manovra per uscire. Esiste una deroga ufficiosa a parcheggiare anche dove non si può – aree verdi, marciapiedi e carreggiate – e anche una sorta di orgoglio nel farlo, nonostante a Milano ci siano molti più parcheggi regolamentari che in altre città europee: 22 posti auto su strada ogni 100 abitanti, contro i 7 di Barcellona e i 6 di Parigi.

Diletta Sereni

#282 /
20:39
/ #mobilità


12 gennaio 2026

Being able to build for reliability, performance, scale, and security will be a highly-prized skill. When [with AI] anyone can generate software that sort of works until it doesn’t, there will be more demand for engineers who produce quality work that always works as expected.

You cannot prompt an AI to create secure, performant code: you need to know what you want, how to validate the nonfunctional requirements, architect the code, and prompt the AI accordingly. You might also need to throw away the AI and get down to writing code or configuration by hand in order to get the details right. Basically, it pays to know when to use your own expertise.

[...]

The good news is that software engineering fundamentals should become more important, the more a team relies on AI to generate code. More code leads to more problems which need to be caught earlier, and dealt with systematically. This is what good software engineering is about, and always has been.

Gergely Orosz

#280 /
20:37
/ #ai

sslip.io is a DNS (Domain Name System) service that, when queried with a hostname with an embedded IP address, returns that IP address.

#279 /
14:55
/ #dns

Altro problema tra i numerosi problemi di macOS 26: l'area in cui si può puntare per ridimensionare una finestra è prevalentemente esterna alla finestra, e quindi è diventato più difficile.

È come prendere in mano un piatto senza toccarlo:

#278 /
10:20
/ #macos#design

Come segnala DDay, ecco la risposta DNS del risolver di Google 8.8.8.8 per un dominio bloccato da Piracy Shield:

~ ❯ dig es1.dn-ott.vip @8.8.8.8
; <<>> DiG 9.20.17 <<>> es1.dn-ott.vip @8.8.8.8
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: REFUSED, id: 45414
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
; EDE: 16 (Censored): (The requested domain is subject to a judicial injunction or other governmental blocking order for IT (ISO country code). To learn more about this specific removal, please visit https://lumendatabase.org/notices/76876931.)
;; QUESTION SECTION:
;es1.dn-ott.vip.			IN	A

;; Query time: 13 msec
;; SERVER: 8.8.8.8#53(8.8.8.8) (UDP)
;; WHEN: Mon Jan 12 10:10:31 CET 2026
;; MSG SIZE  rcvd: 269

Quindi è confermato che come era stato annunciato a giugno il resolver di Google non è più esente da censura, come lo è stato per tantissimi anni.


11 gennaio 2026

La risposta della Lega Serie A a Cloudflare sulla questione antipirateria è parziale ma contiene del vero, specialmente sul fatto che Cloudflare fa orecchie da mercante offrendo consapevolmente servizi a organizzazioni illegali e si rifiuta di rispondere a qualsiasi richiesta in nome della libertà di espressione (che ben poco c'entra col copyright):

Cloudflare was sanctioned because it is the only major global company that, by choice of its CEO, systematically refuses any and all cooperation with authorities, law enforcement, rights holders, and even courts. For this reason, it has become the first and most common choice of criminal organizations for operating their illegal services, precisely because of its determined stance in enabling acts of piracy.

This happens not only in Italy but across the world, as demonstrated by numerous legal rulings against Cloudflare in France, Spain, Belgium, and of course, in Italy as well.

Ma il commento che racchiude tutti i punti di vista e che condivido di più l'ho trovato nella sezione commenti del Post:

Non so dove cominciare con le cose che non vanno in tutta questa storia... Un'azienda monopolistica che ha il potere di bloccare internet in quasi tutto il mondo (anche il FT ne parlava qualche giorno fa); la lega serie A che deve difendere interessi economici da corporazione medievale; il governo vassallo della suddetta corporazione che fa una legge estremamente problematica con grossi rischi di abusi (da censura delle partite a censura delle news è un attimo)... C'è molto di sbagliato nell'agire di tutti gli attori, e di mezzo ci vanno i cittadini

Ognuno con i propri interessi parziali e non indirizzati al buonsenso o al bene comune e nessuno vuole arretrare di un centimetro.

(Qualcuno potrebbe avere da ridire sul fatto che Cloudflare sia monopolista: in termini stretti non lo è, ma tende a esserlo se consideriamo che nessun altro è in grado di offrire servizi simili gratuitamente a una platea così ampia di persone e aziende, rendendolo molto spesso insostituibile.)


10 gennaio 2026

It’s hard to justify Tahoe icons. Partendo dalle linee guida di interfaccia umana del 1992 di Apple, una analisi molto critica delle nuove icone in macOS 26 Tahoe.

Uno degli errori principali è inserire icone per ogni azione:

Anche se non esistono sufficienti icone comprensibili da corrispondere a ogni icona, con questi risultati:

La conclusione:

In my opinion, Apple took on an impossible task: to add an icon to every menu item. There are just not enough good metaphors to do something like that.

But even if there were, the premise itself is questionable: if everything has an icon, it doesn’t mean users will find what they are looking for faster.

And even if the premise was solid, I still wish I could say: they did the best they could, given the goal. But that’s not true either: they did a poor job consistently applying the metaphors and designing the icons themselves.

#275 /
10:15
/ #macos#design