Vous êtes sur le blog de David Madore, qui, comme le
reste de ce site web, parle de tout et
de n'importe quoi (surtout de n'importe quoi, en fait),
des maths à
la moto et ma vie quotidienne, en passant
par les langues,
la politique,
la philo de comptoir, la géographie, et
beaucoup de râleries sur le fait que les ordinateurs ne marchent pas,
ainsi que d'occasionnels rappels du fait que
je préfère les garçons, et des
petites fictions volontairement fragmentaires que je publie sous le
nom collectif de fragments littéraires
gratuits. • Ce blog eut été bilingue à ses débuts (certaines
entrées étaient en anglais, d'autres en français, et quelques unes
traduites dans les deux langues) ; il est
maintenant presque exclusivement en
français, mais je ne m'interdis pas d'écrire en anglais à
l'occasion. • Pour naviguer, sachez que les entrées sont listées par
ordre chronologique inverse (i.e., la plus récente est en haut).
Cette page-ci rassemble les entrées publiées en
mars 2013 : il y a aussi un tableau par
mois à la fin de cette page, et
un index de toutes les entrées.
Certaines de mes entrées sont rangées dans une ou plusieurs
« catégories » (indiqués à la fin de l'entrée elle-même), mais ce
système de rangement n'est pas très cohérent. Le permalien de chaque
entrée est dans la date, et il est aussi rappelé avant et après le
texte de l'entrée elle-même.
You are on David Madore's blog which, like the rest of this web
site, is about everything and
anything (mostly anything, really),
from math
to motorcycling and my daily life, but
also languages, politics,
amateur(ish) philosophy, geography, lots of
ranting about the fact that computers don't work, occasional reminders
of the fact that I prefer men, and
some voluntarily fragmentary fictions that I publish under the
collective name of gratuitous literary
fragments. • This blog used to be bilingual at its beginning
(some entries were in English, others in French, and a few translated
in both languages); it is now almost
exclusively in French, but I'm not ruling out writing English blog
entries in the future. • To navigate, note that the entries are listed
in reverse chronological order (i.e., the most recent is on top).
This page lists the entries published in
March 2013: there is also a table of months
at the end of this page, and
an index of all entries. Some
entries are classified into one or more “categories” (indicated at the
end of the entry itself), but this organization isn't very coherent.
The permalink of each entry is in its date, and it is also reproduced
before and after the text of the entry itself.
Non seulement j'attrape
énormément[#] de rhumes (cette
fois c'est le troisième en trois mois —
voir ici
et là — ce qui est tout de même
assez exceptionnel même pour moi), mais en plus ils me font un effet
terrible. En l'occurrence, il n'y a pas que le climat
abominable de Londres, c'est mon
poussinet qui me l'a refilé : sur lui, ça a juste causé une journée
d'éternuements répétés et une petite fatigue et c'était fini ; alors
que moi, je viens de me réveiller avec un mal de tête horrible, j'ai
juste la force de consulter mes mails et de me traîner jusqu'à la
pharmacie pour refaire provision de sérum physiologique, après quoi je
vais sans doute passer la journée à dormir (ou en tout cas
à ne rien faire — ce qui est un
peu problématique vu que j'ai des millions de choses à faire,
justement). Mais je voudrais bien une explication un peu scientifique
à cette différence : mon système immunitaire est-il partiulièrement
mauvais pour combattre les rhumes ? (et si c'est le cas, pourquoi ?),
ou mauvais tout court ? ou est-ce qu'au contraire mon corps
surréagit ? Et y a-t-il quoi que ce soit que je puisse faire à part
souffrir et râler sur mon blog ?
((Ceci me fait penser qu'hier j'ai assisté à la triste scène d'une
dame en train de se faire embobiner par un charlatan qui se présentait
comme une sorte de guérisseur. Je ne sais pas au juste de quel mal
physique ou psychique la dame souffrait, mais le discours du type en
face, qui lui proposait de commencer par un cours de respiration — la
première étape de sa série des trois B : Bien respirer, Bien
manger, Bien vivre — pour la modeste somme de 150€ parce qu'il ne
court pas après l'argent mais il est quand même docteur vous
comprenez, qui lui promettait qu'elle serait une rebelle, mais une
rebelle de l'action et pas une rebelle de la réaction, et qui
était convaincu que il n'y a pas de
hasard[#2], vous m'avez
rencontré pour une raison, et moi je sais quelle est cette
raison, faisait
hurler toutes
les sirènes dans ma tête. Je me suis un peu senti coupable de
non-assistance à personne en danger de ne pas intervenir pour dénoncer
toutes ces sornettes, mais j'ai un peu trop peur de la confrontation
pour ça.))
[#] Ce qui a souvent
conduit des gens à me soutenir que mes rhumes seraient en fait des
allergies. (Je le mentionne, parce que je sens que sinon quelqu'un va
dire exactement ça dans les commentaires.) Il est possible que je
sois un peu allergique sans le savoir. Mais le fait que mes rhumes
aient surtout lieu en hiver, qu'ils suivent une évolution claire et
régulière (picotement à l'arrière-gorge → fatigue et nez bouché →
toux), et surtout, que je puisse souvent identifier quelqu'un qui me
l'a passé, plaide bien pour le fait qu'il s'agit d'infections.
[#2] J'étais à deux
doigts d'écrire que la phrase le hasard n'existe pas est le
signe infaillible du charlatan, et puis je me suis
rappelé que j'avais récemment posté
ceci. Ahem.
Hollingsworth
v. Perry est une affaire actuellement en cours devant la
Cour suprême des États-Unis et dont l'objet est de décider la
constitutionnalité (vis-à-vis de la Constitution de l'Union et
spécifiquement de
son quatorzième
amendement)
d'une modification
d'initiative populaire à la Constitution de l'État de Californie
visant à resteindre le mariage à un homme et une femme (cette
initiative faisant elle-même suite à — et ayant pour but d'annuler
— une
décision de la Cour suprême de l'État de Californie qui trouvait
contraire aux clauses de non-discrimination de la Constitution de cet
État de limiter le mariage aux couples hétérosexuels).
Le débat contradictoire a eu lieu hier devant la Cour suprême. On
peut en trouver l'enregistrement[#]
et la
transcription ici :
ce qui rend intéressantes les affaires devant la Cour suprême des
États-Unis, c'est que non seulement elles sont importantes par le
fond, mais les arguments vont vraiment à l'essentiel parce que le
calendrier de la Cour est très chargé — en l'occurrence, cela tient en
moins de 1h30 de débats tout à fait compréhensibles par le non-initié
(il y a bien sûr aussi beaucoup de documents écrits annexes, mais il
n'est pas nécessaire de les lire pour suivre les arguments).
Outre la question de fond, il y a deux sous-questions intéressantes
qui se posent.
La première est procédurale : étant donné que l'État de Californie
(i.e., ses représentants élus, et notamment son gouverneur) n'ont pas
voulu défendre la réforme constitutionnelle devant les cours
fédérales, qui a le droit de le faire ? La Cour suprême de l'État de
Californie a jugé que les défenseurs de l'initiative populaire avaient
ce droit, mais la question se pose de savoir si cette cour avait
effectivement le droit de le décider, i.e., si l'État de Californie
peut se faire représenter en justice par quelqu'un qui n'en est pas un
représentant officiel (et qui n'est ni élu ni payé par l'État). Cette
question est essentielle parce que si les plaignants (=défendant la
proposition 8) n'ont
pas intérêt à
agir au sens de
l'article III
de la Constitution de l'Union, l'affaire ne sera pas décidée sur
le fond — et il est possible que ça arrange tout le monde.
La deuxième question est de savoir dans quelle mesure la décision
finale pourra, ou devra, s'appliquer à l'ensemble de l'Union ou
seulement à la Californie. Autrement dit, doit-on trouver qu'il est
contraire à la Constitution des États-Unis de limiter le droit pour
deux personnes de même sexe de se marier (et à vrai dire, personne ne
croit sérieusement que la Cour à majorité conservatrice ira dans ce
sens), ou seulement, comme l'a fait la Californie, de
leur retirer ce droit après le leur avoir trouvé. Mais
surtout, ce qui embête les deux parties et les juges, et sur quoi ils
passent beaucoup de temps à se gratter la tête, c'est le paradoxe
suivant : si on construit l'argument selon lequel la Californie n'a
aucune raison
rationnelle pour interdire à des couples de même sexe le droit de
se marier par le fait qu'elle leur accorde de toute manière des
droits absolument équivalents au nom près, alors cela signifie
que l'argument ne tiendrait pas dans un État moins protecteur, et donc
qu'on trouverait plus normal de pratiquer beaucoup de discrimination
que de n'en pratiquer qu'un peu (et donc,
comme le juge
Breyer le fait remarquer [p. 61–62 du transcript], si la Cour
suprême décide que tout État qui accorde aux couples de même sexe un
droit d'union civil doit leur accorder le droit de se marier, ceci
risquerait d'encourager les États conservateurs à ne pas accorder de
tels droits).
Bon, et puis il est toujours intéressant d'écouter Scalia
(voir ce que j'en disais ailleurs)
jouer au troll en demandant de façon faussement naïve à quel moment
précis il serait devenu anticonstitutionnel de limiter le mariage à un
homme et une femme, à quel moment la Constitution a été changée sans
qu'on le prévienne. (Le vote de Scalia étant sur cette affaire aussi
certain que la catholicité du pape, ce qu'il dit a surtout pour but de
s'amuser aux dépens des avocats, je suppose.)
Quoi qu'il en soit, il sera intéressant de lire attentivement la
décision finale de la Cour, surtout si elle va au-delà de déclarer que
les plaignants n'ont pas intérêt à agir.
La question est encore compliquée par le fait que la Cour décide en
même temps une autre
affaire, United
States v. Windsor, dont les débats
ont eu
lieu aujourd'hui (je n'ai pas eu le temps de lire/écouter) et qui
concerne, elle, la constitutionnalité
d'une loi
fédérale qui prétend limiter la reconnaissance au niveau
fédéral du mariage aux couples hétérosexuels : mais ceux qui
espèrent que la Cour décidera que le Congrès n'a pas le pouvoir de
décider pour les États comment ceux-ci définissent le mariage (et pour
le coup, il n'est pas complètement impossible que Scalia soit du bon
côté de la majorité !) ont du mal à espérer en même temps qu'elle
interdise à la Californie de le faire. Deux affaires à suivre,
donc.
[#] Il faut juste faire
abstraction de la façon assez pénible qu'a Charles Cooper — l'avocat
qui défend la proposition 8 — de bégayer et de demander tout le temps
pardon. Je ne sais pas si c'est parce que c'est la première fois
qu'il plaide devant la Cour suprême des États-Unis et qu'il est
particulièrement impressionné, ou s'il est juste tout le temps comme
ça, mais c'est assez horripilant.
Mon Poussinet et moi sommes rentrés hier soir d'un week-end à
Londres (dont un des buts, en ce qui me concerne, était d'acheter un
nouvel ultraportable, avec un clavier QWERTY GB, à défaut
de QWERTY US, pour remplacer mon
Eee PC devenu
inutilisable — mais j'en parlerai dans une entrée suivante). Je
n'y étais pas allé depuis douze ans (et j'ai eu l'occasion de me
rendre compte que ma mémoire géographique est très étrangement
sélective).
Le climat de la ville a fait honneur à sa réputation : il a fait un
temps épouvantable, alternant entre pluie et neige, avec un vent
glacial, sous un ciel sinistre, si bien que rentrer à Paris me fait
l'impression d'arriver à Marseille.
Notre hôtel était luxueux (le Pullman St Pancras :
c'était Papapoussinet qui payait), avec une vue imprenable sur la
nouvelle British Library et la remarquable architecture de la gare de
St Pancras. En-dehors de ça, il faut dire que le quartier est assez
horrible, Euston Rd faisant partie d'une sorte d'autoroute qui entoure
la zone centrale à circulation restreinte de Londres.
Nous avons aussi très bien mangé. Pas de la nourriture anglaise
même si celle-ci peut tout à fait être bonne : quand j'étais petit et
que mon père m'emmenait régulièrement à Londres, nous allions à chaque
fois manger
à Simpsons-in-the-Strand ;
mais le week-end ils exigent le port de la cravate et je n'en ai pas.
Mais entre le petit-déjeuner gargantuesque du Pullman, un
excellent canard laqué sur Gerrard St (le cœur du Chinatown londonien)
et un restaurant indien de Soho trouvé un peu par hasard mais qui
s'est avéré hautement satisfaisant, nous n'avons pas eu à nous
plaindre de ce côté-là.
Je participe en ce moment à Télécom à un cours sur la théorie des
langages : ce qui signifie notamment, pour ce qui est de la partie sur
les langages rationnels, définir ce que c'est qu'une expression
régulière, définir différentes sortes d'automates finis, et montrer
le théorème
de Kleene selon lequel la classe de langages reconnus par des
automates finis et celle définie par les expressions régulières
coïncident (et montrer comment, en pratique, on arrive à synthétiser
l'automate fini reconnaissant une expression régulière donnée).
Théoriquement, il n'y a aucun doute que cette classe des langages
rationnels est à la fois très naturelle et très importante. Déjà à ce
niveau-là les choses ne sont pas aussi évidentes qu'on pourrait le
penser, voir par exemple la grosse
expression régulière que j'avais produite qui définit les
multiples de 7 écrits en base 10.
Mais en général, quand j'enseigne un sujet, j'aime bien en
apprendre un peu plus que ce que j'enseigne. Et en l'occurrence,
s'agissant des expressions régulières, essentiellement tous les
moteurs d'expressions régulières qui existent ont des extensions par
rapport aux expressions régulières mathématiques, de sorte qu'ils
reconnaissent plus que la classe standard des langages rationnels.
J'aimerais bien savoir s'il existe une étude théorique de ces
extensions, et je m'agace un peu de ne rien trouver de
satisfaisant.
L'extension la plus courante, ce sont les références
arrière (backreferences) : par exemple,
on peut écrire (a*)b\1b\1 reconnaît le langage formé de
trois suites de ‘a’ de même longueur séparées à chaque fois
par un seul ‘b’ (i.e., les
anbanban),
or ce langage n'est même pas définissable par une grammaire sans
contexte comme on le montre facilement avec
un lemme
de pompage standard. A contrario, il semble intuitivement
évident que le langage formé des
anbn (c'est-à-dire un
certain nombre de ‘a’ puis le même nombre de ‘b’), ou encore
le langage des expressions bien-parenthésées, n'est pas définissable
par une expression régulière-avec-références-arrière ; mais, je ne
sais pas le montrer, parce que je n'ai aucun modèle théorique bien
défini pour ces expressions (et aucun « lemme de pompage » qui irait
avec).
À vrai dire, je ne suis pas sûr de savoir
définir exactement la sémantique des références arrière dans
tous les cas bizarres. Et pour commencer, les langages (ou moteurs de
regexps) ne sont pas d'accord entre eux.
Par exemple, tout le monde est d'accord que (a?)b\1
est satisfaite exactement par b et aba. Mais qu'en
est-il de (a)?b\1 : et spécifiquement, est-elle
satisfaite par b ? La logique demande plutôt que non : comme
il n'y a pas de ‘a’ avant le ‘b’, la possibilité suggérée par
le ? n'a pas lieu, donc le groupage n'est pas fait et la
référence arrière n'est pas définie (ce qui est différent
de : définie à la chaîne vide, comme dans l'exemple précédente), si
bien que le \1 refuse de matcher. C'est bien comme ça
que se comporte Perl ainsi que GNU egrep ; en
revanche, en JavaScript, /^(a)?b\1$/.test("b")
renvoie true : apparemment c'est une idiosyncrasie du
langage que les références arrière non définies puissent matcher la
chaîne vide. Maintenant, qu'en est-il de ((a*)b)*c\2 ?
elle est certainement satisfaite par abaabcaa (et dans
JavaScript spécifiquement, par c, suivant la même logique que
l'exemple précédent), mais devrait-elle matcher
aussi aababcaa ? Là, tout le monde semble d'accord que non :
il faut croire que des parenthèses placées dans une étoile de Kleene
capturent la dernière des occurrences du groupe parenthésé
(plutôt que, par exemple, n'importe lequel, de façon
non-déterministe, ce qui m'aurait semblé plus logique — mais
c'est sans doute plus complexe à implémenter).
Plus précisément, la logique est quelque chose comme ceci : les
groupes de parenthèses sont numérotés d'après la position de la
parenthèse ouvrante dans la regexp telle qu'elle est écrite, puis la
chaîne vérifie la regexp lorsqu'il existe une manière de remplacer
chaque référence arrière par la plus récente sous-chaîne
capturée par une paire de parenthèses numérotées de la même
manière qu'elle (étant entendu, en JavaScript spécifiquement, que si
la capture n'est pas définie, la chaîne vide sera acceptée pour la
référence arrière). Avec cette logique, ((a*)b)*c\2 est
équivalent à (a*b)*(a*)bc\2 (sauf en JavaScript où il est
équivalent à c|(a*b)*(a*)bc\2), ce qui explicite que
c'est la dernière répétition du (a*) qui définit la
valeur du \2. Remarquez qu'il est faux —
contrairement à ce qu'on pourrait croire naïvement — que toutes les
références arrière de même numéro désignent forcément la même
sous-chaîne : ((a*)b\2c)*d\2 est satisfaite
par abacaabaacdaa (tous les moteurs sont d'accord sur ce point)
et le \2 a valu une fois a et deux
fois aa.
Mais les moteurs ne sont pas d'accord sur les situations dans
lesquelles une paire de parenthèse doit capturer une chaîne (et
affecter la référence arrière correspondante). Pour illustrer ce fait
subtil, on peut comparer l'expression régulière
(X) ((a*)b)*c\2 (déjà évoquée, et dont je rappelle
qu'elle n'est pas vérifiée par aababcaa) avec les deux
suivantes : (YL) ((a*)b|(a*)b)*c\2 et
(YR) ((a*)b|(a*)b)*c\3. Le comportement
de GNU egrep est le suivant : (YL) et (YR) sont
équivalentes, et sont toutes les deux vérifiées par aababcaa
(contrairement à (X), donc) ; l'explication est la suivante : pour
chaque groupe a*b, lorsque le moteur choisit de façon
non-déterministe la branche gauche ou droite de l'alternative, il
affecte \2 ou \3 selon la branche qu'il
choisit, mais uniquement celui-ci, et au final il accepte une
chaîne lorsqu'il y a moyen de choisir les branches de sorte que
le \2 final coïncide avec une capture par le jeu de
parenthèses correspondant — donc (YL) et (YR) reconnaissent toutes les
chaînes dans lesquelles le nombre de ‘a’ suivant le ‘c’ est égal au
nombre de ‘a’ précédant n'importe quel ‘b’. Perl, en revanche, n'est
pas d'accord : pour lui, (YL) n'est pas vérifiée par aababcaa
(pas plus que (X)) alors que (YR) l'est : la raison est que quand
Perl choisit la branche droite, il désaffecte la capture
(\2) éventuellement faite par la branche gauche
précédente, pour retenir le fait que, cette fois, la branche gauche
n'a pas été prise, mais quand il choisit la branche gauche, il ne
touche pas à la capture faite par la branche droite
précédente[correction].
Quant à JavaScript, il considère qu'aucune des regexps (X), (YL) ou
(YR) n'est vérifiée par aababcaa : la raison est que JavaScript
considère que chaque occurrences des parenthèses externes réaffecte
toutes les captures (\2 et \3), y compris
pour les branches qui ne sont pas prises.
Correction :
on m'a fait remarquer que mon explication initiale ne tient pas, parce
qu'elle prédit que aabeabcaa ne devrait pas
vérifier ((a*)b|e?(a*)b)*c\2, or c'est le cas (avec Perl
comme avec egrep). La seule explication que je voie de la différence
entre le fait que, selon Perl, aabeabcaa
vérifie ((a*)b|e?(a*)b)*c\2 tandis
que aababcaane la vérifie pas, est que son
backtracking est incomplet : quand il change de branche, il conserve
des scories des autres branches explorées (la capture \2
est affectée par l'exploration de la branche gauche de la disjonction
et n'est pas restaurée à sa valeur antérieure par le backtracking sur
la branche droite) ; la présence ou non du ‘e’ élimine un backtracking
et les scories qui vont avec. Ce comportement viole un principe
important du non-déterminisme, qui est que les branches qui ne
matchent pas ne doivent pas avoir d'influence (donc, si on les
implémente avec backtracking, le backtracking doit être complet). Il
cause aussi la surprise suivante : ((a*)d|e?(a*)b)*c\2
est vérifié à la fois par aadabcaa et aadeabcaa, mais
quand on remplace ‘d’ par ‘b’ dans la regexp et dans les chaînes,
comme je viens de le dire, ce n'est plus vrai. Je suis tenté de
résumer sous la forme : Perl est cinglé. • Ajout
supplémentaire : voir
aussi ici
et là
(mais je reste sur le résumé Perl est cinglé).
Pour la même raison, Perl et JavaScript pensent
que abbca ne satisfait pas ((a)?b)*c\2 alors
que GNU egrep pense que si ;
et GNU egrep et Perl pensent que abac
vérifie ((a*)b|\2c)* mais pas abc alors que
JavaScript pense exactement le contraire (et s'agissant
de (\2c|(a*)b)*, Perl et JavaScript ne changent pas
d'avis, mais GNU egrep signalent une erreur).
Enfin, si on fait référence à un groupe de parenthèses dans
lui-même, GNU egrep signale une erreur, JavaScript
ne lui fait matcher que la chaîne vide (parce qu'il désaffecte
immédiatement la référence arrière), et Perl lui donne la valeur
précédente qu'avait ce même groupe (donc (a|b\1c)* est
vérifié par abac en Perl). Ce qui un peu étrange, dans
l'histoire, c'est surtout que PCREgrep semble avoir
souvent le même comportement que GNU grep au lieu
d'avoir celui de Perl.
Même dans le cadre des expressions avec références arrière,
certains moteurs (Perl, Python, .NET) apportent plus de flexibilité en
permettant de nommer explicitement les groupes de capture (y compris
en donnant le même nom à deux groupes différents). Je ne pense pas
vraiment que ceci permette de définir des langages qui ne seraient pas
définissables sans cette fonctionnalité, mais ça ne me semble pas du
tout évident, ni dans un sens ni dans l'autre.
Par ailleurs, certains moteurs d'expressions régulières, notamment
de Perl, ajoutent une extension supplémentaire notable au pouvoir des
expressions régulières : ce sont les motifs récursifs. La
simple possibilité de rappeler un motif (comme
dans (a*)b(?1), qui, contrairement à la référence
arrière (a*)b\1, matche abaa et pas
juste aabaa) n'apporte rien de nouveau en elle-même, mais elle
devient très puissante si on l'utilise récursivement. Par
exemple, (a(?1)b|) définit le langage formé des
anbn dont j'ai signalé
ci-dessus que je pense (même si je ne sais pas le prouver) qu'il n'est
pas définissable avec simplement des références arrière : on peut
ainsi écrire des « expressions régulières » pour les expressions
bien-parenthésées et, sans doute, pour n'importe quel langage défini
par une grammaire sans contexte (même si ce n'est pas totalement clair
à cause des limitations sur la récursion). Le comportement est assez
différent entre Perl et PCRE, parce que ce dernier ne
sait pas faire de backtracking à l'intérieur du motif récursif, et
Perl : alors que Perl voit bien que abbc
vérifie (ab(?1)bc|b*), PCRE n'y arrive pas
parce que le b* capture tous les ‘b’ et n'en laisse
aucun pour bc.
Bref, ce serait bien d'étudier un petit peu tout ça sous l'angle
mathématique, donner des définitions rigoureuses de ce que ces
différents modèles d'expressions régulières permettent de faire,
trouver ceux qui sont les plus naturels, et comparer la puissance des
uns et des autres.
Pourquoi l'univers constructible de Gödel est important mathématiquement et philosophiquement
[J'ai écrit ce texte par tout petits bouts sur
plusieurs mois. J'espère que le processus fragmenté de son écriture
ne le rend pas trop brouillon !]
Introduction
De façon inexplicable, quand
j'ai listé certains des objets
mathématiques qui me fascinent, j'ai oublié de citer
l'univers
constructible de Gödel : la lecture de l'article Wikipédia à son
sujet ne parlera sans doute pas beaucoup au profane, mais je voudrais
rattraper mon oubli en essayant d'expliquer un peu de quoi il s'agit,
parce que cet objet me semble non seulement fondamental et extrêmement
élégant, mais même, dans un certain sens, on peut dire qu'il donne
un sens à toutes les mathématiques (avec néanmoins une question
philosophique fondamentale : est-ce vraiment le sens que
nous voulons ou devrions leur donner ? c'est-à-dire,
veut-on ou doit-on accepter l'axiome de constructibilité
qui affirme que cet univers constructible est l'univers
mathématique ?).
Si on me donne dix secondes pour dire un peu de quoi il s'agit à
quelqu'un qui ne connaît rien aux mathématiques, je pense que je
tenterais de résumer l'axiome de constructibilité à ce slogan
philosophique dont, malheureusement, le côté percutant enlève beaucoup
à la précision :
Il n'existe pas de vrai
hasard.
Si, en revanche, je dois expliquer de quoi il s'agit à quelqu'un
qui connaît un peu les mathématiques, je dirai la chose suivante :
l'axiome de constructibilité généralise — et non seulement implique,
mais même explique — deux postulats célèbres de la théorie
des ensembles que sont
l'axiome du
choix et
l'hypothèse
(généralisée) du continu. L'axiome de constructibilité rend
explicites et « naturels » des objets dont l'axiome du choix ne fait
que postuler l'existence, et il apporte suffisamment d'information sur
les parties de ℕ pour démontrer et éclairer l'hypothèse du continu (et
plus généralement sur les parties de n'importe quel ensemble pour
l'hypothèse généralisée du continu). L'axiome de constructibilité
ordonne (et « déroule ») tout l'univers mathématiques selon les
ordinaux et permet donc de répondre à un nombre étonnant de questions
combinatoires autrement indécidables, dont la véracité de l'axiome du
choix et de l'hypothèse du continu ne sont que deux exemples : ce qui
ne veut pas dire, cependant, que nous devions forcément accepter ces
réponses comme correctes.
J'ai vu Cloud
Atlas dimanche matin, et j'ai énormément aimé. Il faut
dire que je suis bon public pour les œuvres constituées d'histoires
entrelacées qui s'imitent et se répondent les unes les autres (comment
appeler ça ?
des fugues
narratives, peut-être ?), et malgré quelques clichés un peu
fastidieux dans certaines de ces histoires, j'ai trouvé que l'ensemble
était intelligemment construit, et surtout, extrêmement bien monté.
Parce que ce n'était pas un défi facile à relever que de faire en
sorte qu'on arrive à suivre six histoires simultanées, dès le premier
visionnage, sans s'y perdre ; et aussi, que le suspens marche de façon
sextuple. Je recommande donc ce film à ceux qui aiment, par
exemple La Vie, mode
d'emploi, ou Si par
une nuit d'hiver un voyageur, le
film The
Hours ou le roman de Cunningham qui l'a inspiré, ou ceux
qui auraient voulu pouvoir lire
le roman ici résumé.
Je me suis dit que j'aimerais changer la police avec laquelle ce
blog s'affiche. Pour le moment, celle-ci doit varier énormément d'une
personne à l'autre : actuellement, dans le CSS, je
précise pour la police principale : font-family: Optima, "Zapf
Humanist", Palatino, "Palatino Linotype", serif; — c'est-à-dire
que le navigateur ira chercher, par ordre de préférence décroissante,
des polices
appelées Optima
ou Zapf Humanist
(c'est essentiellement la même),
puis Palatino ou sa
version Linotype (c'est quasiment impossible de savoir quels noms
différents une police donnée peut prendre, malheureusement), ou, faute
de quoi, la police sérif par défaut.
J'aime énormément la police Optima pour son compromis subtil entre
sérif et sans-sérif, entre humanisme et modernité, entre sobriété et
audace ; elle est malheureusement rarement disponible sur
les PC, sauf sans doute sur les Mac ; à défaut, Palatino,
du même
concepteur, doit être beaucoup plus souvent installée puisque
c'est une
des polices
PostScript standard, donc forcément distribuée (ou au moins un de
ses clones comme URW Palladio L ou TeX Gyre Pagella — mais en fait je
ne sais pas si les mécanismes de recherche de police vont
automatiquement les sélectionner) sur essentiellement tous les
systèmes du monde.
Maintenant, comme je fais un usage assez immodéré de caractères
Unicode non-latin, il serait bien de trouver une police qui les
contienne (il y a bien un Optima avec du cyrillique, mais
essentiellement personne ne doit l'avoir). Histoire que СССР
et CCCP apparaissent comme identiques. Par chance, il existe
une police libre de bonne qualité, tout à fait dans le même esprit
qu'Optima, et qui contient un répertoire passablement étendu de
caractères Unicode (latin, phonétique, grec, cyrillique…) : il s'agit
de la police Linux Biolinum (le nom est assez ridicule, il faut dire,
et le mot Linux — un simple hommage — peut prêter à confusion
et laisser croire à tort qu'elle ne fonctionne que sous ce système
d'exploitation, mais à part ça c'est une très bonne police). Elle est
la petite sœur de la
police Linux Libertine,
qui s'inspire, pour sa part, plutôt de la police Times de Stanley
Morrison (mais de nouveau en couvrant une région d'Unicode beaucoup
plus importante), et qui est très connue au moins pour une chose :
c'est celle qui sert à écrire
le logo
de Wikipédia
(voir ici
pour plus d'informations).
Je pourrais juste modifier le CSS pour
mettre "Linux Biolinum O" avant Optima. Ça
changerait la police pour la plupart des utilisateurs de Linux, ou
tous ceux qui ont installé Linux Biolinum sur leur ordi. Mais ce
n'est pas furieusement intéressant : le but d'une police libre est
tout de même que tout le monde puisse l'avoir !
Je pourrais bien sûr aussi distribuer la police
au format WOFF,
qui sert exactement à ça. Le tracas, c'est que cette police n'est pas
toute petite (c'est le revers de la médaille du fait qu'elle couvre
beaucoup de caractères Unicode) : si je dois servir, pour quasiment
chaque personne qui consulte ma page, 374ko pour la police en
caractères droits, plus encore à peu près autant pour les italiques,
et encore autant pour le gras (et évidemment je vais vouloir changer
aussi les autres polices de la page, pas juste la principale), ça
commence à devenir lourd : pour le serveur d'une part, et pour
l'utilisateur aussi (j'aime que mes pages Web restent assez légères et
sans fioritures inutiles).
Pour certaines polices, Google fournit un service,
les Google web fonts, par
lequel ils servent eux-mêmes les polices et n'importe quelle page Web
peut les utiliser (à condition d'accepter de rediriger tous leurs
utilisateurs sur les serveurs de Google pour cette requête…), et
surtout, les ressources sont ainsi partagées (un navigateur
ne téléchargera qu'une fois chaque police, pas une fois par page qui
les utilise). Malheureusement, beaucoup de ces polices sont de
mauvaise qualité, et en tout cas, ni Linux Libertine ni Linux Biolinum
n'y figurent.
☞J'en viens au point essentiel.
Pour ce genre de ressource partagées que plusieurs pages Web
pourraient vouloir utiliser, il me semble que la solution serait non
pas d'avoir un serveur commun comme Google web fonts (ou la Open Font
Library ou que sais-je encore), mais plutôt de les partager
par haché. Autrement dit,
j'utiliserais un type d'URL spécial qui indiquerait au
navigateur client : je dispose d'une
ressource LinBiolinum_R.woff dont le sha256
est df706b9a3c8d79781684ea1bc348f63513f61e6121633625e8581b0d38339a07,
et elle est disponible à telle adresse ; le navigateur vérifierait
s'il possède déjà cette ressource (en utilisant le haché fourni) et,
sinon, la récupérerait à l'adresse que je lui fournis, et vérifierait
que le haché est le bon, après quoi il l'enregistrerait comme
ressource partagée pour ce haché : si une autre page Web prétend
utiliser une ressource de même haché, il n'y aura plus besoin de la
télécharger de nouveau (bien sûr, le navigateur gérerait l'expiration
des ressources selon ses propres règles, vraisemblablement en faisant
des stats sur l'utilisation passée de chaque haché). L'intérêt de
spécifier le haché est que ça n'a pas d'importance quelle page Web a
fourni la ressource : si elle a le bon haché, c'est forcément la
bonne.
Ce mécanisme semblerait extrêmement utile pour tout ce qui peut
être une ressource partagée entre pages Web : j'ai pris l'exemple
d'une police, mais ça pourrait aussi être une version de telle ou
telle bibliothèque JavaScript (au
pif, celle-ci), et peut-être même
certaines icônes particulièrement courantes. Ce mécanisme évite que
les pages Web aient à se concerter, ou à utiliser une ressource
centrale, pour partager des données. Tout ce qu'il demande, c'est de
créer un nouveau schéma d'URL qui préciserait simplement
le haché puis une (voire plusieurs) adresses où on peut obtenir le
contenu. (Évidemment, deux versions différentes de la même ressource
ne seraient pas partagées, mais ce serait déjà un mécanisme de cache
très précieux.)
En plus, la compatibilité ascendante avec les
navigateurs ne disposant pas de ce mécanisme pourrait se faire avec un
peu de code en JavaScript grâce
à registerProtocolHandler()
(que tous les navigateurs doivent supporter puisque ça fait partie du
standard HTML, n'est-ce pas ? /air naïf).
Cela semble tellement évident et tellement utile
que j'ai du mal à croire que ça n'existe pas déjà ! Qu'il n'y ait pas
au moins un projet du W3C ou dans le cadre du HTML5 pour
standardiser quelque chose du genre. Et pourtant, je ne trouve pas.
(Le plus proche que je vois, ce sont
les URL magnet,
mais c'est vraiment pour faire du BitTorrent, ce n'est pas typiquement
le genre de choses qu'on s'attend à ce qu'un navigateur gère
spontanément.) Est-ce que je n'ai pas les yeux en face des
trous ?
[Comme je m'attends certainement à ce qu'on me
dise : ah, mais ça existe, et ça s'appelle <truc>,
attendez-vous à ce que cette entrée soit mise à jour en
conséquence.]
Je suis hypocondriaque et donc, j'ai un sommeil d'hypocondriaque.
Petite liste des choses qui m'empêchent de bien dormir et dont, si
aucune n'est vraiment grave, l'accumulation n'est pas
négligeable :
1º Je suis somnambule.
Ce n'est que très léger, heureusement, et ne se produit qu'en début de
nuit, en prenant la forme de confusions
nocturnes où je me demi-réveille en ne sachant plus où je suis
(comme en écho à des situations où, étant petit, je m'étais endormi
dans une chambre peu familière ayant mal repéré les environs, et,
étant réveillé, avais paniqué en cherchant la lumière).
2º Je suis frileux et transpire
facilement, de sorte que le juste équilibre est délicat à
trouver. Ce n'est pas spécifique à la nuit, mais c'est surtout la
nuit que c'est gênant. Je dors donc avec trois couettes, chacune
assez légère, ce qui permet facilement d'en enlever une ou deux. Il
m'est arrivé de transpirer et d'avoir froid en même temps,
auquel cas je ne sais plus quoi faire. Par ailleurs, transpirer
déshydrate, donc je me réveille parfois parce que j'ai soif.
3º Je vais cinquante fois aux
toilettes, probablement parce que je ne supporte pas que ma
vessie ne soit pas parfaitement vide pour m'endormir : du coup, si je
bois un verre d'eau pendant la nuit
(cf. le point
précédent), il faudra que je me relève N fois au cours
de la demi-heure qui suit pour éliminer cette eau jusqu'à la dernière
goutte. (En bon hypocondriaque, je suis allé voir un médecin pour
vérifier que je n'avais pas un problème à la prostate ou à la vessie,
et il semble que non.)
4º Je me retourne
beaucoup dans mon lit. Bon, là, ce n'est pas moi qui suis
gêné, c'est plutôt mon poussinet. Surtout dans un lit double : pour
cette raison, nous préférons de beaucoup des lits jumeaux où chacun a
sa propre couette et on ne doit pas se battre. Mais même quand je
suis seul, ça me gêne un peu, parce que mes couettes tombent
facilement à force que je m'agite, et alors je me retrouve à avoir
froid.
5º Je ne peux dormir que sur le
côté. Sur le dos, je ronfle. Me mettre sur le ventre m'est très agréable
pour m'endormir (ça m'aide à me détendre et à trouver Morphée), mais
il faut absolument que je me mette sur le côté avant d'être vraiment
endormi sans quoi je me réveille cinq minutes plus tard
en étouffant. Sur
le côté, donc. Mais il y a autre chose : si j'ai une narine bouchée
(i.e., quasiment tout
le temps), je dois absolument dormir avec cette narine en
haut — pour aider à la déboucher, mais c'est devenu une habitude
tellement forte que je n'arrive plus à faire autrement — et si elle
reste bouchée, alors je me retrouve coincé sur le même côté sans
pouvoir me retourner, et je finis par ne plus pouvoir dormir, c'est
assez pervers.
6º Les réveils m'empêchent de
dormir. C'est le but, dira-t-on — mais je veux dire, même
avant qu'ils sonnent. Plus exactement, je ne peux m'endormir
correctement que si les deux conditions sont réunies : (a) il n'y a
pas de raison de penser que je serai réveillé dans les trois
heures qui suivent, et (b) il n'y a pas de raison de penser que
je serai réveillé avant d'avoir dormi huit heures (y
comprises les heures que j'ai déjà dormies, bien sûr), même en tenant
compte d'une heure d'insomnie probable. Donc si je mets mon réveil
pour, disons, 8h, il faudra que je me couche vers 23h (pas tant que
j'aie vraiment besoin de 8 heures de sommeil, mais si je suis
certain de ne pas les avoir, ça m'empêche de dormir !), et si je me
réveille après 5h je ne pourrai pas me rendormir.
7º Je suis sensible aux
bruits. Enfin, ça dépend lesquels : les bruits mécaniques,
dans une mesure raisonnable (pas une perceuse…), ne m'embêtent pas
trop, contrairement à mon poussinet qui s'agace du clic du thermostat
du radiateur de notre salle de bains ; en revanche, si j'entends de la
musique ou une conversation de chez les voisins, et dans une moindre
mesure des bruits de pas, je ne dormirai pas (et pour ce qui est
d'être gêné par la musique, je m'aperçois que j'ai
l'ouïe très fine). Par chance, nous habitons dans un
immeuble des années '90, donc bien insonorisé, et nos voisins sont
pour la grande majorité des couples bourgeois pas trop jeunes (et sans
enfants, ou dont les enfants ont déjà quitté l'appartement des
parents) et qui ne font donc que très peu de bruit de toute façon :
chez nous, je suis donc très rarement gêné. (Par ailleurs, si les
bruits me gênent pour m'endormir, ils ne me réveillent pas
trop facilement — de nouveau, perceuses exceptées. La lumière, pour
sa part, me gêne relativement peu, même pour m'endormir — sans doute
parce qu'étant ado je dormais parfois toute une matinée, volets
ouverts, avec le soleil en plein visage.)
8º Je fais des
insomnies, même une fois pris en compte tous les autres
facteurs qui peuvent m'empêcher de dormir : disons que tout tracas un
peu envahissant tournera facilement en boucle dans ma tête et
m'empêchera de m'évader.
9º Je ronfle un peu.
Heureusement, ce n'est que sur le dos, ça ne se produit pas trop
souvent, et ce n'est pas énorme, mais mon poussinet doit parfois me
pousser pour me remettre sur le côté (heureusement aussi, ça ne me
réveille généralement pas) ; la situation est d'ailleurs tout à fait
symétrique entre nous. Quand il n'est pas là ou n'est pas réveillé,
c'est plus ennuyeux, parce que mon propre ronflement me gêne souvent
la nuit (il apparaît dans mes rêves sous forme d'un bruit obsédant, et
ensuite je sens bien que j'ai mal dormi).
10º Je fais de
l'apnée du
sommeil. Si je m'endors sur le ventre, c'est
systématique, mais j'ai l'impression que, depuis récemment, c'est en
train de se manifester aussi sur le dos et peut-être même — ce qui
serait beaucoup plus problématique — sur le côté : je me réveille en
légère asphyxie parce que ma gorge est trop reculée, et je dois
prendre une soudaine respiration. L'ampleur du phénomène n'est pas
claire : que je m'en souvienne n'est pas fréquent, mais je ne sais
évidemment pas combien de fois ça se produit aussi sans que j'en aie
conscience (mais peut-être que le fait que je sois hypocondriaque et
que j'aie peur de faire de l'apnée du sommeil m'aide à ne pas oublier
quand ça se produit !). Je compte consulter à ce sujet, mais quand je
lis les traitements utilisés je suis un peu inquiet : ça me semble
absolument impossible que je puisse dormir avec un dispositif dans la
bouche pour retenir mon palais, ou avec un masque respirateur.
11º J'ai le nez
encombré : indépendamment de questions d'apnée du sommeil, je
respire plutôt mal parce que j'ai le nez qui se charge facilement
quand je suis allongé. Je ne sais pas si c'est une sorte d'allergie
ou un problème mécanique d'évacuation des mucosités. Quand les choses
vont bien, ça se limite à une narine, et il suffit que je dorme avec
celle-ci au-dessus pour qu'elle se dégage (c'est alors l'autre qui se
bouche, et je me
retourne) ; mais si les choses vont moins bien, la même narine
peut rester bouchée très longtemps, et alors il me sera impossible de
dormir tant que la situation ne sera pas réglée ; ou encore, il arrive
que l'autre narine soit elle-même un peu bouchée (hors des jours où
j'ai un rhume, les deux ne sont jamais complètement bloquées). Je
mets du sérum physiologique chaque soir avant de me coucher (une
unidose par narine) et j'ai du Septéal pour déboucher pendant la nuit
si nécessaire, mais parfois ça ne suffit pas.
12º J'ai besoin de beaucoup de
sommeil. Je ne sais pas si c'est parce que j'ai pris
l'habitude de dormir beaucoup, ou parce que je ne respire pas bien, ou
simplement parce que je suis comme ça, mais le fait certain est que je
ne me réveille pas spontanément avant… tard
(or mettre un réveil est
une mauvaise idée). Ceci étant, je ne parle qu'en moyenne :
ponctuellement, je tiens mieux une nuit courte que mon poussinet, qui
a vraiment besoin de ses huit heures chaque nuit.
Chacun de ces points est plutôt mineur, et même quand on les met
tous ensemble, je ne dors pas si mal que ça (en tout cas, il
y a des gens qui sont beaucoup plus à plaindre que moi à ce chapitre),
je m'endors relativement facilement, et s'il est vrai que je me
réveille presque systématiquement pendant la nuit, lorsqu'il n'y a pas
un réveil pour me perturber, je me rendors généralement assez bien, et
la dernière partie de mes nuits, où je
fais beaucoup de rêves, est vraiment agréable.
Je me demande, cependant, comment ça va évoluer en vieillissant, ou
quand je tomberais malade : parce que des tracas mineurs un jour
peuvent devenir beaucoup plus gênants combinés à d'autres
circonstances.
[Normalement je me contenterais pour ce genre de
choses d'éditer l'entrée où
je décris le problème, mais je
pense que ça vaut la peine cette fois d'en faire une entrée à part,
vers laquelle j'ai fait un lien depuis l'autre.]
Je parlais récemment, donc, de
mes soucis de tethering qui ne marche plus sous Android. La solution,
finalement, n'a pas été bien difficile à trouver, je n'y ai pas passé
de nuit blanche, et je n'ai pas eu à recompiler quoi que ce soit (même
si ça vaudra peut-être la peine que j'apprenne à le faire !) : il
m'aura suffi d'éditer la base de données des préférences avec (en tant
que root)
INSERT INTO global ( name, value ) VALUES ( 'tether_dun_required', 0 ) ;
puis rebooter (à vrai dire, j'ai cru par deux fois que ça ne
marchait pas : une fois parce que j'avais édité la
table secure au lieu de global, et une autre
parce que j'avais omis de rebooter).
L'idée semble être que cette préférence, si elle est mise à 1, a
pour effet d'obliger le téléphone à passer par un APN de
type dun quand il fait du tethering (c'est
dans frameworks/base/services/java/com/android/server/connectivity/Tethering.java
dans les sources d'Android), probablement pour que l'opérateur puisse
imposer ses règles à ce sujet. Je n'ai pas compris clairement,
cependant, si le type d'APN est vraiment signalé à
l'opérateur (ma piste s'est perdue du côté
de frameworks/opt/telephony/src/java/com/android/internal/telephony/DataConnection.java
et frameworks/opt/telephony/src/java/com/android/internal/telephony/gsm/GsmDataConnection.java
où je ne vois pas où le type d'APN serait transmis
vraiment) : autrement dit, je ne sais pas si l'échec était dû à une
volonté explicite d'Orange de ne pas m'autoriser le tethering ou si
c'était juste un problème accidentel. Toujours est-il qu'en mettant à
0 la préférence, je passe par l'APN normal, et tout va
bien.
Ce qui est un peu étrange, c'est que quand
on recherche tether_dun_required
dans Google, on ne tombe essentiellement que sur des pages en
japonais. Pourquoi diable serais-je le seul non-japonais à avoir
rencontré ce problème ?
Bon, je blaguais hier, mais
essayons d'être un chouïa sérieux. Non, je ne suis pas déçu de ne pas
avoir été élu. En fait, je ne pensais pas pouvoir être déçu par le
choix d'un pape — qui a à peu près autant d'importance pour moi,
finalement, que l'empereur du Japon — et dont je me doutais bien qu'il
ne pourrait pas être autre chose qu'un vieux crouton homophobe. La
déception vient de l'idée saugrenue qu'en fait, si, peut-être qu'il
aurait pu : nombreux commentateurs ont insisté sur le fait que la
cuvée 2013 était significativement différente des précédents sur
beaucoup de points (par le choix d'un prénom inédit, par le continent
dont il est originaire, par l'ordre religieux dont il vient, et par
les toutes premières paroles qu'il a prononcées) et lui ont attribué
un certain nombre de qualités auxquelles a priori je suis prêt
à croire (on a évoqué son humilité et sa simplicité, son pragmatisme,
sa tolérance, et son dévouement à la cause des pauvres). L'Église
catholique aurait-elle enfin eu l'idée de se choisir pour chef un de
ses prélats les moins détestables ? Pour l'instant le pape le plus
respectable semble avoir été Jean XXIII (ne serait-ce que pour avoir
convoqué un concile qui a tenté de rendre l'institution un peu moins
obsolète), et j'ai entendu qu'on lui comparait le petit François.
Voilà comment j'ai réussi à être déçu par le fait que le nouveau pape
— bien qu'il vienne d'un pays plus avancé que la France en matière de
droits des minorités sexuelles — soit bel et bien un vieux crouton
homophobe. Je note la leçon : au prochain conclave, je ne croirai au
changement que si les cardinaux choisissent une femme noire
lesbienne.
J'ai déjà raconté une de mes
craintes : être nommé Premier
ministre, mais il faut que j'en parle aussi d'une autre : être élu
pape. Vous imaginez l'angoisse ? Les cardinaux vont se réunir dans
une chapelle au plancher
remarquable, les magnifiques fresques de beaux hommes nus peints
par Michel-Ange (ou les gardes suisses, ou
encore leurs
voisins) vont les inspirer — et dans un moment d'égarement
peut-être voteront-ils pour moi. Et dans ces
conditions, ça ne se fait pas de
refuser.
Que de tracas ! Ma maman ne me le pardonnerait certainement pas
(on ne m'a pas élevé pour ça). Mes amis (dont beaucoup sont assez
bouffe-curé) se moqueraient de moi. Beaucoup de gens s'offusqueraient
qu'on puisse être pape et athée (ce à quoi on peut rétorquer
que Rodrigue
Borgia n'avais pas l'air trop profondément croyant). Il y aurait
certainement plein de paperasse à faire pour obtenir l'autorisation de
cumul entre mon poste d'enseignant-chercheur et celui de pape. Par
ailleurs, on est censé changer de nom (je ne suis pas mécontent du
mien, moi ! je n'ai pas envie de m'appeler Pie XIII, Innocent XIII ou
Callixte IV). Il faut faire attention à ne surtout pas dire que 2+2=5
en
parlant ex
cathedra sinon le monde
disparaît dans un pouf de logique. Et puis, les robes blanches,
ça doit être terriblement salissant quand on mange (encore que je
crois avoir vu quelque part que Benoît XVI avait le coup de main
pour se
protéger avec sa serviette). Au moins, ils ont cessé d'utiliser
la tiare
papale, parce que ça doit faire bien mal à la tête, ce truc.
Certes, il est maintenant établi que le pape peut démissionner,
mais il faut être en mauvaise santé pour ça, et moi, j'ai beau être
hypocondriaque, je ne peux pas vraiment me plaindre. Je peux, en
revanche, m'inquiéter qu'il
m'arrive la
même chose qu'au pauvre
Jean-Paul Ier[#].
Bref, je ne serai complètement tranquille que quand j'aurai entendu
que ce n'est pas moi qui suis élu évêque de Rome.
Bon, je vois venir que mes lecteurs pinailleurs
vont me dire : ce n'est pas possible que tu sois élu pape, tu n'es pas
baptisé (on lit partout que les cardinaux ne sont pas tenus d'élire un
des leurs — même si le cas contraire ne s'est pas produit
depuis un bon
moment — mais qu'ils doivent choisir un baptisé). Mais ce n'est
pas si clair, justement : le Code de Droit canonique prévoit
(332.§1)
le cas de figure où un non-évêque serait élu pape (si
charactere episcopali electus careat, statim ordinetur Episcopus)
— il semble logique qu'on procède de la même manière pour le sacrement
du baptême que pour le sacrement de l'ordre, i.e., il est certes
nécessaire pour être pape, mais pas pour être élu
pape, on peut le recevoir entre l'élection et la consécration, et on
le doit si on accepte la charge. Et de toute façon, si les deux tiers
des cardinaux sont d'accord, on se demande qui pourrait leur dire non.
Bref, pas clair que qui que ce soit soit à l'abri d'être élu pape,
s'il est un homme (pour ce qui est des femmes, il y aurait
certainement moyen en poussant encore un peu le raisonnement, mais je
ne suis pas sûr que l'Église catholique romaine soit encore prête à
avoir sa première papesse noire lesbienne).
[#] Tout le monde
connaît certainement la blague : Il y a trois explications sur la mort
suspecte de Jean-Paul Ier. La première est qu'il a
découvert que le Vatican mettait son argent dans une banque en Suisse,
il a voulu l'empêcher et on l'a assassiné en faisant passer ça pour
une crise cardiaque. La seconde est qu'il a découvert que le Vatican
mettait son argent dans une banque en Suisse, ça l'a tellement
horrifié qu'il est mort d'une crise cardiaque. La troisième est qu'il
a découvert que le Vatican ne mettait pas son argent dans une
banque en Suisse…
J'avais essayé le snowboard l'an
dernier en prenant juste une heure de cours (pas franchement un
succès : mon poussinet s'était fait mal au poignet et un vautour nous
avait tourné autour de la tête). Pas assez pour apprendre vraiment
quoi que ce soit mais assez pour se faire une petite idée et décider
que ça devrait me plaire. Cette année (après avoir changé d'avis sur
le pied à mettre en avant), j'ai été un peu plus persévérant : nous
avons repris deux heures de cours le
mois dernier à Métabief, et en avons de nouveau fait — par
nous-même — ce week-end à Termignon-Val-Cenis (les photos ci-dessus
sont géolocalisées pour ceux qui veulent voir précisément où nous
étions).
Comme je suis du genre
angoissé, j'avais acheté plein de protections : des protège-poignets
(à mettre entre les sous-gants et les gants), des protège-genoux et un
casque en guise de bonnet (plus le masque de ski, évidemment). Très
encombrant : ça me donnait un peu l'impression d'être un casseur de
manifestant (cf. photo), mais au moins je me sentais rassuré. Et
malgré les remarques ironiques de mon poussinet je ne pense pas que
ç'ait été inutile : c'est justement quand on est débutant qu'on en a
le plus besoin, et de fait, je suis tombé un nombre incalculable de
fois sur les genoux et les poignets, et j'ai fait une fois un vol
plané qui a terminé par un beau choc à la tête.
J'ai, donc, surtout commencé par beaucoup tomber. Notamment parce
que je n'arrivais pas correctement à tourner vers la gauche.
Il faut dire que le snowboard étant fondamentalement asymétrique
(sauf s'il s'agit d'un non-directionnel, c'est-à-dire que les deux
bouts peuvent servir d'avant, mais je ne sais pas pourquoi ça a l'air
d'être rare), on peut tout à fait ne pas être aussi à l'aise dans un
sens que dans l'autre. Faire face à la pente (où on voit
naturellement où on va) semble beaucoup plus naturel et confortable
que faire dos à la pente (où il faudra regarder par-dessus son
épaule). Et comme j'ai choisi finalement de mettre le pied droit à
l'avant (« goofy ») — parce que c'est comme ça que je me positionne
naturellement pour glisser sur de la glace — quand je fais face à la
pente c'est pour descendre un peu vers la droite alors que quand je
fais dos à la pente c'est pour descendre un peu vers la gauche (qui
est alors, pour moi, la droite). Du coup je suis plus à l'aise sur
une piste qui descend en tournant dans le sens des aiguilles d'une
montre autour de la montagne (parce que je peux rester face à la pente
et déraper gentiment vers la droite) que le contraire.
Évidemment, dès que la piste est un peu autre chose qu'une oblique
régulière, il faut alterner entre ces deux positions (face à la pente
et dos à la pente), et c'est surtout là que c'est délicat : j'ai assez
vite maîtrisé le principe du virage qui passe de « dos à la pente » à
« face à la pente » (virage côté dos,
ou heelside[#],
qui pour moi est vers la droite), mais dans l'autre sens (virage côté
face, toeside) je me plantais absolument
systématiquement. Et du coup je maudissais les lacets vers la gauche
et je me retrouvais souvent comme un idiot au bord droit de la piste,
sans savoir quoi faire ensuite. J'ai poussé une quantité de jurons en
hurlant qui ont provoqué une certaine hilarité chez les autres
skieurs. Ou alors je descendais simplement en dérapage (face à la
pente) sans aller ni vers la gauche ni vers la droite, ce qui est un
un peu l'équivalent pour le snowboard du chasse-neige du skieur
débutant.
Le problème semble être que quand je faisais un virage toeside, ça
prenait trop de temps dans la direction de la ligne de pente, je me
retrouvais toujours à aller trop vite et je ne savais plus contrôler :
soit je fonçais dans le talus soit je dérapais trop et je partais en
marche arrière — et la tentation était grande de simplement se pencher
en avant jusqu'à tomber sur la piste pour s'arrêter à grand renfort de
frottement sur les genoux. À la limite j'arrivais à déraper dos à la
pente (vers l'arrière, donc), mais pas me lancer et à contrôler ma
vitesse dans cette position.
Et tout d'un coup (après deux heures hier et trois aujourd'hui à me
manger des talus et à tomber sur les genoux), j'ai eu un déclic et
j'ai « compris le truc ». Mais le plus frustrant, c'est que je ne
sais pas ce que j'ai compris exactement, et je ne suis pas capable de
le réexpliquer. Tout ce que je sais c'est que mon poussinet a insisté
pour que je pratique le dérapage et l'avancée dos à la pente et
l'arrêt dans cette position, et j'ai arrêté de foncer dans les talus
et j'ai réussi à déraper correctement, et finalement à tourner vers la
gauche.
Ce qui est vraiment dommage, c'est qu'à ce point, où enfin je
commençais à pouvoir enchaîner des virages sans tomber, et surtout
à prendre plaisir à surfer, quand j'ai pu prendre un bout de
piste rouge, mes jambes étaient tellement fatiguées (et surtout le
muscle fessier de la jambe arrière=gauche), tellement fatiguées de
toutes ces pentes descendues à 1km/h en dérapant lentement à force de
me crisper, que je n'en pouvais plus, et nous avons dû mettre fin à
notre expérience.
Je réessaierai certainement l'an prochain, mais je ne sais pas si
je me rappellerai le « truc » que j'ai fini par comprendre ou s'il
faudra de nouveau passer des heures à mordre la neige avait de pouvoir
contrôler ma trajectoire.
[#] Certains utilisent
aussi les termes frontside
et backside, mais j'ai l'impression de comprendre
qu'il y a une grande confusion à ce sujet, certains les utilisant pour
exactement le contraire de ce que d'autres font, donc autant
éviter !
Il y a quelques semaines, j'ai mis à jour l'Android de mon
téléphone (qui est un
CyanogenMod officieux
parce que CyanogenMod considère que mon HTZ Desire Z d'il
y a à peine deux ans est tellement
insupportablement obsolète que ce n'est plus la peine de développer
pour), pour un Android 4.2.1 (CyanogenMod 10.1). J'ai testé plein de
choses qui marchaient très bien mais je n'ai pas pensé à tester ce qui
est, finalement, presque le plus important pour moi dans l'utilisation
du téléphone :
le tethering
(c'est-à-dire l'utilisation du téléphone comme une sorte de modem pour
fournir un accès Internet à un ordinateur auquel il est connecté par
exemple par USB). Et la loi de Murphy ayant frappé,
évidemment, maintenant qu'il me serait très difficile de revenir en
arrière à la version
précédente[#], je m'aperçois que
le tethering ne marche pas. Catastrophe.
Premier effet observé : au moment où j'active le tethering
(par USB, ce qui semble le plus robuste), la connexion de
données disparaît. Initialement j'ai cru que c'était simplemnt que la
connectivité était mauvaise et que par hasard il perdait la connexion
à ce moment-là, mais au bout de N répétitions du même
motif, j'ai fini par me rendre à l'évidence : il y a vraiment un
problème.
J'ai trouvé une première cause du problème : pour faire fonctionner
le tethering, il faut maintenant créer un APN de
type dun.
Un APN,
c'est le mécanisme par lequel on fait passer une connexion de données
sur la couche de protocoles GSM ; mais je ne sais
pas exactement ce à quoi ça correspond : ce qui est sûr,
c'est que le téléphone a besoin qu'on lui en fournisse un, et même un
par type de connexion qu'on peut avoir besoin d'effectuer :
un pour les connexions Internet « normales »
(type default ou peut-être internet), un
pour l'envoi de MMS (type mms : c'est
souvent tarifié différemment), un pour les upgrades du firmware
(type fota), un pour la réception de
données GPS (type supl ou
peut-être agps — je ne sais pas la différence, et de
toute façon ça ne semble plus trop utilisé), peut-être encore d'autres
types
(admin ? hipri ? phone ?), et,
donc, maintenant, aussi un pour le tethering (dun ou
peut-être tether ou tethering). Remarquez
que personne ne semble y comprendre quoi que ce soit : en googlant ces
différents mots-clés on trouve plein de gens qui s'échangent des
recettes de cuisine et des conseils contradictoires sur les types
d'APN à configurer — probablement dans beaucoup de cas ça
a peu d'importance, certains types sont sans doute synonymes, et de
toute façon l'opérateur ne fournit guère qu'un tout petit nombre
d'APN différents (chez Orange-FR il semble y
avoir simplement orange qui sert pour tout accès
Internet, donc essentiellement pour tous les types
listés saufmms, et orange.acte,
justement, pour les MMS). Tout ceci est extrêmement
confus (peut-être que je pourrai trouver un collègue à Télécom qui
peut m'expliquer exactement ce que tout ce merdier signifie), toujours
est-il que je n'avais pas d'APN de type dun
et que c'est sans doute la cause (cachée dans un message fort peu
convivial caché dans le log :
D/Tethering( 393): chooseUpstreamType(true), preferredApn =4, got type=-1)
de la disparition de ma connexion de données au moment où j'active le
tethering : apparemment les Android récents exigent
un APN de type dun, ils ne vont pas prendre
celui de
type default. D'autres
gens semblent avoir rencontré un problème très semblable (mais
eux, au moins, avaient un message d'erreur un peu plus
compréhensible !).
Il y a une chose qui m'horripile, c'est quand on a un problème,
qu'on trouve une cause qui explique tout, qu'on corrige en
conséquence, et que le problème persiste. (Je me sens un peu comme
Gregory House quand il découvre que son troisième diagnostic n'est
encore pas le bon parce que le foie du patient se met maintenant à
défaillir.)
Tout content d'avoir trouvé cette histoire d'APN de
type dun manquant, j'en ajoute un, je vois avec joie que
le téléphone établit une connexion de données, je me dis que
maintenant ça va marcher… eh non ! aucun paquet ne passe. Même depuis
le téléphone lui-même.
Mon explication provisoire (provisoire comme les diagnostics de
House) est que cette nouvelle version d'Android, en exigeant
un APN de type dun
(whatever that means), communique à
l'opérateur (Orange, donc) ce qu'il veut faire de la connexion de
données qu'il demande (bonjour, je voudrais une connexion pour
faire du tethering) et qu'Orange ne veut pas qu'on fasse du
tethering, au moins avec la formule de pauvre que j'ai (qui ne me
coûte que 8€ par mois pour Internet illimité, il faut admettre que
c'est assez compétitif), du coup ils ne laissent pas passer mes
paquets. Ou quelque chose de ce genre.
L'ennui, c'est que (1) ce diagnostic va être délicat à confirmer
(il va falloir au moins fouiller dans les entrailles d'Android pour
savoir ce qu'il fait au juste avec le type d'un APN), et
(2) même en admettant qu'il soit bon, ça va être difficile à réparer
(je ne veux pas que mon téléphone dise à mon opérateur qu'il va faire
du tethering). Je risque de devoir soit arriver à recompiler un
Android (ce qui semble vraiment difficile, d'autant que je
veux recompiler précisément celui d'Andromadus parce qu'il doit
marcher sur mon téléphone — ils fournissent les sources, mais ils ne
fournissent pas les explications sur comment les compiler), soit lui
faire un patch binaire (j'en ai déjà plusieurs, par exemple pour
désactiver
le choix aléatoire
d'adresse IPv6 que je déteste, mais s'il s'agit de
patcher un binaire Java converti en Dalvik, ce ne sera probablement
pas facile).
Je sens que je vais passer un bon nombre de nuits blanches sur
cette affaire.
Si par hasard parmi mes lecteurs infiniment cultivés il y en a qui
savent comment fonctionne la gestion des APN dans
le GSM en général ou dans Android en particulier, je suis
preneur de toute information !
[#] J'ai fait un backup
avant de changer de version, mais le reprendre impliquerait de perdre
tout ce que j'ai fait depuis. Comme la nouvelle version d'Android a
changé la signature de la base des contacts, je ne peux pas simplement
installer une plus ancienne. Par ailleurs, je me suis habitué aux
nouveautés de la version que j'ai maintenant.
Représentation des maths : TeX et Unicode sont dans un bateau
[Cette entrée fait plus ou moins suite — ou
complément — à la précédente, même
si elle peut être lue indépendamment.]
Quand on change de police dans le mode maths de TeX (avec des
commandes comme \it pour les italiques
ou \bf pour le gras dans plain TeX, remplacées en LaTeX
par \mathit et \mathbf), le système change
vraiment de police (enfin, plus exactement, il change de « famille »,
une famille étant un ensemble de polices pour le mode maths, les
indices et exposants et indices et exposants de deuxième niveau).
Plus précisément, TeX attribue aux symboles du mode maths
un mathcode, qui est constitué de trois parties :
un type de symbole (0=ordinaire, 1=grand opérateur,
2=opération binaire, 3=relation, etc., et 7=variable),
une famille (par exemple, 0=droit, 1=italiques maths,
2=script et symboles, 6=gras) et un numéro de caractère dans la police
(par exemple, pour un ‘x’, ces parties valent 7, 1 et 0x78, tandis que
pour un ‘+’ elles valent 2, 0 et 0x2B, et enfin pour
un \Gamma ce sont 7, 0 et 0x00) ; le type sert à
l'espacement, la famille détermine la police utilisée pour ce symbole,
et le numéro indique quoi chercher dans cette police ; mais si le type
vaut 7(=variable), alors le numéro de famille stocké comme deuxième
partie du mathcode sera overridé par le numéro de famille
courante (celle qu'on choisit en tapant une commande de police) si ce
numéro ne vaut pas −1 : c'est la raison pour laquelle le ‘x’ est
italique par défaut (alors que le \Gamma est droit par
défaut) mais que si on ajoute un \bf devant (qui passe la
famille à 6), tous les deux deviennent gras — en revanche, le ‘+’ ne
le devient pas.
Mais Unicode a prévu des alphabets spécifiques pour les lettres
grasses/italiques/etc. dans les formules mathématiques (l'idée étant
qu'en mathématiques, et seulement en mathématiques, passer en gras
change vraiment la sémantique du caractère : donc il est logique d'en
faire un caractère Unicode différent).
Du coup, si on utilise LuaTeX avec le
package unicode-math, les choses sont complètement
différentes : il n'y a plus qu'une police (numérotée 0) qui sert pour
tout, elle est encodée avec des codepoints Unicode. Par exemple, un
‘x’ mathématique italique minuscule est représenté dans Unicode par le
codepoint U+1D465 MATHEMATICAL ITALIC SMALL X : le
paquet unicode-math va donc lui donner
le mathcode (étendu par LuaTeX pour pouvoir dépasser les
3+4+4=15 bits prévus par TeX) dont les trois parties sont : 7, 0 et
0x1D465. Cette fois, quand on veut passer, disons, en sans-sérif, le
paquet ne change pas la police, il change
les mathcode associés aux lettres (dans
un \mathsf, le mathcode du ‘x’ devient (7,
0, 0x1D5D1) pour référencer U+1D5D1 MATHEMATICAL SANS-SERIF SMALL
X).
Bon, le principe n'est pas idiot, mais il souffre d'une
limitation : et si je veux un ‘Ш’ en gras ou en sans-sérif ? Et si je
veux un ‘é’ en gras ou en sans-sérif ? Unicode n'a pas prévu de
caractères pour ces choses-là. Et, indépendamment d'Unicode, la
police XITS ne les a pas. Ce qui ne veut pas dire que
les choses soient impossibles : pour le gras, on peut prendre une
version grasse de la police XITS (oui, il y a un alphabet
mathématique gras dans la police normale, mais il y a aussi
une version grasse de la police) ; pour le sans-sérif, on peut aller
chercher une police vaguement semblable ; et pour taper un ‘é’ on peut
aussi mettre un ‘´’ sur un ‘e’. Mais quelle est la bonne façon de
faire ?
On peut peut-être inventer des nuances sémantiques sibyllines : par
exemple, on peut prétendre que si j'écris un x sans-sérif dans une
formule mathématique (un 𝖾), c'est un symbole en lui-même, donc il est
logique de le représenter par un symbole Unicode spécial qui
correspond à un e sans-sérif quelle que soit la police (U+1D5BE
MATHEMATICAL SANS-SERIF SMALL E), mais que si je choisis de
représenter l'ensemble des dérivations sur un anneau A par
Dér(A) et que je m'amuse à écrire le Dér en
sans-sérif, alors il faut quand même le représenter par les caractères
Unicode normaux (U+0044 LATIN CAPITAL LETTER D / U+00E9 LATIN SMALL
LETTER E WITH ACUTE / U+0072 LATIN SMALL LETTER R) et c'est la police
qui devra être sans-sérif. Pour aller plus loin dans les distinctions
byzantines : dans le deuxième cas, on a un ‘é’ dans une police
sans-sérif, alors que si j'invente une notation mathématique
représentée par un accent aigu (pourquoi pas, après tout), je pourrai
voir un U+1D5BE MATHEMATICAL SANS-SERIF SMALL E surmonté d'un accent
aigu, ce qui est différent. C'est en tout cas la meilleure façon que
je voie de défendre la choix d'Unicode. Mais il faut dire que c'est
sacrément tiré par les cheveux, et un peu pénible à implémenter
avec unicode-math. Et ça ne tient même pas complètement
debout : parce que si je prétends que les mots ou bouts de mots
français qui apparaissent dans les formules mathématiques doivent
s'écrire avec les caractères Unicodes « normaux » et pas dans les
alphabets mathématiques du plan 1 — ce qui, effectivement, se défend —
ça pose problème lorsque je commence à vouloir distinguer le
mot Hom écrit en caractères gras (par exemple pour la catégorie
des foncteurs entre deux catégories). Bref, on encule les mouches
mais on ne sait pas très bien où on va.
J'avais déjà parlé de la question il
y a quelques années, mais il est peut-être temps que je fasse une
mise au point un peu plus détaillée sur ce qu'il en est.
Le merdier
Commençons par rappeler les personnages de la pièce. D'un côté, on
a TeX, le logiciel de
typographie scientifique écrit vers la fin des années '70
par Donald
E. Knuth pour pouvoir mettre en page son Art
of Computer Programming, et qui à ce jour semble être le seul
programme capable de faire de la mise en page scientifique (voire, de
la mise en page tout court) de bonne qualité — et qui est, en tout
cas, universellement utilisé pour leurs publications par les
mathématiciens, les physiciens et les informaticiens. De l'autre, on
a Unicode, le jeu
de caractères démarré vers la fin des années '80 et qui est en train
de devenir le standard pour la représentation de toutes les
formes d'écriture de toutes les langues du monde.
De cette description il résulte que si on veut mettre en page un
document de qualité typographique correcte mélangeant un grand nombre
de langues, on va vouloir utiliser TeX et Unicode. L'ennui, c'est
qu'ils ne s'aiment pas. Mais alors, vraiment pas.
Le problème vient principalement de ce que Knuth, quand il
programme, écrit du code certes absolument parfait du point de vue des
bugs (il a fait 427 corrections à TeX depuis 1982, dont 11 depuis le
début de ce millénaire, ce qui est plutôt pas mal quand on
considère que Mozilla/Firefox approche les 850000 bugs rapportés
depuis 1998 — même si ça ne compte pas exactement la même chose ça
donne une idée), mais absolument abominable du point de vue de
l'extensibilité future. TeX est donc bourré de bizarreries et
d'idiosyncrasies
poussiéreuses[#], de code ad
hoc, de constantes magiques, et d'hypothèses faites à niveau
profond — comme le fait qu'il n'y aura pas plus que 256 caractères
dans une police, ou que toutes les dimensions sont exprimés en une
unité fondamentale qui vaut 127/23681433600 mètres (soit environ
5.362851nm). En plus de ça, c'est un des langages de programmation
les plus abominables qui soient (basé sur l'expansion de macros, sans
aucune notion
de portée
bien définie ou
de transparence
référentielle — et avec des limitations incroyablement lourdingues
comme 255 variables globales et 255 variables locales pour chaque type
de données, aucune multiplication ou division ou arithmétique
flottante, bref, une
vraie fosse à
goudron de Turing). Soit dit en passant, le source de TeX
lui-même est tout aussi abominable (pas
seulement parce
qu'il est écrit en Pascal, mais aussi parce qu'il fait tout ce
qu'on dit de ne surtout pas faire dans les cours de
compilation, comme stocker des paramètres et variables de retour dans
des variables globales).
Comme si ce n'était pas suffisamment atroce, au-dessus de TeX s'est
accumulée toute une couche de sédiments, à savoir des packages pour
TeX qui tentent de l'enrichir dans différentes directions. Et
notamment tout l'édifice de LaTeX qui essaie de fabriquer quelque
chose de propre au-dessus du merdier sous-jacent d'une façon qui
revient à peu près à essayer de construire une ville au-dessus d'un
tas de fumier, pour se retrouver, en fait, avec une construction
complètement bancale et qui ressemble plus à
la citadelle
de Kowloon qu'à
la Cité
interdite. (Bon, j'en conviens, mes métaphores sont complètement
pourries.) Certains de ces paquets sont carrément impressionnants
(comme TikZ), mais
le problème est que (1) la compatibilité des packages entre eux est
souvent très douteuse, car chacun peut modifier tout le système dans
des directions carrément imprévisibles, et (2) les hypothèses
douteuses du cœur (comme le fait que les polices sont limitées à 256
caractères) sont démultipliées par tout le code qui se greffe
au-dessus.