2 puntos por GN⁺ 2024-10-05 | 3 comentarios | Compartir por WhatsApp
  • 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

 
tribela 2024-10-07

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]].

 
y15un 2024-10-05

Parece que man fue traducido como masculino, jaja.

 
GN⁺ 2024-10-05
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 aaa o 111.

    • En Google, las cadenas usadas para depuración debían incluir DO NOT SUBMIT, y después de que una cadena de debug llegara a producción se agregó un bot para revisarlas.
      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.
    • Me pasó algo parecido hace tiempo, cuando en un sitio de apuestas hice una función para que la gente pudiera subir apuestas en masa mediante un archivo especial.
      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.
    • Había un comentario que dejé durante mucho tiempo en este archivo, pero el líder del proyecto, que era bastante profesional, lo borró. El comentario era # 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.
    • Como marca de debug normalmente uso mis iniciales junto con DEBUG.
      Es fácil de encontrar con grep antes de hacer commit y, si por accidente llega a producción, al menos no es una cadena completamente indescifrable.
    • Definitivamente alguna vez hice commit de mensajes de debug, y creo que la mayoría de quienes escriben código lo ha hecho al menos una vez.
      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 diff y buscar print o 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.

    • Entonces eso podría hacer que todos los términos y condiciones sean inválidos.
  • 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.

    • Como están ocultos, la mayoría de la gente no se topará con esos easter eggs.
      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.
    • Hay pocas cosas tan divertidas y satisfactorias como un easter egg bien escondido.
      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í.
    • Un easter egg divertido para alguien puede ser, para otra persona, un disparador de mal funcionamiento no determinista que produzca consecuencias reales en su flujo de trabajo.
      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...

    • En la discusión de ese issue leí una vez un comentario hermoso que ahora no logro encontrar.
      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.
    • Acabo de probarlo en una Raspberry Pi vieja y todavía está. Está basada en Debian 9 Stretch.
  • 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 -abba

    • Viendo la primera respuesta, originalmente la intención era que se activara solo en una situación de error, es decir, cuando no se especificaba ninguna página
      Pero por error también se activaba cuando se especificaba la manpage con la bandera --path en lugar del nombre de la página
    • $ man --abba --format=json
      ["gimme", "gimme", "gimme"]
    • Fue eliminado. Referencia: https://news.ycombinator.com/item?id=41738239
  • Esta actualización rompió mi flujo de trabajo

    • Esta actualización arregló mi flujo de trabajo. Necesitaba man después de medianoche
  • Al 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 man sin argumentos
    ¿El objetivo era simplemente comprobar que man estuviera instalado? Aun así, uno pensaría que probarían el comando de la forma en que normalmente se usa

    • Leyendo las respuestas, parece que el easter egg también se activaba por error al pasar la página a cargar con --path
      Luego eso se corrigió y, más adelante, se eliminó todo el easter egg
    • La pregunta de Stack Overflow en sí parece haber sido una pregunta forzada para que otra persona pudiera contar públicamente su historia
    • En los comentarios de la pregunta enlazada de Stack Overflow se trató el tema en detalle y, en resumen, era porque querían manpath: man -w
    • También pudo haber sido una prueba automatizada para verificar que la imagen de build estuviera instalada correctamente y que man produjera la salida esperada
  • Creo que, para determinar si man terminó correctamente, basta con confiar en el código de salida
    Juzgarlo por la longitud de stderr siempre es frágil