- 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
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]].manfoi traduzido como homem mesmo, hahaOpiniõ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
aaaou111.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.
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.
# 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.
É fácil de encontrar com
grepantes do commit e, se por acaso chegar ao ambiente de produção, não é uma string completamente indecifrável.Felizmente não era nada muito constrangedor; hoje em dia, como última checagem antes de commitar e fazer push, sempre olho o
git diffe procuro porprintou 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.
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.
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.
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.
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...
Dizia que easter eggs como esse deveriam ser mantidos, porque no fim são coisas assim que distinguem humanos de máquinas.
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 -abbaMas, por engano, também disparava quando a manpage era especificada com a flag
--pathem vez do nome da página$ man --abba --format=json["gimme", "gimme", "gimme"]Essa atualização quebrou meu fluxo de trabalho
mandepois da meia-noiteAo 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
mansem argumentosO objetivo era apenas verificar se o
manestava instalado? Mesmo assim, acho que testariam o comando do jeito como ele é normalmente usado--pathDepois isso foi corrigido e, mais tarde, o easter egg inteiro foi removido
man -wmanproduzia a saída esperadaPara determinar se o
manterminou corretamente, acho que dá para confiar no código de saídaJulgar pelo tamanho de
stderré sempre frágil