arthur.bebou

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