Note di Matteo


23 gennaio 2026

Scaling PostgreSQL to power 800 million ChatGPT users

OpenAI ha pubblicato un articolo in cui spiega meglio la strategia di scaling di PostgreSQL: un server primario read-write e 50 replica read-only per supportare 800 milioni di utenti. Ma è di fatto in corso una migrazione verso database più scalabili come Azure Cosmos DB:

To mitigate these limitations and reduce write pressure, we’ve migrated, and continue to migrate, shardable (i.e. workloads that can be horizontally partitioned), write-heavy workloads to sharded systems such as Azure Cosmos DB, optimizing application logic to minimize unnecessary writes. We also no longer allow adding new tables to the current PostgreSQL deployment. New workloads default to the sharded systems.

Azure Cosmos DB è un database managed globalmente distribuito e a scalabilità essenzialmente illimitata, l'equivalente di DynamoDB di AWS ma, mi sembra di capire, con anche il supporto al modello relazionale e non solo NoSQL/a documenti (Azure Cosmos DB for PostgreSQL). Con garanzie di consistency che possono essere diverse da un classico database relazionale con scritture single-node, in base alla configurazione di sharding dell'estensione Citus.


Come riconosce anche il ministro della Giustizia Carlo Nordio, «siamo tutti dentro una perversa spirale mediatica in cui ogni singolo caso di cronaca produce un allarmismo generale». E siamo certi che il giorno in cui Nordio scoprirà chi è che ha alimentato questa spirale, gliene dirà quattro. Si è creata una realtà parallela che vuole un paese in mano ai maranza e alle baby gang? Ora non ci si può rifugiare nella realtà reale per ignorare le paure di chi ti ha votato.

Valerio Valentini in Montecit. del 23 gennaio 2026.

#308 /
18:23
/ #italia

This has been said a thousand times before, but allow me to add my own voice: the era of humans writing code is over. Disturbing for those of us who identify as SWEs, but no less true. That's not to say SWEs don't have work to do, but writing syntax directly is not it.

Ryan Dahl, creatore di Node.js e Deno.

#307 /
15:15
/ #ai

Ultimamente la UI di ChatGPT web ha crisi di layout:

#306 /
14:47
/ #openai

DNSimple spiega come gestiscono le repository GitHub con Terraform. Quando iniziano a diventare centinaia, gestirle manualmente genera inconsistenze:

  • Repositories had different settings, even when they should have been identical
  • Labels for issue triage varied from repository to repository, making cross-project tracking difficult
  • Some repositories had issue templates, while others didn't
  • Permission management was manual and error-prone
  • Security features like vulnerability alerts weren't consistently enabled
  • Pull request templates were copy-pasted (when they existed at all)

Dopo un tentativo con Repocop, per automatizzare il setup, hanno deciso di usare Terraform con aggiornamento delle configurazioni tramite Pull Request e Terraform Cloud.

#305 /
14:46
/ #dev#github

I fatti non sono mai separati dalle opinioni, sui giornali. Nel momento stesso in cui qualunque giornale decide di pubblicare un articolo su un fatto, su una notizia, su una storia, sta applicando una propria opinione. Altri giornali non lo pubblicheranno, avendo opinioni diverse. Le opinioni di ogni giornale e di ogni giornalista con delle responsabilità influenzano la decisione di che articoli pubblicare, e poi di quale evidenza dare loro, e poi di quali elementi e tagli mettere nel titolo: e sono tutte scelte, mai universali, mai le sole possibili, anzi. E le opinioni di ogni giornalista incaricato di scrivere influenzano i fatti che ci mette dentro e quelli che no, e lo spazio che dà a ciascun fatto, e di quali parla prima e di quali parla dopo.

Il risultato è che di un fatto - un fatto - verranno a sapere i lettori di un giornale, e non quelli di un altro. O che i lettori di uno lo riceveranno come molto importante e quelli di un altro come poco importante. O che i lettori di uno leggeranno che la cosa più importante di quel fatto è una e quelli dell'altro che è un'altra. Anche se stiamo sempre parlando di fatti: ma la cui descrizione, a cominciare dalla decisione di descriverli o no, è il risultato di un'opinione.

