A nova geração das Funções ZZ

Sabe as Funções ZZ? É um programinha que criei em fevereiro de 2000. Ele faz um monte de coisas, como gerar senhas, gerar e validar CPF/CNPJ, buscar notícias na Internet, obter o resultado da Mega-Sena, consultar a Wikipédia, pesquisar no Google, traduzir textos, … Enfim. Faz um monte de coisas :)

Mês passado este programa completou oito anos de existência. Oito anos… Nem eu acredito. É, estou ficando velho…

Preocupações senis à parte, as funções resistiram bravamente à obsolescência, durante tantos anos, por causa dos usuários. Se poucas pessoas o utilizassem, este programa já teria sido aposentado. Mas como há bastante usuários ativos que escrevem agradecendo, dando idéias e apontando problemas, isso é um incentivo para continuar.

Mesmo assim, não é fácil. Dá muito trabalho manter tudo atualizado e funcionando, pois são mais de 60 funções (miniprogramas) diferentes para cuidar. O Thobias entrou em 2003 para me ajudar, mas mesmo programando em dupla, é uma carga pesada. Com uma média vergonhosa de uma versão nova por ano, 2006 e 2007 passaram lentos para as Funções ZZ.

Grande parte dessa dificuldade na manutenção deve-se a uma “brilhante” idéia deste ser que vos escreve. Desde o início, resolvi fazer do código-fonte algo, digamos, compacto. Veja um exemplo:

zztrocaarquivos(){ zzzz -z $1 zztrocaarquivos && return
[ "$2" ] || { echo 'uso: zztrocaarquivos arquivo1 arquivo2'; return; }
local at="$ZZTMP.$$"; cat "$2" > $at; cat "$1" > "$2"; cat "$at" > "$1"
rm $at; echo "feito: $1 <-> $2"
}

A função zztrocaarquivos serve para trocar dois arquivos de lugar. Mas eu não precisava dizer, pois isso está claro ali no código-fonte. O que, não entendeu nada? Nem eu :)

Agora imagine mais de 60 monstrinhos do naipe desse, só que maiores e mais complexos. Assim fica fácil perceber o quão trabalhoso era fazer qualquer alteração no código. Era preciso atenção tripla para encontrar exatamente onde e o quê alterar.

Percebemos tarde que isso era um problema. Eu explico. Existe uma época na vida do programador, quando ele ainda é um aprendiz-padawan, em que códigos feios, grudados e incompreensíveis são “legais”. Há um prazer narcisista quando alguém olha seu código e diz que não entendeu nada. Você se sente fodão. Felizmente essa fase passa :)

Mas reconhecer o problema não era suficiente, pois o número exagerado de funções tornava a tarefa de “limpar a casa” algo muito trabalhoso. Era mais fácil continuar com o código porco do que arrumar mais de 60 funções. E assim ficaria, ad infinitum.

Entra o livro de shell na história.

Estava eu lá por Julho de 2007 escrevendo o mítico livro, argumentando que um código profissional deve ser bem alinhado, limpo, bonito e comentado, para facilitar sua manutenção.

Você já percebeu o que vai acontecer né? :)

De repente, caiu a ficha. Lembrei das ZZ e comecei a sentir vergonha. Que moral eu tenho para falar em código bonito se meu programa mais conhecido pelos shelleiros tem um código sopa-de-letrinhas? Casa de ferreiro…

Fui obrigado a resolver de vez o problema. Parei a escrita do livro e fiquei vários dias trabalhando no código das funções, reformatando, alinhando, colocando comentários, melhorando os nomes de variáveis, trocando algoritmos enigmáticos por versões simplificadas. Enfim, aquela reforma geral bonita de ver, de desmontar o jipe até os chassis, não sobrando nenhum parafuso no lugar.

Veja como ficou a zztrocaarquivos depois da reforma:

