2 pontos por GN⁺ 2024-10-05 | 3 comentários | Compartilhar no WhatsApp
  • O motivo de os testes automáticos falharem apenas às 00:30 era que man -w também imprimia a string inesperada em stderr gimme gimme gimme
  • Essa string era um easter egg do man, que aparecia às 00:30 no horário local ao executar sem uma página de manual ou ao usar -w
  • A frase veio de “Gimme! Gimme! Gimme! (A Man After Midnight)”, do ABBA, e uma piada no Twitter em 2011 acabou sendo incorporada ao código do man-db
  • man -w imprimia o manpath e retornava código de saída 0, então podia ser usado em automações, mas o easter egg podia quebrar o parsing da saída
  • O man-db primeiro corrigiu o problema para não disparar com man -w e, depois, decidiu remover completamente o easter egg no man-db 2.8.0

Teste que falhava só às 00:30

  • O teste automático funcionava normalmente na maior parte do tempo, mas falhava apenas quando era executado às 00:30
  • A causa direta era a adição de uma string inesperada em stderr
gimme gimme gimme
  • O comando usado no teste era man -w, com o objetivo de obter o manpath atual

O easter egg que existia no man

  • A string em questão era um easter egg embutido no comando man
  • As condições de ativação eram as seguintes
    • Executar man sem especificar uma página de manual
    • Ou executar man -w
    • O horário local ser 00:30
  • Quando essas condições eram atendidas, gimme gimme gimme era impresso em stderr
# date +%T -s "00:30:00"
00:30:00


# man -w
gimme gimme gimme
/usr/local/share/man:/usr/share/man:/usr/man
  • Mesmo nesse caso, o código de saída permanecia em 0

O comportamento originalmente esperado

  • A saída normal de man -w é retornar apenas o caminho de busca das páginas de manual
# man -w
/usr/local/share/man:/usr/share/man:/usr/man


# echo $?
0
  • Ao executar man sem página, o comportamento esperado é perguntar qual página de manual você quer e retornar código de saída 1
# man
What manual page do you want?


# echo $?
1
  • Como man -w imprime o caminho de busca, ele podia ser usado para verificar a instalação de páginas de manual ou como componente de automação de testes

Código e alcance nas distribuições

  • A string foi encontrada em RHEL, OpenSUSE, Fedora, Debian e outras, ou seja, não era um comportamento específico de uma única distribuição
  • Era possível verificar sua presença fazendo grep da string no binário
  • A saída era gerada pelo código em src/man.c do 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");

String vinda de uma música do ABBA e de um tuíte

  • gimme gimme gimme veio de “Gimme! Gimme! Gimme! (A Man After Midnight)”, do ABBA
  • Marnanel Thurman sugeriu em tom de brincadeira, em um tuíte de 2011, que executar man às 00:01 deveria imprimir gimme gimme gimme
  • O mantenedor do man colocou a ideia no código de verdade
  • Comentários complementam que o commit inicial disparava às 00:01 e depois foi alterado para 00:30 com a mensagem de commit “half past twelve”

Correção e remoção

  • O mantenedor do man-db, Colin Watson, primeiro corrigiu isso para que o easter egg não disparasse em man -w, por meio do commit 84bde8
  • Depois, Colin Watson aplicou um commit que remove completamente o easter egg
  • O easter egg removido deixaria de existir a partir do planejado man-db 2.8.0
  • O mantenedor avaliou que o easter egg divertiu algumas pessoas, mas irritou outras, e que 6 anos já tinha sido tempo suficiente

3 comentários

 
tribela 2024-10-07

Se vão colocar esse tipo de easter egg, também é uma boa verificar se a entrada/saída padrão é um TTY. Em shell script, dá para validar com [[ -t 1]].

 
y15un 2024-10-05

