<?xml version="1.0" encoding="utf-8"?>
<entry title="Faut-il supprimer les secondes intercalaires pour sauver l'humanité ?">
<date>2012-07-02</date>
<update_date>2012-07-06</update_date>
<content>
<p>La grande panne de nombreux serveurs <wikipedia>Linux</wikipedia>
le 1er juillet a remis sur le tapis la question des
<wikipedia name="Seconde intercalaire">secondes intercalaires</wikipedia>. S'il y a toujours des
bogues aussi sérieuses dans le code qui les gère, ne faudrait-il pas
supprimer le problème en simplifiant l'échelle de temps
<wikipedia name="Temps universel coordonné">UTC</wikipedia>, par la suppression de ces secondes
intercalaires ?</p>
<p>D'abord, il faut établir clairement les responsabilités : ce
comportement anormal de <wikipedia>Linux</wikipedia> (le meilleur
article technique est <link
url="http://serverfault.com/questions/403732/anyone-else-experiencing-high-rates-of-linux-server-crashes-during-a-leap-second">celui
de ServerFault</link>, très détaillé) est une
<emphasis><wikipedia name="Bug (informatique)">bogue</wikipedia></emphasis>. Quarante ans après
la création des <wikipedia name="Seconde intercalaire">secondes
intercalaires</wikipedia>, il est anormal qu'il reste encore de telles
bogues dans un programme répandu, alors qu'il y a déjà eu 25 secondes
intercalaires, donc plein d'occasions de tester.</p>
<p>Ensuite, le problème n'est pas dans <wikipedia name="Temps universel coordonné">UTC</wikipedia> ou
dans les <wikipedia name="Seconde intercalaire">secondes
intercalaires</wikipedia>. Le problème est dans la
<wikipedia>Terre</wikipedia> qui ne « <link url="http://tycho.usno.navy.mil/leapsec.html">tourne pas rond</link> ». Son mouvement
n'est pas constant et, pire, il n'est pas prédictible. Lorsque
certains articles anti-secondes-intercalaires ont écrit « il n'est pas
normal qu'on ne puisse pas calculer le temps à l'avance », ils disent
une grosse bêtise. Normal ou pas, c'est ainsi que le monde réel
fonctionne.</p>
<p>Comme on ne peut pas
« <foreign><wikipedia name="Patch (informatique)">patcher</wikipedia></foreign> » la Terre, que
reste-t-il comme solutions ? Les adversaires de la seconde
intercalaire proposent de supprimer cette dernière
d'<wikipedia name="Temps universel coordonné">UTC</wikipedia>. Mais je trouve cette « solution » tout à
fait inutile. Il existe déjà une échelle de temps sans secondes
intercalaires et c'est <wikipedia name="Temps atomique international">TAI</wikipedia> ! Supprimer les
secondes intercalaires revient à aligner UTC sur TAI, faisant perdre
l'intérêt qu'il y a à avoir deux échelles :
<enum>
<item>TAI (qui est complètement indépendant des astres) est pratique pour les informaticiens, notamment parce que son déroulement est
prévisible.</item>
<item>UTC est pratique pour les gens qui mettent le nez dehors, car
elle garantit que l'heure reste proche de celle des astres (le
<wikipedia>Soleil</wikipedia> au plus haut à midi, ce genre de
choses).</item>
</enum>
Les deux ont leur légitimité et leur utilité. Les gens qui réclament
la suppression des secondes intercalaires pour simplifier les
programmes n'ont tout simplement pas compris cela. (TAI a actuellement
<link url="http://maia.usno.navy.mil/ser7/tai-utc.dat">35 secondes de
décalage avec UTC</link>, si bien qu'on ne voit pas encore de conséquences pratiques.)</p>
<p>Mais, me dira-t-on, UTC, avec ses secondes intercalaires, est bien
compliqué pour des programmes qui souhaitent avoir une horloge
monotone et prévisible (comme les bases de données réparties, les grandes victimes de la panne). Dans ce cas, la solution est d'utiliser
TAI. Hélas, sur <wikipedia>Unix</wikipedia>, la <link url="http://www.mail-archive.com/leapsecs@rom.usno.navy.mil/msg00109.html">situation est
compliquée</link>. Il n'y a pas de moyen simple d'accéder à TAI. Quelques
solutions possibles :
<enum>
<item><wikipedia>Posix</wikipedia> a une option <computer>CLOCK_MONOTONIC</computer>
(voir <link
url="http://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_gettime.html">la
définition de clock_gettime()</link>) qui n'est pas vraiment TAI et ne
semble pas beaucoup mise en &#x153;uvre.</item>
<item>On peut aussi modifier le système pour ne pas appliquer la
seconde intercalaire d'un coup, <link
url="http://googleblog.blogspot.fr/2011/09/time-technology-and-leaping-seconds.html">comme
l'a fait Google</link> qui avait besoin d'un temps monotoniquement
croissant pour ses serveurs,</item>
<item>Attendre qu'un patch permettant l'accès à TAI (comme <link
url="http://comments.gmane.org/gmane.linux.kernel/1299564">celui de
Richard Cochran</link>) soit intégré dans Unix,</item>
<item>Utiliser une bibliothèque comme <link
url="http://cr.yp.to/libtai.html">libtai</link>. Attention, comme elle
marche en accédant à UTC (la seule information disponible sur Unix) et
en corrigeant, elle dépend de listes de secondes intercalaires à jour,
ce qui n'est pas le cas de la distribution officielle (alors que l'<wikipedia name="Internet Assigned Numbers Authority">IANA</wikipedia>) <link url="https://www.iana.org/time-zones">distribue cette information</link>, dans le fichier <computer>leapseconds</computer>, et qu'elle est correcte ; pourquoi diable libtai ne l'utilise pas ?).</item>
<item>Sur le même principe (corriger puisqu'on connait le décalage
entre TAI et UTC), un <link url="http://pastebin.com/BGuM1L1F">simple fichier timezone</link>
d'Alain Thivillon, bien plus simple à utiliser et très efficace.</item>
</enum>
Alain a aussi produit <file name="gentai.pl">un script simple</file> pour fabriquer une table des décalages
UTC-TAI à partir du registre des temps à
l'<wikipedia name="Internet Assigned Numbers Authority">IANA</wikipedia>. Voici comment on peut
l'utiliser. D'abord, exécuter de temps en temps (pour mettre à jour le
fichier), par exemple depuis <wikipedia>cron</wikipedia> :
<code>
% cd /usr/share/zoneinfo
% perl /usr/local/sbin/gentai.pl
Zonefile ./tai generated
Zonefile ./tai compiled in Etc/TAI
You can check with "TZDIR=/usr/share/zoneinfo TZ=Etc/TAI date &amp;&amp; TZ=UTC date"
Leapsecond file ./leapseconds_iana saved
</code>
Ensuite, lorsque vous avez envie de voir le temps TAI, vous définissez
juste la variable d'environnement qui va bien :
<code>
% TZ=Etc/TAI date &amp;&amp; date -u
Fri Jul  6 21:00:16 TAI 2012
Fri Jul  6 20:59:41 UTC 2012
</code>
Vous voyez bien les trente-cinq secondes de décalage actuels.
</p>
<p>À noter que cette idée d'avoir deux échelles, TAI et UTC, qui
reconnait le fait qu'il y a deux populations d'utilisateurs, avec des
besoins différents, est rejetée par le <wikipedia name="Bureau international des poids et mesures">BIPM</wikipedia> qui
considère que <link
url="http://www.bipm.org/cc/CCTF/Allowed/18/CCTF_09-27_note_on_UTC-ITU-R.pdf">deux,
c'est trop</link>, à cause du risque de confusion.</p>
<p>Autres lectures :
<enum>
<item>Le <link url="ftp://hpiers.obspm.fr/iers/bul/bulc/bulletinc.43">bulletin C</link> annonçant cette seconde intercalaire,</item>
<item>Le <link url="http://seenthis.net/messages/32168">débat sur la
suppression de la seconde intercalaire</link> et <link
url="http://seenthis.net/messages/32168#message32940">ma position</link>,</item>
<item>Une intéressante <link
url="http://www.cl.cam.ac.uk/~mgk25/time/utc-sls/">proposition
alternative de réforme d'UTC</link>, faisant varier l'horloge progressivement
(comme dans la solution de Google) et non pas d'un coup,</item>
<item>Un <link url="http://www.eecis.udel.edu/~mills/leap.html">bon
article</link> expliquant la gestion de la seconde intercalaire par <wikipedia name="Network Time Protocol">NTP</wikipedia>,</item>
<item>Une <link
url="http://www.ucolick.org/~sla/leapsecs/right+gps.html">proposition
concrète de Steve Allen</link> pour résoudre ce dilemme (attention,
c'est technique).</item>
<item>Pour les Unixiens, un <link
url="http://souptonuts.sourceforge.net/readme_working_with_time.html">bon
article sur le temps dans Unix</link>, même UTC est mal géré (avec retour de l'horloge en arrière),</item>
<item>Une <link
url="http://www.madore.org/~david/computers/unix-leap-seconds.html">vigoureuse
critique</link> de la gestion du temps dans Unix,</item>
<item>Une <link url="http://cr.yp.to/proto/utctai.html">autre</link>,
uniquement pour ceux qui supportent le ton de
<wikipedia name="Daniel J. Bernstein">D. J. Bernstein</wikipedia>.</item>
<item>Sur les conséquences de la bogue Linux, l'<link
url="http://www.wired.com/wiredenterprise/2012/07/leap-second-bug-wreaks-havoc-with-java-linux/">article
de Wired</link>.</item>
</enum></p>
<p>Remerciements à <link url="http://www.ucolick.org/~sla/">Steve Allen</link>, <link url="https://twitter.com/fanf">Tony
Finch</link>, <link url="https://twitter.com/pbeyssac">Pierre
Beyssac</link>, <link url="https://twitter.com/romiglups">Alain
Thivillon</link> et <link url="https://twitter.com/Habbie">Peter van
Dijk</link> pour la discussion sur TAI dans Unix. Merci à Kim-Minh
Kaplan pour le rappel qu'UTC ne va jamais en arrière, c'est Unix (ou
d'autres systèmes) qui le fait, ne sachant pas gérer la seconde
intercalaire.</p>
</content>
</entry>


