Automatize a investigação de bugs com git bisect

Muitas vezes bugs acabam sendo introduzidos inadvertidamente em um projeto mesmo após passarem pelos testes unitários, eventualmente sendo descobertos somente após a execução de testes de integração, performance ou e2e na CI.

Nem sempre é fácil encontrar qual foi o commit causador do problema, dependendo do volume de alterações do projeto, práticas internas de engenharia de software e do número de desenvolvedores trabalhando no código.

Felizmente o git tem uma ferramenta bastante prática para automatizar o processo de encontrar o commit problemático: git bisect.

O git bisect é uma funcionalidade do git que usa um algoritmo de busca binária para “navegar” pelo histórico de commits do projeto e encontrar qual o commit problemático (não sabe o que é busca binária? Aprenda aqui).

Para isso o git bisect precisa de duas informações: um commit “ruim” (o hash do commit onde o problema ocorre) e um commit “bom” (o hash do commit onde o problema não ocorre). Tendo essas informações em mãos você pode rodar: git bisect start "ruim" "bom" e ele vai fazer o checkout dos commits para você.

Aí, basta você executar os comandos para compilar e testar a aplicação (por exemplo: “mvn clean verify“). Se o teste passar, você deve marcar o commit como bom (git bisect good). Caso ele falhe, você deve marcar o commit como ruim (git bisect bad). Após rodar um desses dois comandos para marcar o commit como bom ou ruim, ele vai prosseguir para o próximo commit no histórico.

Você deve repetir o processo até que ele termine de navegar pela lista de commits e lhe mostre qual foi o primeiro commit problemático que introduziu o problema.

Mas peraí, eu falei que o lance era automatizar a investigação de bugs, e esse processo parece muito manual né? É aí que entra o git bisect run. Essa funcionalidade permite que você forneça um script que teste o projeto. O script tem um requisito básico: o script deve retornar 0 para marcar um commit como bom, e um valor entre 1 e 127 para marcar um commit como ruim.

Por exemplo, suponha que você precise usar o docker-compose para subir a infra de testes, então rodar o build e os testes, e depois de executado encerrar a execução dessa infraestrutura. Para isso, você usaria um script parecido com esse aqui.

E, então, basta rodar o script usando o seguinte comando: git bisect run meu-script-de-testes.sh.

cf63ab12cbe3cfa598fcb83e6447c3c39718b3a4 is the first bad commit
commit cf63ab12cbe3cfa598fcb83e6447c3c39718b3a4
Author: Otavio R. Piske some-email@domain.com
Date: Wed Jun 28 09:05:14 2022 +0300

Added support for whatever in module foo.

Dependendo de quão grande é seu projeto, esse processo pode demorar um pouco. Então, agora basta sair para tomar um café, ler as notícias do dia ou fazer uma thread legal no Twitter, enquanto o git bisect procura o commit problemático para você.

Trocando rapidamente a placa de saída de audio no Mountain Lion

Algumas semanas atrás eu comprei um headset e uma placa de audio USB para usar o Skype e ouvir música sem incomodar meus vizinhos. Porém, ter que ficar abrindo as preferências de som (sound preferences) me incomodava demais.

Fuçando pelo OS X eu descobri que ao segurar Alt Option e clicar no ícone de som é possível trocar qual a placa de som vai ser utilizada sem precisar abrir as preferências de sistema. O resultado, é semelhante a isso aqui

Opções de som
Opções de som

Configuração de teclado BR ABNT2 no Evev

Dica de última hora para quem ficou muito tempo afastado 🙂 e nunca mexeu com o evdev: para configurar o suporte a BR ABTN2 no Evev você pode fazer o seguinte:

cp /usr/share/hal/fdi/policy/10osvendor/10-keymap.fdi /etc/hal/fdi/policy/

Editar as linhas de configuração do teclado. Ficará mais ou menos assim:

<merge key="input.xkb.layout" type="string">br</merge>
 <merge key="input.xkb.variant" type="string" />

Reinicie o daemon do hal e pronto.

Excelente desfragmentador para Windows

