About me

About

2013-10-02

Pythonices, list -> map.

Como é que consigo facilmente converter o texto “p_dist m show_acs curses tget termcap” num dicionário chave-valor, ou seja, nisto: {'tget': 'termcap', 'p_dist': 'm', 'show_acs': 'curses'} ?

Uma simples iteração

Criar um dicionário vazio, iterar a lista dois a dois, fazer chave igual ao próximo.

t = "p_dist m show_acs curses tget termcap".split()

x = {}
for i in range(0, len(t), 2): x[t[i]] = t[i+1]
print x

Zip it

Substituir a iteração 2 a 2, por uma construção funcional – zip – que extrai dois elementos de cada vez da lista. Para isso a lista precisa de ser encapsulada num iterador, que funciona como um consumidor linear da lista.

t = "p_dist m show_acs curses tget termcap".split()

x = {}
it = iter(t)
for k,v in zip(it, it): x[k] = v
print x

Compactar o zip

  • [it,it] <=> [it]*2
  • f(it,it) <=> f(*[it]*2)

logo…

t = "p_dist m show_acs curses tget termcap".split()
x = {}
for k,v in zip(*[iter(t)]*2): x[k] = v
print x

Eliminar o loop explícito

  • zip(*[iter(t)]*2) = [('p_dist', 'm'), ('show_acs', 'curses'), ('tget', 'termcap')]

O lado direito é uma association list (alist), que é a representação python de um dicionário. Logo…

t = "p_dist m show_acs curses tget termcap".split()
x = dict(zip(*[iter(t)]*2))
print x

Verbatim

No limite podemos usar uma só expressão literal para criar um dicionário:

mymap = dict(zip(*[iter("""

chave1  valor1
chave2  valor2
chave3  valor3

""".split())]*2))

Ferramentas Linux, UNIX (2/2)

Multimédia

  • sox: o canivete suíço de processamento de som. Desde conversões de formatos a manipulação de efeitos, quase tudo é possível, da linha de comando.
  • mplayer/mencoder: o mplayer é mais que um video player da linha de comando (até porque também funciona como audio player). Além de aguentar com praticamente qualquer formato conhecido, também permite fazer processamento e conversões. O mencoder cria, ou converte, formatos de vídeo e som. mplayer -ao null FILE para ver sem som, ou mplayer -vo null FILE para ouvir sem imagem, devem ser os comandos multimédia que mais uso.
  • ffmpeg: outro excelente processador / conversor / etc multimédia.

Sistemas, misto

  • ddrescue: excelente ferramenta para tentar recuperar dados em drives que estão no processo de entrega de alma ao criador. O ddrescue não aborta a leitura em falhas de hardware e, através da manutenção de um ficheiro de log, permite várias passagens de leitura da drive, gravando apenas os blocos não lidos nas passagens anteriores.
  • htop: aquilo que o top devia ter sido :)
  • xtail: um tail que funciona em directorias, monitorizando todos os ficheiros lá existentes e novos que entretanto lá sejam criados. Não há que saber: xtail /var/log control- para sair, control-c dá o status.
  • buffer, mbuffer: o comando buffer implementa um buffer ao nível da shell. O racional é simples: um processo produtor de dados, um processo consumidor de dados, um deles é mais lento que o outro e sofre uma enorme penalização de performance quando resume um bloqueio. Põe-se o buffer no meio e já está :) O mbuffer implementa o mesmo conceito com mais algumas funcionalidades interessantes.
  • rename: às vezes as ideias simples são as mais interessantes. rename FROM TO files... renomeia os ficheiros substituindo FROM por TO no seu nome, em que ambos são strings banais (nada de expressões regulares). Por incrível que pareça a esmagadora maioria de renames que faço encaixam neste modelo:

    # xxx.jpeg => xxx.jpg
    rename .jpeg .jpg *.jpeg
    
    # t1.txt t2.txt ... t500.txt => t_001.txt t_002.txt ... t_500.txt
    rename t t_00 t?.txt 
    rename t t_0 t??.txt 
    rename t t_ t???.txt 
    
    # t_001.txt t_002.txt ... t_500.txt => t1.txt t2.txt ... t500.txt
    rename t_00 t t_00?.txt
    rename t_0 t t_0??.txt
    rename t_ t t_???.txt
  • star: não sei ao certo o que significa o s antes do tar, provavelmente será s de Schilling, o nome do autor da ferramenta, que também tem outros utilitários começados por s. Independentemente disso, para mim o s é de super, isto é um super tar. Funciona como tar, cpio ou pax e suporta as N variantes de formatos de arquivamento desenvolvidos ao longo da história do Unix. Tem opções de buffering builtin, lê listas de ficheiros a partir do stdin (não mais tar -cf foo.tar `find . expr`), correcto na preservação de todos os atributos dos ficheiros, usa expressões find builtin, detecta compressão automaticamente, por aí fora.

