2 points par GN⁺ 2024-10-05 | 3 commentaires | Partager sur WhatsApp
  • La raison pour laquelle les tests automatisés échouaient uniquement à 00:30 était que man -w affichait aussi sur stderr une chaîne inattendue : gimme gimme gimme
  • Cette chaîne était un easter egg de man, qui apparaissait lorsque la commande était exécutée sans page de manuel, ou avec -w, si l’heure locale était 00:30
  • La phrase vient de « Gimme! Gimme! Gimme! (A Man After Midnight) » d’ABBA, et une blague publiée sur Twitter en 2011 a été intégrée au code de man-db
  • man -w affichait le manpath et renvoyait aussi le code de sortie 0, ce qui permettait de l’utiliser dans l’automatisation, mais l’easter egg pouvait casser l’analyse de sa sortie
  • man-db a d’abord été corrigé pour que cela ne se déclenche pas avec man -w, puis il a été décidé de supprimer complètement l’easter egg dans man-db 2.8.0

Un test qui échouait uniquement à 00:30

  • Les tests automatisés fonctionnaient normalement la plupart du temps, mais échouaient seulement lorsqu’ils étaient exécutés à 00:30
  • La cause directe était l’ajout d’une chaîne inattendue sur stderr
gimme gimme gimme
  • La commande utilisée dans le test était man -w, afin d’obtenir le manpath courant

L’easter egg présent dans man

  • La chaîne en question était un easter egg intégré à la commande man
  • Les conditions de déclenchement étaient les suivantes :
    • exécuter man sans préciser de page de manuel
    • ou exécuter man -w
    • l’heure locale est 00:30
  • Lorsque les conditions étaient réunies, gimme gimme gimme était affiché sur stderr
# date +%T -s "00:30:00"
00:30:00


# man -w
gimme gimme gimme
/usr/local/share/man:/usr/share/man:/usr/man
  • Même dans ce cas, le code de sortie restait 0

Le comportement attendu à l’origine

  • La sortie normale de man -w consiste à ne renvoyer que les chemins de recherche des pages de manuel
# man -w
/usr/local/share/man:/usr/share/man:/usr/man


# echo $?
0
  • Lorsqu’on exécute man sans page, le comportement attendu est de demander quelle page de manuel est souhaitée et de renvoyer le code de sortie 1
# man
What manual page do you want?


# echo $?
1
  • Comme man -w affiche les chemins de recherche, il peut être utilisé pour vérifier l’installation de pages de manuel ou comme composant de tests automatisés

Code et distributions concernées

  • La chaîne a été trouvée dans RHEL, OpenSUSE, Fedora, Debian, entre autres, et il ne s’agissait pas d’un comportement propre à une distribution particulière
  • Il était possible de vérifier sa présence en faisant un grep de la chaîne dans le binaire
  • La sortie provenait du code src/man.c de man-db
time_t now = time (NULL);
struct tm *localnow = localtime (&now);
if (localnow &&
    localnow->tm_hour == 0 && localnow->tm_min == 30)
  fprintf (stderr, "gimme gimme gimme\n");

Une chaîne venue d’une chanson d’ABBA et d’un tweet

  • gimme gimme gimme vient de « Gimme! Gimme! Gimme! (A Man After Midnight) » d’ABBA
  • Dans un tweet de 2011, Marnanel Thurman avait suggéré en plaisantant que man, exécuté à 00:01, devrait afficher gimme gimme gimme
  • Le mainteneur de man a intégré cette suggestion dans le code réel
  • Le commit initial se déclenchait à 00:01, puis des commentaires ont précisé qu’il avait ensuite été changé à 00:30 avec le message de commit « half past twelve »

Correction et suppression

  • Colin Watson, mainteneur de man-db, a d’abord corrigé le problème avec le commit 84bde8, afin que cet easter egg ne se déclenche plus avec man -w
  • Colin Watson a ensuite appliqué un commit supprimant complètement l’easter egg
  • L’easter egg supprimé devait disparaître dans la version prévue man-db 2.8.0
  • Le mainteneur a estimé que l’easter egg avait fait sourire certaines personnes, mais en avait agacé d’autres, et que six ans étaient une durée suffisante

3 commentaires

 
tribela 2024-10-07

Si l’on veut ajouter ce genre d’easter egg, c’est aussi une bonne idée de vérifier au préalable si l’entrée/sortie standard est un TTY. Dans un script shell, on peut le vérifier avec [[ -t 1]].

 
y15un 2024-10-05

