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.




MiGuXeiToR
Engripeitor
Embriagueitor

Publicado por giseli em 5 Março 2008 às 12:56
Aurélio, ficou mesmo boa a reforma! :) E ainda bem que respondeu ao ping hehe, já estava sentindo falta dos seus posts (se bem que ainda não tive tempo de fuçar o site inteiro), são excelentes!
Publicado por Jônatas em 5 Março 2008 às 13:39
3 posts em uma semana. Que legal.
Publicado por Rodrigo Reis em 5 Março 2008 às 14:27
Ae Aurélio. Que bom que voltou.
Vou esperimentar o Funções ZZ em breve.
Abraços
Publicado por Ademar em 5 Março 2008 às 15:53
Ohh!!
Que bom que você limpou o código. Não foram poucas as vezes que eu tive problemas com as funcoeszz mas te xinguei até a última geração na hora que fui tentar hackear o código (e eventualmente desisti de usá-las).
Essa merecia um upgrade de versão pra 9.0, mas como imagino que o 8 reflita a idade da funcoes-zz, dá pra ficar com 8.3 mesmo.
Parabéns, ficamos no aguardo do livro. :-)
Publicado por Aurélio Jargas em 5 Março 2008 às 16:12
Oi Ademar!
Sabe, eu mesmo me xingava às vezes, quando olhava e não entendia… Sei que você é casado, mas espero que agora as ZZ possam ter uma segunda chance contigo :)
Quanto à versão é ano 8 mês 3 (março de 2008), pra facilitar.
Abração!
Publicado por Fabio em 5 Março 2008 às 18:31
Ainda não li,mas dá pra ver que o Aurélio voltou com todo gás. Nova versão do Funções ZZ, um post desse tamanhão…
Publicado por eljunior em 5 Março 2008 às 19:39
baaaaaita!
valeu, cara!
é agora que eu volto pras ZZ! :)
Publicado por any em 5 Março 2008 às 23:40
The green nerd voltou então, eu vôooooltei…
.
– “fala” o Aurélio…
.
– obter o resultado da Mega-Sena,
Legal! Com quantas semanas de antecedência se consegue o resultado? ;)
.
– Desde o início, resolvi fazer do código-fonte algo, digamos, compacto.
Gostava da old way, era interessante desmontar aqueles blocos.
.
– 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
Não era melhor temporalmente, e até didaticamente, por a mão apenas no necessário para resolver problemas e deixar o ok, para mostrar o contraste entre estilos na fase de transição!?
.
– Comentários em português esclarecem o código em shell.
São só em portugues?
Duplicações seriam perda de tempo.
Seu código é para o mundo, não acha que os fuçadores dele poderiam captar sem problema o idioma global e seriam assim, em número bem maior?
.
– Código limpo é outro nível. Agora eu aprendi, tá? :)
Usufruiremos! :)
.
– Migração definitiva para a codificação UTF-8. Somos conservadores e
– esperamos bastante tempo para abandonar o bom e velho ISO-8859-1,
Não queria dizer isto, mas acabo de descobrir que sou conservador.
.
– Funcionamento garantido. Foi criada uma suíte de testes automatizada que
– Uma equipe de voluntários roda estes testes em diversos sistemas, ajudando
Legal!
Espero que no cron daily do mestre rode um para checar a consistência do mundo exterior.
.
– As funções que não puderam ser arrumadas foram removidas, para evitar a
Espero que não para o trash, mas sim para o to_do. Deve ser triste não poder por na linha um filhote, por mais rebelde que ele seja. :)
.
– grandezas de bits, na escala de byte até yota.
Eu só conhecia de atto a exa, graças a este paragrafo ratifiquei e ampliei :)
http://searchstorage.techtarget.com/sDefinition/0,,sid5_gci499008,00.html
Valeu verdão!
.
Como informação, vi uma vez em http://planeta.dyndns.org um arquivo de funções com uma forma de carga diferenciada…
.
– Mas prepare-se, pois cansa :)
Pelo que sei você chegou a ser documentarista na sua vida patrãocinada.
Esse negócio de “produzir de fato” e “gastar tempo” para documentar costuma ter uma fronteira muito instável, até quando o autor comenta para si próprio visando o futuro.
.
Bom ver que ainda reserva alguns ciclos de clock de seu cérebro para umas nerdices de vez em quando.
.
Grandes posts (em conteúdo) merecem grandes comments (em tamanho, ao menos :) !
.
this time, pvt is valid, len=45 ;)
Publicado por Aurélio Jargas em 5 Março 2008 às 23:59
Fala any,
A idéia de fazer as mudanças aos poucos é boa, porém as funções nunca teriam chegado no ponto que estão hoje. A mudança foi muito radical, envolveu mudar o estilo de codificação, mudar comandos, estruturas. É o tipo de coisa que você faz de uma vez de cabo a rabo, ou não faz nunca :)
Comentários em inglês não tem necessidade pois o público das funções é exclusivamente brasileiro, ou melhor, fluente em português. E como quero que o código sirva para aprendizes de shell estudá-lo, impor uma barreira a mais com a língua seria um contrasenso.
Sim, as funções removidas foram apenas desativadas (comentadas), mas se forem arrumadas, voltam ao pacote!
Interessante o funcs desse site que você passou. Mas carregar cada função na mão é um saco. A carga em memória de todas as funções ao mesmo tempo, como fazem as ZZ, é irrelevante para o hardware atual, não afeta em nada a performance.
Quase ninguém valoriza a documentação. Isso muda no dia em que você precisa dela, mas ela não existe :)
Ah, virão mais textos nerds, pode ficar tranqüilo :)
Publicado por Vlademir em 6 Março 2008 às 1:28
E aí, velhinho?
Seja bem-vindo ao lar.
O código ficou bem legível mesmo. Ainda no ano passado eu lia a criatura e via um bicho-de-sete-cabeças (menos mal, pois na primeira vez tinha mais de 100) e pensava: como sou tapado, como é que ‘todos’ conseguem ler isso com fluência e eu aqui travado…
Encontrei um bugzinho na zztool que não deixava o zzloteria pegar um resultado por vez. Solução: escapei os colchetes e passou a funcionar.
Linha 123 estava assim:
sed "s/$padrao/$esc[${ZZCODIGOCOR}m&$esc[m/g"
Agora está desse jeito:
sed "s/$padrao/$esc\[${ZZCODIGOCOR}m&$esc\[m/g"
Abraço.
Em tempo: Voltaste com todo gás! Beleza!
Publicado por Aurélio Jargas em 6 Março 2008 às 1:29
Vlademir, não consigo reproduzir este bug aqui e o colchete não é um caractere especial na segunda parte do comando s/// do sed.
Ao escapar o colchete você está anulando o comando ESC[m que muda a cor da fonte no terminal. Se estiver com problema com as cores, basta fazer um
export ZZCOR=0para desligar as cores de vez em todas as funções. Pode colocar isso no teu .bashrc pra valer para todos os terminais.
Abraço!
Publicado por Winchester em 6 Março 2008 às 13:58
Agora esperemo o livro! :D
Publicado por Henrique em 6 Março 2008 às 17:21
Aurélio, atualmente o Cygwin está sem servidores disponíveis para download mesmo ou é só comigo que está acontecendo?
Publicado por Aurélio Jargas em 6 Março 2008 às 17:22
Henrique, faz muitos anos que nunca mais vi nem a cor do Cygwin, estou completamente desatualizado. Tem o pessoal da lista cygwin-br do Yahoo que pode te ajudar. Abraço!
Publicado por José Carlos em 6 Março 2008 às 17:56
Cara, parabéns pelo programa. Instalei aqui no meu Ubuntu 7.04 e realmente é muito útil.
Publicado por Thiago em 7 Março 2008 às 1:29
Voltou com a corda toda!
Vou ver se te encontro (e patrocino!) no FISL esse ano, estava adiando a aquisição do livro de shell. Mas acho que dessa vez _vc_ vai ter sorte, hehe.
Código feio é código para retrabalho, né? :)
Abraços!
Publicado por Aurélio Jargas em 7 Março 2008 às 1:30
Thiago, pois é, nada como aproveitar bem a vida real para limpar a mente e voltar com disposição para o trabalho!
Código feio é um pesadelo. Tanto para quem usa quanto para quem programa. É um tiro no pé, só que a bala demora alguns meses pra chegar ;)
Então já que estou com sorte, nos vemos no FISL!
Publicado por Fabio em 7 Março 2008 às 9:31
É o funções ZZ de versão nova, site novo, arrumação “nova”.
Parabéns Aurélio!
P.S.: Concordo com any : “Grandes posts (em conteúdo) merecem grandes comments (em tamanho, ao menos :) !”, mas falta inspiração pra um comentário maior, acho que por ainda não ser um usuário das funções ZZ.
Publicado por Fabio em 7 Março 2008 às 9:35
Aurélio, acho que falta do Adsense no site das funções ZZ. Nada mais justo.
Publicado por Aurélio Jargas em 7 Março 2008 às 11:13
Fabio, até poderia colocar anúncios no site das ZZ, mas por experiência prévia com o aurelio.net, te digo com segurança que “nerds não clicam em ads” (essa vai pro livro hehe)
Tenho algumas idéias diferentes para tentar levantar alguns centavos para ajudar no (cansativo) trabalho de manter as funções funcionando. Quando tiver algo eu conto aqui.
Mas para quem gosta das Funções ZZ e quer ajudar, tem lá no site um link para doações. Elas são muito bem-vindas!
Valeu pela preocupação e pela idéia!
Publicado por Weslei em 7 Março 2008 às 17:28
Parabéns pela nova atualização do FunçõesZZ, facilita e muito o dia a dia dos nerds… rsrsrs
Abraço
Publicado por any em 7 Março 2008 às 21:58
Só comentando sobre aquele funcs:
pelo que me lembro ele poderia carregar várias funções com um só comando.
Daí você colocava no ~/.profile, por exemplo:
. funcs fun1 func2 funfun3
e, ganhou prompt, tá na mão.
Desculpe-me, acho que sou um ecologista incorrigível e cada byte, cada mW.h conta. :)
.
“nerds não clicam em ads”; Ahahaha, essa foi boa, ahahah…
Se puser lá e não for clicado, você tem algum prejuízo/inconviniência? Conta aí…
Se não tiver, põe lá. Quanto pintar um nerd chapado, daquele que nem sabe o que está fazendo, você fatura uns cents. :)
Publicado por Fábio em 9 Março 2008 às 10:07
Concordo com any mais uma vez:
“Se puser lá e não for clicado, você tem algum prejuízo/inconviniência? Conta aí…
Se não tiver, põe lá. Quanto pintar um nerd chapado, daquele que nem sabe o que está fazendo, você fatura uns cents. :)”
Publicado por Aurélio Jargas em 9 Março 2008 às 23:59
A inconveniência é justo ter anúncios. Eles são feios e ocupam espaço. Se quase ninguém vai clicar, é melhor nem pôr para não incomodar os visitantes. Assim o site fica mais limpo e rápido.
Publicado por Igor Cemim em 10 Março 2008 às 14:10
Peque na que ainda to usando Windows…
mas pode deixar que eu ainda vou ser um linuxer profissional :)
Publicado por LameDuck em 12 Março 2008 às 14:09
E viva as Funções ZZ \o/
O verdadeiro canivete suíço digital :D
Publicado por Vlademir em 12 Março 2008 às 16:54
Pois é, Aurélio, realmente ouve falha. Eram retornadas todas as loterias, mesmo quando era requerida somente uma. E foi resolvido como citei.
Até achei estranho, depois de escapado os colchetes, funcionar, mostrando um resultado por vez quando chamado, e ainda mostrar colorido.
Utilizei tanto com o UTF ligado como desligado, utilizando a iso-8859-1.
Tentei reproduzir o mesmo erro novamente mas não tive sucesso.
Resumo da ópera: não tinha bug, era só mais um pum (paranóia de usuário metido).
Partindo pra desculpa:
Naquele dia eu estava fazendo manutenção num código que escrevi há quatro anos atrás e que estava uma imundícia.
Tinha que reformulá-lo acrescentando mais algumas chamadas que eu nem lembrava mais como eram feitas.
Pois é, código mal feito, todo amontoado, sem comentários indicando a natureza das criaturas.
Verdadeira receita de campo minado bem feito: em qualquer lugar que pisava explodia.
Fiquei grudado nessa “maquininha de fazer loucos” até a menina dos meus olhos ficar bronzeada.
Depois fui olhar as zz e testar uma ou outra função. Devo ter feito muitas barbeiragens e deu no que deu: um falso positivo de erro.
Já que escrevi uma linha de código no outro comentário, o meu pedido de desculpas, por ter feito gastares o teu precioso tempo com um erro que não havia, vai também com algumas poucas linhas para não sujar demais aqui.
Trata-se apenas de um fragmento tosco da minha zzradinhodepilha com duas rádios que creio vão te agradar.
#!/bin/bash
while getopts 'l:e:' banda; do
case "$banda" in
l)
case "$OPTARG" in
alt) xterm -e mplayer 'http://alternative.mthn.net:8700' &
;;
esac
;;
e)
case "$OPTARG" in
gaba) xterm -e mplayer 'http://76.17.132.22:8666' &
;;
esac
;;
esac
done
Abraços pra ti e a família. E mais uma vez me perdoe-me pelo anúncio equivocado.
Publicado por Aurélio Jargas em 12 Março 2008 às 19:58
Esquenta não Vlademir, o pum acontece :)
Valeu pela zzradinhodepilha!
Sei como é, um certo pacote de funções aí sofria deste mal ;)
Publicado por Vlademir em 13 Março 2008 às 21:32
Sabe, Aurélio, como todo mundo tem os seus playlists em players gráficos sofisticados, sempre achei a minha zz inútil.
Mas agora me convenci de que pode ser útil para alguém aprender como criar parâmetros, com ou sem argumentos, que não vi nas outras zz.
Para quem ainda não sabe: com o getopts se cria os parâmetros, que no caso do exemplo acima exigem argumentos, e o argumento é recebido pela $OPTARG.
A minha funçãozinha tem uma penca de urls. Vou testar as que eu não tenho usado para ver qual está quebrada e também procurar outras que diversifiquem os estilos de música, para depois incluí-las na função e mandá-la para as extras no site das zz. Vou ver se consigo classificar uns 10 estilos diferentes e manter uma url para cada, senão fica monstruosa, além do que não caberiam no número de linhas que estabeleceste para a ajuda.
Um pouco de encheção de lingüiça:
Essa função evoluiu da ‘abelheira’, que tinha uma única chamada a uma rádio on-line, para a ‘radinhodepilha’ com 6 rádios para banda estreita, quando incluí rádios em banda larga passou para ‘aipode’ e atualmente com televisões tem o nome de ‘aitoones’. Pois é, o nome parece mas não é. Quando tentei colocar o looney dentro do tunes acabou sobrando coisas e ficou os dois zoinho (oo) pra ver tv. Ah, quase esqueço! O ai é o aí do bordão “e aí, velhinho!”.
Abraço.
Publicado por farley rangel em 25 Março 2008 às 3:30
Aurélio, gostei. Queria deixar meu Pendrive e o HD do note (apenas algumas pastas em comum nos dois) iguais. Ou seja, trabalhando no pendrive no micro do escritório e no note em outro lugar, um ou outro, sincronizariam os dois lados, ficando iguais o pendrive e o note. Há alguma forma de usar as ZZ pra isso?
Publicado por Recados da Paróquia ZZ « Blog do Aurélio (Verde) em 2 Outubro 2008 às 15:58
[...] primeiro passo você já sabe: o código das Funções ZZ passou por uma reforma geral e hoje é limpo, alinhado e recheado de comentários explicativos. Leia-o para aprender mais sobre [...]