Documentação

  • pandoc: é o canivete suíço da documentação em texto com markup. À data a que escrevo isto, a versão 1.12.0.2 lê de 15 formatos diferentes e escreve para 35. Escrito em haskell, é bastante rápido.
  • asciidoc: formato de texto com markup para efeitos de documentação. A vantagem deste é ser bastante mais rico que as comuns alternativas (rst, markdown). A quantidade de features permite escrever um livro de alta qualidade tipográfica. Na verdade existem alguns livros em asciidoc.
  • Sphinx: um processador de reStructuredText (rst). Tem múltiplos formatos de saída (HTML, Latex, texto simples, entre outras), funcionalidades específicas para documentar código e uma integração especial para python já que foi criado como ferramenta de documentação oficial do projecto.
  • Docutils: outro processador de reStructuredText.
  • aspell: uma ferramenta da linha de comando para corrigir erros de escrita (validação simples contra dicionário). Útil para desenrascar.

XML

  • XMLStarlet: processador de xml da linha de comando. Validações, queries xpath, transformações xslt, até reformatação, está lá tudo. Útil para pequenos scripts e verificações rápidas. Dica: xml fo <file> para reformar xml.
  • jing-trang: jing valida xml contra schemas RELAX NG, trang converte entre schemas. Bastante útil… quando é preciso. :)

Outros

  • gestão de versões:
    • svn: depois de ter morto o CVS, o subversion tornou-se no sistema de controlo de versões de facto… com repositório central. Continua a ser um bom sistema, provavelmente o mais usado, mas os novos DCVS têm-lhe diminuído a base de utilizadores.
    • git: um sistema de controlo de versões distribuído: cada checkout está associado a um repositório local. Desenvolvido inicialmente pelo Linus Torvalds, popularizou-se brutalmente com a sua adopção pelo github.
    • hg: como o git só que mais elegante e compreensível. :)
  • dirdiff: uma ferramenta gráfica de comparação de várias directorias, com capacidades de merging, cópia ou remoção de ficheiros. É um software antigo, em tcl/tk, ainda bastante útil. Depois de se apanhar o truque para editar os merges torna-se numa das ferramentas mais potentes para o efeito. Mas admito que o sistema escolhido seja um bocado confuso inicialmente.

  • nvi: o vi original há muito que passou a constar apenas nas tapes de arquivo dos sistemas BSD originais. Keith Bostic reimplementou-o como nvi (new vi), mantendo compatibilidade total face ao original com umas poucas funcionalidades extra de conveniência. O nvi manteve o espírito e tradição do antigo vi, é rápido, correcto (não tem bugs), consome poucos recursos, corre bem as minhas macros – deixando teclas livres para o fazer! – e faz bem o que deve fazer: editar texto. Totalmente a antítese do vim, mas isso são outras histórias.

  • VirtualBox: um bom sistema de virtualização, relativamente rápido, é excelente para uso pessoal ou pequenas equipas. 100% manipulável da linha de comando: vboxheadless -s vmname para arrancar, vboxmanage ... para todas as restantes tarefas.

  • make: é mais que uma ferramenta de construção de projectos – que aos poucos vai sendo substituído por ferramentas mais modernas e especializadas no domínio respectivo –, para mim funciona com um repositório de pequenas tarefas necessárias num contexto (ver: como são feitos estes artigos).

  • units: um programa de linha de comando com uma enorme base de dados de unidades científicas e alguma inteligência associada na conversão.

    # quantas milhas por galão correspondem 6 litros aos 100 km 
    # notar que o programa detectou a inversão das grandezas (reciprocal conversion) 
    units 6l/100km miles/gallon
    reciprocal conversion
    * 39.202431
    / 0.025508622

Spam surreal.

As motivações do spam são conhecidas e têm o seu racional, ainda que ilegítimo. Agora fazer spam assim ultrapassa qualquer nível de compreensão!

2013-10-01

Readable lisp

O LISP e todos os seus dialectos usam as conhecidas s-expr, que têm dois grandes problemas:

  • notação prefixa;
  • excesso de parêntesis.

O David A. Wheeler criou o sistema readable com três truques para simplificar a sintaxe das s-expr, mantendo total compatibilidade com a linguagem:

  • curly infix c-exprs: {2 * 3} <=> (* 2 3);
  • neoteric n-exprs: f(x) == (f x);
  • sweet expressions s-exprs que é dedução de parêntesis por indentação, ala Haskell ou Python.

