- 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
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]].mana donc été traduit par « homme », haha.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
aaaou111.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.
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.
# 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.
C’est facile à retrouver avec
grepavant de commit, et si jamais ça arrive en production, ce n’est pas non plus une chaîne totalement incompréhensible.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 diffet je chercheprintou 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.
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é.
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.
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à.
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...
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.
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.Mais, par erreur, cela se déclenchait aussi lorsqu’on indiquait une page de manuel avec le flag
--pathau lieu du nom de la page.$ man --abba --format=json["gimme", "gimme", "gimme"]Cette mise à jour a cassé mon workflow.
manaprè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
mansans 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.--path.Ce point a ensuite été corrigé, puis l’easter egg entier a été supprimé plus tard.
man -w.manproduisait la sortie attendue.Pour déterminer si
mans’est terminé correctement, je pense qu’on peut se fier au code de sortie.Se baser sur la longueur de
stderrest toujours fragile.