man a donc été traduit par « homme », haha.

 
GN⁺ 2024-10-05
Avis sur Hacker News
  • Il y a quelque temps, avant que la télémédecine ne se démocratise comme aujourd’hui, j’avais créé une webapp de télémédecine : les patients remplissaient un questionnaire en ligne, puis le médecin consultait leurs réponses.
    En onboardant plusieurs spécialités, on avait une logique assez puissante pour contrôler conditionnellement l’affichage des questions. En travaillant sur les fonctionnalités d’une nouvelle clinique psychiatrique, je déboguais un cas où une question censée s’afficher n’apparaissait pas, et j’ai ajouté à côté des questions tout un tas de messages de debug absurdes et un peu énervés.
    Je pensais avoir corrigé le problème et nettoyé le tout, mais j’avais laissé, pour une certaine combinaison de réponses, un message en gros texte rouge disant I SEE YOU!!!. C’est un patient qui remplissait le questionnaire d’évaluation de la paranoïa de la nouvelle clinique psychiatrique qui l’a découvert.
    Depuis, j’utilise des marqueurs de debug du genre aaa ou 111.

    • Chez Google, les chaînes de debug devaient contenir DO NOT SUBMIT, et un bot a ensuite été ajouté pour les détecter après qu’une chaîne de debug était partie en production.
      Si je me souviens bien, c’était après le légendaire incident WD, où, dans du code de test, “western digital” avait été remplacé par “woodly doodly”, puis déployé par erreur.
    • J’ai fait quelque chose de similaire autrefois, sur un site de paris, en développant une fonctionnalité permettant aux gens d’importer en masse des paris via un fichier spécial.
      Pendant le développement, ça ne cassait que dans une situation très précise, qui ressemblait à une condition bizarre propre à l’environnement de dev local. J’ai donc mis un message d’erreur du genre “watch and amaze while the application eats itself!”. La phrase m’était venue d’une erreur que j’avais vue dans le jeu Discworld sur PlayStation.
      Mais une fois en production, la condition qui déclenchait cette erreur s’est révélée beaucoup moins rare que prévu, et le support client a été submergé par des centaines de personnes appelant parce qu’elles pensaient que leur argent avait disparu. Les utilisateurs de cette fonctionnalité étaient de gros parieurs, donc la direction n’a pas du tout apprécié non plus.
      Heureusement, je n’ai pas été licencié et j’ai corrigé ça rapidement, mais j’ai vraiment senti la lame passer tout près de mon cou. C’était il y a presque 20 ans, dans l’un de mes premiers jobs, et j’ai reçu cette semaine-là une bonne leçon.
    • Il y avait dans ce fichier un commentaire que j’avais laissé pendant longtemps, mais le lead du projet, quelqu’un de très professionnel, l’a supprimé. Le commentaire était # MULTIPASS!.
      https://github.com/workarea-commerce/workarea/blob/master/co...
      Le contexte : The 5th Element est un super film, le chien de ma sœur s’appelait Leeloo Dallas Multipass, c’était mon chien préféré, et c’est moi qui avais créé au départ la fonctionnalité de requête de recherche ProductMultipass.
      J’ai aussi découvert que les commentaires amusants font davantage aimer un produit aux autres développeurs.
    • Comme marqueur de debug, j’utilise en général mes initiales avec DEBUG.
      C’est facile à retrouver avec grep avant de commit, et si jamais ça arrive en production, ce n’est pas non plus une chaîne totalement incompréhensible.
    • J’ai très certainement déjà commité un message de debug, et j’imagine que la plupart des gens qui écrivent du code l’ont fait au moins une fois.
      Heureusement, ce n’était rien de trop embarrassant. Aujourd’hui, avant de commit et de push, je fais toujours une dernière vérification avec git diff et je cherche print ou l’équivalent dans le langage concerné.
      Au lycée, un ami avait l’habitude de donner des titres inappropriés à ses brouillons de devoirs. Quand on se relisait entre nous, c’était drôle, mais il a fini par oublier une fois de remettre le bon titre. En cours d’anglais, quand la prof a commencé à passer ramasser les devoirs, mon ami a regardé sa feuille, a soudain dit qu’il devait aller aux toilettes, puis a filé en salle informatique réimprimer un exemplaire sans insulte en 24 points tout en haut. J’ai failli mourir de rire.
  • Si le logiciel est gratuit et que les mainteneurs ne sont pas payés, quelques easter eggs me semblent être un faible prix à payer.
    Certes, Colin était payé, mais pas principalement pour maintenir man.
    Dans une entreprise où j’ai travaillé, un développeur avait un jour ajouté aux conditions d’utilisation une phrase disant que l’utilisateur cédait son âme à l’entreprise. Le but était de voir si les dirigeants ou le service juridique relisaient bien les CGU comme promis ; ils ne l’ont pas fait, et beaucoup d’âmes ont été capturées.

    • Ça pourrait rendre l’intégralité des CGU nulle et non avenue.
  • Coder doit être amusant, et écrire du code aussi. Je trouve que ces gens ont bien fait.
    L’idée que l’open source devrait être froid et sérieux vient seulement du fait que les entreprises s’en sont emparées. Si je créais un programme avec un ami, je mettrais probablement des easter eggs un peu partout pour rappeler qu’il y a un humain de l’autre côté.

    • Comme ils sont cachés, la plupart des gens ne tomberont jamais dessus.
      Ceux qui les rencontrent le feront par hasard, comme dans l’article original, où ça a cassé le pipeline d’intégration continue. Je ne trouve pas que les easter eggs soient un très bon moyen de rappeler qu’« il y a un humain de l’autre côté ».
      Du moins en dehors des logiciels de divertissement.
    • Il y a peu de choses aussi amusantes et satisfaisantes qu’un easter egg bien caché.
      Surtout si ce sur quoi on travaille est entouré de procédures bureaucratiques. Mon préféré, personnellement, est un Rick Roll que j’ai caché il y a quelques années dans le code source d’une application gouvernementale que j’ai corrigée en mission de conseil. Seul un développeur travaillant sur un sous-système très précis peut le trouver, mais s’il le découvre, il comprendra au contexte pourquoi il est là.
    • Un easter egg amusant pour quelqu’un peut être, pour quelqu’un d’autre, un déclencheur de dysfonctionnement non déterministe avec de vrais effets sur son workflow.
      Voilà une raison de plus de se méfier des logiciels qui intègrent, dans des applications critiques pour la sécurité des personnes ou essentielles à une mission, plusieurs composants issus de processus d’ingénierie différents.
  • Il n’y est désormais plus.
    Colin Watson, développeur de man-db, a estimé que c’était assez drôle et que l’histoire ne serait pas oubliée, et a supprimé complètement l’easter egg.
    https://git.savannah.gnu.org/cgit/man-db.git/commit/?id=b225...

    • Dans la discussion de cette issue, j’avais lu un beau commentaire que je n’arrive plus à retrouver aujourd’hui.
      Il disait qu’il fallait conserver ce genre d’easter eggs, parce qu’au fond ce sont ces choses-là qui distinguent l’humain de la machine.
    • Je viens d’essayer sur un vieux Raspberry Pi et il y est encore. Il est basé sur Debian 9 Stretch.
  • Articles liés :
    Why does man print “gimme gimme gimme” at 00:30? (2017) - https://news.ycombinator.com/item?id=27994194 - juillet 2021, 211 commentaires
    Why does man print “gimme gimme gimme” at 00:30? - https://news.ycombinator.com/item?id=15747313 - novembre 2017, 159 commentaires
    Why does man print “gimme gimme gimme” at 00:30? - https://news.ycombinator.com/item?id=15746972 - novembre 2017, 1 commentaire
    Why does man print “gimme gimme gimme” at 00:30? - https://news.ycombinator.com/item?id=15742221 - novembre 2017, 1 commentaire

  • C’est une idée amusante, mais il ne faut pas la mettre dans le flux d’exécution normal. Cela nuit aux utilisateurs.
    Comme l’a dit l’auteur du billet original, cela aurait été mieux si c’était man -abba.

    • D’après la première réponse, à l’origine, cela ne devait se déclencher qu’en cas d’erreur, c’est-à-dire lorsqu’aucune page n’était indiquée.
      Mais, par erreur, cela se déclenchait aussi lorsqu’on indiquait une page de manuel avec le flag --path au lieu du nom de la page.
    • $ man --abba --format=json
      ["gimme", "gimme", "gimme"]
    • Cela a été supprimé. Référence : https://news.ycombinator.com/item?id=41738239
  • Cette mise à jour a cassé mon workflow.

    • Grâce à cette mise à jour, mon workflow a été réparé. J’avais besoin de man après minuit.
  • En supprimant l’ancien système téléphonique, j’ai installé FreePBX dans l’entreprise.
    Comme il n’y avait pas beaucoup de postes, on utilisait 1xx, 2xx et 3xx pour différents types d’extensions, et il restait encore beaucoup de numéros. J’avais ajouté un petit easter egg : si quelqu’un appelait l’extension 666, cela jouait le rire inquiétant de Vincent Price à la fin de Thriller de Michael Jackson.
    Un matin très tôt, un an ou deux plus tard, un collègue m’a envoyé un SMS en disant que le téléphone semblait avoir été piraté, et qu’il entendait une voix effrayante quel que soit le numéro appelé. En vérifiant, il s’est avéré que quelque chose s’était mal passé et que tous les appels étaient renvoyés vers la dernière extension ajoutée, la 666.
    Évidemment, les gens n’ont pas trouvé cet easter egg drôle, et le rire les a vexés.

  • Je me demande s’il existe une hypothèse expliquant pourquoi il y avait un test qui appelait man sans argument.
    L’objectif était-il simplement de vérifier que man était installé ? Même dans ce cas, on aurait plutôt testé la commande comme elle est normalement utilisée.

    • En lisant les réponses, il semble que l’easter egg se déclenchait aussi par erreur quand la page à charger était passée via --path.
      Ce point a ensuite été corrigé, puis l’easter egg entier a été supprimé plus tard.
    • La question Stack Overflow elle-même semble avoir été une question artificielle destinée à permettre à quelqu’un d’autre de raconter publiquement son histoire.
    • Les commentaires de la question Stack Overflow liée en parlent en détail ; en bref, c’était parce qu’ils voulaient manpath : man -w.
    • C’était peut-être un test automatisé du genre : vérifier que l’image de build était correctement installée et que man produisait la sortie attendue.
  • Pour déterminer si man s’est terminé correctement, je pense qu’on peut se fier au code de sortie.
    Se baser sur la longueur de stderr est toujours fragile.