man sheep.exe
$ man sheep.exe
No manual entry for sheep.exe
$
C’est exact, il n’y en a pas, et ce billet ne fera pas office de page de manuel non plus. Quelqu’un m’a demandé d’expliquer la page de maintenance, j’ai commencé à répondre, puis je me suis arrêté en réalisant que tout dérouler reviendrait à démonter le jouet devant celui qui n’a pas encore eu le temps d’y toucher. Ce qui suit donne donc les entrées, pas les sorties.
Commencez par le bas de la page
Il y a un chiffre dans la barre de statut. Il indique 57 jours
pendant que vous lisez cette phrase, et contrairement à peu près à tout le reste de ce site, il ne raconte aucune histoire, puisqu’il vaut très exactement ce que git log --reverse vous répondrait si vous cloniez le dépôt.
Cliquez dessus.
Je ne dirai pas ce qui se produit, sinon autant spoiler tout de suite. Sachez seulement que le même chiffre se met alors à compter depuis 452822400, soit le 8 mai 1984, ce qui devrait vous mettre sur une piste littéraire dont je ne prétendrai pas qu’elle témoigne d’une grande originalité de ma part. Le compte affiche quarante-deux ans à l’heure où j’écris ces lignes. La réponse sans la question. La seconde couche est mieux cachée, et beaucoup moins intéressante : elle se contente d’être la date de mise en production du site. Je vous laisse juger de la sobriété du geste.
Le fond n’est pas une image
Ce qui bouge derrière le texte est le jeu de la vie de Conway, tournant pour de bon, cellule par cellule. Quatre règles, pas une de plus, une cellule vivant, mourant ou naissant selon le nombre de voisines autour d’elle. Avec ces quatre règles on assemble des portes logiques, et avec ces portes un ordinateur complet à l’intérieur du jeu lui-même, ce qui n’est pas une figure de style puisque des gens l’ont réellement fait, motif par motif, et que j’aimerais autant ne pas savoir combien de week-ends ça leur a coûté.
Si vous ouvrez la console de votre navigateur, la grille répond. Elle vous dira combien de cellules sont vivantes, quelles dimensions elle occupe, et où se trouve l’amas le plus dense de l’écran. Rien n’est obfusqué, window.LifeGame et window.SheepFlock suffiront à faire apparaître le reste, et vous pourrez ensuite vous abonner aux événements qu’ils émettent, ce qui nous amène au point suivant.
Le journal ne ment qu’à moitié
L’onglet journal fait défiler des lignes de log. Une partie relève de la décoration pure, écrite à l’avance et tirée au sort, l’autre absolument pas. Les secondes décrivent des événements qui viennent de se produire dans la simulation, à la cellule près, et rien ne les distingue typographiquement des premières, ce qui était probablement une mauvaise décision de conception mais dont j’assume le résultat.
Le tri se fait à l’œil nu, à condition de regarder l’écran en même temps que le texte. Quand une ligne annonce qu’un mouton vient de brouter sept cellules, allez vérifier qu’il en manque sept. Quand une autre annonce une carcasse en décomposition puis un nombre de cellules rendues au sol, allez vérifier que la grille s’est rallumée d’autant.
Le mouton a une extension Windows et ce n’est pas un accident
Tout le vocabulaire du site est du Unix strict, systemd[1], journald, ps aux, et puis il y a sheep.exe. La blague facile tient en une ligne et vous l’avez déjà faite mentalement, merci. La vraie raison s’appelle eSheep, un logiciel de 1995 dont le mouton se promenait sur le bord des fenêtres, et qui descendait lui-même de courts métrages d’animation de Tatsutoshi Nomura diffusés vers minuit sur Fuji Television. Un mouton de dessin animé nocturne, donc, converti en logiciel vendu quelques milliers de yens, ce qui résume assez bien le milieu des années quatre-vingt-dix.
On répète un peu partout qu’il serait mort avec Windows XP. C’est faux et c’est plus drôle que ça, puisque ce binaire 16 bits a survécu à toutes les éditions 32 bits, et que seule la bascule vers le 64 bits, en emportant le sous-système entier, a fini par l’achever. Ce qui explique la première ligne des messages de démarrage de la page de maintenance, où l’architecture détectée se termine par un nombre qui n’est pas là pour faire joli. Le mouton d’origine est mort du 64 bits, le mien boote dessus.
Trois auteurs se partagent un bandeau
Une fois le mode caché déclenché, un texte défile en haut de l’écran. Orwell y fournit ce qu’on attend de lui et personne ne s’en étonnera, mais il a fallu que j’aille chercher du renfort. Philip K. Dick vient donc y douter que la réalité existe, et Asimov y interdit aux robots de laisser un humain en danger avant de qualifier la violence de dernier refuge de l’incompétence, ce qui tombe assez mal vu ce qui arrive au troupeau une demi-page plus bas.
Trois hommes qui n’avaient sans doute pas prévu de finir en bandeau défilant au-dessus d’un mouton en pixels. Le fichier qui les rassemble est un îlot JSON en clair dans la page, et si vous voulez savoir qui a dit quoi, il n’y a même pas besoin de télécharger quoi que ce soit.
Ce qui entre doit ressortir
Les moutons ne se contentent pas de marcher sur la grille. Ils repèrent les amas denses, s’y arrêtent, et broutent les cellules dans un rayon autour de leur museau, ce qui fait chuter la population de l’automate pour de bon. Un cycle qui ne boucle qu’à moitié n’ayant aucun intérêt, la suite était inévitable, et je vous laisse imaginer par quel mécanisme les cellules reviennent à la grille. Disons que le mouton doit d’abord digérer, que l’opération se déroule à l’endroit exact où il se tient, et que le résultat rallume des cellules mortes.
Cellules, mouton, digestion, dépôt, cellules. Un métabolisme fermé, ce qui est déjà satisfaisant, sauf que je m’étais laissé emporter et qu’un mouton repu se trouve également avantagé au moment de l’appariement. La démographie du troupeau dépend donc de l’état de la grille qu’il broute, une famine sur l’automate finissant par se lire dans la natalité ovine. Cette conséquence-là, je ne l’avais pas prévue, je l’ai découverte en regardant le journal défiler, et je l’ai gardée parce qu’elle était trop belle pour être corrigée.
Trois fonctions portent des noms suffisamment explicites pour que vous reconstituiez la boucle sans mon aide. Cherchez celle qui tue des cellules, celle qui en rallume, et le drapeau booléen qui conditionne la seconde à la première.
La mort aussi est un engrais
Le mouton broute, digère, dépose : le métabolisme tournait déjà dans les deux sens. Il lui manquait la sortie la plus évidente, celle par laquelle tout finit. Chaque mouton transporte désormais une jauge de nutrition : elle se remplit à chaque bouchée, se vide avec le temps, et quand elle reste à zéro pendant huit secondes, le mouton meurt de faim. Aucun script, aucune mise en scène : le même trépas que la guerre, appliqué à un mouton qui n’a simplement pas trouvé d’herbe.
La vieillesse est une affaire de gènes, au sens propre : le génome est passé de trois à quatre, curiosité, paresse, sociabilité, longévité, avec croisement et mutation comme le reste. La longévité multiplie l’âge à partir duquel la mort devient possible, mais elle ne fixe pas un compte à rebours : passé ce seuil, chaque seconde joue un tirage dont la probabilité monte avec l’âge. Un mouton peut mourir vieux, un autre survivre au-delà du raisonnable, et personne n’a écrit ça nulle part.
Chaque mort laisse un cadavre, un petit tas de pixels qui se décompose pendant seize secondes. Sa biomasse dépend de ce que le mouton a mangé dans sa vie et de l’état de sa jauge à l’instant du décès : un mouton repu rend plus de cellules qu’un mouton affamé. La décomposition les reverse une par une dans la grille, à l’endroit exact où le corps est tombé, et rien ne se perd : la masse ne quitte le cadavre que si une cellule est réellement rallumée. Un adulte bien nourri rend quatorze à dix-huit cellules. Un mouton qui n’a rien mangé en rend beaucoup moins. Le carnage de la section suivante participe donc au cycle : les victimes des frappes laser laissent elles aussi de quoi reverdir le pré.
J’avais pourtant écrit la boucle sans vérifier l’arithmétique. La première version rendait huit cellules par cadavre, alors que trois moutons exigent quarante-cinq cellules vivantes pour ne pas crier famine : le troupeau tournait en rond, naissait, mourait de faim, respawnait, recommençait. C’est une sonde headless qui me l’a montré, un cycle mesuré plutôt que deviné : soixante-six cellules avant la guerre, cent quatre-vingt-seize après la décomposition des cinq cadavres. J’ai doublé le rendement et la boucle s’est mise à tourner dans le bon sens.
Il reste une soupape : si le troupeau s’éteint entièrement en temps de paix, deux moutons neufs renaissent quelques secondes plus tard. Le jeu ne s’arrête jamais faute de joueurs. Et si vous avez demandé à votre système de réduire les animations, la mort est mise en pause avec le reste : pas de vieillissement, pas de famine, pas de cadavres. Un mouton immobile est un mouton immortel, ce qui est une façon comme une autre de voir les choses.
Et puis ça dégénère
Faites naître assez de moutons et la population franchit un seuil. Ce qui suit est bref, violent et parfaitement cartoon, le survivant décollant pour sortir de l’écran par une trajectoire que j’ai passé un temps parfaitement déraisonnable à régler, avec une approche, des loopings au bord, un retournement de cap et une traversée accélérée.
Ceux qui ont usé une souris sur un certain jeu de vers armés jusqu’aux dents auront reconnu la courbe avant la fin du paragraphe. Pour les autres, le nom du jeu est écrit noir sur blanc dans un commentaire du CSS, ce qui constitue à ma connaissance la seule référence de ce site qui ne vienne pas d’un livre.
Le seuil qui déclenche tout ça a longtemps été purement géométrique, une simple affaire de moutons par pixel disponible, et il ne racontait donc rigoureusement rien. Il en compte trois désormais. La densité demeure, puisqu’un écran plein doit bien finir par déborder, mais le surpâturage et la famine l’ont rejointe, c’est-à-dire le moment où le troupeau broute plus vite que la grille ne se régénère, puis celui où il ne reste franchement plus rien à brouter.
La famine a gagné un second effet depuis l’arrivée de la mort : elle tue aussi à la carte, mouton par mouton, et les cadavres qu’elle laisse peuvent suffire à renverser la tendance avant que la guerre ne soit déclarée. Quand ils ne suffisent pas, le troupeau est cueilli au laser, et ce qu’il en reste nourrit la grille pour la génération suivante.
Deux de ces trois causes relèvent donc de la responsabilité des moutons, ce qui donne rétrospectivement un sens à leur carnage. Rien ne vous empêche de les provoquer séparément pour voir laquelle arrive la première, et je note au passage qu’Asimov avait raison sur toute la ligne, ce dont je ne me remets pas complètement.
Le reste est éparpillé
Pas ici, en tout cas. Le dépôt est public, j’écris mes messages de commit comme si quelqu’un allait les lire un jour, hypothèse dont je mesure l’optimisme, et le changelog raconte l’ordre dans lequel les couches se sont empilées, ce qui rend assez visible le fait qu’aucune n’ait été planifiée.
Je ne vous dirai pas dans quel fichier chercher quoi. Ce qui manque à ce billet se trouve dispersé un peu partout, sans plan d’ensemble, parfois dans des endroits où personne n’irait regarder de son plein gré. Les commentaires du code sont bavards par vice plus que par méthode, et les noms de variables laissent occasionnellement tomber le masque.
Une dernière chose, et je vous laisse
Sur la grille, de temps en temps, cinq cellules se mettent à traverser l’écran en diagonale sans jamais se déformer. Ça s’appelle un planeur, c’est la plus petite structure du jeu de la vie capable de se déplacer toute seule, et quelqu’un a proposé un jour d’en faire le drapeau d’une certaine communauté qui n’en avait pas. Ce quelqu’un tient par ailleurs le dictionnaire de l’argot de ladite communauté, ce qui lui donnait une légitimité difficile à contester et qu’il n’a pas manqué de rappeler lui-même.
Vous l’avez sous les yeux depuis le début, d’ailleurs. Pas dans le fond, où il ne fait que passer. Dans le curseur qui clignote au bout du prompt.
$ ps aux | grep sheep
sheep 421 0.0 0.1 grazing conway_cells
$