Le site arthur.bebou.netlib.re - retour accueil
git clone git://bebou.netlib.re/arthur.bebou
Log | Files | Refs |
index.sh (17997B)
1 #! page 2 title: Faire du retro-portage, l\'exemple de catium 3 author: Arthur Pons 4 description: Et si l\'on essayait de faire fonctionner catium dans le passé ? Qu\'est-ce que cela va nous coûter ? 5 publication: 2025-04-26 6 7 section: main 8 9 Article pas relu. J'ai un nouveau clavier dont les touches sont très dures donc 10 j'oublie souvent des lettres. 11 12 Le travail décrit dans cet article est le fruit d'une collaboration avec 13 Guillaume Salagnac et Lou Paul-Dauphin, respectivement chercheur et stagiaire 14 au CITI à l'INSA Lyon. Merci à eux. 15 16 ## Introduction 17 18 Phenix est une équipe de recherche s'intéressant à la frugalité dans le 19 numérique. Dans ce cadre là elle s'intéresse aux liens entre nos pratiques du 20 numériques et les technologies anciennes[^1]. Elle explore ces liens en tentant 21 de répondre à des questions du type : "Etait-il possible de faire wikipedia en 22 1997 ?" et "Si oui, pour quels compromis ?". Ce faisant elle met à jour dans 23 quelle mesure les progrés en informatique sont des conditions nécessaires ou pas 24 à reproduire des services numériques aujourd'hui presque universellement 25 reconnus comme souhaitables. 26 27 Par ailleurs j'avais pour envie de tester jusqu'à quand fallait-il remonter pour 28 que catium ne fonctionne plus. Autrement dit répondre à la question "depuis 29 quand catium peut-il fonctionner tel quel sans qu'il n'ait besoin d'être modifié 30 ?". Alors forcément lorsque j'en ai parlé à Guillaume et Lou ça a parfaitement 31 matché. C'est l'occasion pour nous de tester empiriquement l'intuition que l'on 32 a souvent tenu pour vraie à Katzele, celle que de faire des logiciels avec la 33 boite à outil traditionnelle d'Unix permet de faire du logiciel qui nécessite 34 peu de maintenance à long terme. 35 36 ## Le portage 37 38 Dans le cadre de l'archéologie wikipedienne Lou a fait fonctionné un debian bo 39 1.3 datant de 1997 en suivant [ce 40 tuto](https://www.arsouyes.org/articles/2019/51_debian1.3/), corrigé depuis dans 41 [cet article](https://www.arsouyes.org/articles/2025/2025-03-04_Archeologie/) 42 suite aux problèmes rencontrés. Si vous voulez vous aussi avoir une debian 1.3 43 mais que vous préférez qemu vous pouvez suivre le readme de [ce dépôt 44 github](https://github.com/rdebath/debian-bo). 45 46 Pour répondre à notre question il était alors plus simple de prendre le problème 47 à l'envers, c'est à dire porter catium sous debian 1997 puis affirmer que catium 48 fonctionne tel quel depuis cette date là. La question devient alors "Qu'est-ce 49 que ça coûte de porter catium en 1997 ?". Un autre question intéressante serait 50 "Si le portage iso-fonctionnel n'est pas possible ou trop coûteux, qu'à-t-on 51 gagné depuis 1997 ?" ou, formulé autrement, "Que perd-t-on dans catium en se 52 limitant à des technologies de 1997 ?". 53 54 ### Le makefile 55 56 Pour le makefile les modifications suivantes ont été faites : 57 58 1. Utiliser la fonction `$(shell cmd)` disponible depuis au moins 1988[^2] 59 plutôt que l'opérateur presque équivalent `!= cmd` introduit en 2011[^4]. 60 2. Utiliser la fonction `patsubt` disponible depuis au moins 1988 à la place 61 des substitutions de référence `$(var:a=b)` introduites en 1989[^3]. 62 63 Seule la première était nécessaire pour que le makefile fonctionne sous debian 64 bo mais la seconde ne coûte rien alors pourquoi pas. 65 66 ### Le script page 67 68 A la tentative d'exécution de la page de demo `index.sh` nous avons obtenu 69 l'erreur suivante : 70 71 bash: mktemp : not a command 72 73 Et pour cause, `mktemp` n'existe dans les GNUcoreutils que depuis décembre 74 2007[^5]. Le [manuel d'OpenBSD](https://man.openbsd.org/mktemp.1) dit que la 75 commande est apparue dans OpenBSD 2.1 datant de 1997[^7] mais je n'en trouve pas 76 mention dans [les changelog](https://www.openbsd.org/plus21.html). Il est donc 77 possible qu'un `mktemp` portable ait existé à ou juste après la sortie de debian 78 bo mais il n'y était pas par défaut. 79 80 La solution retenue pour résoudre notre souci est de fabriquer un dossier 81 temporaire "à la main" en se basant sur le `pid` du processus : 82 83 tmpdir="/tmp/catium-$$" 84 mkdir -p "$tmpdir" 85 86 J'ai connaissance des [limites à la création de dossiers 87 temporaires](https://dotat.at/@/2024-10-22-tmp.html) comme ceci et à fortiori 88 dans le dossier `/tmp` mais honnêtement ici on s'en fiche un peu. Un compromis 89 pourrait être d'utiliser le dossier `~/.tmp` s'il existe mais flemme et ce ne 90 changera rien pour notre objectif de portabilité. 91 92 Les prochaines erreurs arrivaient groupées, j'ai nommé les : 93 94 bash: syntax error near unexpected token `cat' 95 96 Ces erreurs étaient déclenchées par une syntaxe particulière de déclaration de 97 fonction dont en voici un exemple : 98 99 save() cat >> "$tmpdir/$1" 100 101 Il se trouve que cette syntaxe n'est pas POSIX[^8][^9]. Les fonctions shell 102 doivent être suivies d'une `coumpound command` qui doit commencer et finir par 103 un mot réservé (`for` par ex) ou un opérateur de contrôle (`{` par ex) et finir 104 par le mot réservé ou l'opérateur de contrôle correspondant (`done` et `}`). 105 `cat` n'est ni l'un ni l'autre donc `bash` ne le parse pas. J'ai longtemps cru 106 que cette syntaxe était POSIX puisque `dash` le comprend et parce que j'avais mal 107 lu la [page du wiki de shellcheck sur le 108 sujet](https://www.shellcheck.net/wiki/SC1064). L'exemple donné à la fin avec la 109 boucle `for` m'avait fait pensé que c'était ok de ne pas mettre de `{}` en 110 toute circonstance mais ce n'est ici rai que parce que `for` et `done` sont des 111 mot réservés qui se correspondent. 112 113 Une fois la confusion levée la correction a été très simple. Encadrer les 114 commandes des fonctions par des `{}` sans oublier de terminer la dernière 115 commande par `;` si la fonction est écrite sur une seule ligne[^10]. 116 117 Je n'ai pas résisté à l'envie d'envoyer un mail à Marc à ce sujet ce qui a été 118 un grand succès puisque l'on a eu le droit à [un magnifique pavé 119 Chantresque](https://groupes.renater.fr/sympa/arc/unix/2025-04/msg00000.html) 120 salade tomates oignons : 121 122 * Réponse à un mail perso sur une liste de diff publique 123 * Du bashism de bash 124 * Un cours d'histoire sur le shell 125 * Des takes militantes 126 * Des arguments soutenus par des bouts de code ésotériques mais convaincants 127 128 Nouvel obstacle dans notre portage sous debian 1997, cet ensemble d'erreur : 129 130 bash: page: line 3: title: command not found 131 bash: page: line 3: author: command not found 132 ... 133 134 Autrement dit `bash` ne semble pas instancier les alias `title:`, `author:` etc. 135 En lisant la partie `ALIAS` du manuel de bash je suis tombé sur : 136 137 ALIAS 138 139 [...] 140 141 Les alias ne sont pas développés quand l'interpréteur n'est pas 142 interactif sauf si l'option expand_aliases de l'interpréteur est 143 créée par la commande shopt (consultez la descrip‐ tion de shopt dans 144 COMMANDES INTERNES DE L'INTERPRÉTEUR ci-dessous). 145 146 [...] 147 148 Il se trouve que c'est exactement ce dont on nous avions besoin mais j'ai mal 149 compris `développés`. J'ai cru que le manuel parlait de développer les 150 éventuelles variables qui se trouvait dans la déclaration de l'alias et non pas 151 de créer l'alias tout court. J'ai donc cherché une autre explication sans 152 succès. C'est Guillaume qui est indépendamment tombé sur cette info, a 153 correctement compris le texte et a demandé à Lou de tester la modif avec succès. 154 On considère souvent que le plus difficile est de trouver les informations dans 155 les mégas pages de manuel de la mort mais une fois l'information trouvée faut-il 156 encore la comprendre ! Idem avec la page de shellcheck au sujet des compounds 157 commands. C'est donc ça la puissance d'un directeur de thèse ? 158 159 Il y aurait des moyens automatiques de tester si le shell utilisé est `bash` 160 puis d'appliquer la configuration mais, à ma connaissance, pas de manière 161 simple, fiable et cohérente de debian 1.3 jusqu'à debian 12. La solution retenue 162 a donc été d'introduire la ligne de configuration spécifique à bash dans la 163 section prévue à cet effet dans `page` : 164 165 ## 166 # 3. Config si vous utilisez bash 167 ## 168 169 # Si votre sh est bash alors décommenter la ligne suivante 170 # Sous linux vous pouvez vérifier en faisant 171 # readlink $(whereis sh) 172 173 # shopt -s expand_aliases 174 175 Et j'ai le plaisir de vous annoncer qu'avec ces modifications catium fonctionne 176 sous debian 1.3, en 1997, sans installer de paquets. 177 178 ### Des bugs dans le layout 179 180 Premier bug, la présence de cette syntaxe censée mettre fin à la génération en 181 produisant un message d'erreur en l'absence d'un titre : 182 183 <title>${title?La page dont le chemin s'affiche au dessus nécessite un titre}</title> 184 185 La syntaxe `${param?mot}` n'est pas correcte. Ce doit être `${param:?mot}`. 186 187 Autre bug, sur la même ligne, l'apostrophe empêche `zsh` et `bash` de parser 188 correctement le fichier. Il s'attend à voir une apostrophe fermante. Cela fait 189 plutôt sens et il est vrai que j'ai été surpris la première fois en constatant 190 que `dash` comprenant ça correctement. J'ai cru sur le moment que la partie 191 droite du `:?` était spécifiée comme étant spéciale. Il semblerait que non 192 et que `dash` est simplement très permissif. A vérifier. La forme correcte pour 193 tous les shells testés est donc : 194 195 <title>${title:?"La page dont le chemin s'affiche au dessus nécessite un titre"}</title> 196 197 Dans la même veine la ligne d'après posait problème et a été corrigée en double 198 quotant toute la valeur par défaut : 199 200 ${STYLE:+"<link rel=stylesheet href=$STYLE />"} 201 202 ### Le traducteur markdown 203 204 Catium a ceci de particulier qu'il ne présuppose pas en quoi vous voulez écrire 205 vos page. C'est pourquoi à la première exécution il vous force à ouvrir le 206 script `page` et à écrire/décommenter la fonction qui appelera le traducteur. 207 En pratique le langage de markup le plus utilisé avec catium est markdown et 208 le traducteur associé [`lowdown`](https://kristaps.bsd.lv/lowdown/)[^11]. 209 210 Du fait de ce fonctionnement catium peut s'adapter à tous les usages. En 1997, 211 si l'on avait utilisé catium pour écrire de l'HTML on aurait probablement écrit 212 de l'HTML à la main. Le traducteur aurait alors été la fonction identitié : 213 214 save() { cat >> "$tmpdir/$1"; } 215 216 Cela dit, si l'on voulait se poser la question d'utiliser, en 2025 et donc avec 217 la connaissance de markdown, une debian 1.3, il serait sympa d'avoir un 218 traducteur. J'ai donc testé mon traducteur 219 [`katdown`](http://git.bebou.netlib.re/katdown/log.html) écrit en `awk` POSIX. 220 **Attention**, je précise que ce traducteur implémente une toute petite partie de 221 markdown et même pas correctement. Il est ultra méga pété. Mais, mais, pour des 222 documents très simples et dans des contextes où c'est pas forcément la mort 223 d'avoir parfois un doc un peu cassé, il faisait le taf en 1997, interprété par 224 `mawk`. C'est chouette. 225 226 Une autre alternative serait [`markdown.awk` de Paul 227 Hänsch](https://git.plutz.net/?p=cgilite;a=blob;f=markdown.awk;h=bef97d1b7955191cb6b63af748c761d5288dea3a;hb=HEAD) 228 mais il fait 999 lignes et semble ne pas fonctionner avec le `mawk` pré installé 229 sur debian 1.3. 230 231 ## Discussion 232 233 ### Sur le nom de la pratique 234 235 Ce que l'on fait ici est de porter du logiciel d'aujourd'hui pour qu'il 236 fonctionne sur du vieux matériel. C'est, je crois, une pratique assez rare. Le 237 fait que l'on porte en arrière dans le temps m'a donné envie d'appeler ça du 238 rétro-portage. Pourtant quand j'ai [initiallement porté catium vers OpenBSD et 239 MacOS](/portabilite/) je ne me suis pas demandé si je faisais quelque chose de 240 particulier alors même que le mac de Timothée tourne sur un vieux MacOS. Je 241 suppose que c'est la quantité de temps conséquente qui sépare 1997 de 2025 qui 242 me donne envie de lui donner un nom particulier. Sinon on peut simplement 243 appeler ça du portage/porting et la pratique plus large de l'arhéologie 244 numérique. 245 246 ### Sur le coût 247 248 Qu'est-ce que cela a coûté de porter ? 249 250 Le portage nous a pris ~2h30. Il a initiallement mobilisé uniquement Guillaume 251 et Lou puis, vers la fin, moi en renfort. On peut donc dire que le coût a été 252 2h de personnes fortes en shell et 30m du mainteneur du projet. Ce n'est pas 253 rien. 254 255 Guillaume m'a confié s'attendre à beaucoup plus. Personnellement c'était à peu 256 près ce à quoi je m'attendais. On peut adopter plusieurs perspectives qui ne 257 s'excluent pas : 258 259 1. Se dire qu'il est "normal" que le portage ait été facile puisqu'après tout 260 le logciel est très simple. 261 2. Se dire que mine de rien ces affaires de compatibilité entre les différents 262 shells c'est bien relou et caractéristique de ce pourquoi beaucoup de 263 personnes ne comptent pas sur cet environnement technique pour fabriquer 264 leurs outils. 265 3. Se dire que c'est assez exceptionnel qu'un logiciel écrit en 2023/2024 soit 266 portable en 1997 en moins de deux heures. 267 4. Sûrement d'autres 268 269 Quand on analyse plus en détail on se rend compte que l'histoire des alias et 270 les bugs dans le layout sont avant tous des corrections pour porter vers `bash`, 271 également nécessaires en 2025. Si c'est une bonne idée de l'avoir fait puisque 272 de nombreuses personnes utilisent ce shell nous avons eu ici à le faire 273 uniquement parce que bash est le seul shell installé par défaut sur debian 1.3. 274 Cela veut dire que si l'on avait initiallement écrit catium pour fonctioner avec 275 `bash` les seules modifications à faire auraient été la substitution de la 276 syntaxe `!=` par la fonction `$(shell)` dans le makefile et le retrait de la 277 dépendance à `mktemp`. 278 279 ### Sur l'objectif 280 281 Derrière les recherches de Phenix et les intuitions de Katzele se cache un 282 problème important. Nous aimerions pouvoir objectiver ce qui fait qu'un logiciel 283 est fiable et réparable dans le temps mais il est impossible de prédire le 284 futur. L'un comme l'autre nous faisons l'hypothèse que le fait qu'un logiciel 285 fonctionnait il y a 20 ans et fonctionne encore sans changement majeur est une 286 bonne raison de penser qu'il a une chance de fonctionner encore dans 20 ans. 287 288 Cela dit il ne faudrait pas se laisser aller à penser que cette relative 289 fiabilité ne serait *que technique* et le *seul et meilleur indicateur* de ce 290 qui fonctionnera dans 20 ans. 291 292 Par exemple si le shell et les commandes traditionnelles d'Unix utilisées dans 293 catium changent suffisament peu pour pouvoir être utilisées de la même manière 294 en 1997 et en 2025, il serait faux de dire que ce sont exactement les mêmes 295 logiciels qui fonctionnent sous le capot. Des efforts humains non 296 négligeables[^12] ont été consentis durant ces 28 ans pour maintenir ces outils 297 en état de marche, s'adapter aux ouveau matériels, corriger des bugs etc. Il ne 298 faut pas confondre fiabilité des "API" et fiabilité du code sous-jacent. 299 300 Par ailleurs la durabilité d'une techno peut aussi se faire malgré des mises à 301 jour fréquentes. Il est raisonnable d'estimer qu'il est durable de faire du 302 javascript, malgré le fait que ça n'existait pas en 1997, malgré le fait que ce 303 soit techiquement plus compliqué que du C89, malgré le fait que de nouvelles 304 fonctionnalités sortent "fréquemment", parce que des entreprises extrêmement 305 riches et puissantes dépendent de cette technologie. C'est, dans le fond, un 306 pari assez similaire à celui que l'on fait en visant du shell et des utilitaires 307 unix standards, mais à plus haut niveau et se reposant davantage sur la 308 perpétuation d'entreprises "too big to fail". Pourquoi pas ? Après tout le shell 309 n'a pas toujours existé non plus et pourtant il aurait été bon de parier sur sa 310 durabilité à sa création. 311 312 Finalement, comme Guillaume et Matthieu me l'avaient fait remarquer, il serait 313 dommage de ne se poser *que* la question de la fiabilité dans le temps et non 314 pas de la *réparabilité* et de l'*appropriabilité*. On pourrait imaginer créer 315 un outil tellement sur-ingénieuré qu'il soit capable de prévoir tous les cas 316 possibles, tous les imprévus, toutes les innovations technologiques. Cet outil 317 imaginaire serait impossiblement complexe à écrire, à maintenir, à modifier, à 318 adapter. Peut-être qu'il serait capable de fonctionner dans 100 ans mais 319 personne ne serait capable de l'adapter aux inévitables changements de nos 320 besoins durant ce centenaire. À moins qu'il remplisse le plus essentiel des 321 besoins il deviendrait rapidement obsolète. Il faut donc s'atteler à maximiser 322 la fiabilité *et* la réparabilité. Que l'outil ne nécessite pas d'être souvent 323 réparé a fur et à mesure que son environnement technique change mais que, 324 lorsque c'est inévitablement le cas ou lorsque le besoin change, il puisse être 325 raisonnablement facilement modifié en fonction des ressources dont on dispose. 326 Comme exemple on peut citer le développement de l'[indice de 327 durabilité](https://www.ecologie.gouv.fr/politiques-publiques/indice-durabilite) 328 suite aux limites de l'indice de réparabilité qui pouvait donner un 10/10 à un 329 téléphone très facile à réparer mais tombant en panne tous les deux jours. 330 331 [^1]: Dans un contexte numérique donc pas forcément si anciennes que ça 332 [^2]: https://git.savannah.gnu.org/cgit/make.git/tree/ChangeLog.1#n4241 333 [^3]: https://git.savannah.gnu.org/cgit/make.git/tree/ChangeLog.1#n3362 334 [^4]: https://git.savannah.gnu.org/cgit/make.git/tree/ChangeLog.3#n1475 335 [^5]: https://git.savannah.gnu.org/cgit/coreutils.git/tree/NEWS#n4025 336 [^6]: https://man.openbsd.org/mktemp.1 337 [^7]: https://www.openbsd.org/21.html 338 [^8]: https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_05 339 [^9]: https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_04 340 [^10]: https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_04_01 341 [^11]: parce que c'est celui qui était utilisé pour le site de Katzele pour son 342 bon compromis "stabilité/taille/fonctionnalités". 343 [^12]: bien que possiblement asez faibles en comparaison à d'autre 344 environnements techniques