David Madore's WebLog: 2013-03

This WebLog is bilingual, some entries are in English and others are in French. A few of them have a version in either language. Other than that, the French entries are not translations of the English ones or vice versa. Of course, if you understand only English, the English entries ought to be quite understandable without reading the French ones.

Ce WebLog est bilingue, certaines entrées sont en anglais et d'autres sont en français. Quelques-unes ont une version dans chaque langue. À part ça, les entrées en français ne sont pas des traductions de celles en anglais ou vice versa. Bien sûr, si vous ne comprenez que le français, les entrées en français devraient être assez compréhensibles sans lire celles en anglais.

Note that the first entry comes last! / Notez que la première entrée vient en dernier !

Index of all entries / Index de toutes les entréesXML (RSS 1.0) • Recent comments / Commentaires récents

Entries published in March 2013 / Entrées publiées en mars 2013:

(jeudi)

Pourquoi les rhumes me font-ils tant d'effet ?

Non seulement j'attrape énormément[#] de rhumes (cette fois c'est le troisième en trois mois — voir ici et — 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.

(mercredi)

Hollingsworth v. Perry

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.

(lundi)

Retour de Londres

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à.

(mercredi)

Méditations sur les regexps « étendues »

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 aababcaa ne 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 (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.

(mardi)

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.

Plan de cette entrée :

(mardi)

Cloud Atlas

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é.

(dimanche)

Polices, et partages des ressources par haché

☞Commençons par le contexte.

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.]

(samedi)

Les nombreux troubles de mon sommeil

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 :

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.

(vendredi)

Tethering, Orange et Android récent : solution

[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)

sqlite3 /data/data/com.android.providers.settings/databases/settings.db

et d'y ajouter une préférence avec

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 ?

(vendredi)

La déception du Vatican

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.

(mardi)

L'angoisse du Vatican

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…

(dimanche)

Nouvelle expérience en snowboard

[Photo de moi à la montagne][Photo de moi tenant un snowboard]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).

[Armure de protection]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 !

(samedi)

Tethering, Orange et Android récent : souci

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 sauf mms, 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 !

Suite : voir une entrée ultérieure.

[#] 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.

(mercredi)

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.

(lundi)

De la difficulté de marier TeX et Unicode

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.

Continue to older entries. / Continuer à lire les entrées plus anciennes.


Entries by month / Entrées par mois:

2017 Jan 2017 Feb 2017 Mar 2017 Apr 2017 May 2017 Jun 2017 Jul 2017 Aug 2017 Sep 2017 Oct 2017 Nov 2017
2016 Jan 2016 Feb 2016 Mar 2016 Apr 2016 May 2016 Jun 2016 Jul 2016 Aug 2016 Sep 2016 Oct 2016 Nov 2016 Dec 2016
2015 Jan 2015 Feb 2015 Mar 2015 Apr 2015 May 2015 Jun 2015 Jul 2015 Aug 2015 Sep 2015 Oct 2015 Nov 2015 Dec 2015
2014 Jan 2014 Feb 2014 Mar 2014 Apr 2014 May 2014 Jun 2014 Jul 2014 Aug 2014 Sep 2014 Oct 2014 Nov 2014 Dec 2014
2013 Jan 2013 Feb 2013 Mar 2013 Apr 2013 May 2013 Jun 2013 Jul 2013 Aug 2013 Sep 2013 Oct 2013 Nov 2013 Dec 2013
2012 Jan 2012 Feb 2012 Mar 2012 Apr 2012 May 2012 Jun 2012 Jul 2012 Aug 2012 Sep 2012 Oct 2012 Nov 2012 Dec 2012
2011 Jan 2011 Feb 2011 Mar 2011 Apr 2011 May 2011 Jun 2011 Jul 2011 Aug 2011 Sep 2011 Oct 2011 Nov 2011 Dec 2011
2010 Jan 2010 Feb 2010 Mar 2010 Apr 2010 May 2010 Jun 2010 Jul 2010 Aug 2010 Sep 2010 Oct 2010 Nov 2010 Dec 2010
2009 Jan 2009 Feb 2009 Mar 2009 Apr 2009 May 2009 Jun 2009 Jul 2009 Aug 2009 Sep 2009 Oct 2009 Nov 2009 Dec 2009
2008 Jan 2008 Feb 2008 Mar 2008 Apr 2008 May 2008 Jun 2008 Jul 2008 Aug 2008 Sep 2008 Oct 2008 Nov 2008 Dec 2008
2007 Jan 2007 Feb 2007 Mar 2007 Apr 2007 May 2007 Jun 2007 Jul 2007 Aug 2007 Sep 2007 Oct 2007 Nov 2007 Dec 2007
2006 Jan 2006 Feb 2006 Mar 2006 Apr 2006 May 2006 Jun 2006 Jul 2006 Aug 2006 Sep 2006 Oct 2006 Nov 2006 Dec 2006
2005 Jan 2005 Feb 2005 Mar 2005 Apr 2005 May 2005 Jun 2005 Jul 2005 Aug 2005 Sep 2005 Oct 2005 Nov 2005 Dec 2005
2004 Jan 2004 Feb 2004 Mar 2004 Apr 2004 May 2004 Jun 2004 Jul 2004 Aug 2004 Sep 2004 Oct 2004 Nov 2004 Dec 2004
2003 May 2003 Jun 2003 Jul 2003 Aug 2003 Sep 2003 Oct 2003 Nov 2003 Dec 2003