man foi traduzido como homem mesmo, haha

 
GN⁺ 2024-10-05
Opiniões no Hacker News
  • Antigamente, antes de a telemedicina se popularizar como hoje, criamos um web app de telemedicina, e havia um recurso em que o paciente preenchia um questionário online e o médico via as respostas.
    Ao integrar várias especialidades, tínhamos uma lógica bem poderosa para controlar condicionalmente se as perguntas seriam exibidas ou não. Enquanto eu trabalhava em recursos para uma nova clínica psiquiátrica, uma pergunta que deveria aparecer não aparecia; durante a depuração, coloquei ao lado das perguntas um monte de mensagens de debug absurdas e meio irritadas.
    Achei que tinha corrigido o problema e limpado tudo, mas deixei uma mensagem que, sob uma combinação específica de respostas, aparecia em letras vermelhas grandes: I SEE YOU!!!. Ela foi encontrada por um paciente que estava preenchendo o questionário de avaliação de paranoia da recém-inaugurada clínica psiquiátrica.
    Depois disso, passei a usar marcadores de debug como aaa ou 111.

    • No Google, era obrigatório colocar DO NOT SUBMIT em strings usadas para depuração, e depois que uma string de debug foi parar em produção foi adicionado um bot para verificar isso.
      Pelo que me lembro, foi depois do lendário incidente da WD, em que “western digital” foi trocado por “woodly doodly” no código de teste e acabou sendo implantado por engano.
    • Fiz algo parecido antigamente, quando trabalhava em um site de apostas e criei um recurso para que as pessoas pudessem enviar apostas em massa usando um arquivo especial.
      Durante o desenvolvimento, ele quebrava apenas em uma situação muito específica, e parecia uma condição estranha restrita ao ambiente local de desenvolvimento; então coloquei uma mensagem de erro como “watch and amaze while the application eats itself!”. A frase foi inspirada em um erro que eu tinha visto no jogo Discworld para PlayStation.
      Só que, quando foi para produção, a condição que disparava o erro era bem menos específica do que parecia, e o suporte ao cliente ficou paralisado por centenas de pessoas ligando achando que o dinheiro tinha desaparecido. As pessoas que usavam esse recurso eram apostadores de alto valor, que apostavam muito dinheiro, então a diretoria também não gostou nada.
      Felizmente não fui demitido e corrigi rápido, mas foi como sentir a lâmina chegando perto do pescoço. Aprendi uma lição valiosa naquela semana, em um dos meus primeiros empregos, há quase 20 anos.
    • Havia um comentário que deixei por muito tempo neste arquivo, mas o líder do projeto, que era uma pessoa bem profissional, acabou removendo. O comentário era # MULTIPASS!.
      https://github.com/workarea-commerce/workarea/blob/master/co...
      O contexto é este: The 5th Element é um filme ótimo, o cachorro da minha irmã se chamava Leeloo Dallas Multipass e era meu cachorro favorito, e fui eu o desenvolvedor que criou primeiro a funcionalidade de consulta de busca ProductMultipass.
      Também aprendi que comentários engraçados fazem outros desenvolvedores gostarem mais do produto.
    • Como marcador de debug, normalmente uso minhas iniciais junto com DEBUG.
      É fácil de encontrar com grep antes do commit e, se por acaso chegar ao ambiente de produção, não é uma string completamente indecifrável.
    • Com certeza já comitei mensagens de debug, e acho que quase todo mundo que escreve código já fez isso pelo menos uma vez.
      Felizmente não era nada muito constrangedor; hoje em dia, como última checagem antes de commitar e fazer push, sempre olho o git diff e procuro por print ou saídas equivalentes da linguagem em questão.
      No ensino médio, um amigo tinha o hábito de dar títulos inadequados aos rascunhos dos trabalhos. Era engraçado quando revisávamos um do outro, mas uma vez ele acabou esquecendo de trocar o título de volta. Quando a professora de inglês começou a passar recolhendo os trabalhos, ele olhou para a própria folha, de repente disse que ia ao banheiro e saiu correndo para a sala de informática para imprimir de novo uma cópia sem um palavrão em 24 pontos no topo; eu quase morri de rir.
  • Se o software é gratuito e os mantenedores não são pagos, considero alguns easter eggs um pequeno preço a pagar.
    Claro que Colin estava sendo pago, mas não era principalmente para manter o man.
    Em uma empresa onde trabalhei certa vez, um desenvolvedor colocou nos termos de serviço uma frase dizendo que o usuário transferia sua alma para a empresa. A intenção era ver se a diretoria ou o jurídico realmente revisavam os termos como prometido; não revisaram, e muitas almas foram capturadas.

    • Isso poderia tornar os termos de serviço inteiros inválidos.
  • Programar deve ser divertido, e escrever código também deve ser divertido. Acho que essas pessoas mandaram bem.
    A ideia de que open source precisa ser frio e sério só surgiu porque as empresas passaram a conduzir isso. Se eu estivesse criando um programa com um amigo, acho que espalharia easter eggs por aí para lembrar que há uma pessoa do outro lado.

    • Como eles ficam escondidos, a maioria das pessoas não vai encontrar esses easter eggs.
      Quem encontra acaba tropeçando por acaso, como no post original, e no post original o pipeline de integração contínua quebrou. Acho que easter eggs são uma ferramenta ruim para lembrar que “há uma pessoa do outro lado”.
      Pelo menos fora de software de entretenimento.
    • Poucas coisas são tão divertidas e satisfatórias quanto um easter egg bem escondido.
      Especialmente quando aquilo em que você está trabalhando é cercado por processos burocráticos. Meu favorito pessoal é um Rick Roll que escondi no código-fonte de uma aplicação governamental que corrigi em uma consultoria alguns anos atrás. Só desenvolvedores que trabalham em um subsistema bem específico conseguem encontrá-lo, mas, quando encontram, entendem pelo contexto por que ele está ali.
    • Um easter egg divertido para alguém pode ser, para outra pessoa, um gatilho de mau funcionamento não determinístico que gera consequências reais no fluxo de trabalho dela.
      Mais um motivo pelo qual é difícil confiar, em aplicações críticas para a segurança de vidas ou para a missão, em software que integra várias partes com processos de engenharia diferentes.
  • Ele já não está mais lá.
    Colin Watson, desenvolvedor do man-db, concluiu que a piada já tinha sido suficientemente divertida e que a história não seria esquecida, então removeu completamente o easter egg.
    https://git.savannah.gnu.org/cgit/man-db.git/commit/?id=b225...

    • Lembro de ter lido um comentário bonito nessa discussão da issue, que hoje não consigo mais encontrar.
      Dizia que easter eggs como esse deveriam ser mantidos, porque no fim são coisas assim que distinguem humanos de máquinas.
    • Acabei de testar em um Raspberry Pi antigo e ainda está lá. É baseado no Debian 9 Stretch.
  • Posts relacionados:
    Why does man print “gimme gimme gimme” at 00:30? (2017) - https://news.ycombinator.com/item?id=27994194 - julho de 2021, 211 comentários
    Why does man print “gimme gimme gimme” at 00:30? - https://news.ycombinator.com/item?id=15747313 - novembro de 2017, 159 comentários
    Why does man print “gimme gimme gimme” at 00:30? - https://news.ycombinator.com/item?id=15746972 - novembro de 2017, 1 comentário
    Why does man print “gimme gimme gimme” at 00:30? - https://news.ycombinator.com/item?id=15742221 - novembro de 2017, 1 comentário

  • É uma ideia divertida, mas não deve ser colocada no fluxo normal de execução. Prejudica o usuário
    Como o autor do post original disse, teria sido melhor se fosse man -abba

    • Pelo primeiro comentário, originalmente a intenção era disparar apenas em uma situação de erro, ou seja, quando nenhuma página fosse especificada
      Mas, por engano, também disparava quando a manpage era especificada com a flag --path em vez do nome da página
    • $ man --abba --format=json
      ["gimme", "gimme", "gimme"]
    • Foi removido. Referência: https://news.ycombinator.com/item?id=41738239
  • Essa atualização quebrou meu fluxo de trabalho

    • Graças a essa atualização, meu fluxo de trabalho foi corrigido. Eu precisava do man depois da meia-noite
  • Ao desativar o antigo sistema telefônico, instalei FreePBX na empresa
    Como não havia muitos ramais, mesmo usando 1xx, 2xx e 3xx como ramais por categoria, ainda sobravam muitos números; então coloquei um pequeno easter egg que tocava a risada assustadora de Vincent Price no final de Thriller, de Michael Jackson, quando alguém ligava para o ramal 666
    Um ou dois anos depois, bem cedo de manhã, um colega me mandou mensagem dizendo que achava que o telefone tinha sido hackeado e que, para qualquer lugar que ligasse, ouvia uma voz assustadora. Fui verificar e, por algum motivo, todas as chamadas estavam sendo encaminhadas para o último ramal que eu havia adicionado, o 666
    Naturalmente, as pessoas não acharam o easter egg engraçado e se sentiram insultadas pela risada

  • Fico curioso se alguém tem alguma hipótese de por que havia um teste chamando man sem argumentos
    O objetivo era apenas verificar se o man estava instalado? Mesmo assim, acho que testariam o comando do jeito como ele é normalmente usado

    • Lendo a resposta, parece que o easter egg também era acionado por engano quando a página a carregar era passada via --path
      Depois isso foi corrigido e, mais tarde, o easter egg inteiro foi removido
    • A própria pergunta no Stack Overflow parece ter sido uma pergunta forçada para permitir que outra pessoa contasse publicamente a própria história
    • Isso foi tratado em detalhes nos comentários da pergunta linkada no Stack Overflow; resumindo, era porque queriam o manpath: man -w
    • Também pode ter sido um teste automatizado para verificar se a imagem de build tinha sido instalada corretamente e se o man produzia a saída esperada
  • Para determinar se o man terminou corretamente, acho que dá para confiar no código de saída
    Julgar pelo tamanho de stderr é sempre frágil