David Madore's WebLog: 2011-12

Vous êtes sur le blog de David Madore, qui, comme le reste de ce site web, parle de tout et de n'importe quoi (surtout de n'importe quoi, en fait), des maths à la moto et ma vie quotidienne, en passant par les langues, la politique, la philo de comptoir, la géographie, et beaucoup de râleries sur le fait que les ordinateurs ne marchent pas, ainsi que d'occasionnels rappels du fait que je préfère les garçons, et des petites fictions volontairement fragmentaires que je publie sous le nom collectif de fragments littéraires gratuits. • Ce blog eut été bilingue à ses débuts (certaines entrées étaient en anglais, d'autres en français, et quelques unes traduites dans les deux langues) ; il est maintenant presque exclusivement en français, mais je ne m'interdis pas d'écrire en anglais à l'occasion. • Pour naviguer, sachez que les entrées sont listées par ordre chronologique inverse (i.e., la plus récente est en haut). Cette page-ci rassemble les entrées publiées en décembre 2011 : il y a aussi un tableau par mois à la fin de cette page, et un index de toutes les entrées. Certaines de mes entrées sont rangées dans une ou plusieurs « catégories » (indiqués à la fin de l'entrée elle-même), mais ce système de rangement n'est pas très cohérent. Le permalien de chaque entrée est dans la date, et il est aussi rappelé avant et après le texte de l'entrée elle-même.

You are on David Madore's blog which, like the rest of this web site, is about everything and anything (mostly anything, really), from math to motorcycling and my daily life, but also languages, politics, amateur(ish) philosophy, geography, lots of ranting about the fact that computers don't work, occasional reminders of the fact that I prefer men, and some voluntarily fragmentary fictions that I publish under the collective name of gratuitous literary fragments. • This blog used to be bilingual at its beginning (some entries were in English, others in French, and a few translated in both languages); it is now almost exclusively in French, but I'm not ruling out writing English blog entries in the future. • To navigate, note that the entries are listed in reverse chronological order (i.e., the most recent is on top). This page lists the entries published in December 2011: there is also a table of months at the end of this page, and an index of all entries. Some entries are classified into one or more “categories” (indicated at the end of the entry itself), but this organization isn't very coherent. The permalink of each entry is in its date, and it is also reproduced before and after the text of the entry itself.

[Index of all entries / Index de toutes les entréesLatest entries / Dernières entréesXML (RSS 1.0) • Recent comments / Commentaires récents]

Entries published in December 2011 / Entrées publiées en décembre 2011:

↓Entry #1978 [older| permalink|newer] / ↓Entrée #1978 [précédente| permalien|suivante] ↓

(vendredi)

Comment superposer des cercles de façon symétrique ?

Pour fabriquer ma petite animation mathématique de Noël (dont je voudrais d'ailleurs faire une version pour mettre sur YouTube — ajout : voilà, c'est fait), je me suis posé la question suivante, sur laquelle je continue à m'arracher les cheveux, et dont je suis assez stupéfait qu'il ne semble pas exister de solution pratique :