Nessun giornale ha i fatti separati dalle opinioni.

Luca Sofri nella newsletter Charlie.

#304 /
11:52
/ #informazione

TIL Cloudflare sovrascrive il record CAA aprendo ad attacchi MiTM in caso di BGP hijacking, e anche se a conoscenza del problema l'ha sempre ignorato:

When a BGP leak occurs (malicious or accidental), an attacker can intercept traffic to satisfy an ACME http-01 challenge. This allows them to issue a valid SSL certificate for a victim’s domain.

The IETF standard RFC 8657 was created specifically to stop this by using accounturi in CAA records to bind issuance to a specific account.

Issue: But Cloudflare’s Universal SSL automatically injects permissive CAA records that override user-defined accounturi bindings.

Ignoring, Cloudflare is saying like: “We know BGP leaks happen constantly, but we will force a configuration that allows those leaks to be used for valid certificate issuance by malicious attackers.”

Qua la spiegazione completa.

#303 /
10:26
/ #cloudflare

22 gennaio 2026


21 gennaio 2026

macOS Tidbits

Lunga lista molto utile (e che dimenticherò subito) di tips e shortcut di macOS: macOS Tidbits

#301 /
21:21
/ #macos




We live in an age where capital and data can cross Europe in a second. And business must be able to move just as freely. But as things stand, too many companies have to look abroad to grow and scale up – partly because they face a new set of rules every time they expand into a new Member State. So while on paper the market of 450 million Europeans is open to them, it is far more complicated in reality. And that acts as a handbrake on the growth and profit potential of companies. This is why we need a new approach. We will soon put forward our 28th regime. The ultimate aim is to create a new truly European company structure. We call it EU Inc., with a single and simple set of rules that will apply seamlessly all over our Union. So that business can operate across Member States much more easily. Our entrepreneurs, the innovative companies, will be able to register a company in any Member State within 48 hours – fully online. They will enjoy the same capital regime all across the EU. Ultimately, we need a system where companies can do business and raise financing seamlessly across Europe – just as easily as in uniform markets like the US or China. If we get this right – and if we move fast enough – this will not only help EU companies grow. But it will attract investment from across the world.

Ursula von der Leyen nel discorso al World Economic Forum.

#297 /
10:17
/ #business#eu

20 gennaio 2026

Paradisi fiscali

È un affascinante caso di possibile errore che ottiene però un risultato efficace. «Paradiso fiscale», per indicare delle nazioni o dei luoghi in cui la tassazione è particolarmente favorevole, è infatti probabilmente il risultato di una traduzione sbagliata dell’espressione inglese tax haven, usata per prima rispetto alla lunga storia dei «paradisi fiscali». E che significa «rifugio fiscale», ma in cui haven (che può voler dire anche «porto») suona molto simile alla più familiare parola heaven, che vuol dire in effetti «paradiso» o «cielo» in senso figurato.

Luca Sofri in Parole che usiamo in un modo o nell’altro sul Post.

#296 /
22:31
/ #scrivere

Il terrore delle ripetizioni che ci viene instillato a scuola genera nel giornalismo scelte acrobatiche e artificiose per sostituire parole e nomi con presunti sinonimi o creative perifrasi. Nel giornalismo sportivo questo ha prodotto un ricco vocabolario di termini di poco uso, ma con radici storiche o geografiche, per indicare le città sedi di squadre di calcio o altro. Il risultato è posticcio, ma permette di imparare termini che hanno ricchissime implicazioni storiche. Sapete dire a quali città si riferiscono gli aggettivi scaligera, labronica, felsinea, partenopea, sabauda, orobica, capitolina, estense, gigliata, ambrosiana, etnea, alabardata, lariana?

Luca Sofri in Parole che usiamo in un modo o nell’altro sul Post.


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

Pagina 1 di 16 Successiva →