- La razón por la que la prueba automatizada fallaba solo a las 00:30 era que
man -w imprimía además una cadena inesperada en stderr: gimme gimme gimme
- Esa cadena era un easter egg de
man, que aparecía cuando se ejecutaba sin una página de manual o con -w si la hora local era 00:30
- La frase venía de “Gimme! Gimme! Gimme! (A Man After Midnight)” de ABBA, y un chiste en un tuit de 2011 terminó reflejado en el código de
man-db
man -w imprimía el manpath y también devolvía código de salida 0, por lo que podía usarse en automatización, pero el easter egg podía romper el parseo de la salida
man-db primero lo corrigió para que no se activara con man -w y luego decidió eliminar el easter egg por completo en man-db 2.8.0
La prueba que fallaba solo a las 00:30
- La prueba automatizada funcionaba correctamente la mayor parte del tiempo, pero fallaba únicamente cuando se ejecutaba a las 00:30
- La causa directa era que se agregaba una cadena inesperada a
stderr
gimme gimme gimme
- El comando usado en la prueba era
man -w, con el propósito de obtener el manpath actual
El easter egg que estaba dentro de man
- La cadena en cuestión era un easter egg incluido en el comando
man
- Las condiciones para activarlo eran las siguientes
- Ejecutar
man sin especificar una página de manual
- O ejecutar
man -w
- Que la hora local fuera 00:30
- Si se cumplían las condiciones, se imprimía
gimme gimme gimme en stderr
# date +%T -s "00:30:00"
00:30:00
# man -w
gimme gimme gimme
/usr/local/share/man:/usr/share/man:/usr/man
- Incluso en este caso, el código de salida se mantenía en 0
Comportamiento esperado originalmente
- La salida normal de
man -w debía devolver solo la ruta de búsqueda de páginas de manual
# man -w
/usr/local/share/man:/usr/share/man:/usr/man
# echo $?
0
- Al ejecutar
man sin una página, el comportamiento esperado era que preguntara qué página de manual se quería y devolviera el código de salida 1
# man
What manual page do you want?
# echo $?
1
- Como
man -w imprime la ruta de búsqueda, podía usarse para verificar la instalación de páginas de manual o como componente en automatización de pruebas
Alcance en código y distribuciones
- La cadena se encontró en RHEL, OpenSUSE, Fedora, Debian y otras, por lo que no era un comportamiento exclusivo de una distribución específica
- Era posible confirmar su presencia haciendo
grep de la cadena en el binario
- La salida se producía desde el código
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");
La cadena venía de una canción de ABBA y de un tuit
gimme gimme gimme es una frase tomada de “Gimme! Gimme! Gimme! (A Man After Midnight)” de ABBA
- En un tuit de 2011, Marnanel Thurman propuso en broma que, si se ejecutaba
man a las 00:01, imprimiera gimme gimme gimme
- El mantenedor de
man incorporó esa propuesta al código real
- El commit inicial se activaba a las 00:01, y luego, según se añadió en comentarios, se cambió a las 00:30 con un mensaje de commit que decía “half past twelve”
Corrección y eliminación
- Colin Watson, mantenedor de
man-db, primero lo corrigió con el commit 84bde8 para que este easter egg no se activara con man -w
- Después, Colin Watson aplicó un commit para eliminar el easter egg por completo
- El easter egg eliminado estaba previsto que desapareciera en man-db 2.8.0
- El mantenedor consideró que, aunque el easter egg había hecho reír a algunas personas, también había molestado a otras, y que seis años era tiempo suficiente
3 comentarios
Si vas a meter este tipo de easter eggs, también es buena idea verificar una vez si la entrada/salida estándar es un TTY. Si es un script de shell, puedes comprobarlo con
[[ -t 1]].Parece que
manfue traducido como masculino, jaja.Opiniones de Hacker News
Hace tiempo, antes de que la telemedicina se popularizara como ahora, hice una webapp de telemedicina, y tenía una función en la que el paciente completaba un cuestionario en línea y el médico veía las respuestas.
Al incorporar varias especialidades, había una lógica bastante potente para controlar condicionalmente si se mostraban o no ciertas preguntas. Mientras trabajaba en una función para una nueva clínica psiquiátrica, una pregunta que debía mostrarse no aparecía, así que durante la depuración puse junto a la pregunta un montón de textos de debug absurdos y algo enojados.
Creí que había arreglado el problema y limpiado todo, pero dejé una frase que, con cierta combinación de respuestas, aparecía en letras rojas enormes: I SEE YOU!!!. La encontró un paciente que estaba completando el cuestionario de evaluación de paranoia de la nueva clínica psiquiátrica.
Desde entonces empecé a usar marcas de debug como
aaao111.Recuerdo que fue después del legendario incidente de WD, cuando en código de prueba “western digital” se cambió por “woodly doodly” y se desplegó por error.
Durante el desarrollo fallaba solo en una situación muy específica y parecía una condición rara que solo aplicaba al entorno local de desarrollo, así que puse un mensaje de error como “watch and amaze while the application eats itself!”. La frase estaba inspirada en un error que había visto en el juego Discworld para PlayStation.
Pero cuando llegó a producción, la condición que disparaba ese error resultó ser menos especial de lo que pensábamos, y soporte al cliente quedó colapsado por cientos de llamadas de personas que creían que su dinero había desaparecido. Quienes usaban esta función eran apostadores de alto volumen que jugaban mucho dinero, así que a la gerencia tampoco le hizo ninguna gracia.
Por suerte no me despidieron y lo arreglamos rápido, pero sentí la navaja muy cerca del cuello. Aprendí una lección valiosa esa semana, en uno de mis primeros trabajos hace casi 20 años.
# MULTIPASS!.https://github.com/workarea-commerce/workarea/blob/master/co...
El contexto es este: The 5th Element es una gran película, la perra de mi hermana se llamaba Leeloo Dallas Multipass y era mi perra favorita, y yo fui el desarrollador que creó originalmente la funcionalidad de consulta de búsqueda
ProductMultipass.También aprendí que los comentarios divertidos hacen que otros desarrolladores aprecien más el producto.
Es fácil de encontrar con
grepantes de hacer commit y, si por accidente llega a producción, al menos no es una cadena completamente indescifrable.Por suerte no era nada demasiado vergonzoso, y hoy en día, como última revisión antes de hacer commit y push, siempre intento mirar
git diffy buscarprinto salidas similares del lenguaje en cuestión.En la preparatoria, un amigo tenía la costumbre de poner títulos inapropiados a sus borradores de trabajos. Cuando nos corregíamos entre nosotros era gracioso, pero al final una vez olvidó cambiar el título. En clase de inglés, cuando la maestra empezó a pasar recogiendo los trabajos, mi amigo miró su hoja, de pronto dijo que iba al baño y salió corriendo al laboratorio de computación para imprimir otra copia sin el insulto en 24 puntos en la parte superior. Yo casi me moría de risa.
Si el software es gratis y el mantenedor no recibe pago, creo que unos cuantos easter eggs son un precio pequeño.
Claro que Colin sí cobraba, pero no principalmente por mantener
man.En una empresa donde trabajé, un desarrollador puso una frase en los términos y condiciones diciendo que el usuario cedía su alma a la compañía. La intención era ver si los ejecutivos o el equipo legal realmente revisaban los términos como prometían; no lo hicieron, y se capturaron muchas almas.
Programar debería ser divertido, y escribir código también debería ser divertido. Creo que esta gente lo hizo bien.
La idea de que el open source debe ser frío y serio surgió solo cuando las empresas empezaron a impulsarlo. Si hiciera un programa con mi amigo, probablemente pondría easter eggs por todas partes para recordar que al otro lado también hay una persona.
Quien sí se los encuentre lo hará por accidente, como en el texto original, y al autor original se le rompió el pipeline de integración continua. No creo que los easter eggs sean una buena herramienta para recordar que “al otro lado también hay una persona”.
Al menos no fuera del software de entretenimiento.
Sobre todo si aquello en lo que trabajas está rodeado de procesos burocráticos. Personalmente, mi favorito es un Rick Roll que dejé escondido hace años en el código fuente de una aplicación gubernamental que arreglé como consultor. Solo puede encontrarlo un desarrollador que trabaje en un subsistema muy específico, pero si lo descubre entiende por el contexto por qué está ahí.
Es otra razón más para desconfiar del software que integra varias piezas con procesos de ingeniería distintos en aplicaciones críticas para la seguridad de vidas o esenciales para una misión.
Ya no está incluido.
Colin Watson, desarrollador de
man-db, consideró que ya había sido suficientemente divertido y que la historia no se iba a olvidar, así que eliminó por completo el easter egg.https://git.savannah.gnu.org/cgit/man-db.git/commit/?id=b225...
Decía que deberíamos conservar easter eggs como este, porque al final son cosas así las que distinguen a los humanos de las máquinas.
Artículos relacionados:
Why does man print “gimme gimme gimme” at 00:30? (2017) - https://news.ycombinator.com/item?id=27994194 - julio de 2021, 211 comentarios
Why does man print “gimme gimme gimme” at 00:30? - https://news.ycombinator.com/item?id=15747313 - noviembre de 2017, 159 comentarios
Why does man print “gimme gimme gimme” at 00:30? - https://news.ycombinator.com/item?id=15746972 - noviembre de 2017, 1 comentario
Why does man print “gimme gimme gimme” at 00:30? - https://news.ycombinator.com/item?id=15742221 - noviembre de 2017, 1 comentario
Es una idea divertida, pero no debería estar en el flujo normal de ejecución. Perjudica al usuario
Como dijo el autor del post original, habría sido mejor que fuera
man -abbaPero por error también se activaba cuando se especificaba la manpage con la bandera
--pathen lugar del nombre de la página$ man --abba --format=json["gimme", "gimme", "gimme"]Esta actualización rompió mi flujo de trabajo
mandespués de medianocheAl eliminar el sistema telefónico antiguo, instalé FreePBX en la empresa
Como no había muchas extensiones, usamos 1xx, 2xx y 3xx para distintos tipos de extensiones y aun así sobraban muchos números, así que agregué un pequeño easter egg: si alguien llamaba a la extensión 666, se reproducía la risa aterradora de Vincent Price del final de Thriller de Michael Jackson
Uno o dos años después, una madrugada, un compañero me mandó un mensaje diciendo que parecía que habían hackeado el teléfono, y que sin importar a dónde llamara se escuchaba una voz aterradora. Al revisar, resultó que algo había salido mal y todas las llamadas estaban siendo redirigidas a la última extensión agregada, la 666
Obviamente a la gente no le pareció divertido el easter egg, y se sintieron ofendidos por la risa
Me pregunto si alguien tiene una hipótesis de por qué había una prueba que llamaba a
mansin argumentos¿El objetivo era simplemente comprobar que
manestuviera instalado? Aun así, uno pensaría que probarían el comando de la forma en que normalmente se usa--pathLuego eso se corrigió y, más adelante, se eliminó todo el easter egg
man -wmanprodujera la salida esperadaCreo que, para determinar si
manterminó correctamente, basta con confiar en el código de salidaJuzgarlo por la longitud de
stderrsiempre es frágil