[Disques de couleur]Je veux dessiner, sur un fond neutre (disons, noir, mais peu importe) un certain nombre de disques de couleur, de façon qu'à l'intersection de n de ces disques la couleur soit donnée par la moyenne (ou, en fait, par n'importe quelle fonction raisonnablement symétrique) des couleurs de ces n disques. Le point important est qu'il ne soit pas possible de déterminer dans quel ordre les disques ont été dessinés.

L'idée est de faire ça en Canvas, SVG, ou à la limite en n'importe quoi de commodément programmable (Cairo, ImageMagick, que sais-je encore). L'exemple ci-contre a été calculé par un programme de mon cru (très malcommode et mal foutu).

Ça ressemble à de la transparence, mais je ne vois pas comment obtenir ce résultat (la symétrie entre les objets) avec le modèle de transparence (canal alpha) ni avec les modes de composition des différents outils évoqués. Il y a toujours une notion d'objet au-dessus et d'objet en-dessous, et si je rends l'objet du dessus partiellement transparent, il laissera apparaître le fond, alors que je veux qu'il occulte complètement celui-ci.

À la limite, je me contenterais bien du XOR comme opération pour les couleurs à l'intersection (ce que je veux surtout est que l'opération soit symétrique). C'est ce que j'ai essayé d'utiliser dans ma petite animation de Noël, mais le XOR utilisé par canvas (au moins chez Firefox et Chrome) a l'air d'obéir à des règles qui m'échappe (rouge xor vert = noir ? hein ?). [Ajout () : on me souffle que cette page explique assez bien comment fonctionnent les modes de composition standards — en l'occurrence de Cairo, mais ce sont presque un sur-ensemble de ceux de canvas — et notamment ce que fait le XOR.]

↑Entry #1978 [older| permalink|newer] / ↑Entrée #1978 [précédente| permalien|suivante] ↑

↓Entry #1977 [older| permalink|newer] / ↓Entrée #1977 [précédente| permalien|suivante] ↓

(dimanche)

This video is not available in your country

De temps en temps, que ce soit parce que je vis dans un pays qui n'est pas vraiment une démocratie[#] ou parce que quelqu'un a décidé qu'il n'était pas assez riche ou parce qu'un connard a acheté des droits de propriété intellectuelle pour quelque chose, une vidéo YouTube (typiquement) n'est pas disponible dans mon pays. Qu'à cela ne tienne : pour contourner ça, il faut

  • installer Tor, pour pouvoir avoir accès à un nœud de sortie qui soit dans un autre pays ; malheureusement, Tor fournit un proxy Socks, et juste comme ça ça ne marchera pas ; du coup, il faut ensuite
  • installer un proxy HTTP et le configurer pour communiquer avec Tor, par exemple Polipo, et enfin
  • utiliser YouTube-DL en lui donnant l'adresse du proxy HTTP : comme ça, on récupère la vidéo
  • qu'on peut ensuite lire avec MPlayer ou équivalent.

Pfiou, c'est gonflant, quand même. En réalité, il y a une méthode plus simple, qui marche dans beaucoup de cas :

  • se rendre compte que la vidéo existe en beaucoup de copies sur YouTube, dont certaines sans limitations géographiques (ou même, qu'on l'a déjà vue).

[#] Pas que j'accorde spécialement du crédit à cette mesure-là, qui reflète beaucoup les opinions politiques du journal qui l'édite (malheureusement, malgré les nombreux autres indicateurs qui pourraient s'en rapprocher, je ne connais rien de vraiment mieux). Au moins le haut du classement et la place de la France me semblent assez plausibles.

↑Entry #1977 [older| permalink|newer] / ↑Entrée #1977 [précédente| permalien|suivante] ↑

↓Entry #1976 [older| permalink|newer] / ↓Entrée #1976 [précédente| permalien|suivante] ↓

(samedi)

Différentes manières de permuter six objets

Voici un petit gadget qui pourrait servir de décoration de Noël (choisissez une entrée au hasard dans le menu déroulant puis cliquez sur Start, avant de lire les explications ci-dessous) :

Il s'agit d'une représentation sous forme animation de n'importe lequel des seize (classes de) sous-groupes transitifs sur six objets. J'avais évoqué des questions semblables à propos des symétries possibles sur cinq objets dans une entrée récente, mais la discussion pour six objets est évidemment plus compliquée. Un groupe de permutations sur six objets (=sous-groupe de 𝔖6), c'est un ensemble de façon de permuter (réordonner) ces six objets de façon que si on effectue deux permutations du groupe à la suite (=on les compose), on obtient encore une permutation du groupe ; le nombre de permutations s'appelle l'ordre du groupe. Un tel groupe de permutations est dit transitif lorsqu'il y a moyen d'envoyer n'importe quel objet à n'importe quel emplacement par (au moins) un élément du groupe. On dit que deux sous-groupe de 𝔖6 sont conjugués lorsqu'on peut transformer l'un en l'autre en permutant les objets. À conjugaison près, il existe exactement seize groupes de permutation transitifs sur six objets, et c'est ça que cette petite animation représente : on choisit un groupe dans la liste, et le script va choisir aléatoirement une permutation du groupe, puis une autre, puis une autre, et ainsi de suite indéfiniment, et anime à chaque fois le déplacement des six objets. À une extrême, 𝔖6 contient toutes les permutations possibles, à l'autre, C6 ne contient que les permutations cycliques. Entre les deux, chacun des sous-groupes proposés correspond à une petite danse que peuvent faire mes six cercles colorés, je trouve ça assez envoûtant à regarder.

Le cas de 𝔖6 est intéressant, parce que 𝔖6 est l'unique groupe symétrique qui possède des automorphismes extérieurs (c'est-à-dire des façons d'associer à toute permutation une autre de façon à préserver la composition). Pour reprendre la terminologie de Sylvester (qui aimait bien les mots commençant par sy), on appelle pentade synthématique une façon de partitionner en 5 classes les 15 arêtes du graphe complet sur les six objets de façon que deux arêtes ayant un sommet commun ne soient jamais dans la même classe : il existe exactement 6 pentades synthématiques, et 𝔖6 réalise toutes les permutations possibles sur les pentades, ce qui signifie qu'en même temps qu'il agit sur les six objets, il agit aussi sur les six pentades, la correspondance entre les deux définissant un automorphisme extérieur. Beaucoup des sous-groupes transitifs de 𝔖6 se voient assez naturellement à travers cette description. [Ajout : voir cette entrée ultérieure pour une description de l'automorphisme extérieur de 𝔖6.]

Par ailleurs, je dois signaler que j'ai dû faire des choix de représentants dans mes classes de conjugaisons de sous-groupes. (Il n'est malheureusement pas possible de les faire de façon parfaite, c'est-à-dire de façon que deux sous-groupes inclus à conjugaison près soient effectivement représentés par des sous-groupes inclus exactement.) J'ai fait ces choix de façon à respecter la structure de l'hexagone, c'est-à-dire, techniquement, que le groupe diédral de l'hexagone soit dans le normalisateur de tous les représentants ici choisis (ça doit rendre mes choix uniques ou quasiment uniques, et ça les rend en tout cas assez naturels).

↑Entry #1976 [older| permalink|newer] / ↑Entrée #1976 [précédente| permalien|suivante] ↑

↓Entry #1975 [older| permalink|newer] / ↓Entrée #1975 [précédente| permalien|suivante] ↓

(vendredi)

Quelques concepts d'économie monétaire

[Central Banking for Dummies]J'ai eu un mal fou à arriver à comprendre plus ou moins comment fonctionne le système bancaire moderne (à multiplicateur de crédit), quel est le rôle précis d'une banque centrale et comment fonctionne, spécifiquement, la BCE et sa comptabilité. Alors je vais essayer d'expliquer (et si possible de façon geek-friendly) ce que j'ai réussi à comprendre malgré les explications épouvantables ou l'absence d'explications que j'ai rencontrées un peu partout.

Note : Dans tout ce qui suit, M€ = méga-euro = million d'euros (1000000€) ; G€ = giga-euro = 1000M€ = milliard d'euros (1000000000€) ; et T€ = téra-euro = 1000G€ = mille milliards d'euros (1000000000000€ ; billion en bon français, trillion en anglais ou en français de journalistes ignares) : voyez cette entrée pour la raison d'utiliser ces termes, et ce graphique par xkcd pour les ordres de grandeur. Par ailleurs, en bon informaticien, j'utilise le ‘.’ comme séparateur décimal, donc par exemple 1.729G€=1729M€.

Avant d'expliquer les choses analytiquement, je voudrais démonter un certain nombre d'idées reçues et tordre le coup à des mythes classiques, et en profiter pour donner quelques ordres de grandeurs s'agissant de la zone euro :

↑Entry #1975 [older| permalink|newer] / ↑Entrée #1975 [précédente| permalien|suivante] ↑

↓Entry #1974 [older| permalink|newer] / ↓Entrée #1974 [précédente| permalien|suivante] ↓

(vendredi)

Enfin ! ils sont revenus

[Pile de paquets de biscuits]

'Nuf said.

↑Entry #1974 [older| permalink|newer] / ↑Entrée #1974 [précédente| permalien|suivante] ↑

↓Entry #1973 [older| permalink|newer] / ↓Entrée #1973 [précédente| permalien|suivante] ↓

(dimanche)

Polynômes plus ou moins symétriques en cinq variables

Suite à des réflexions autour de la théorie de Galois (notamment des équations de degré 5, dans le cadre de l'écriture d'un livre sur le sujet) et autour de la théorie des invariants, je me suis amusé à regarder un peu la façon dont « fonctionnent » les polynômes plus ou moins symétriques à cinq variables. Par plus ou moins symétrique je veux dire qu'il y a des permutations échangeant les cinq variables qui laissent le polynôme invariant, mais pas nécessairement que le groupe G de ces permutations doive être le groupe symétrique 𝔖5 de toutes les (120) permutations possibles. Par exemple, le polynôme Q = Z1·Z2 + Z2·Z3 + Z3·Z4 + Z4·Z5 + Z5·Z1 (dans les cinq variables Z1, Z2, Z3, Z4, Z5) est symétrique sous l'effet de 10 permutations des variables, à savoir les 10 symétries d'un pentagone régulier dont les sommets seraient étiquetés par les cinq variables (dans l'ordre donné), i.e., ce qu'on appelle le groupe diédral D5 du pentagone : concrètement, Q est invariant si on permute cycliquement les variables (Z1 devient Z2, Z2 devient Z3 et ainsi de suite) ou si on les inverse (Z1 devient Z5 et réciproquement, Z2 devient Z4 et réciproquement, et Z3 reste) ou par n'importe quelle composition de ces symétries.

