David Madore's WebLog

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

(vendredi)

Où je comprends un peu mieux comment recoller les surfaces

Cette entrée fait logiquement suite à la précédente, même si je vais essayer de redire en partie (pour, j'espère, éclaircir) ce que j'y disais. Sinon, ce n'est pas grave, c'est au moins un nouveau prétexte pour faire des zoulis dessins.

[Un domaine fondamental dans le plan hyperbolique]Je me posais (dans l'entrée précédente) la question de comprendre la forme — et mathématiquement, la réalisation du groupe fondamental — d'une surface obtenue en recollant un polygone par identification de certaines arêtes du bord. (En l'occurrence, un polygone hyperbolique, mais peu importe si on veut juste se poser des questions de topologie.)

J'ai tracé ci-contre à gauche (cliquez pour agrandir) une version beaucoup plus symétrique, quitte à découper à l'intérieur des carrés du pavage, du « domaine fondamental » de mon labyrinthe hyperbolique jouet, ce sera beaucoup plus satisfaisant d'expliquer sur cet exemple-là, même si les explications que je vais donner sont tout à fait générales. J'ai aussi choisi un code de couleurs plus logique (et, j'espère, un peu moins difficile à repérer visuellement), et surtout, j'ai choisi de marquer les identifications par des pastilles au niveau des sommets plutôt que par des languettes au niveau des arêtes. Il faut donc comprendre qu'on a identifié les deux arêtes portant chaque paire de couleurs consécutives possible (par exemple les deux arêtes vert-clair–bleu-foncé sont identifiées, en identifiant bien sûr les extrémités de la même couleur ; ainsi, dans mon jeu de labyrinthe, si on sort du domaine fondamental par une arête vert-clair–bleu-foncé, on y rentre par l'autre arête ayant le même code de couleurs). Le but est de comprendre, de façon aussi explicite que possible, ce qu'on obtient en faisant ces identifications (et pourquoi, sur mon exemple, on obtient un tore à 4 poignées, et comment voir ces poignées).

Pour ceux qui auraient du mal à voir la figure ou qui voudraient plus de détails, la description complète du polygone hyperbolique ci-contre est la suivante : gris [X] bleu-clair [Y] vert-foncé* [X] rouge-clair [Y] jaune-foncé [Y] vert-clair [X] rouge-foncé* [Y] bleu-clair [X] gris [X] rouge-clair [Y] bleu-foncé* [X] jaune-clair [Y] vert-foncé [Y] bleu-clair [X] jaune-foncé* [Y] rouge-clair [X] gris [X] jaune-clair [Y] rouge-foncé* [X] vert-clair [Y] bleu-foncé [Y] rouge-clair [X] vert-foncé* [Y] jaune-clair [X] gris [X] vert-clair [Y] jaune-foncé* [X] bleu-clair [Y] rouge-foncé [Y] jaune-clair [X] bleu-foncé* [Y] vert-clair [X] : ici, les couleurs étiquettent les sommets (c'est la seule chose qui importe topologiquement), les astérisques qui suivent certains d'entre eux signifient qu'à cet endroit le polygone a un angle de 3π/4 (i.e., en suivant le périmètre, on fait un tournant de π/4 vers la gauche) alors que partout ailleurs c'est un angle droit (i.e., on fait un tournant de π/2 vers la gauche), et les lettres X et Y font référence aux longueurs des cotés, à savoir X≈1.4693517444 et Y≈1.5919125929 unités naturelles de longueur du plan hyperbolique. (Mon polygone hyperbolique a donc seulement deux angles différents et deux longueurs différentes de côtés ; par ailleurs, il est symétrique par rapport à quatre axes. Mais je répète que, pour ce qui est de la topologie, les longueurs des côtés et angles aux sommets n'ont pas d'importance.)

Le fait de colorier les sommets et pas les arêtes, pour l'identification, aide à y voir plus clair : on est naturellement amené à tracer le graphe des sommets du polygone en reliant deux sommets lorsqu'il y a une arête qui les joint sur le polygone. Sur mon exemple, bien que le polygone ait prima facie 32 sommets (et donc 32 arêtes), il n'a en fait, compte tenu des identifications, que 9 sommets distincts (i.e., 9 couleurs), et 32/2 = 16 arêtes. Le graphe d'adjacence des sommets est tracé ci-contre pour ceux dont le navigateur supporte le SVG.

(lundi)

J'essaie de recoller une surface de Riemann

[Un domaine fondamental dans le plan hyperbolique]Le hasard a fait que j'ai repensé à mon petit jeu HTML de labyrinthe hyperbolique, mais en fait surtout à sa version jouet (voir ici et pour les de mon blog où j'en discute), en même temps que je me posais des questions sur les surfaces de Riemann. En fait, je ne suis pas terriblement content de mon jeu : l'espace hyperbolique étant en lui-même labyrinthique, il est dommage de plaquer dessus un dédale avec des murs infranchissables — je voudrais refaire un jeu où les mouvements ne sont jamais bloqués, pour montrer qu'il est quand même difficile de trouver son chemin dedans. Mais pour cela, il faut que je comprenne un peu mieux des choses sur lesquelles j'ai encore des idées vagues, même sur la version jouet de mon labyrinthe.

☞ J'invite mon lecteur à essayer d'y jouer, ou plus exactement, à s'y déplacer en essayant de se faire une idée de la géographie du labyrinthe — je ne parle pas de la forme des murs eux-mêmes, mais de la périodicité de l'espace. On peut par exemple jouer à se rendre de la case de départ à la case d'arrivée en utilisant le nombre exact de déplacements optimal (indiqué à droite), et à prévoir le chemin avant de faire le moindre déplacement. On devrait au moins réussir à se convaincre qu'il n'y a en fait, dans ce labyrinthe-jouet, que 30 cellules différentes (les cellules étant des « carrés » de murs possibles, au centre desquels se trouve un cercle de référence). Les carrés blancs dans l'image ci-contre à gauche représentent un choix possible des 30 cellules du labyrinthe (c'est-à-dire que tout carré en-dehors de ceux-ci est, en fait, identique à l'un de ceux-ci) : on dit qu'il s'agit d'un domaine fondamental (pour le groupe fondamental de mon labyrinthe).

Il faut souligner qu'il y a beaucoup d'arbitraire dans le choix d'un tel domaine fondamental : j'aurais très bien pu faire passer tel ou tel carré d'un côté à l'autre en le remplaçant par un autre qui lui est équivalent. Mais bon, cela n'a pas beaucoup d'importance, et on n'aurait pas pu obtenir une figure symétrique — malgré le fait que la surface recollée que je décris ci-dessous soit réellement très symétrique.

La figure ci-contre à gauche peut être considérée comme une sorte de patron géométrique : les arêtes du bord ont été décorées par des petites languettes figurées en couleur ; si on recolle chaque languette sortante sur le bord des cases blanches avec la languette entrante qui lui correspond (par exemple, les deux languettes rouges qui forment une sorte d'entaille un tout petit peu à gauche du bas de la figure sont à recoller avec les deux languettes rouges qui forment une saillie en haut à gauche), on obtient la forme de l'espace de mon labyrinthe-jouet — ou pour dire les choses autrement, dans ce labyrinthe, si on sort du « domaine fondamental » par une des languettes colorées, on y rentre par la languette qui correspond.

(vendredi)

Grothendieck, la propriété intellectuelle, et le testament de Virgile

Bon alors il faut vraiment que je publie quelque chose sur la mort d'Alexander Grothendieck, ne serait-ce que pour faire cesser le flux de gens qui m'envoient un mail — ou postent un commentaire sur une entrée qui n'a rien à voir — pour me demander si j'en avais connaissance (oui, la preuve) ou s'étonner que je n'aie rien à dire à ce sujet (eh, calmez-vous un peu !, il est mort depuis même pas 48h, la presse people n'a pas encore sorti un numéro spécial à son sujet — permettez que je n'écrive pas instantanément des textes au kilomètre).

Je n'essaierai pas, en tout cas pas aujourd'hui, de parler du contenu de ses travaux mathématiques, parce que rien que pour vulgariser — et pas au niveau le plus élémentaire qui soit — le concept très basique de schéma j'avais écrit une des entrées les plus longues de ce blog, alors je ne sais pas ce que ça donnerait si je me lançais dans une explication de ce que sont les champs, les topos (topoï ?) ou les motifs (sur ce dernier concept au moins, ce serait en outre présumer de mes connaissances mathématiques que de tenter d'en parler).

Je n'essaierai certainement pas non plus de parler de la polémique autour de la paternité de telle ou telle idée mathématique, qui l'a conduit à se fâcher avec une partie de la communauté mathématique, notamment nombre de ses anciens élèves, et à publier sa version des faits dans un très long texte, Récoltes et Semailles, où il règle ses comptes avec beaucoup de gens. Je sais que je suis un peu extrémiste quand je pense que les articles scientifiques devraient être anonymes (pas forcément au sens où le nom des auteurs serait tenu secret mais au sens où il ne devrait pas être une donnée importante), et que les objets et théorèmes mathématiques ne devraient pas être nommés d'après des personnes vivantes ou mortes mais d'après des idées (i.e., pas comme la conjecture de Poincaré, le théorème des zéros de Hilbert ou les conjectures de Weil, mais comme l'hypothèse du continu, le théorème de la boule chevelue ou la conjecture de pureté cohomologique absolue) : toujours est-il que les questions de paternité m'intéressent très peu — le monde des idées, et en tout cas des idées mathématiques, n'est la propriété de personne. (Et de toute façon, quand les élèves de Grothendieck étaient mes enseignants ou les enseignants de mes enseignants, je me vois mal me prononcer sur qui à fait quoi.)

Je n'essaierai enfin pas de parler de la vie de Grothendieck ou de ses idées politiques (et plus généralement non-mathématiques), parce que je ne prétends pas en savoir assez, ou comprendre ce personnage complexe et énigmatique, et d'autres s'en chargeront certainement mieux que moi.

Mais il y a un point sur lequel je voudrais dire un mot, c'est sur la question des écrits de Grothendieck et de leur propriété intellectuelle (au sens juridique du droit d'auteur). Parce que la communauté mathématique, du moins, ceux qui s'intéressent à la géométrie algébrique, a un problème pratique : la référence incontournable qui fonde la lecture moderne de cette discipline est une série de textes (écrits en français), les Éléments de Géométrie algébrique (ÉGA), soit environ 1800 pages, plus les Séminaires de Géométrie algébrique [du Bois Marie] (SGA), numérotés de SGA1 à SGA7, soit environ 5700 pages au total (sans compter SGA4½), dont Grothendieck est soit l'auteur soit un coauteur (comme je l'explique ci-dessus, la question de la paternité intellectuelle m'intéresse peu — même si ici il n'y a aucune contestation — mais je parle au sens juridique). Malgré des efforts de divers auteurs pour écrire des introductions plus ou moins complètes à la géométrie algébrique (et dont le plus sérieux est sans doute le monumental Stacks Project que je salue très bas au passage ainsi que son grand coordinateur, A. Johan de Jong), aucun n'a réussi à couvrir tout ce que couvrent les ÉGA et encore moins les SGA (et quand bien même on y arriverait, il resterait encore que toutes les références numériques à ces textes n'ont de sens que si on y a accès).

Or voici le problème pratique : Alexander Grothendieck s'est toujours opposé à ce qu'on réédite ces textes. (Je ne prétends pas comprendre, encore moins expliquer, quelles étaient ses motivations pour le refuser.)

(lundi)

Comment travailler sur du XML en conservant le formatage ?

Je ne suis certainement pas le premier à me poser cette question, et ça m'étonnerait un peu qu'il n'y ait pas déjà une solution, mais je ne trouve pas — il faut dire que je ne sais pas bien quoi chercher comme mots-clés.

Voici mon problème :

J'ai des fichiers XML que je voudrais traiter avec des outils XML, par exemple appliquer une feuille de style XSLT (qui laissera la grande majorité du document inchangé, se contentant d'ajouter des attributs ici ou là, ou peut-être quelques balises). Néanmoins, je voudrais préserver, dans la mesure du raisonnable, le formatage du document d'origine : par formatage dans cette phrase, je veux dire la manière dont les balises et les attributs sont écrits/sérialisés (par exemple, <foo color="blueish" price="expensive" /> et <foo price='expensive' color='blueish'/> sont deux formatages différents de la même balise, de même que des changements possibles du whitespace, et plus généralement tout ce qui conduit au même XML canonique — on peut d'ailleurs considérer ça comme la définition du formatage : deux documents XML diffèrent uniquement par le formatage lorsqu'ils ont le même XML canonique). Concrètement, je veux que le diff de mon document après traitement (par une feuille de style XSLT qui ne change que quelques attributs ou balises) soit en gros aussi faible que possible avec celui avant traitement (parmi tous les formatages possibles de la sortie XML du traitement).

Éclaircissement/redite : Comme je semble avoir été mal compris, je vais essayer de redire différemment ce que je cherche à faire. Je ne cherche pas à reformater du XML, au contraire, je cherche à le modifier sans le reformater : je cherche à traiter du XML par des outils XML en changeant le moins possible le XML en sortie (et notamment, sans changer le formatage des balises qui n'auront pas du tout été modifiées). Concrètement, j'ai du XML écrit à la main, je veux faire des changements automatisés dessus tout en préservant les idiosyncrasies du formatage à la main (notamment : l'ordre des attributs, le whitespace dans les balises ouvrantes et fermantes, les sections CDATA, les entités, ou le fait d'écrire parfois certains caractères Unicode sous forme de références de caractères).

Y a-t-il des outils pour réaliser ça ?

Je pensais à l'idée suivante : inventer un namespace ad hoc qui sert à refléter le formatage XML. Autrement dit, partant d'un document XML sous un certain format texte, on aurait des outils qui ajoutent des attributs et balises de ce namespace servant à stocker tous les détails du formatage (l'ordre des attributs, le type de guillemets les représentant, le whitespace partout où il n'est pas significatif, etc.), et capables, inversement, d'interpréter (et retirer) ces attributs et balises pour recréer le document exactement tel qu'il était, même s'il a été reformaté entre temps (par exemple remplacé par son XML canonique). On pourrait alors travailler en trois étapes : ajouter les attributs et balises représentant le formatage, travailler avec XSLT sur le document ainsi enrichi (la feuille de style XSLT ignorerait typiquement les éléments de formatage), puis réappliquer le formatage sauvegardé dans les attributs et balises spécifiques (dans certains cas l'information de formatage serait incomplète ou non directement applicable, bien sûr, vu que des attributs ou balises ont pu être ajoutés, supprimés ou changés par le XSLT, mais le reformateur ferait « au mieux » dans un sens pas très important).

Ça ne doit pas être horriblement compliqué d'écrire des outils comme ça de sauvegarde/sérialisation et restauration/désérialisation du formatage, mais ça m'arrangerait de ne pas être celui qui invente la roue surtout si quelqu'un l'a fait avant moi. Quelqu'un connaît-il des choses dans ce sens ?

Ajout () : J'envisage essentiellement trois pistes pour résoudre mon problème :

J'avais réfléchi à plusieurs occasions à ce problème et à des questions adjacentes, et je m'étais dit qu'il faudrait développer une petite théorie formelle des encodages, réencodages et transcodages de l'information : notamment, je pense que le théorème de Cantor-Schröder-Bernstein a son mot à dire dans l'histoire du round-trip encoding (je rappelle qu'il s'agit du théorème qui affirme que si on a une injection f:AB et une injection g:BA dans des sens opposés entre deux ensembles, alors on a une bijection entre A et B), et que sa démonstration (constructive !) pourrait fournir des conventions en la matière. (Je ne prétends pas qu'il s'agisse du même problème que celui évoqué ci-dessus, mais qu'il s'agit de problématiques du même genre ; on pourra par exemple réfléchir à la question suivante : si j'appelle f la fonction qui envoie tout arbre (DOM) XML abstrait sur son XML canonique, et g la fonction qui envoie un document texte sur l'arbre DOM XML qui a une unique balise text contenant tout le texte, alors à quoi ressemble la bijection entre fichiers texte et arbres XML que produit une démonstration constructive standard du théorème de Cantor-Schröder-Bernstein à partir de ces deux injections ? Même question si on remplace g par une injection des documents XML bien-formés dans les arbres DOM XML obtenue en ajoutant des balises de formatage comme je le suggère ci-dessus.)

(dimanche)

Gratuitous Literary Fragment #148 (le souvenir du passé)

C'était le 9 novembre 2014. L'Europe fatiguée essayait de se souvenir des événements survenus vingt-cinq ans plus tôt, en même temps que les autres 9 novembre d'un siècle sanglant se bousculaient dans sa mémoire comme la chronologie dérangée d'une histoire qui bégaye. L'Europe avait la gueule de bois d'avoir trop fait la fête à la porte de Brandebourg sur l'air de Wind of Change des Scorpions, et cherchait maintenant à se rappeler ce qu'elle célébrait au juste.

Мир стоит на грани новой холодной войныLe monde est au bord d'une nouvelle guerre froide — avait averti le vieil ours Gorbatchev, l'air de dire : c'est moi qui ai fait tomber les dominos une première fois, ne comptez pas sur moi pour recommencer si vous les remettez en place.

Hegel a remarqué quelque part que tous les grands faits et personnages de l'Histoire du monde apparaissent pour ainsi dire deux fois. Il a oublié d'ajouter, nous prévient Marx : la première fois comme une tragédie, la seconde comme une farce.

Tout le monde se demande donc qui sera le dindon de la farce, — qui sera condamné à répéter le passé.

J'aurais voulu écrire ce fragment en allemand, mais je me suis rendu compte que ça me prendrait décidément trop de temps. Si quelqu'un veut faire l'effort de le traduire, qu'il ne se prive pas. Je vous donne au moins le troisième paragraphe, puisque c'est tiré du pamphlet de Marx de 1852 consacré au XVIII brumaire de Louis Napoléon Bonaparte : Hegel bemerkte irgendwo, dass alle großen weltgeschichtlichen Tatsachen und Personen sich sozusagen zweimal ereignen. Er hat vergessen, {warnt uns Marx vor,} hinzuzufügen: das eine Mal als Tragödie, das andere Mal als Farce.

(samedi)

Interstellar

(Je vais essayer de ne pas spoiler, ou en tout cas pas sur quoi que ce soit d'important.)

Je crois que j'ai toujours aimé les intrigues à rebondissements (je ne sais pas quel mot convient le mieux en français, rebondissements, révélations… l'anglais plot twist est sans doute le plus proche de ce que je veux dire) : les histoires où on découvre que le grand méchant est en fait le père du héros, que celui qu'on croyait gentil est en fait un méchant traître, que (et ce sens-là est à mon avis beaucoup plus intéressant et plus difficile à mener correctement) celui qu'on prenait pour un méchant est en fait un gentil, qu'on s'est totalement trompé sur la nature de X ou Y, que les intentions d'Untel n'étaient pas du tout ce qu'on pensait, que tel personnage est en fait tel autre déguisé, que tel personnage est en fait deux personnes différentes, que quelqu'un apparaît à un moment inattendu ou bien réapparaît, que tel personnage, tel lieu ou tel objet n'a jamais existé, ou bien le contraire, que le général que la princesse doit épouser est une femme ou au contraire que la princesse avec laquelle le héros a couché est un général, que celui qu'on croyait fou ne l'est pas, ou le contraire, que le meurtrier qu'on recherchait est en fait le détective / le narrateur / la victime elle-même, que la femme que le héros a épousé est sa mère tandis que l'homme qu'il a tué est son père, bref, ce genre de choses. Quand on aime ce genre de choses, il est difficile de ne pas apprécier les films de Christopher Nolan, et je pense que c'est beaucoup pour ça qu'il plaît — pas seulement à moi. Je l'ai découvert, je crois, quand je suis allé voir Le Prestige ; j'ai aussi beaucoup aimé Shutter Island [correction : on me fait remarquer que celui-ci n'est pas de Nolan, comme dans l'univers parallèle dont je viens, mais de Scorcese — il faut croire que c'est le plus nolanien des films de Scorcese], et un peu moins (et pour des raisons un peu différentes), Inception. Je ne prétends pas que tous ses films soient forcément bourrés de rebondissements, mais on peut révéler sans trop spoiler qu'au moins un ou deux des éléments de rebondissement que je viens de citer ont servi quelque part dans un film de Nolan.

Interstellar en a aussi sa part, même si ce n'est sans doute pas le plus important dans un film plutôt riche et qui semble hésiter entre plusieurs genres (dont l'un à part entière est sans doute le genre « hommage à 2001 »). Cela ne m'a pas empêché de l'apprécier. Je précise aussi, car c'est très important pour moi dans un film qui doit peut-être recevoir une suite, qu'il y a une véritable fin, on ne nous laisse pas en plan avec une intrigue à moitié achevée (chose que je déteste) : on voit que le film fait potentiellement partie d'un ensemble plus grand, mais il peut très bien se suffire à lui-même. (Et je reciterai cet exemple à ceux qui me prétendent parfois que c'est impossible de concilier les deux.)

Je ne révélerai pas quel est le point de vue du réalisateur sur la conquête spatiale (on sait quel est le mien), d'autant moins que je ne sais pas ce qu'il est : le film reste sans doute volontairement ambigu, et les personnages n'ont pas tous la même idée à ce sujet. Il pose néanmoins, d'ailleurs peut-être malgré lui, et en ayant l'intelligence de ne pas vraiment chercher à y répondre, une ou deux questions éthiques intéressantes, notamment sur ce que cela signifie de nous perpétuer en tant qu'espèce, ou quel but cela doit avoir (cf. l'entrée liée ci-dessus). Tout ça pour dire que la tagline mankind was born on Earth: it was never meant to die here est un peu simpliste.

Ce qui est sûr, en revanche, c'est qu'il faut bien accrocher sa suspension of disbelief, notamment en ce qui concerne la physique (ou d'autres lois de la nature, d'ailleurs). Pas que le film soit plus plein d'invraisemblances que d'autres films de SF, mais il donne l'impression de prétendre à plus de vraisemblance. J'ai eu quelque espoir en la matière en voyant que l'extérieur du trou de ver n'était pas ridicule, que certaines images de trou noir étaient inspirées d'images sérieuses (apparemment fournies avec la collaboration de Kip Thorne ; dommage qu'il ne soit pas tombé sur mes vidéos à ce sujet, j'aurais peut-être pu rencontrer M. Nolan). Mais au final, on a droit à la ration standard de bêtises, que ce soit le blabla sur la 5e dimension qui semble inévitable dès que quelqu'un évoque la courbure de l'espace-temps (mais noooooon ! pitié !) ou encore d'une planète près d'un trou noir sur laquelle il suffit de se poser pour que le temps subisse un ralentissement d'un facteur 60000 par rapport aux observateurs juste à côté (allô la Terre ?), et je ne parle même pas de planétologie, d'intelligence artificielle (soupir !), ou de simples ordres de grandeurs sur la taille des choses dans l'univers ou même de vraisemblance interne vis-à-vis de cette physique farfelue (par exemple, si le temps s'écoule 60000 plus lentement sur une planète, une sonde arrivée dessus va sembler envoyer ses bips 60000 fois plus lentement, je crois que tout le monde peut deviner ça). En revanche, j'ai bien envie de voir des images fixes des tableaux noirs remplis d'équations qu'on aperçoit dans quelques scènes du film, parce qu'il y a l'air d'avoir des choses rigolotes dessus (j'ai repéré quelques équations standard de la relativité générale transformée avec des lettres cyrilliques comme indices, je me demande s'il faut y voir une private joke).

(vendredi)

La sécurité de l'ambassade du Canada

Je suis allé hier déposer une demande de renouvellement de mon passeport canadien et, sans doute pour une raison qui n'est pas sans rapport avec un événement récent, le niveau de sécurité était vraiment impressionnant :

Bon, je ne me plains pas, il n'y avait en gros personne d'autre que moi donc je n'ai pas spécialement attendu, et tout le monde était très poli. Mais j'avais un peu l'impression de rentrer dans Fort Knox.

Le passeport que j'aurai est bien sûr aussi (comme mon passeport français, en fait) plein de chouettes mesures de sécurité qui garantiront mon impossibilité absolue d'avoir une vie privée.

(lundi)

Comment faire de la géographie algorithmique ?

Régulièrement[#], je me pose des questions du style :

  1. Quel est le plus long arc de grand cercle à la surface de la Terre qui soit entièrement dans les terres émergées (resp., qui soit entièrement dans la mer) ? Autrement dit, quelle est la plus longue distance qu'on puisse parcourir sur la terre ferme (resp. dans la mer) en allant tout droit ?
  2. Quel est le grand cercle à la surface de la Terre dont la proportion de terre émergée soit la plus grande possible (resp. la plus faible possible) ? Autrement dit, par où doit-on faire le tour de la Terre si on veut rencontrer le plus possible de terre (resp. le plus possible de mer) ?
  3. Quel est l'hémisphère (découpé par un grand cercle quelconque) de la surface de la Terre qui contienne la plus grande proportion de terre émergée (resp. la plus faible possible — ce sera bien sûr simplement l'autre côté du même grand cercle) ? Autrement dit, si on veut faire le tour de la Terre de façon à mettre le plus de terre d'un côté et le plus de mer de l'autre, comment doit-on s'y prendre ?

(Toutes ces questions assimilent implicitement la Terre à une sphère, qu'on aurait divisée, selon un contour bien défini, en une partie « terres émergées » et une partie « mers ». On pourrait bien sûr raffiner, soit en considérant la terre comme un ellipsoïde oblate[#2].)

On n'aura pas de mal à trouver d'autres questions dans le même genre (et on fera bien attention à distinguer des questions qui peuvent se ressembler subtilement : par exemple j'ai parfois eu du mal à expliquer à des non-mathématiciens la différence entre les deux premières questions que je pose ci-dessus, qui sont pourtant bien distinctes). J'ai envie d'appeler ça collectivement la géographie algorithmique, au croisement de la géométrie algorithmique et de la géographie physique (quoique ça pourrait être de la géographie humaine, aussi : je m'étais demandé ce que vaudrait l'entropie de distribution de la densité de population humaine à la surface de la Terre, ça pourrait aussi s'appeler une question de géographie algorithmique).

Certaines de ces questions trouvent une réponse en ligne. Par exemple la question 3 ci-dessus a sa réponse dans cet article Wikipédia, qui prétend que l'hémisphère de la Terre ayant le plus de terres émergées est celui centré sur Nantes (qui pourrait donc, en un certain sens[#3], se targuer d'être le centre des terres émergées), en faisant lui-même référence à un vieil article du Journal of Geography (auquel je n'ai pas accès, ce qui est d'ailleurs franchement honteux de la part de l'éditeur pour un texte aussi vieux [ajout : on m'a communiqué une copie de l'article, mais en fait il ne dit rien sur la manière dont le calcul a été mené : Geographers have made careful determinations to ascertain which hemisphere contains a larger percentage of land area than any other. It has been found to have its center in western France, near Nantes.]). Et la réponse à la question 1 pour ce qui est de la plus longue distance dans la mer prétend être apportée par cette vidéo YouTube, qui trace une ligne droite entre un point de la côte du Pakistan (du côté de Karachi) et un point de la péninsule du Kamčatka en Russie, en passant par le canal du Mozambique et le passage de Drake, ce qui fait plus de 30000km de mer en ligne droite, c'est indiscutablement impressionnant (et un petit peu difficile à visualiser). On trouve aussi des gens qui prétendent que la plus longue distance sur la Terre ferme relie le Libéria (vers Greenville) à la Chine (du coté de Taizhou), encore que ça a l'air de traverser la mer Morte, donc il reste à décider si celle-ci est un lac ou une vraie mer.

Mais la méta-question que je me pose, c'est : comment les gens qui prétendent avoir la réponse à ce genre de questions ont-ils obtenu la réponse en question ? Et comme je suis mathématicien, forcément, je me demande : ont-ils une preuve d'optimalité (au moins pour une certaine approximation bien définie de la forme de la Terre et de la limite des continents) ?, ou ont-ils simplement essayé de placer plein de grands cercles jusqu'à se dire oh, c'est sûrement ça le mieux qu'on puisse faire ? À vrai dire, je soupçonne fortement le second.

Et j'avoue que si je devais essayer de répondre exactement — et en tout cas plus scientifiquement qu'en essayant plein de possibilités à la main — à une de ces questions, je serais bien embarrassé, même si je sais vaguement, ou du moins j'ai su, me servir de PostGIS (et l'ai utilisé pour des problèmes de ce genre). Par exemple, s'agissant de la question 2, même en admettant que j'arrive, pour un grand cercle donné à calculer la proportion de terres émergées rencontrée sur sa circonférence (ce qui, en principe, si on se donne le contour des continents sous forme d'un énorme polygone, consiste simplement à calculer tous les points d'intersection et à sommer les longueurs qui vont bien), encore faut-il arriver à faire la maximisation correctement : peut-être commencer par placer un million de grands cercles à peu près bien répartis sur la Terre, calculer la proportion de terres émergées de chacun d'eux, puis faire un recuit simulé ou (si on arrive à calculer le gradient) une descente de gradient, en espérant que le million de grands cercles de départ était suffisant pour éviter un faux extremum. Au moins l'espace de recherche n'est que de dimension 2 (pour ce qui est des questions 2 et 3 que je pose ci-dessus, il y a « autant » de grands cercles sur une sphère que de paires de points antipodaux sur la sphère, grâce à la polarité, et de même autant d'hémisphères que de points sur lesquels ils peuvent être centrés ; et pour la question 1, on cherche un couple de points évidemment situés sur les côtes).

Mais si je devais programmer la recherche d'un extremum garanti et démontrablement exact une fois fixé un polygone sur la sphère dont on décrète arbitrairement que c'est ça la forme des continents (par exemple VMAP0), je serais encore plus embarrassé. Je suppose que je ferais quelque chose comme ceci, s'agissant par exemple de la question 2 : prendre un point de départ arbitraire (disons le pôle nord) et son grand cercle polaire (qui serait donc l'équateur), regarder l'intersection de ce dernier avec le polygone des côtes, en déduire à la fois la proportion de terres pour ce grand cercle, mais aussi la plus petite cellule polygonale autour de mon point de départ sur laquelle le grand cercle polaire coupe précisément les mêmes segments du polygone des côtes, cellule sur laquelle j'ai donc une forme simple de la fonction de proportion de terre, puis calculer les cellules adjacentes de la même façon, jusqu'à avoir recouvert la terre par des cellules sur chacune desquelles le grand cercle polaire coupe un certain ensemble de segments du polygone des côtes. Puis, dans chaque cellule, faire l'optimisation exacte, ce qui doit être facile vu que la cellule est polygonale et la fonction à optimiser a une forme simple, et enfin, rassembler l'optimum global, qui sera alors démontrablement le bon (pour peu qu'on a mené les calculs en précision garantie, en encadrant systématiquement les bornes d'erreur, etc.). Ça semble un projet assez monstrueux, et je doute sérieusement que quelqu'un ait fait ça.

À encore plus haut niveau, je peux dire que le problème est décidable en raison du théorème de Tarski sur la décidabilité de la géométrie algébrique réelle (plus un petit argument facile pour expliquer que maximiser une somme de sinus, bien que ce ne soient pas des fonctions algébriques, peut néanmoins se traduire comme une maximisation de fonctions algébriques). Et là ce sera vraiment une réponse de matheux, parce qu'essayer d'appliquer ça pour résoudre une des questions ci-dessus est beaucoup plus désespéré qu'essayer de vider les océans à la petite cuiller.

Je suis donc assez insatisfait par les réponses qu'on peut trouver en ligne à ces problèmes de géographie algorithmique, et je suis sûr qu'il faudrait monter une équipe de recherche à gros budget pour travailler là-dessus (et produire plein de thèses, et d'articles à la con, et de congrès internationaux, etc.).

[#] Bon, en vérité, j'écris cette entrée pour me changer les idées, parce qu'il m'est encore arrivée la même chose dont je me plaignais récemment : comme mon entrée sur les espaces homogènes et isotropes partait dans tous les sens (alors qu'elle-même était destinée à être une entrée courte puisque je n'arrivais pas à en écrire une sur le carré magique de Freudenthal-Tits, elle-même commencée parce que celle sur les octonions devenait interminable), j'ai commencé à en écrire une sur le cas particulier du plan projectif complexe, en me disant que ça au moins c'était un sujet trop étroit pour que ça devienne si long que je n'arrive pas à finir l'entrée, et c'est pourtant de nouveau ce qui s'est produit. (Eh oui, je ne m'étais pas rendu compte de ça, mais comprendre comment sont foutus les plans projectifs réels dans le plan projectif complexe, ce n'est pas si trivial.)

[#2] La terminologie pour désigner les ellipsoïdes de révolution (ceux dont deux axes ont la même longueur) est un peu confuse : il y a deux cas, selon que les deux axes égaux sont plus longs que le troisième (i.e., qu'on a fait tourner une ellipse autour de son axe mineur, ce qui donne une forme aplatie comme la Terre) ou plus courts (i.e., qu'on a fait tourner une ellipse autour de son axe majeur, ce qui donne une forme allongée comme un ballon de rugby). On trouve différentes paires de termes pour distinguer ces deux cas : oblate/prolate (c'est le plus fréquent en anglais, et un peu rare en français), oblate/oblong (où on fait varier le suffixe plutôt que le préfixe), ou encore aplati/allongé (peut-être plus clair, mais ça ne fait pas très scientifique) ou son équivalent anglais flattened/elongated. Je trouve toujours pénible quand des langues ont des terminologies gratuitement différentes : donc je décrète autoritairement que ces différentes paires de termes pourront être utilisées indifféremment (et on fera bien attention à distinguer prolate et oblong, qui sont synonymes, de oblate, qui est leur antonyme ; on évitera en revanche le mot prolong, dont on ne sait pas bien lequel des deux cas il devrait désigner).

[#3] Mais bon, le barycentre des terres émergées, c'est encore un autre problème dans le même genre : là, une des difficultés consiste à définir ce qu'est un barycentre en géométrie sphérique/elliptique (ou dualement, hyperbolique), et il y a plusieurs concepts concurrents, plus ou moins naturels, dans ce sens : à ce sujet, voir la section 7.4 (the Center of Mass Problem on Two-Point Homogeneous Spaces) du livre d'Alexey Shchepetilov, Calculus and Mechanics on Two-Point Homogeneous Spaces, (Springer / ISBN 978-3-540-35384-3), et, pour un concept parmi d'autres (mais peut-être le plus naturel), le joli article de Galperin, A concept of the mass center of a system of material points in the constant curvature spaces, Comm. Math. Phys. 154 (1993) 63–84, en Open Access ici (spoiler : le concept en question consiste, en pratique, pour la sphère, à faire le barycentre euclidien en trois dimensions et à reprojeter vers la sphère depuis son centre).

(mardi)

Sur l'argument je ne suis pas raciste

Je tiens d'un autre la remarque qui suit, mais je trouve l'idée (le mème ?) suffisamment importante pour qu'elle mérite d'être répétée. Je vais donc m'attacher à l'expliquer ici.

On entend souvent des gens se défendre d'avoir fait une remarque, émis une idée, etc., un peu nauséabonde, en prononçant la phrase je ne suis pas raciste (même chose avec sexiste, homophobe, antisémite, islamophobe, etc.). Il y a aussi la variante je ne suis pas raciste, mais : celle-là est suffisamment évidente, parce que l'apodose contredit presque toujours immédiatement la protase. Mais regardons la phrase je ne suis pas raciste toute seule.

L'idée de celui qui se défend d'être raciste est qu'il y aurait des personnes racistes, et d'autres qui ne le sont pas : c'est-à-dire, que la propriété raciste serait une propriété attachée à une personne, un attribut inhérent à celle-ci. Or c'est surtout cette idée-là qui est fausse et dangereuse. Ce qui est raciste, c'est une action, un propos, une pensée — pas une personne. On peut certes raisonnablement qualifier de raciste une personne qui commet ou soutient régulièrement des actions, propos ou pensées racistes, mais la contraposée ne marche pas : une personne pas raciste, qui serait magiquement invulnérable à ces idées (et donc, qui ne pourrait jamais en être accusée), ça n'existe pas parce que ça n'a pas de sens.

Les choses devraient être plus claires si on compare avec stupide : je ne sais pas s'il existe des personnes intrinsèquement stupides, mais en tout cas, personne n'aurait l'idée de se défendre, après avoir dit une bêtise, ou une potentielle bêtise, en disant je ne suis pas stupide (sans parler de je ne suis pas stupide, mais). Si quelqu'un vous accuse d'avoir fait quelque chose de stupide, on se défend sur le fond, on ne dit pas je ne suis pas stupide.

Le danger de cette idée est que si on pense qu'il existe un attribut non-raciste, à peu près tout le monde veut s'en réclamer (presque autant que non-stupide), et se croit ensuite invulnérable à toute accusation dans le domaine : ce qui dispense d'avoir à remettre en question ses actions, propos ou pensées. Or c'est idiot : de même que tout le monde commet occasionnellement des actes stupides, prononce des paroles stupides ou entretient des idées stupides, il serait bien étonnant que la même chose ne vaille pas pour d'autres façons pour une action, un propos ou une pensée d'être intellectuellement et/ou moralement répréhensible (même s'il y en a qui sont plus facilement détectables, donc évitables, que d'autres, pour peu qu'on en ait la volonté). Indiscutablement, il m'arrive (et d'ailleurs, la fréquence m'en inquiète) d'avoir des pensées racistes, et il doit m'arriver d'aller plus loin que la pensée. D'ailleurs, ça m'arrive aussi pour l'homophobie. Et pour ce qui est de la stupidité, n'en parlons pas.

Il faut donc chasser l'idée qu'en parlant de racisme on jugerait une personne dans son entier. Ce qu'on peut juger publiquement, c'est une action ou un propos. Ce que chacun peut juger in imo pectore, c'est ses propres pensées. Former des jugements holistes sur une personne, ça n'a guère de sens.

Mais il y a aussi la question connexe de l'intention : dire je ne suis pas raciste est souvent avancé pour signifier mon intention n'était pas mauvaise, i.e., le racisme était involontaire. Pour un juge de moralité, la question du caractère volontaire ou non d'une action soumise au jugement est effectivement importante ; mais le plus souvent, nous ne sommes pas juges de la moralité des autres, ce n'est pas notre place : ce qui importe est ce qu'ils ont réellement fait ou dit, et les conséquences que cela entraînera, pas de savoir si leurs intentions étaient pures. La réponse à faire à je ne suis pas raciste est alors : je ne suis pas ta conscience.

(vendredi)

Un petit exercice d'Analyse (moyenner une fonction)

Un petit exercice d'Analyse pas très difficile (j'en ai traité un bout avec mes élèves à Télécom Paris), mais que je trouve amusant :

Soit f:ℝ/ℤ→ℝ (c'est-à-dire : une fonction réelle de la variable réelle qui soit 1-périodique) ; on note N(f) la fonction définie comme la moyenne arithmétique des N translatées de f par des multiples de 1/N, c'est-à-dire : (N(f))(x) = (1/N) · ∑k∈{0,…,N−1} f(x+k/N) ; et, si f est intégrable (c'est-à-dire, intégrable sur une période), soit (f) la fonction constante égale à l'intégrale ∫ℝ/ℤ f de f (sur une période). On se demande dans quelle mesure N(f) tend vers (f) quand N tend vers +∞ :

(Indication : montrer la convergence uniforme — qui entraîne donc la convergence Lp pour un p quelconque — pour une fonction en escalier ; il suffit pour ça de la montrer pour la fonction indicatrice d'un intervalle [0;c[ de ℝ/ℤ.)

Dans le cas p=2, il y a une jolie démonstration en regardant les séries de Fourier (l'effet de N est de décimer la série de Fourier).

On pourra aussi montrer que N ne tend pas vers en tant qu'opérateur (i.e., pour la norme).

Bref, je sais faire ça, mais j'ai quand même l'impression de manquer de recul sur la question : qu'il doit y avoir une façon plus élégante et plus générale d'inscrire ces résultats dans un contexte plus éclairant. D'ailleurs, la deuxième partie me surprend beaucoup, j'étais tellement persuadé que le résultat aurait dû être l'affirmation plus faible si f est Riemann-intégrable, alors N(f) tend vers (f) ponctuellement, et si f est réglée, alors la convergence est uniforme que j'ai cherché en vain à trouver une erreur dans mon raisonnement (j'ai fini par me convaincre qu'il était bien correct, mais j'ai toujours la sensation déplaisante d'avoir mal compris quelque chose d'important).

Pour mémoire, une fonction f est dite réglée (ou parfois Dieudonné-intégrable) lorsque pour tout ε>0 il existe une fonction en escalier h telle qu'on ait partout |fh|≤ε (i.e., f est uniformément approchable par les fonctions en escalier) ; cela équivaut à dire qu'elle admet en tout point une limite à gauche et une limite à droite (finies). • Une fonction f est dite Riemann-intégrable lorsque pour tout ε>0 il existe des fonctions en escalier h et ψ telles qu'on ait partout |fh|≤ψ, avec ∫ψε (i.e., f est approchable par les fonctions en escalier avec une erreur uniformément contrôlée par une fonction en escalier elle-même de norme 1 arbitrairement petite) ; cela équivaut à dire que f est bornée et que son ensemble de points de discontinuités est Lebesgue-négligeable. • Pour comparaison, si fonction f est Lebesgue-intégrable, pour tout ε>0 il existe une fonction en escalier h telle que ∫|fh|≤ε (i.e., f est approchable au sens L¹ par les fonctions en escalier). • J'aime bien présenter ces trois propriétés côte à côte, cela aide à situer la notion d'intégrabilité au sens de Riemann entre celle de fonction réglée et celle d'intégrabilité au sens de Lebesgue. Cela devrait peut-être expliquer pourquoi j'avais l'intuition qu'on aurait besoin de f réglée pour pouvoir conclure à la convergence uniforme de N(f) vers (f).

(jeudi)

Changement de serveur

Comme je le fais de temps en temps, j'ai changé le serveur Web qui héberge ce site et ce blog (c'est maintenant une Dedibox XC, auquel j'ai donné le nom de betelgeuse.gro-tsen.net). Normalement, le changement devrait être totalement transparent (je n'ai cassé le système de commentaires de ce blog que pendant quelques minutes), mais il se peut que quelque chose m'ait échappé, parce que le nombre de choses qui tournent sur ce serveur et qu'il faut migrer dans le bon ordre en pensant à tout est relativement élevé (entre le serveur Tomcat qui sert maintenant à fournir des pages dynamiques, le système de commentaires de ce blog, le serveur Git qui réside sur le même serveur, les autres scripts CGI en tout genre, le tracker BitTorrent pour les quelques fichiers que je distribue par ce protocole, et quelques bizarreries comme un microscopique site accessible uniquement en IPv6, cela fait un nombre assez pénible de fichiers de config à régler correctement).

(À vrai dire, je me suis levé aujourd'hui avec un mal de tête épouvantable, je me suis dit que j'étais trop fatigué pour réfléchir, et j'ai préféré faire de l'informatique que faire des maths : je ne suis pas persuadé que ça ait amélioré mon mal de tête.)

À cette occasion, j'ai jeté un coup d'œil dans les logs de mon serveur Web, et je suis impressionné par le nombre de requêtes bizarres qui s'y trouvent. Par exemple, Bing me demande régulièrement des choses comme /%7Edavid///lit/fourshort.html (le fichier qui existe vraiment est /~david/lit/fourshort.html) : le %7E est une autre façon d'écrire ~ — en principe ça ne devrait pas faire de différence, sauf qu'en fait on ne sait jamais bien qui est censé faire la substitution —, mais ce qui est mystérieux dans l'histoire c'est comment il a inventé les 3 / consécutifs. Bon, c'est assez facile de demander à Apache de le rediriger sur une adresse plus normale (encore qu'il y a des interactions subtiles entre le mécanisme de redirection/réécriture d'Apache et son mécanisme de négociation de contenu[#]), mais ce genre de choses fait penser soit que j'ai laissé traîner un lien mal écrit quelque part, soit que Bing est cassé dans sa façon de faire des résolutions de liens relatifs. Comment savoir ?

Dans le même genre, je me souviens qu'à l'époque lointaine où ce site était hébergé à l'ENS, j'utilisais des fichiers SHTML, et notamment ma page principale s'appelait /home/madore/index.shtml — et voilà que quelqu'un avait inventé un lien /home/madore/index.shtml/ (avec un / à la fin), pour lequel Apache servait le même contenu, et du coup tous les liens relatifs étaient cassés : du genre, math/ pointait vers /home/madore/index.shtml/math/ au lieu de juste /home/madore/math/ et cela renvoyait toujours vers la même page à cause du index.shtml, qui du coup contenait de nouveau un lien math/ qui faisait que le moteur de recherche allait chercher /home/madore/index.shtml/math/math/ et ainsi de suite indéfiniment. Bref, dès qu'une URL est servie sous un nom non-canonique, ça peut être une source de tracas.

[#] À titre d'exemple, j'avais dans mon .htaccess une ligne du type : RedirectMatch seeother /(.*david)/pages_new.html /$1/weblog/ mais j'ai découvert qu'elle ne fonctionnait pas à cause de la présence d'un fichier pages_new.html.en~ (un backup Emacs) qui traînait : si quelqu'un peut m'expliquer la logique de la chose…

(lundi)

Le SQL c'est rigolo

Bon, en fait, non, je ne pense pas vraiment ce que je dis dans le titre de cette entrée : le SQL est, au niveau syntaxique, un langage invraisemblablement pourri. En revanche, ce qui est vrai, c'est qu'au chapitre des technologies qui donnent envie de s'en servir, quand on a une base de données SQL, on a envie de faire des requêtes dessus pour tout et n'importe quoi. Or il se trouve que les entrées de ce blog sont stockées dans une base PostgreSQL (alimentée depuis les fichiers XML que je tape moi-même à la main). Donc je peux avoir la réponse à plein de questions inutiles, du genre :

J'aurais aussi aimé extraire quelque chose comme « les balises HTML que j'aime le plus », mais apparemment le XPath de PostgreSQL 9.1 est buggué limité : si j'essaie SELECT unnest(xpath('.//name()', '<foo><bar /></foo>'::xml)) ;, il me prétend que .//name() est une expression XPath invalide, ce qui est clairement faux parce qu'elle nécessite XPath 2.0 (il est probablement gêné par le fait que ça renvoie des chaînes au lieu de renvoyer du XML — mais je ne vois pas comment faire autrement).

Bon, bien sûr, j'ai écrit tout ça juste pour pouvoir me souvenir plus tard de comment on fait ce type de requêtes. Quand j'aurai unifié la base des commentaires à la base des entrées, je pourrai poser d'autres questions rigolotes. Mais en tout état de cause, il y a quelque chose de vraiment amusant à pouvoir interroger des ensembles de données de cette façon (fût-ce avec une syntaxe complètement pourrie). À un certain moment, un forum de discussion que je fréquentais à l'ENS avait une base de données des messages dans le même genre, et c'était très distrayant de pouvoir lui poser toutes sortes de questions menant à des statistiques gratuites et vaguement absurdes (du style : classer les intervenants par le nombre moyen de réponses que leurs messages provoquent).

Remarquer que les navigateurs permettent aussi des choses amusantes. Par exemple, j'ai récemment voulu couper les entrées les plus longues de ce blog (« couper » signifiant que l'entrée complète n'apparaît que sur sa page individuelle, les pages du mois ou des catégories la contenant étant abrégées par un lien lire la suite qui y renvoie). La recherche des entrées par nombre de caractères du source peut ne pas être la plus pertinente, alors j'ai recherché les entrées, dans une page comme celle rassemblant mes entrées mathématiques (et qui est beaucoup trop longue) en triant par nombre de pixels du rendu effectué par le navigateur : il suffit pour cela d'ouvrir la page en question, d'ouvrir une console JavaScript (control-shift-K sous Firefox) et de taper quelque chose comme ceci :

entries = Array.prototype.slice.call(document.querySelectorAll("article.weblog-entry"))
entries.sort(function(a,b){var ah=a.clientHeight; var bh=b.clientHeight; return (ah<bh ? 1 : ah>bh ? -1 : 0);})
list = entries.slice(0, 10).map(e=>({"id": e.id, "height": e.clientHeight, "title": e.querySelector(".entry-title").textContent}))
console.table(list)

Et hop ! J'ai un joli tableau des dix entrées les plus hautes (en pixels) dans la page que je suis en train de regarder. La fonction console.table est un goodie de Firefox (disponible à partir de la version 34) qui est bien pratique dans ce genre de situation. La ligne précédente utilise les lambda-expressions d'ECMAscript 6, qui sont aussi bien pratiques. Bref, JavaScript — et la console JavaScript des navigateurs — est aussi quelque chose de bien pratique et puissant (je prends l'exemple de mon blog, mais ça peut servir dans plein de contextes d'interroger ou de manipuler la page HTML qu'on est en train de regarder), malheureusement, comme SQL, encombré par une syntaxe souvent très peu heureuse.

(dimanche)

Les entrées de blog que je n'arrive jamais à écrire

Il y a une éternité j'ai promis d'écrire une entrée de ce blog sur les octonions. Je n'ai jamais réussi à la publier. Ce n'est pas que je n'aie rien à écrire, au contraire, ni même que je n'aie rien écrit : j'ai commencé (au hasard des moments où j'ai du temps pour le faire) à écrire des choses sur le sujet, et de plus en plus, et je me suis rendu compte que ça débordait dans tous les sens, et qu'à la fin non seulement ça devenait trop long et indigeste, mais en plus que ça manquait de structure et de cohérence thématique. Alors j'ai décidé de diviser cette entrée en trois parties : des généralités sur les octonions d'abord, puis une petite partie sur les octonions entiers et les réseaux dans les octonions, et enfin une troisième (indépendante de la seconde) sur la géométrie octonionique et le carré magique de Freudenthal-Tits — qui est à mon avis la principale raison pour laquelle les octonions sont intéressants. Puis j'ai commencé à développer la première partie séparément, et je me suis rendu compte que je devais parler d'automorphismes des octonions, et à me poser plein de questions qui débordaient dans tous les sens, et finalement cette partie-là, même prise seule, devient aussi trop longue, et il faudrait la couper à son tour. Pareil pour la troisième partie : là j'ai pensé, je vais changer de point de vue et écrire une petite entrée sur les espaces deux-points-homogènes (dits aussi : homogènes et isotropes), c'est-à-dire, pour parler grossièrement, les espaces (au sens : variétés riemanniennes) qui sont identiques en tous les points et dans toutes les directions. C'est une question très naturelle et intéressante que de classifier ces espaces homogènees et isotropes, la réponse a été apportée par Tits et Wang (très rapidement : outre l'espace euclidien et les sphères, ce sont les espaces projectifs et hyperboliques sur les réels, complexes, quaternions, et octonions, sachant que sur les octonions il n'y a que la droite et le plan projectif, et la droite et le plan hyperbolique, pas de dimension plus élevée) ; ce sont des espaces très beaux par leur pure symétrie, et élégants dans leur description, et ils amènent naturellement à parler des octonions et des groupes de Lie exceptionnels (et cela apporte une réponse possible à la question qui m'avait tracassé, qu'est-ce qu'une géométrie). Et bien sûr, en essayant de parler de ça, j'ai de nouveau eu trop de choses à dire et de nouveau ça débordait dans tous les sens.

Il n'y a pas que les octonions qui m'aient causé ce souci. C'est un peu quelque chose qui m'arrive à chaque fois que je parle de n'importe quoi : je ne sais pas sélectionner ce dont je veux parler, ma logorrhée s'étale sans structure dans toutes les directions, et à la fin tout est trop long et indigeste. Mais bien sûr, c'est pire quand je parle de maths. J'ai par exemple aussi voulu écrire une entrée sur les notations ordinales, essentiellement, pour faire suite à cette entrée déjà très longue, et expliquer comment on peut « fabriquer » (décrire, expliciter, travailler avec, calculer sur) des ordinaux récursifs très grands — essentiellement, vulgariser la notion de fonction d'écrasement pour fabriquer de grands ordinaux à partir de cardinaux de plus en plus sophistiqués (inaccessibles, Mahlo), cette question étant du coup naturellement liée à celle des grands nombres que j'ai abordée à plusieurs reprises. Bref, j'ai travaillé là-dessus au hasard de ma motivation et de mon temps disponible. Et puis je suis rentré dans les explications sur les fonctions d'écrasement forcément d'autant plus compliquées qu'on fabrique des ordinaux plus grands, c'est devenu long, très long, très très très long, et il me reste sur les bras une montagne d'explications que je ne sais pas bien comment structurer ou diviser pour la rendre un peu digeste. (Cela n'arrange pas les choses que j'ai cru comprendre quelque chose, que je me suis trompé, que j'ai compris autrement, que je me suis retrompé, que j'ai compris que j'avais bien compris initialement, et qu'au bout du compte je me suis beaucoup embrouillé sur les différentes variantes qu'on peut construire autour des fonctions d'écrasement — par exemple, il y en a qui sont croissantes, d'autres qui ne le sont pas, et il y a toutes sortes de conventions possibles sur comment organiser et définir les valeurs.) J'ai encore d'autres entrées dans le même genre, commencées parce que je pensais que je n'aurais pas tant de choses que ça à dire, et finalement dans des limbes où les choses sont à moitié écrites et peut-être ne seront jamais achevées.

C'est un peu l'histoire de ma vie, de commencer plein de choses, et de n'en finir que très peu.

Alors qu'est-ce que je devrais faire ? Publier des choses inachevées ? En publier le début, quitte à nuire à la cohérence de la suite ? Laisser tomber ? Attendre un temps potentiellement infini que j'arrive à terminer ce que j'ai commencé ? Je ne sais vraiment pas.

Il faut dire aussi que je ne sais pas bien qui lit mon blog, et notamment qui lit les entrées mathématiques (et quel est son niveau en maths et quels sont ses centres d'intérêt). En vérité, le principal lecteur pour lequel j'écris, c'est mon moi futur : j'écris parce que j'ai compris quelque chose, que j'ai envie de pouvoir le recomprendre à l'avenir quand j'aurai un peu oublié, alors je me l'explique à moi-même pour savoir que je pourrai relire telle ou telle entrée et resavoir ce que j'aurai su. À titre d'exemple, en réfléchissant à des questions de bases de données SQL, je suis récemment retombé sur cette entrée, et il y a un peu plus longtemps, en me posant des questions de physique, sur celle-ci : dans les deux cas, j'avais totalement oublié les subtilités de ce que j'y raconte, et je n'étais pas fâché que la personne qui sait le mieux m'expliquer les choses — c'est-à-dire, moi — me prenne par la main pour me redire comment tout ça fonctionne. Idem concernant les séries de Fourier (que je m'oblige à réapprendre à chaque fois que je dois enseigner le sujet, sachant très bien que j'oublierai dans le mois qui suit). En termes informatiques, on pourrait dire que mon blog est mon espace de swap : c'est là que je consigne les choses quand ma mémoire déborde (ou que je veux changer de contexte). Mais le temps de swap est lui-même long !

(samedi)

Le Quatramaran est revenu

Une fois n'est pas coutume, j'utilise mon blog pour faire passer un message — parce que je pense qu'il doit y avoir un certain nombre d'anciens normaliens concernés qui me lisent. Ce qui suit ne s'adresse qu'à ceux qui comprennent de quoi je parle.

La machine Quatramaran est revenue, ou plutôt s'est réincarnée, sous le nom quatramaran.salle-s.org. Ceux qui avaient un compte actif dessus l'ont encore (avec le même mot de passe ; la clé SSH est aussi la même). Ceux dont le compte a été désactivé parce que trop vieux (inactif) et qui veulent néanmoins le rouvrir, ou au contraire ceux qui veulent faire fermer leur compte, ou pour toute autre demande, peuvent s'adresser à root[arobase]quatramaran[point]salle-s[point]org ; par ailleurs, les contributions financières sont bienvenues quoique non obligatoires (tarif indicatif : 15€/an).

(Cette machine joue un rôle semblable à phare.normalesup.org mais elle en est tout à fait indépendante, et gérée de façon plus informelle.)

(vendredi)

Des caractères Unicode qui manquent

Je commence une page pour rassembler quelques caractères Unicode qui me semblent manquer dans le Saint Standard et dont j'aimerais proposer l'addition. (J'avais déjà il y a longtemps essayé de suggérer l'addition d'un caractère N-ARY RESTRICTED PRODUCT, mais visiblement la personne à laquelle j'avais transmis l'idée — et les preuves de son utilisation dans la littérature mathématique — n'en a rien fait. Il faudra que je voie si je peux trouver des contacts plus fiables.)

Après, ça risque d'être comme ce dont je parlais dans l'entrée précédente : pour faire bouger les choses, il faut se battre contre les Gardiens de la Loi, et ma motivation pour le faire n'est pas démesurée, surtout si je suis tout seul à mener le combat.

(jeudi)

De la difficulté de soumettre du code à Linux

Il y a des problèmes informatiques qui ne seront jamais résolus parce qu'ils sont intrinsèquement difficiles (par exemple, pour une raison algorithmique) : on est bien obligé de le comprendre. Il y en a d'autres qui posent des difficultés non pas pour des raisons intrinsèques mais pour des raisons historiques : on peut aussi comprendre que ce soit difficile de se battre avec des bizarreries historiques qui se sont profondément enracineés (le changement du protocole Internet d'IPv4 à la version IPv6 représent un bon exemple de cette nature). Mais il y en a aussi, et là c'est vraiment désolant, qui ne seront jamais résolus parce que les gens qui pourraient les résoudre ont des opinions dogmatiques sur la façon dont les choses devraient être faites, et que ces opinions empêchent toute résolution possible du problème. Je voudrais donner un exemple très concret.

Je situe d'abord un peu les choses pour ceux qui ne connaissent pas le monde Unix. Le principal protocole qui permet à Internet de fonctionner est appelé TCP/IP : plus exactement, IP est le protocole qui donne un (ou plusieurs) numéro(s) à chaque ordinateur, et leur permet d'échanger des « paquets » d'information, et TCP vient là-dessus fournir une notion de connexion fiable. Dans le monde Unix, les deux bouts de cette connexion s'appellent des sockets (traduire ça comme des prises et pas comme des chaussettes ; mais en pratique, même quand on parle en français, on dit une socket) : une socket TCP/IP (ou, dans le jargon plus unixien, une socket de domaine AF_INET et de type SOCK_STREAM) est l'abstraction par laquelle un processus (=programme) sur une machine peut parler à un autre, a priori situé sur une machine distante, via le réseau. Maintenant, il arrive aussi qu'un processus veuille communiquer avec un processus sur la même machine : Unix offre un véritable labyrinthe de façons différentes de faire ça ; d'aucunes sont très différentes, mais certaines utilisent la même abstraction de socket. Notamment, deux processus Unix peuvent communiquer entre eux par une socket de domaine Unix (AF_UNIX), qui apparaît alors comme un fichier spécial sur la machine (représentant le point de communication), ou encore par une socket de domaine INET (AF_INET), c'est-à-dire en faisant exactement comme une connexion réseau Internet mais qui se trouve simplement relier la machine à elle-même. Il peut y avoir plein de raisons, liées aux idiosyncrasies d'Unix, de préférer, ou de devoir choisir, une socket Unix ou au contraire une socket INET.

Maintenant, quand deux processus Unix communiquent par une socket de domaine Unix, chacun des deux a la capacité d'identifier l'autre, c'est-à-dire de demander au système qui est en train de me parler par cette socket ? (la réponse donne le numéro du processus et l'identitié de l'utilisateur qui en est propriétaire ; cette réponse est fiable, parce qu'apportée par le noyau Unix lui-même ; techniquement, sous Linux, cette information s'obtient avec getsockopt(socket, SOL_SOCKET, SO_PEERCRED,,)). Quand on a affaire à une socket de domaine INET, en général, vu que la communication peut venir de n'importe où sur Internet, on ne peut pas identifier complètement le processus en face, on peut simplement demander l'identité de la machine en face (son numéro IP ; techniquement, ceci s'obtient avec getpeername(socket,,)). Mais si la socket INET est reliée à la machine elle-même, c'est-à-dire, si deux processus sur la même machine, sont en train de parler entre eux par une connexion TCP/IP, le système pourrait très bien fournir la même information (quel est le processus en face ?) qu'il accepte de le faire pour les sockets de domaine Unix : seulement, il ne le fait pas. Ou plus exactement, ni Linux ni Unix BSD ne le font (Solaris, en revanche, accepte de le faire par l'appel système getpeerucred()).

Or ceci est un manque grave, que je voudrais bien voir corrigé. Pourquoi ? Le problème est que pour toutes sortes de raisons, on peut ne pas avoir le choix du protocole qu'on parle : si on est obligé d'utiliser une socket de domaine INET, le fait de ne pas pouvoir obtenir plus d'information que l'autre bout est sur la même machine empêche de mettre des contrôles d'accès offrant une sécurité minimale dans certaines situations. Je donne un exemple.

(samedi)

Des changements techniques sur ce blog

Si vous arrivez à lire cette entrée, c'est que je n'ai pas totalement tout cassé. ☺

Après avoir longtemps tergiversé (j'en parlais déjà il y a trois ans), j'ai enfin décidé de faire faire un petit pas au système technique d'hébergement de ce blog.

Jusqu'à présent, les entrées de ce blog étaient présentées sous essentiellement trois formes : une page principale avec les 20 entrées les plus récentes, une page par mois pour les archives, et aussi une page par catégorie pour les entrées que j'ai tagguées ; seules certaines entrées particulièrement longues (comme celle-ci) avaient droit à une page individuelle. De façon liée à ce choix, toutes les pages du blog lui-même (i.e., à l'exception du système de commentaires, qui est géré par un petit script CGI assez trivial écrit en Perl) étaient purement statiques, c'est-à-dire, générées à l'avance et servies comme de bêtes fichiers ; je regénère ces fichiers quand j'écris une nouvelle entrée ou quand j'en modifie une (le moteur lui-même qui parse le sur-ensemble de HTML dans lequel je tape et qui produit les différentes pages HTML, est écrit en Java ; là-dessus, j'ai un petit script Perl qui essaie de détecter les pages qui sont vraiment modifiées pour ne regénérer que celles-là).

Cet agencement était logique quand j'ai commencé ce blog, avec un moteur trivial (j'ai longtemps simplement tout tapé dans un unique gros fichier de toutes les entrées, qui était traité par une feuille de style XSLT simpliste), puis un à peine moins trivial (écrit en C). Par ailleurs, il convenait assez bien aux entrées plutôt courtes que j'écrivais il y a une dizaine d'années (l'entrée moyenne sur les années 2004 à 2006 fait moins de 3000 caractères de long, celle de 2011 à 2013 en fait plus de 9000 !) : séparer un blog aux entrées très courtes en pages individuelles n'a pas beaucoup de sens, cela en a beaucoup plus quand il s'agit de textes assez longs expliquant, par exemple, un concept mathématique.

Il y avait plusieurs inconvénients qui me préoccupaient. Notamment, si je donnais un lien vers une de mes entrées à quelqu'un qui n'a pas l'habitude de mon blog, le lien risquait d'être au milieu de la page et il risquait de voir se charger toute une page sans rapport avec le sujet avant que le navigateur le positionne sur l'entrée voulue : pas forcément attrayant. Mais par ailleurs, les moteurs de recherche, manifestement, ne savent décidément pas indexer séparément les différents éléments à l'intérieur d'une page Web, même quand on leur donne toutes les indications sémantiques (de la balise <code> au microformat hAtom) pour leur mâcher le travail.

Quoi qu'il en soit, j'ai fini par donner à chaque entrée sa propre page (accessible notamment depuis la page d'index de toutes les entrées ou via le permalien qui est caché sous la date dans le coin en haut à gauche de l'entrée). Comme je ne voulais pas générer statiquement deux mille fichiers HTML (pas vraiment que ça pose un problème aux ordinateurs modernes, mais cela choquait un peu mon sens de l'esthétique et de l'organisation), et comme cette génération est de toute façon très efficace, ces pages seront produites dynamiquement à la demande : j'utilise pour ça un serveur Tomcat (qui parle à mon serveur Apache), ce qui est logique vu que mon moteur de blog est déjà écrit en Java. (Il faudra que je raconte un jour ce que je pense de Java.)

Ce qui ne veut pas dire que ç'ait été complètement évident non plus. Mon code n'était pas prévu pour tourner de façon parallèle (je faisais usage de quelques variables globales, i.e., de champs statiques de classes Java), ni pour persister : j'ai donc dû revoir un certain nombre de choses. Si tout casse, au moins, les pages statiques devraient rester lisibles (la page principale avec les entrées récentes, et aussi la page de toutes les entrées d'un mois, maintenant accessible en passant par l'index de toutes les entrées). J'ai aussi fait un effort considérable pour ne casser aucun lien, mais il est toujours possible que j'aie échoué en cela. Je dois dire, aussi, qu'il était assez fastidieux de m'arranger pour que PostgreSQL, Tomcat et Apache parlent correctement les uns aux autres (le nombre de fichiers de configuration à régler est franchement assez pénible). Mais bon, c'est fait.

On verra d'ici un jour ou deux si les recherches Google renvoient désormais des pages des entrées individuelles de ce blog. (J'ai en tout cas été impressionné par la vitesse à laquelle le Googlebot a repéré le changement et tout téléchargé : il n'a pas dû s'écouler deux heures que c'était fait.)

Par ailleurs, je n'ai toujours pas eu le courage de m'attaquer à la refonte du système de commentaires (rien n'a changé à son sujet, et je sais qu'il est nul : pas la peine de me le rappeler, donc !), dont la modification d'aujourd'hui devrait cependant être la prémisse.

(lundi)

Ma mémoire de la chronologie qui fonctionne mal

Je ne peux pas spécialement dire que j'aie une mauvaise mémoire. À part pour les visages (mais en fait c'est plus que je suis mauvais physionomiste : c'est une question de reconnaissance plus que de mémoire) et pour les nombres, j'ai plutôt tendance à bien retenir les choses, et notamment les événements du passé.

En revanche, il y a une chose pour laquelle je suis épouvantablement mauvais, c'est pour réconstituer la chronologie, c'est-à-dire l'ordre de déroulement, et les dates approximatives, d'événements passés. Je peux garder un souvenir extrêmement précis et clair de quelque chose qui s'est déroulé, et être incapable de dire si c'était il y a un mois, il y a un an ou il y a cinq ans. De même, je peux avoir deux événements précis en tête et être incapable de savoir dans quel ordre ils se sont produits : à moins qu'il y ait un lien causal clair entre eux, ou un autre indice permettant, à la réflexion (et à condition que je fasse cette réflexion !), de retrouver lequel est antérieur, la seule information que livrera ma mémoire est ceci s'est produit, et ceci aussi.

C'est une des raisons pour lesquelles je tiens un journal assez précis de ma vie depuis le début du millénaire : il me permet de retrouver l'ordre (chrono)logique des choses qui me sont arrivées ; parce que par exemple, si on me rappelait les différentes choses qui se sont produites le 21 janvier dans ma vie, toutes ces choses m'évoquent des souvenirs relativement clairs, mais je serais incapable de les remettre dans l'ordre ou de retrouver l'année de chacune.

De même, je suis souvent assez surpris, en relisant des entrées de mon propre blog, de voir ah, j'ai écrit ça il y a dix ans déjà ? ou au contraire ah, cette entrée est si récente ?, ou de voir que telle entrée est beaucoup plus vieille que telle autre alors que j'aurais pensé le contraire.

Ce problème d'orientation dans le temps vaut aussi pour l'Histoire avec une ‘H’ majuscule, mais ça, j'en ai déjà parlé (mais j'aurais été incapable de dire quand).

(dimanche)

Des Livres dont Vous Êtes le Héros ressurgissent du passé

J'aimais beaucoup, quand j'étais au collège et lycée, cette série de livres qu'on appelait les livres dont vous êtes le héros (LDVELH), c'est-à-dire des aventures à choix multiples, généralement situées dans des univers de type heroic fantasy ou plus rarement science-fiction, dont le lecteur construisait l'histoire en lisant tour à tour les paragraphes numérotés qu'on lui demandait de suivre (cela ressemblait donc à ceci).

À vrai dire, je n'y jouais pas vraiment, parce que je n'avais pas la patience nécessaire pour ne pas tricher, encore moins pour prendre des dés et mener des combats dans les règles, et trop de curiosité pour ne pas vouloir connaître toutes les issues possibles de tous les choix possibles ; il serait aussi un peu exagéré de dire que je les lisais linéairement du paragraphe 1 au dernier ; mais je faisais quelque chose un peu entre les deux, je prenais un petit bout du livre et j'explorais tous les choix possibles, puis un autre, et ainsi de suite jusqu'à avoir tout lu. (J'avais d'ailleurs moi-même entrepris l'écriture d'une telle aventure dans un monde dont deux de mes amis devaient écrire deux autres parties.)

Parmi les nombreuses séries de ces LDVELH, certaines représentaient une simple collection thématique d'histoires sans rapport réel (ou seulement reliées par un vague univers commun), d'autres étaient les différents chapitres d'une saga (et on devait en principe les lire dans l'ordre ; ou du moins, on pouvait gagner quelque chose à le faire, parce que certains livres vous permettait d'acquérir des objets spéciaux qui pourraient resservir dans un autre).

Les séries qui ont le plus attiré mon attention étaient Sorcellerie (voir aussi ici) de Steve Jackson (les quatre parties d'une quête menant le héros à récupérer un objet magique, la Couronne des Rois volé à son peuple d'Analand par le cruel archimage Ming de Mongo de la forteresse de Mampang) ; et surtout Quête du Graal de J. H. Brennan, une série d'aventures incongrues au monde du roi Arthur qui avait surtout pour elle qu'elle ne se prenait pas trop (voire, pas du tout) au sérieux, entre un Merlin complètement farfelu qui habitait une maison différente et improbable à chaque roman et des personnages hauts en couleur comme le poète vampire (Nosférax dans la traduction française) et l'épée Excalibur Junior. Du même auteur, et en un peu moins loufoque, il y avait aussi la série Loup* Ardent (il faut lire l'astérisque comme un grognement de barbare), considérée par certains comme la plus remarquable, et peut-être la plus difficile, de tout le genre, et qui m'avait fait rêver. (Je passe sur la psychanalyse évidente de l'ado geek homo encore mal assumé qui rêve de pouvoir s'incarner en barbare musclé armé d'une grosse épée.)

Si je raconte ça aujourd'hui, c'est que je suis tombé sur un dépôt sur archive.org rassemblant toutes sortes de ces livres. Je ne sais pas par quelle bizarrerie du copyright (ou si c'est juste le principe plus personne n'en a rien à foutre) quelque chose de vaguement officiel comme The Internet Archive peut les rendre disponibles, mais toujours est-il que je suis ravi de retrouver quelques fantômes du passé (et qui plus est, dans leur version originale, que je n'avais jamais encore vue), notamment :

(Note : comme quantité de livres distribués sur archive.org de cette façon, il faut parfois essayer plusieurs des différents formats proposés avant d'en trouver un qui ne soit pas gigantesque en taille et qui soit d'une qualité correcte.)

(dimanche)

Quelques nouvelles (et first world problems) en vrac

Comme je le craignais, le rétablissement de ma ligne téléphonique m'a confronté à la pile de mails et de choses à traiter que j'avais laissée de côté en me disant je verrai quand j'aurai de nouveau l'ADSL, ce qui (combiné à un emploi du temps assez merdique) fait que je suis loin d'avoir rattrapé mon sommeil en retard. Je suis toutefois un petit moins fatigué maintenant qu'il y a trois semaines.

Je suis passé récemment dans le Marais, un quartier que j'ai arrêté de fréquenter depuis la fermeture du Daily monop' de la rue des Archives qui était devenu un de mes lieux de prédilection, pour voir si, dix mois plus tard, un nouveau commerce avait fini par prendre sa place (ainsi que celle du Starbucks adjacent, qui a fermé à peu près en même temps) : toujours pas. Je me demande un peu pourquoi le BHV (qui en était propriétaire) a tenu à le fermer de façon aussi précipitée si c'est pour ne rien faire des lieux pendant aussi longtemps.

En revanche, j'ai constaté que la fort sympathique librarie Agora, un peu plus haut sur la rue des Archives, avait fermé à son tour, ce qui m'a un peu attristé. (Il devait y avoir quelque chose comme trois ou quatre librairies de cette toute petite chaîne dans toute la France, et par coïncidence je crois que je les ai toutes fréquentées : à part celle du Marais, il y en a une au centre commercial Ulis 2 pas loin de là où mes parents habitent, et qui est encore ouverte, et une à Lyon où je suis passé une fois complètement par hasard, et peut-être encore une à Bordeaux, je ne sais plus bien.)

Mais au chapitre des fermetures de commerces, ce qui m'a le plus peiné récemment est d'apprendre celle de mon café Espressamente préféré, à Bercy-Village, où ils servaient un choix fabuleux de déclinaisons du café Illy, ainsi qu'une excellente sélection de desserts (notamment trois sortes de tiramisù : au chocolat, au café, et au thé vert — toutes les trois délicieuses). Voilà donc un très grave first world problem : où vais-je trouver un aussi excellent café macchiato pour conclure le brunch que j'aime bien prendre à Chai 33 ?

J'ai commencé à réfléchir un peu sérieusement ce week-end à la possibilité (qui est sur ma liste de choses à faire depuis une éternité) d'améliorer mon moteur de blog pour ne plus avoir uniquement des pages statiques — une par mois et une par catégorie — mais aussi des pages dynamiques pouvant refléter les entrées individuelles de ce blog. (Ceci répond à la fois à une attente de certains de mes lecteurs, mais aussi de Google et des autres moteurs de recherche qui ne sont pas foutus d'indexer correctement des éléments individuels d'une page Web malgré la quantité faramineuse d'indications sémantiques que je peux lui donner pour l'aider dans ce sens, de la balise <article> du HTML5 à tout le markup hAtom que j'ai employé autant que je pouvais. Après ça, je pourrai envisager de refondre le système de commentaires qui est actuellement ridiculement limité.)

Bref, j'envisage d'utiliser des servlets Java, ce qui est logique vu que le moteur de blog est déjà écrit en Java. (Là, il faut que je sorte la blague préférée d'un ami : au début on a pensé que Java était bon pour faire des applets, puis on a commencé à s'en servir pour faire des servlets, et finalement il semble que Java soit simplement bon pour les toilettes.) J'ai réussi à écrire un servlet (sur un serveur privé) qui produit une page pour une entrée unique de ce blog — maintenant il reste à trouver tous les endroits où j'ai pu écrire du code avec accès concurrents qui doive être synchronisé. Globalement, ça n'a pas l'air trop affreux, il faut juste prononcer un nombre hallucinant d'incantations rituelles comme partout en Java (le langage où avant de pouvoir parser du XML il faut demander une factory d'implémentation DOM à laquelle on demande une implémentation DOM à laquelle on demande de créer un mode de parsing auquel on demande de parser le document, chacune de ces demandes nécessitant une incantation à la con).

Only the 20 most recent entries were included above. Continue to older entries.

Seules les 20 plus récentes entrées ont été incluses ici. Continuer à lire les entrées plus anciennes.


Entries by month / Entrées par mois:

2014 Jan 2014 Feb 2014 Mar 2014 Apr 2014 May 2014 Jun 2014 Jul 2014 Aug 2014 Sep 2014 Oct 2014 Nov 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