Blog ·
La sélection entoure toute la phrase
Quatorze phrases appelaient VM un conteneur. Échanger le mot marche en anglais et casse dans sept langues, donc la branche porte la phrase entière.
Par Provibr
Un conteneur Proxmox est, dans notre produit, un VPS. Le client en commande un, reçoit une machine avec une adresse et une offre, et chaque écran qui parle de serveurs en parle correctement. Le type en base de données dit vm, et c’est juste : ce qui a été vendu est un serveur privé virtuel.
La différence vit une couche plus bas, dans les mots. Un conteneur n’a pas de BIOS, pas de disque virtuel au sens où une machine virtuelle en a un, et pas d’agent invité. Une ronde antérieure avait noté, comme fil qui pend, qu’une phrase sur une page de conteneur disait encore « la VM ». Elles étaient quatorze.
Pourquoi le mot est la mauvaise unité
La réparation évidente est un espace réservé là où se trouve le substantif. Une sélection sur le type de ressource qui donne « conteneur » ou « VM », posée au milieu de la phrase.
En anglais, cela marche. En allemand, cela casse, car l’article n’est pas le même pour ces deux mots. Cela casse de la même façon en espagnol, en français, en italien, en portugais et en roumain, et cela casse plus fort en ukrainien, où le substantif à cet endroit doit porter une désinence de cas que le mot substitué n’a pas.
On peut courir après. Ajoutez aussi une sélection pour l’article, puis une pour l’accord de l’adjectif, et découvrez ensuite que l’ordre naturel des mots change. Ce que vous avez construit à ce stade est un petit moteur grammatical, piloté par une traductrice à qui l’on interdit de voir la phrase.
La branche porte donc la phrase entière. Une variante pour un conteneur, une pour tout le reste, et la traductrice écrit chacune comme une phrase dans sa propre langue au lieu de remplir un trou dans une phrase anglaise. La branche générique est identique octet pour octet à la valeur qu’elle a remplacée : rien de ce qui était déjà juste n’a bougé.
La branche s’appelle container et non lxc, car l’onglet des sauvegardes utilisait déjà exactement ce nom pour exactement cette question, et son modèle de vue nomme le champ de la même manière. Deux orthographes de la même distinction dans un seul catalogue coûtent un peu à chaque fois et sont une devinette à chaque fois : la ronde suivante doit établir laquelle des deux s’applique ici.
Une sélection dont les branches s’accordent est invisible
Un test qui vérifie la forme de ces clés, qu’elles s’analysent, que les deux branches existent, que l’argument s’écrit partout pareil, passe sur une sélection dont les deux branches disent exactement la même chose. C’est précisément le défaut réparé ici : un contrôle de forme vaut donc très peu.
La garde dessine par conséquent les deux branches, dans les neuf langues, et exige que la branche conteneur d’une phrase anglaise ne contienne plus le mot qu’elle a été écrite pour supprimer. Elle exige aussi que la liste elle-même ne se soit pas vidée en silence : une garde au-dessus d’une liste vide est le vert le moins cher du logiciel.
Vingt et un tests, et chacun a été prouvé en le faisant d’abord échouer. C’est la même forme que la garde sur les mots de couverture des sauvegardes, et pour la même raison : l’erreur intéressante n’est pas une erreur de syntaxe, c’est une phrase grammaticalement parfaite et factuellement fausse.
La phrase qui n’a jamais été vraie
L’une des quatorze n’était pas du tout un problème de mots.
L’onglet réseau comporte une ligne pour le cas où aucune adresse n’a encore été observée. Elle disait en substance : rien vu pour l’instant, l’agent invité doit tourner dans la VM.
Sur un conteneur, cette phrase est toujours affichée, car l’agent ne lit pas du tout les adresses des conteneurs. La fonction d’observation renvoie une liste vide pour ce type d’invité avant de poser la moindre question. La phrase était donc là en permanence, et tant qu’elle y était, elle disait deux choses fausses : que cela pourrait changer dès que quelque chose démarrerait, et que ce qui le changerait est un agent invité, qu’un conteneur n’a jamais.
Personne n’avait menti. La phrase avait été écrite pour des machines virtuelles, elle était juste pour elles, et on l’atteignait par un chemin de code qui avait gagné un second appelant. C’est la manière ordinaire dont un écran finit par dire quelque chose de faux : non parce que quelqu’un écrit une contrevérité, mais parce qu’une phrase vraie est montrée dans une situation dont elle n’a jamais parlé.
La branche conteneur dit ce qui est réellement le cas, à savoir que les adresses à l’intérieur d’un conteneur ne sont pas lues. Elle n’offre aucun espoir de voir le nombre apparaître plus tard, car il n’y en a pas.
| Ancienne phrase | Ce qui clochait sur un conteneur | |
|---|---|---|
| Promesse | Rien vu pour l’instant | Cela ne changera pas ; le code ne regarde jamais |
| Cause | L’agent invité doit tourner | Les conteneurs n’en ont pas |
| Remède | Démarrez l’agent invité | Il n’y a rien à démarrer |
Deux façons dont la mesure est passée au vert pour la mauvaise raison
Le contrôle par navigateur de tout ceci a été écrit en premier et s’est trompé deux fois, de manières qui méritent d’être nommées car toutes deux produisent un résultat qui passe.
La première : le contrôle lisait le texte visible de la page et cherchait le mot « conteneur ». Il l’a trouvé. Il était dans le nom de l’offre de test, zz-k7-containerplan, semée par le contrôle lui-même, tandis que la phrase trois lignes plus bas disait encore « la VM ». Un test qui sème un montage puis parcourt toute la page à la recherche d’un mot que ce montage contient mesure sa propre préparation. Le remède est un crochet sur l’élément qui porte vraiment la phrase, pour que l’assertion ne puisse être satisfaite que par ce dont elle parle.
La seconde était un vrai défaut que la première avait masqué. Le type qui pilote la sélection était dérivé d’une variable du formulaire de commande qui porte une condition sur le placement, à savoir si l’offre a un endroit où tourner. Une offre de conteneur sans placement ressortait donc comme « pas un conteneur », et la page disait « la VM » sur une commande de conteneur. Le type vient désormais du type de calcul propre à l’offre et de ce que le client a choisi, et aucun des deux ne sait quoi que ce soit du placement.
C’est la forme plus générale : une valeur qui se trouve aller de pair avec ce que vous voulez savoir n’est pas la valeur que vous voulez. Elle s’accorde jusqu’au jour où elle ne s’accorde plus, et ce jour-là rien n’échoue, elle dit simplement l’autre chose.
Quand deux constantes partagent un nom
Encore une petite chose issue de la même ronde, dans une garde tout à fait différente, car elle illustre bien comment un contrôle statique peut perdre pied.
Nous avons une garde qui résout par le nom, à l’échelle du projet, la forme des arguments des constantes de traduction partagées, afin qu’une clé utilisée avec un objet partagé reste couverte. Deux composants différents définissaient chacun une constante where, au contenu différent. La garde, qui résout par le nom, ne pouvait plus dire à laquelle des deux tel appel renvoyait, et elle les a tous abandonnés, y compris des appels dans un troisième fichier qui n’avait rien à voir ni avec l’une ni avec l’autre.
Renommer l’une des deux a réglé le problème. La leçon ne porte pas sur les noms : elle porte sur le fait qu’une garde qui résout des symboles par le nom entre fichiers a un mode d’ambiguïté, et que ce mode est le silence. Le contrôle ne signale pas « deux candidates », il ne signale rien du tout sur ces appels, et le compte des clés couvertes baisse d’une quantité que personne ne surveille.
Ce qui a été laissé tel quel, exprès
Trois choses sont restées comme elles étaient, et écrire pourquoi fait partie du travail.
Une phrase indique à un client qu’une réinstallation détruit tout ce qui se trouve sur les disques de la machine. Sur un conteneur, ce n’est pas un problème de mot : réinstaller un conteneur conserve, efface ou exclut point de montage par point de montage, et le remplacement honnête est une affirmation sur les points de montage qui tombent dans chaque groupe. C’est un écran et non une traduction, et il appartient à la ronde qui le construira.
Une indication du formulaire de commande appelle un champ le nom d’hôte de la machine virtuelle, dans un contexte où la chose nommée est un compte d’hébergement. C’est une décision de contenu et non une question de conteneurs, et prétendre le contraire aurait glissé un changement rédactionnel dans une correction de mots.
Et le compteur de licences continue de dire VM, car c’est ce qu’il compte. L’unité facturée à un client n’est pas l’unité qu’un client regarde, et la renommer en silence ferait qu’une ligne de facture cesserait de correspondre à un nombre sur une page.
Ce que nous noterions
- Mettez la branche autour de la phrase, pas autour du substantif. La substitution de mots marche en anglais et échoue partout ailleurs sur les articles et les cas.
- Réutilisez le nom de branche qui existe déjà. Deux orthographes d’une distinction dans un catalogue sont une devinette pour chaque ronde future.
- Dessinez les deux branches dans le test. Une sélection dont les branches s’accordent passe tout contrôle qui ne regarde que la forme.
- Contrôlez contre un crochet sur l’élément, pas contre la page entière. Un nom de montage contenant le mot cherché est un feu vert pour rien.
- Une valeur corrélée n’est pas la valeur. Dériver un type de ressource d’une chose qui porte une condition de placement fonctionne jusqu’à ce qu’une offre n’ait pas de placement.
- Une garde qui résout par le nom se tait devant un nom ambigu. Elle ne signale pas l’ambiguïté, elle ne signale rien.
- Une phrase peut être fausse sans que personne ait écrit une contrevérité. Vraie pour un cas, atteinte par un second appelant, telle est la voie habituelle.
Pour être clair : les quatorze clés sont en production dans les neuf langues et sous garde. Sept de ces langues ne sont passées que par le test de rendu et non par une seconde lectrice, et rien de tout cela n’a été exécuté contre un vrai Proxmox dans cette ronde.
Issu du travail de plateforme sur Provibr. Ce qui diffère réellement entre les deux types d’invité est expliqué dans VM ou conteneur sur Proxmox, et pourquoi réinstaller un conteneur est un remplacement et non une réparation dans réinstaller un conteneur est un remplacement.