Pourquoi précisément cinq variables ? Parce que c'est le plus petit nombre pour lequel il commence à y avoir des choses intéressantes à dire, parce qu'historiquement cela a eu de l'importance (pour montrer que l'équation algébrique générale du cinquième degré n'est pas résoluble par radicaux et pour savoir précisément détecter si une équation donnée l'est), parce que ça fait une situation sur laquelle faire des calculs explicites, et parce que la situation pour plus de variable commence à devenir franchement compliquée. Bref, c'est un cadre sympathique pour faire quelques observations élémentaires de théorie des invariants ou de Galois, et un peu de vulgarisation comme j'aime en faire.

↑Entry #1973 [older| permalink|newer] / ↑Entrée #1973 [précédente| permalien|suivante] ↑

↓Entry #1972 [older| permalink|newer] / ↓Entrée #1972 [précédente| permalien|suivante] ↓

(mardi)

Le mystère des Chinois qui commencent leurs copies par la fin

Voici un petit mystère à résoudre, sans aucune importance, mais néanmoins intrigant. Hier, j'ai corrigé un paquet de copies, principalement d'étudiants étrangers : sur 18 copies, il y en avait 9 d'étudiants chinois (je juge par le nom), 9 d'autres nationalités (plusieurs russes, plusieurs hispaniques — je ne sais pas bien d'où —, un ou deux français, un vietnamien, et ça doit être à peu près tout). Les deux tiers des étudiants chinois (6 sur 9, donc) ont rédigé leur copie en commençant par ce qui, pour un Français, est la dernière page. Ma première réaction a été de penser qu'ils sont habitués au chinois écrit en colonne de haut en bas et de droite à gauche, mais il semble que ce mode traditionnel d'écriture soit devenu rare en Chine continentale (or je suis quasiment sûr que ces étudiants ne viennent ni de Taïwan ni même de Hong Kong), donc ce n'est probablement pas la bonne explication. En fait, à y regarder de plus près, il semble[#] qu'ils prenaient les pages de la copie dans 4-1-2-3 (en numérotant les pages comme un Français le ferait, i.e., 1 est la page de droite extérieure, 2 est le verso de 1, 3 est de l'autre côté de la pliure par rapport à 2, et 4 est le verso de 3). Ce n'est pas illogique : cela peut vouloir dire qu'on déplie la copie double, qu'on écrit sur une face, d'abord à gauche puis à droite, puis sur l'autre face, d'abord à gauche puis à droite ; ce n'est qu'une fois la copie pliée que ça devient bizarre. Les 12 autres étudiants, dont la totalité des non-Chinois, ont utilisé leurs copies dans l'ordre 1-2-3-4.

À la réflexion, je crois avoir déjà vu ce phénomène (mais, comme je n'avais pas un gros nombre d'étudiants chinois dans les autres tas de copies que j'ai pu corriger, j'ai dû penser à une inattention et ne pas bien prendre note du phénomène ni de la corrélation avec la nationalité).

Seulement, ce qui est étrange, c'est qu'une amie chinoise (enfin, la femme d'un ami) se dit tout aussi surprise et assure qu'elle aurait écrit les pages de la copie de la même façon que moi. Bon, ce n'est pas extraordinaire : la Chine, c'est grand, il se peut que cette habitude soit particulière à une région, je ne sais quoi. Sauf qu'en fait, la Chine est certes grande, mais les endroits et milieux sociaux d'où nous viennent des étudiants chinois doivent être extrêmement rares et peu représentatifs de la diversité chinoise (et l'amie dont je parle doit venir sensiblement du même ensemble[#2][#3]).

Bref, les lumières de mes lecteurs sinophiles (il me semble qu'il y en a beaucoup) sont bienvenues.

[#] Non, ce n'est pas aussi clair qu'on peut l'imaginer : leurs copies sont de toute façon présentées de façon complètement bordélique, ils ne numérotent pas les pages, et à peine les exercices, donc ce n'est pas évident de retrouver dans quel ordre les choses ont été écrites ou sont censées être lues.

[#2] Dans le même genre, mon père s'était fait un jour la réflexion qu'il connaissait un certain nombre d'Indiens (hindous ou d'origine hindoue), et que 100% d'entre eux étaient des brahmanes.

[#3] J'allais dire : par exemple, il est certain, vu le nombre de noms comme Xu ou Zheng, que ce ne sont pas des Cantonnais, mais en fait, je ne suis pas sûr du raisonnement — quand les Cantonnais vont en France, est-ce qu'ils transcrivent leur nom depuis la prononciation cantonnaise ou mandarine ? Je vois que le nom du maire de Canton, 万庆良, n'est jamais transcrit Maan Hingloeng mais toujours comme Wan Qingliang, ce qui accrédite la deuxième hypothèse.

↑Entry #1972 [older| permalink|newer] / ↑Entrée #1972 [précédente| permalien|suivante] ↑

↓Entry #1971 [older| permalink|newer] / ↓Entrée #1971 [précédente| permalien|suivante] ↓

(dimanche)

Introuvables biscuits aux céréales et aux raisins

Mes goûts, que ce soit en matière d'intérêts scientifiques ponctuels, de musique, d'habillement, ou d'alimentation, ont tendance à fonctionner par lubies : je me prends de passion pour quelque chose, ça dure quelques jours, quelques semaines ou quelques mois, et je passe ensuite à autre chose (s'agissant de projets que j'entreprends, le problème est d'ailleurs que mon intérêt ne dure que rarement assez longtemps pour finir le projet : de là toutes les choses inachevées qui jalonnent mon parcours). C'est particulièrement frappant dans le domaine, étroit mais révélateur, des biscuits que je consomme comme goûter ou comme dessert : je me mets à en aimer une sorte, je ne mange plus que ça pendant un temps variable, puis j'arrête complètement — ce n'est pas que je ne les aime plus, mais simplement que j'ai trouvé autre chose qui a capté ma préférence. (Ça agaçait ma maman quand j'étais petit : elle m'achetait tel ou tel biscuit, j'aimais beaucoup ça, j'en mangeais des quantités énormes, et presque du jour au lendemain j'arrêtais en lui laissant un gros stock sous les bras.)

Ma lubie du moment en matière de biscuits, ce sont des petits biscuits aux céréales et aux raisins secs, à manger avec des carrés de chocolat noir à la fleur de sel. Le chocolat noir à la fleur de sel, c'est Lindt qui fait ça, et je le recommande indépendamment des biscuits. Les biscuits, eux, ils sont chez Bjorg[#].

Seulement voilà, mon supermarché Carrefour Market local a cessé d'en avoir (je parle des biscuits : le chocolat, ils en ont toujours). Et ce, avant que mon goût passe à autre chose. Du coup, je suis en état de manque.

C'est assez frustrant, en fait : ils ont tout un rayon de produits bio, dont pas mal de la marque Bjorg, et récemment ils l'ont entièrement réapprovisionné sauf ces biscuits précis dont l'emplacement reste désespérément vide. Comme l'étiquette est encore là, je continue d'espérer qu'ils réapparaissent, mais enfin, ça fait des semaines qu'ils n'en ont toujours pas, alors cet espoir est sans doute naïf. Pourtant j'avais pris mes précautions, voyant déjà que leur approvisionnement était un peu erratique, en me donnant un objectif de stock préventif de trois à cinq paquets[#2], mais ça n'a pas suffi. J'ai recherché dans une petite supérette bio pas loin de chez moi, ainsi que chez mon Arabe du coin (qui malgré sa surface est bien fourni en produits Bjorg), et enfin, aujourd'hui, dans l'hypermarché Casino du boulevard Masséna, tout ça sans succès. Il est énervant qu'il n'y ait aucun moyen de trouver un produit précis quand on connaît son EAN-13 (en l'occurrence : 3-229820-780931 — mais que fait Google ?). En tout cas, si un lecteur voit ces biscuits précis dans un commerce facilement accessible depuis Paris XIIIe, qu'il me fasse signe.

En fait, même au-delà de ce produit précis, je suis assez étonné de la difficulté de trouver des biscuits aux raisins secs : dans le monde parallèle dont je viens, les raisins secs étaient un ingrédient assez naturel à mettre dans des biscuits pour le goûter, soit à la place soit en plus de chocolat, et notamment dans des biscuits aux céréales, vu que cela va plutôt bien ensemble. Dans l'Univers dans lequel j'étais aujourd'hui, j'ai parcouru l'immense rayon biscuits du Casino Masséna 13 et le nombre de biscuits aux raisins secs se comptait sur les doigts de la main, et si on voulait des biscuits aux raisins secs sans chocolat (le but étant justement de choisir soi-même le chocolat), c'était même les doigts d'une main assez sérieusement amputée.

[#] Je ne les achète pas parce qu'ils sont bio ou faibles en calories (ce serait même deux critères vaguement négatifs). Juste parce qu'ils sont bons.

[#2] Pour chaque produit que j'achète au supermarché, j'ai deux bornes mentales sur le stock de ce produit chez moi : l'algorithme appliqué consiste à racheter le produit, s'il passe en-dessous de la borne inférieure, jusqu'à atteindre la borne supérieure. Pour un produit peu important, surtout s'il est périssable, ces bornes seront 0 et 1 unité de vente (i.e., j'en rachète quand je n'en ai plus du tout, et je n'en rachète alors qu'une seule unité). Si je veux être sûr de ne pas tomber à court et que le produit n'est pas périssable, je prévois large (comme pour le PQ : entre 12 et 18, voire 24 rouleaux ; ou les boîtes de mouchoirs : entre 6 et 9).

↑Entry #1971 [older| permalink|newer] / ↑Entrée #1971 [précédente| permalien|suivante] ↑

↓Entry #1970 [older| permalink|newer] / ↓Entrée #1970 [précédente| permalien|suivante] ↓

(samedi)

Validation du HTML5, et énervement

Le HTML a toujours eu une relation de haine-amour avec les validateurs. Les validateurs, ce sont des programmes censés vérifier que le HTML qu'on écrit est (au moins dans une certaine mesure) conforme à la spécification. Par exemple, si on écrit <A HREF="http://example.tld/foobar/">cliquez <B>ici</A></B> le validateur va se plaindre que les balises A et B ne sont pas correctement emboîtées.

Cette relation de haine-amour a eu plusieurs phases.

Il y a eu une phase où le HTML (≤4) était formellement et ostensiblement basé sur une technologie complètement imbitable (i.e., un standard ISO) appelée le SGML : la spécification se présentait comme une extension de ce standard, les les validateurs utilisaient un parseur SGML pour vérifier le HTML. Les navigateurs, eux, fonctionnaient avec un parseur complètement différent, qu'on appelle vulgairement soupe de tags, et qui essaie de se débrouiller du mieux qu'il peut de la merde que les auteurs écrivent. Cette incompréhension fondamentale donnait des choses assez comiques : par exemple si vous faites valider à un validateur HTML4 un truc tel que <P><A HREF=http://example.tld/foobar/>cliquez ici</P> (à mettre au bon endroit à l'intérieur d'un document HTML, bien sûr) il vous dira que c'est correct alors qu'en apparence la balise A n'a pas été refermée — la raison étant qu'à cause des arcanes du SGML (et spécifiquement de la fonctionnalité SHORTTAG), il comprend le code précédent exactement comme <P><A HREF="http:"></A>example.tld/foobar/>cliquez ici</P> ce qui est bizarre mais formellement correct. Naturellement, ce n'est pas du tout ce que comprendront les navigateurs, puisque eux voient une soupe de tags, ils devinent qu'il faut fermer la balise A avant le P et comprennent donc <P><A HREF=http://example.tld/foobar/>cliquez ici</A></P> comme ce que l'auteur voulait (probablement) écrire : on a donc une situation assez paradoxale où le validateur comprend un truc complètement différent de ce qu'on voulait faire, le déclare comme correct, le navigateur, lui, comprend ce qu'on voulait en réparant l'erreur, et du coup on ne remarque pas qu'elle est là.

Puis on a inventé le XML, qui est incroyablement plus simple que le SGML (c'est-à-dire seulement très compliqué), et on s'est mis à tout réinventer à la sauce XML. Le XML a deux niveaux de conformité : un document peut être bien-formé (le niveau minimal : s'il n'est même pas bien-formé, ce n'est pas du XML du tout, et en principe un outil qui cherche à l'analyser a le devoir de le rejeter), et éventuellement valide de surcroît (c'est-à-dire conforme à une certaine déclation sur l'usage des balises, à l'origine il s'agissait de DTD, mais on a inventé différentes autres sortes de mécanismes de validation et du coup le mot valide est assez surchargé). Il y a toutes sortes d'outils pour reconnaître la bien-formitude du XML, et éventuellement la validité selon tel ou tel mécanisme de validité. Pour plein de choses, le XML a eu du succès, mais le HTML a résisté : quasiment personne n'écrit de HTML-sur-XML, ce qu'on appelle XHTML (si le XHTML1 a eu un relatif succès, le 1.1 a été très peu utilisé, et le 2 a été avorté). La raison est sans doute entre autres parce que le XML oblige un navigateur qui détecterait une erreur de non-bien-formitude dans une page XHTML à ne rien afficher du tout sauf le message d'erreur (et de fait, c'est ce que fait Firefox). Mais la raison principale est surtout qu'Internet Explorer ne supporte (supportait ?) pas le XHTML (application/xhtml+xml) : je ne comprends pas vraiment pourquoi, vu qu'il comprend le XML et qu'il comprend le HTML, c'était si difficile de gérer l'un sur l'autre, mais je ne cherche pas à savoir. Comme les deux standards sont de toute façon plus ou moins interopérables (il est possible d'écrire du XHTML valide et de le faire manger à un parseur soupe-de-tags), on peut du moins écrire du XHTML, le valider comme tel, mais le présenter comme du HTML (text/html) ; c'est ce que je faisais moi-même sur ce site Web jusqu'à récemment. L'inconvénient, c'est qu'en faisant ça on s'interdit d'utiliser des technologies comme SVG ou MathML qui ne pouvaient marcher que sur XML.

L'acte III de mon psychodrame concerne l'apparition du HTML5. Le HTML5 propose un nouveau mode de parsage du HTML, qui n'est ni basé sur SGML ni sur XML, ni vraiment le mode soupe-de-tags traditionnel des navigateurs, mais plutôt un nouveau mode soupe-de-tags, décrit de façon complètement formelle, et qui essaie de trouver un compromis entre la robustesse et la reproductibilité ; de plus, ce nouveau parseur rend utilisables certaines des technologies XML (le SVG et le MathML) dans le HTML. Bref, on a maintenant quatre modes de parsage (sur SGML, sur XML, par le nouveau mode HTML5, et l'ancien mode soupe-de-tags, ou plutôt les anciens car il y en a un différent par navigateur). Le HTML5 est aussi prévu pour pouvoir exister sur XML, auquel cas on l'appelle XHTML5, et comme ils ont fait attention à la façon dont le nouveau parseur fonctionne, il est même possible, au prix de quelques efforts, de faire des documents « polyglottes » HTML5/XHTML5, c'est-à-dire qu'ils peuvent se parser aussi bien avec le nouveau parseur HTML5 qu'avec un parseur XML, et si possible avec le même sens (ou des différences négligeables qui n'apparaîtront pas à celui qui lit la page). Les nouvelles pages de ce sites Web sont écrites dans ce style « polyglotte » : je les produis avec des outils XML, donc c'est du XHTML5, mais j'obéis à certaines contraintes qui font qu'ils seront analysés de la même façon par un parseur HTML5 (et, de façon limitée, c'est-à-dire SVG et MathML exclus, par un parseur HTML soupe-de-tags traditionnel). C'est un peu confus à expliquer, mais pas trop difficile au final, et ça marche plutôt bien.

Mais maintenant, comment valider ? Déjà, en principe, je devrais valider chaque page deux fois, une fois avec syntaxe HTML5 et une fois comme XHTML5, puisque mes pages sont censées être les deux à la fois. En fait, côté XML, je n'ai pas trop d'inquiétude, vu que les outils que j'utilise peuvent difficilement produire quelque chose qui n'est pas au moins bien-formé (j'ai eu cependant un cas où un oubli de ma part faisait que des balises ressemblaient à <p xml:lang="en" lang="en" lang="en"> avec une indication redondante d'attribut, ce qui rend le XML non-bien-formé), et si le XHTML5 est bien-formé en tant que XML et également valide comme HTML5, il y a fort à parier qu'il soit du XHTML5 valide (on peut donner des contre-exemples, par exemple en oubliant les bons attributs xmlns, mais il faut un peu le faire exprès). Mais comment vérifier, justement, qu'on a du HTML5 valide ?

En principe, il y a un validateur pour ça. En pratique, il est loin d'être exempt de problèmes. D'abord parce que — et ce n'est pas la faute du navigateur — le standard HTML5 n'arrête pas de bouger. Récemment ils avaient supprimé la balise time. Puis ils l'ont remise, mais avec un modèle différent. C'est un peu agaçant : je comprends qu'ils veuillent être un living standard (ce sont leurs mots), mais enfin, à ce point-là, sept ans après avoir commencé à bosser dessus, ce n'est pas très sérieux. Ensuite, parce que le validateur, je veux en avoir une copie chez moi, pas l'utiliser via un site Web distant (je veux valider mes pages avant de les avoir publiées, et sans forcément avoir l'intention de les publier d'ailleurs), or celui de validator.nu, il est particulièrement lourdingue à faire marcher : en principe le code est disponible, mais c'est une vraie bagarre à compiler, et l'arbre de compilation fait plus de 400Mo. Soyons sérieux ! Est-il normal que ce standard censé rendre le parsage du HTML plus robuste soit aussi monstrueusement compliqué à valider ? Et enfin, parce que ce validateur comporte des erreurs, ou en tout cas des bizarreries, par exemple quand on commence à mélanger le HTML avec SVG et MathML (ce qui était le but, somme toute). Je viens de me rendre compte, par exemple, qu'il n'inclut que les attributs de MathML 2, alors que le standard HTML5 fait (maintenant ?) référence à MathML 3 : du coup, j'ai des pages correctes qui me crachent des bordées d'insultes. Et comme je ne comprends rien à la façon dont fonctionne cette tambouille (en principe c'est juste du RelaxNG+Schematron utilisé derrière un parseur HTML5, mais apparemment les choses sont bien plus compliquées, parce que ça ça n'expliquerait certainement pas d'où sortent les 400Mo), je ne sais pas, par exemple, réparer le truc pour aller chercher les schémas MathML 3[#]. De toute façon, ce validateur a l'air de ne plus être maintenu.

Bref, pour l'instant, la validation HTML5, c'est pas encore trop ça. Alors je pourrais me dire, à quoi bon valider, de toute façon ça n'a pas d'importance, la chose qui importe est d'essayer avec deux ou trois navigateurs et vérifier que la page marche. Mais je n'aime pas cette attitude : d'abord, parce qu'il est parfaitement possible qu'une erreur faite maintenant, surtout sur des standards encore un peu chauds sortis du four, ne se manifeste dans les navigateurs qu'à l'avenir, et de toute façon je n'ai pas beaucoup de choix de navigateurs avec lesquels tester (s'agissant du MathML, comme Safari ne tourne pas sous Linux, j'ai exactement un navigateur utilisable, il se trouve qu'il a de sévères limitations sur précisément un truc que je voulais utiliser et dont le validateur m'aurait permis de vérifier que j'avais écrit les choses correctement dans l'espoir qu'un jour un navigateur les implémente… sauf que le validateur non plus ne connaît pas ces attributs… bref…). Et il y a quand même des fautes que je fais souvent, et qui ne se remarquent pas forcément, comme une faute de frappe dans une balise (comme c'est mon éditeur qui les insère, la même faute se retrouver sur la balise ouvrante et fermante), qu'il est quand même utile qu'un validateur puisse détecter.

[#] Bon, ce n'est pas tout à fait vrai : j'ai trouvé des schémas RelaxNG pour MathML 3, j'ai trouvé comment faire pour que le validateur tente de les charger, mais il me crache l'erreur suivante : Multiple definitions of “image” without “combine” attribute. File: http://s.validator.nu/mathml3/mathml3-content.rnc Line: 94 Col: 1 (de fait, la ligne en question du fichier mathml3/mathml3-content.rnc, qu'on peut trouver dans le fichier mathml3-relaxng.zip téléchargeable par le lien précédent, a pour contenu : image = element image { CommonAtt, DefEncAtt, empty} ; moi je ne sais pas du tout ce que ça veut dire vu que je ne connais pas RelaxNG, mais ce fichier ne contient certainement pas d'erreur vu qu'il est distribué par le W3C, et j'ai tendance à trouver que si le langage n'a pas été prévu pour pouvoir réutiliser tels quels les schémas, c'est vraiment qu'il est complètement pourri).

↑Entry #1970 [older| permalink|newer] / ↑Entrée #1970 [précédente| permalien|suivante] ↑

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


Entries by month / Entrées par mois:

2024 Jan 2024 Feb 2024 Mar 2024 Apr 2024 May 2024 Jun 2024 Jul 2024 Aug 2024 Sep 2024
2023 Jan 2023 Feb 2023 Mar 2023 Apr 2023 May 2023 Jun 2023 Jul 2023 Aug 2023 Sep 2023 Oct 2023 Nov 2023 Dec 2023
2022 Jan 2022 Feb 2022 Mar 2022 Apr 2022 May 2022 Jun 2022 Jul 2022 Aug 2022 Sep 2022 Oct 2022 Nov 2022 Dec 2022
2021 Jan 2021 Feb 2021 Mar 2021 Apr 2021 May 2021 Jun 2021 Jul 2021 Aug 2021 Sep 2021 Oct 2021 Nov 2021 Dec 2021
2020 Jan 2020 Feb 2020 Mar 2020 Apr 2020 May 2020 Jun 2020 Jul 2020 Aug 2020 Sep 2020 Oct 2020 Nov 2020 Dec 2020
2019 Jan 2019 Feb 2019 Mar 2019 Apr 2019 May 2019 Jun 2019 Jul 2019 Aug 2019 Sep 2019 Oct 2019 Nov 2019 Dec 2019
2018 Jan 2018 Feb 2018 Mar 2018 Apr 2018 May 2018 Jun 2018 Jul 2018 Aug 2018 Sep 2018 Oct 2018 Nov 2018 Dec 2018
2017 Jan 2017 Feb 2017 Mar 2017 Apr 2017 May 2017 Jun 2017 Jul 2017 Aug 2017 Sep 2017 Oct 2017 Nov 2017 Dec 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

[Index of all entries / Index de toutes les entréesLatest entries / Dernières entréesXML (RSS 1.0) • Recent comments / Commentaires récents]