domenica, luglio 14, 2019

Epoch e il primo passo dell'uomo sulla luna

Epoch è il nome convenzionalmente attribuito all'istante da cui molti sistemi informatici (in pratica, tutti quelli basati o ispirati a UNIX) iniziano a conteggiare il passare del tempo. La data scelta è il primo gennaio 1970 e ad essere conteggiati sono i secondi.

Quando interrogate il sistema per sapere quando è stato modificato un file l'ultima volta, ad esempio con

$ stat -c '%x' testfile 
2019-07-14 09:33:04.977645058 +0200

quello che ottenete in realtà è solo la rappresentazione in formato "umano" del numero memorizzato internamente nel filesystem.

$ stat -c '%X' testfile 
1563089584

Un tempo per la memorizzazione di questo valore si utilizzava una variabile a 32 bit senza segno. Per questo motivo, ancora oggi, la pagina man di stat non indica come ottenere una precisione maggiore. Adesso i bit a disposizione sono molti di più, e consentono la memorizzazione fino al livello dei nanosecondi:

$ stat -c '%.X' testfile 
1563089584,977645058

È interessante notare che nelle primissime versioni di Unix era stato scelto di utilizzare i numeri interi non per contare i secondi, ma i sessantesimi di secondo (questo perché ci si basava su oscilloscopi a 60 Hz). Si era nel 1971, e con 32 bit si potevano in questo modo rappresentare solo 828 giorni e mezzo circa, per cui fu deciso all'epoca (scusate il bisticcio di parole) di impostare epoch al 1 gennaio 1971. Solo successivamente fu cambiata l'impostazione e si passò alla memorizzazione dei secondi utilizzando il 1 gennaio 1970 come riferimento di base.

Capisco i motivi pratici della scelta, ma pensate a quanto sarebbe bello, ancora oggi, se fosse stato scelto come riferimento il primo passo dell'uomo sulla Luna, avvenuto pochi mesi (14.159.025 secondi, per la precisione) prima, alle 2:56:15 UTC del 21 luglio 1969.

$ date -d '@-14159025'
lun 21 lug 1969, 04.56.15, CEST


$ date -u -d '@-14159025'
lun 21 lug 1969, 02.56.15, UTC