Em três passos se simplifica brutalmente o calcanhar de Aquiles do LISP: a sintaxe. Claro que já vem tarde, mas isso é outra história.

2012-05-21

Ferramentas Linux, UNIX (1/2)

Como utilizador veterano de Linux (e outros sistemas Unix no passado, não tanto agora) fui adoptando um grande número de ferramentas ao longo dos anos. Deixo uma pequena lista de alguns dos que mais uso e/ou considero interessantes, para não se tornar exaustiva. Ficaram de fora alguns dos tradicionais comandos de Unix (sed, awk, cat, dd, find, grep, …), software servidor (apache, samba, …) ou outros demasiados específicos.

Aviso: é natural que as minhas raízes command line se revelem um pouco.

Comunicações mundanas

  • firefox – o meu browser. Há outros, bons, como o opera, chrome, mas é este que uso já desde o tempo do monolítico netscape.
  • thunderbird – o meu interface de mail. Mais um do projecto mozilla, favorito de longa data.
  • pidgin (ex gaim)instant messenger com vários protocolos suportados. Pode não suportar as funcionalidades mais avançadas de outros talkers específicos, mas centraliza as comunicações do tipo IM e serve para o uso que lhe dou (pouco).

Networking

  • stone – um excelente repetidor tcp/ip. stone proxy 8888 e tenho um proxy http lançado no porto 8888. Suporta mais protocolos e esquemas de repetição.
  • iperf – qual é a largura de banda entre dois pontos de rede?
  • netcat – cliente/servidor tcp/udp flexível. Um clássico, mas que ainda hoje uso. Servidor: nc -l -p 8888, cliente: echo ola | nc 127.0.0.1 8888. Para determinar rapidamente o contéudo de um pedido http:

    [edit /etc/hosts "127.0.0.1 mysite"]
    nc -l -p 80
    [browse to http://mysite/urlpath]
  • tcpdump – mostra o que passa num interface de rede. O avozinho deste tipo de ferramentas, com interface totalmente baseado na linha de comando, dispõe de um flexível mecanismo de filtros.
  • wireshark, ex ethereal – um tcpdump em modo gráfico. Captura e analisa os pacotes de rede.
  • nmap – mais do que um port scanner, isto é um autêntico canivete suíço de rede. De vez em quando uso o nmap -sV -O ip para tentar descortinar um pouco do que se está a passar, mas hoje em dia isto foge ao meu trabalho típico. A suite nmap inclui outros utilitários interessantes como o ncat (inspirado pelo netcat referido acima), ndiff e nping.
  • curl, wgetdownload de URLs (ftp e http) da linha de comando. O curl é mais completo, permite fazer upload, suporta autenticação ntlm. O wget aceita vários URLs e funciona em modo recursivo. Complementam-se bem.
  • ncftp, lftp – há cada vez menos coisas em ftp que não estejam disponíveis por http, mas quando é preciso, estes dois continuam a ser bons clientes ftp interactivos.
  • rsync – inicialmente o objectivo do rsync era fazer transferências por rede optimizadas, i.e. permitia transferir apenas um conjunto mínimo de diferenças entre a origem remota e o destino local (ou vice versa), reconstruindo a mesma imagem no destino. Mas com o tempo, usar o rsync para copiar de qualquer sítio para qualquer sítio tornou-se um vício.

    # actualiza em dest os conteúdos de source
    rsync -av --delete /a/b/source /x/y/dest 
    
    # envia os meus dados para o servidor, via ssh, com compressão, 
    # restringindo a largura de banda usada a 50KB/s, para não me 
    # estrangular a minha ligação de rede
    rsync -Pav --delete ~/stuff/. host:/stuff/. -e ssh -z --bwlimit=50
  • cntlm – quando a Microsoft decidiu implementar um mecanismo de segurança proprietário, NTLM, sem qualquer documentação, nem suporte fora de Windows, o resto do mundo ficou às escuras. Nos sítios em que se usavam proxies com autenticação NTLM isso significava não ter acesso a nada. Felizmente alguém com tanto de generosidade como de genialidade fez o reverse engineering desse protocolo e implementou um proxy que se autenticava via NTLM num MS Proxy Server. Esse proxy era o NTLM Authorization Proxy Server, escrito em python. Mais tarde apareceu esta versão em C que trouxe algumas melhorias e funcionalidades. Exemplo real de utilização:

    # cria um proxy http anónimo no porto 5866 que se autentica e usa o 
    # proxy windows NTLM_PROXY no porto 80 
    cntlm -g -d DOMAIN -u USER -p PASS -l 5866 NTLM_PROXY:80
  • w3m, links2w3m é, para mim, o melhor browser em modo texto. Também funciona como paginador e até suporta tags. As outras incarnações de browsers texto (lynx, links, elinks) nunca me convenceram, excepto o links2 que adicionou suporte javascript e gráficos (links -g). De vez em quando dão jeito.

Gráficos, diagramas

  • PlantUML – a partir de uma simples descrição textual o plantuml gera diagramas UML de sequência, casos de uso, classes, actividade, componentes, estado e objectos. Muito útil para documentar rapidamente fluxos e processos.

    @startuml cache.png
    title padrão usual de cache
    
    (*) --> "cache get"
    if "hit?" then
            --> [yes] (*)
    else
            -> [no] "source get"
            --> "cache set"
            --> (*)
    endif
    
    @enduml
    —>diagrama actividade
  • yUML – ferramenta online com um conceito semelhante ao plantuml. Os gráficos têm melhor qualidade, contudo.
  • graphviz – conjunto de ferramentas para produzir todo o tipo de diagramas, a partir de especificações textuais. Útil para gerar diagramas programaticamente.
  • Pencil – um poor man’s visio que funciona como extensão do firefox ou standalone (é uma aplicação XUL). Surpreendemente funcional! O “Sketchy GUI” é excelente para prototipar mockups.
  • ImageMagick, GraphicsMagick – ImageMagick é uma suite de utilitários para processar imagens da linha de comando, embora também inclua o display que é um utilitário gráfico. Assim, tarefas como converter entre formatos, alterar resoluções, aplicar efeitos ou outras operações em imagens está à distância de usar o nosso mecanismo de automatização preferido a envolver isto. Exemplo em shell+awk para re-escalar todas as imagens para 800x600:

    # confirmar se está tudo ok
    ls *.png *.jpg | awk -vR=800x600 '
      function f(s) {sub(".[^.]*$", "_" R "&", s);return s} 
      {printf "convert -geometry %s \"%s\" \"%s\"\n", R, $0, f($0)}'
    
    # executar
    ls *.png *.jpg | awk -vR=800x600 '
      function f(s) {sub(".[^.]*$", "_" R "&", s);return s} 
      {printf "convert -geometry %s \"%s\" \"%s\"\n", R, $0, f($0)}' | sh -x

    O GraphicsMagick foi um spin-off do ImageMagick feito em 2002 que reivindica ser melhor. Independentemente das pretensões dos autores, uma coisa que eu prefiro no GraphicsMagick é o uso do comando gm como driver dos outros subprogramas (gm convert, gm identify, …).

  • pinta – finalmente um programação de edição gráfica simples, funcional e usável, que funciona em Linux.

2012-05-20

As pessoas são recursos?

O uso do termo “recurso” como designação de pessoa tem-se vindo a generalizar e banalizar. Mas são as pessoas recursos?

Um recurso é algo do qual se faz uso para um propósito. Como recurso é indistinguível face a outros equivalentes ou iguais. Por exemplo, posso trocar um carro por outro modelo igual sem perda de funcionalidade ou necessidade de adaptação.

Ora as pessoas não têm “modelos iguais”. Se assim fosse não eram precisas entrevistas no processo de contratação, bastava consultar a ficha técnica da pessoa. Não era preciso haver período experimental, ou outros expedientes usados devido à individualidade de cada ser humano.

O próprio lugar-comum “a maior riqueza são as pessoas” enferma de uma contradição na asserção pessoa-recurso. Se as pessoas se trocam facilmente enquanto recursos, não constituem maior riqueza que os outros recursos da empresa, como instalações, veículos, etc.

Resumindo: uma pessoa é um ser humano, não é um recurso.

Por incrível que pareça há pessoas que têm dificuldade em tratar as outras pessoas por… pessoas.

Notas:

  • a expressão “recursos humanos” faz sentido enquanto designação de uma área comportamental ou organizacional;
  • a expressão “recurso humano” não faz sentido para mim.

Outras leituras:

2012-05-08

ACK, um grep para programadores.

Por vezes bastam pequenas ideias para nos melhorarem a vida, e o ACK é um desses casos. Quantas vezes não sentimos necessidade de fazer coisas como:

find ! -path \*/.svn\* -print0 | xargs -0 grep foo

ou outras artimanhas do género? O ACK resolve este problema: é um grep que exclui à partida padrões com reconhecido desinteresse. Adicionalmente possui mais umas poucas opções extras de conveniência. É escrito em perl mas é rápido q.b. e bastante prático de se usar.