L'ORA FANTASMA DEL BLOCCO SCHERMO
Desktop giusto. Lock screen un'ora indietro. Da sempre. Una chiacchiera notturna diventa una caccia al bug, fra ipotesi sbagliate, registro, fuso orario e un campo vuoto che non avrebbe dovuto esserlo.
"Oh Scriba, ci ho sta cosa che il blocco schermo ha un'ora indietro. Solo il blocco schermo."
La radio intanto continuava a suonare sotto il blocco schermo. Quello era il bello. Il brutto era l'orologio: desktop corretto, lock screen a −1 ora.
Prima tentazione: dare la colpa alla sincronizzazione, al server delle notizie, a Windows Spotlight, all'ora legale, a qualche folletto Microsoft in giacca e cravatta. Tutto plausibile. Quindi tutto da verificare.
Prima retina: il fuso
Partiamo dal cartello più semplice:
C:\Users\Josta>tzutil /g W. Europe Standard Time
Il fuso è quello giusto. Italia, Europa occidentale, niente Pacifico infilato di nascosto nel BIOS.
Quindi lanciamo la prima retina nel Registro:
reg query HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation /v RealTimeIsUniversal
Risposta:
Errore: Impossibile trovare la chiave del Registro di sistema o il valore specificato.
Bene. Nessun evidente override del clock hardware in UTC. Primo pesciolino lasciato andare.
Seconda retina: ora legale
Altro comando:
reg query HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation /v DynamicDaylightTimeDisabled
Ed eccolo:
DynamicDaylightTimeDisabled REG_DWORD 0x1
Qui Billy-Scriba parte allegro: "Ah! Ora legale disattivata, ecco l'ora mancante."
Josta lo prende per la collottola:
"Ma era così anche prima del cambio ora, stava sempre un'ora indietro, Billy... :D"
Giusto. Una spiegazione che funziona solo oggi non spiega un difetto presente da sempre. Ipotesi ridimensionata. Si riapre la scatola.
La farfalla che non dovrebbe essere vuota
A questo punto niente più pesca con la canna. Tiriamo su tutta la rete:
reg query HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation
Il dump restituisce:
Bias REG_DWORD 0xffffffc4 DaylightBias REG_DWORD 0xffffffc4 DaylightName REG_SZ ora legale Europa occidentale DaylightStart REG_BINARY 00000300050002000000000000000000 StandardBias REG_DWORD 0x0 StandardName REG_SZ ora solare Europa occidentale StandardStart REG_BINARY 00000A00050003000000000000000000 TimeZoneKeyName REG_SZ DynamicDaylightTimeDisabled REG_DWORD 0x1 ActiveTimeBias REG_DWORD 0xffffff88
Ed è lì che compare la cosa interessante:
TimeZoneKeyName REG_SZ
Vuoto.
Non un numero sbagliato. Non un'ora palesemente errata. Un nome assente.
Nel frattempo tzutil /g continuava a rispondere W. Europe Standard Time. Quindi Windows, da una parte, sapeva quale fuso stava usando; dall'altra, nel blocco persistente del Registro, il campo che normalmente lo nomina risultava vuoto.
È il genere di dettaglio che non urla. Fa solo una piccola increspatura sulla superficie. Ma se stai guardando avanti sul nastro, quella increspatura è la farfalla.
I numeri non erano il colpevole
ActiveTimeBias = 0xffffff88 corrisponde a −120 minuti. Tradotto nel meccanismo di Windows, la sessione stava lavorando con l'offset coerente con UTC+2.
Questo spiega perché il desktop mostrava l'ora giusta. Quindi non avevamo semplicemente un sistema intero spostato di un'ora.
Avevamo invece due comportamenti diversi nello stesso Windows:
| Parte | Stato |
|---|---|
| Sessione desktop | ora corretta |
| Lock screen | −1 ora |
tzutil /g | W. Europe Standard Time |
TimeZoneKeyName | vuoto |
Non serve ancora inventare quale DLL, servizio o componente stesse leggendo cosa. Basta tenere separati fatto e ipotesi.
Il fix più piccolo possibile
Invece di modificare a mano bias, minuti, chiavi e geroglifici binari, si chiede a Windows di riscrivere la stessa timezone che già dichiara di usare:
tzutil /s "W. Europe Standard Time"
Nessun cambio di paese. Nessun trucco. Nessun riavvio della civiltà occidentale.
Solo: "Windows, riscriviti bene quello che dici già di essere."
TimeZoneKeyName torna valorizzato correttamente.Il blocco schermo mostra finalmente l'ora giusta.
BugHunted
La catena osservata è semplice:
PRIMA desktop corretto lock screen -1h tzutil /g = W. Europe Standard Time TimeZoneKeyName = vuoto AZIONE tzutil /s "W. Europe Standard Time" DOPO TimeZoneKeyName = W. Europe Standard Time lock screen = ora corretta
Questo non dimostra da solo l'implementazione interna del bug. Dimostra però una relazione operativa molto forte: la riscrittura canonica del fuso ricostruisce uno stato coerente e il difetto sparisce.
Manuale, ma narrato
Il punto non è soltanto il comando finale. È il percorso.
Prima una spiegazione troppo facile. Poi il dettaglio storico che la smentisce. Poi un controllo più largo. Poi il campo vuoto. Poi il fix minimo. Poi il riscontro visivo.
vedo → ipotizzo → verifico → sbaglio → correggo → allargo la retina → trovo l'incongruenza → applico il minimo intervento → verifico di nuovo → FIXATO
Fra lenti, farfalle, retine e pesciolini, il manuale resta tecnico. Solo che non finge che il tecnico sappia già dall'inizio dove sta andando.
Interessanted x TEDx
Perché può diventare materiale da palco? Perché in piccolo racconta una cosa più grande: la differenza tra avere dati e vedere una relazione.
Un sistema può mostrare contemporaneamente informazioni apparentemente coerenti e uno stato interno incompleto. La soluzione non arriva sempre dal valore più vistoso. A volte arriva da ciò che manca.
E soprattutto: correggere un'ipotesi davanti all'evidenza non indebolisce il ragionamento. È il ragionamento che funziona.
BugHunted Duranted: non soltanto trovare il bug. Lasciare visibile il sentiero con cui ci sei arrivato.