De vez em quando eu acabo eu acabo encontrando alguns programas para Windows realmente muito bons. Hoje foi o caso, enquanto procurava uma ferramenta pra melhorar o desempenho do micro da minha mãe acabei encontrando o Ultimate Defrag, da Disk Trix. A boa notícia sobre o programa é que ele é completamente grátis, inclusive para uso pessoal comercial. Basta preencher o formulário de cadastro e você pode baixa-lo aqui.

Dicas: diminuindo o uso da CPU no dd-wrt

Depois de ter instalado o DD-WRT, eu tive alguns probleminhas devido ao uso excessivo da CPU. Aqui vão duas dicas rápidas para quem quiser diminuir o uso da CPU noLinkSys WRT54G v6 rodando a DD-WRT v24:

  1. Desabilite o suporte q QoS
  2. Use WEP ao invés de WPA2*

No meu caso, o roteador que estava com um load average em torno de 3 a 4, caiu para menos de 1.5, como é possível ver no “copy/paste” abaixo, copiado de um momento em que meus micros estão fazendo vários downloads, aumentando o uso da CPU do roteador.

Firmware:
DD-WRT v24-sp1 (07/27/08) micro
Time:   22:41:05 up 31 min, load average: 0.34, 0.76, 0.74
WAN IP: 192.168.1.64

Como vocês podem ver, o uso da CPU caiu consideravelmente.

*Obs.: Não posso confirmar com 100% de que essa configuração realmente diminuiu o uso da CPU – e também não recomendo pois é mais inseguro que o WPA2 – mas listo aqui como sugestão e registro histórico de algo que eu fiz e aparentemente ajudou a resolver o problema.

Documentando com Docbook: aprofundando seu conhecimento

Interessado em documentar sua aplicação utilizando o formato DocBook? Aqui vão alguns links, em inglês, para aprofundar seu conhecimento a respeito (por ordem de relevância e facilidade):

Gnome Handbook Of Writing Software Documentation

The KDE Docbook Authors Guide

Introducing DocBook

http://wiki.docbook.org/topic/DocBookTutorials

DocBook Demystification HOWTO

DocBook On Windows Bliss

DocBook XSL: The Complete Guide

Sincronizando o Nokia 5310 Express Music no Linux

Eu já tinha conseguido sincronizar meu Nokia 5310 com o Mac OS X, mas ainda não tinha conseguido fazer o mesmo com o Linux. Aqui vão algumas das coisas que você vai precisar (obs.: não chega a ser um tutorial, é apenas um guia simples indicando o que é preciso):

1) Você vai precisar dos seguintes módulos no kernel:
módulos: usbcore, usbserial, cdc_acm, ohci_hcd

2) Programas:
gnokii, libopensync-plugin-gnokii, libopensync-plugin-evolution2, msynctool

3) Configuração do telefone: no site do gnokii não existe a configuração específica para o Nokia 5310, mas você pode usar a do 5140, disponível em http://wiki.gnokii.org/index.php/Nokia5140Config.

4) Depois de configurado, teste o telefone:

otavio@venus ~ $ gnokii --identify
GNOKII Version 0.6.22
IMEI         :  xxxxxxxxxxxxxxxxxxxxxxxxxxx
Manufacturer : Nokia
Model        : Nokia 5310 XpressMusic
Product name : Nokia 5310 XpressMusic
Revision     : V 03.63

5) Agora que o celular foi reconhecido, proceda com a configuração da libopensync, conforme descrito em http://www.opensync.org/wiki/Evo2-File.

6) Configure seu organizador pessoal. Isso vai depender do qual você usa. Para os testes que eu fiz, utilizei o Evolution e a sincronização funcionou sem problemas. Não vou entrar em detalhes da configuração, pois varia de aplicação pra aplicação.

Blog sobre Perl

Meu colega Vinicius, um grande entusiasta do Perl e um hacker no melhor sentido da palavra, está escrevendo um blog sobre Perl, desmistificando os detalhes da linguagem e quebrando várias concepções erradas desta linguagem (muitas das quais, admito, eu mesmo tinha até pouco tempo atrás). Recomendo seriamente.