zztrocaarquivos ()
{
	zzzz -h trocaarquivos $1 && return

	# Um terceiro arquivo é usado para fazer a troca
	local tmp="$ZZTMP.trocaarquivos.$$"

	# Verificação dos parâmetros
	[ "$#" -eq 2 ] || { zztool uso trocaarquivos; return; }

	# Verifica se os arquivos existem
	zztool arquivo_legivel "$1" || return
	zztool arquivo_legivel "$2" || return

	# Tiro no pé? Não, obrigado
	[ "$1" = "$2" ] && return

	# A dança das cadeiras
	cat "$2"   > "$tmp"
	cat "$1"   > "$2"
	cat "$tmp" > "$1"

	# E foi
	rm "$tmp"
	echo "Feito: $1 <-> $2"
}

Volte um pouco o texto e veja a versão antiga. Não tem nem como comparar, né?

A versão nova está fácil de ler, entender e alterar. Cada trecho está claramente identificado e separado dos demais. Comentários em português esclarecem o código em shell. Se der algum problema, será fácil encontrar o ponto certo para alterar.

Ainda teve outra vantagem: vários problemas (bugs) com as funções apareceram durante o processo. Eram exceções que estavam escondidas no código feio, difíceis de perceber, mas na limpeza apareceram e puderam ser corrigidos. Código limpo é outro nível. Agora eu aprendi, tá? :)

Eu não devia contar para não estragar a surpresa, mas não me agüento… Outro benefício dessa reforma foi que, agora com o código legível, é possível entender como fazer algumas tarefas avançadas em shell script. A experiência leva ao aprimoramento, então há muitas pérolas por ali. Não confundir com perl. Então, há um capítulo inteiro do livro de shell dedicado a esmiuçar estas pérolas do código das ZZ. A mágica foi explicada :)

Já que o código não é mais intimidador, esperamos também receber mais contribuições de outros programadores. Se você encontrou algum problema ou quer uma opção nova, que tal dar uma olhadinha no código? Ficou mais fácil modificar as funções. Só não se esqueça de nos enviar as melhorias para que todos os usuários possam usufruir delas!

E último, porém não menos importante, agora o código das funções também é uma excelente fonte de estudo para quem quer aprender shell script. Se um exemplo vale mais do que mil man pages, ali você tem dezenas de miniprogramas prontos para serem estudados e dominados. Curte shell? Então não deixe de conferir a versão nova 8.3 das Funções ZZ!

Este lançamento marca uma nova fase das funções. Além do código refeito, outras novidades marcantes são:

  • Migração definitiva para a codificação UTF-8. Somos conservadores e esperamos bastante tempo para abandonar o bom e velho ISO-8859-1, mas agora foi. Porém, ainda disponibilizamos uma versão especial para quem tem sistemas mais antigos, para não deixar ninguém na mão.
  • Funcionamento garantido. Foi criada uma suíte de testes automatizada que conta com 587 verificações, fazendo um controle de qualidade rigoroso nas funções. Uma equipe de voluntários roda estes testes em diversos sistemas, ajudando a encontrar e resolver problemas. As funções que não puderam ser arrumadas foram removidas, para evitar a frustração do usuário.
  • Há duas funções novas. A zzbyte serve para fazer conversões entre grandezas de bits, na escala de byte até yota. Quantos bytes têm em 2 mega? São 2097152. A zztool é uma miniferramenta que serve para validação de textos e arquivos. Por exemplo, “zztool testa_ip” verifica se o texto informado é um número IP.
  • Há uma loooooooonga lista de melhorias, se você quiser saber exatamente o que mudou desde a última versão. Mas prepare-se, pois cansa :)

Para completar o pacote de grandes mudanças, o site das Funções ZZ também foi reformado, contando agora com um formato mais intuitivo e fácil de encontrar as informações.

  • Se você já usa as funções, atualize agora! Garanto que você não vai se arrepender.
  • Se nunca usou, que tal visitar o site agora para conhecê-las? Deve ter alguma função lá que lhe seja útil.
— EOF —

Gostou desse texto? Aqui tem mais.