David Madore's WebLog: 2014-10

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 October 2014 / Entrées publiées en octobre 2014:

(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).

Ajout : voir aussi cette question pour une « suite » de cet exercice.

(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. [Mise à jour () : cette partie a fini par être publiée.] 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).

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