Sites e sistemas rápidos, acessíveis, bem posicionados no Google e, o que é mais importante, fáceis de usar.

Arquivos da tag 'Linux'

Exportando MySQL para CSV

04/02/2010

Criei agora um pequeno script para resolver um problema meu, um exportador de base de dados MySQL para arquivos CSV. Resolvi compartilhar:

MySQL2CSV

Para baixar, você vai precisar do git. No Ubuntu, para instalar, faça:

$ sudo apt-get install git-core

Depois, para baixar:

$ git clone git@github.com:elcio/mysql2csv.git

Isso vai criar a pasta mysql2csv, com o script dentro. Você pode copiá-lo para a pasta /usr/local/bin/ e dar permissão de execução se for usar com muita freqüência:

$ cd mysql2csv
$ sudo cp mysql2csv.py /usr/local/bin/mysql2csv
$ sudo chmod +x /usr/local/bin/mysql2csv

Se fizer isso, vai poder chamar, em qualquer diretório:

$ mysql2csv host user passwd dbname

Rodando comandos do sistema operacional com cache no Python

01/02/2010

Código simples, mas que pode ser útil para alguém não ter que escrevê-lo de novo (arquivo runcached.py):

import os,time
cachepath='cache'
timeout=360
 
def runcached(cmd):
  filename=os.path.join(cachepath,str(hash(cmd)))
  if os.path.isfile(filename):
    if time.time()-os.path.getmtime(filename)<timeout:
      return open(filename).read()
  t=os.popen(cmd).read()
  open(filename,'w').write(t)
  return t

A função runcached roda comandos do sistema operacional, e faz cache do resultado por 6 minutos. Para alterar o tempo do cache, basta mudar a variável timeout. Por exemplo, para cachear por 10 horas:

import runcached
runcached.timeout=36000
r=runcached('lynx --source http://www.tableless.com.br')

Navegação rápida com o Google Public DNS

07/12/2009

Uma coisa que sempre me espantou é a ineficiência dos servidores de DNS dos provedores de hospedagem brasileiros. Já testei ADSL, cabo coaxial, 3G e, aqui em São Paulo, de maneira geral as conexões são boas. Mas como o servidor de DNS dos provedores é ruim, a navegação é muito lenta.

Eu vinha usando OpenDNS, cuja performance é muito boa. Mas hoje resolvi testar o Google Public DNS. Deixa o OpenDNS no chinelo!

Como o Google conseguiu isso? Um mega sistema de cache, com cobertura global, e um inovador sistema de prefetching. Se você não está usando ainda, vale a pena testar.

Para facilitar a vida dos usuários de Linux, segue meu /etc/resolv.conf:

nameserver 8.8.8.8
nameserver 8.8.4.4

Sim, são esses IPs mesmo ;-) Não é fantástico?

Ubuntu 9.10 boota rápido!

08/11/2009

Só para deixar registrado: instalei o novo Ubuntu 9.10, Karmic Koala. Tenho um LG R405. Funcionou tudo de primeira, sem configurações esotéricas em arquivos texto misteriosos.

Boota rápido. Boota muito rápido. Estou feliz ;-)

[update 1] Olha que legal: qual o boot mais rápido - vídeo comparativo de boot entre o Karmic, o Jaunty, o Vista e o Seven. [/update 1]

Sobre Windows, Linux, paixões e times de futebol

28/08/2009

Discussões sobre o melhor sistema operacional, o melhor navegador ou a melhor linguagem de programação tendem a entrar em loop infinito. Cada um dos lados parece achar o outro um completo idiota por não se convencer de suas opiniões.

Semana passada troquei algumas mensagens com o René de Paula que me fizeram pensar bastante sobre o assunto. O René provavelmente não me conhece, mas eu tenho aprendido muito com ele nos últimos anos, principalmente em seu podcast, o Roda e Avisa. E esse post não é um desabafo "estou chateadinho". Estou citando o nome do René porque a conversa se deu no Twitter, ou seja, em público, e realmente me fez pensar.

O René recomendou esse artigo da ZDNet, analisando um estudo de segurança dos navegadores web. O artigo começa apresentando os resultados do estudo, em que o Internet Explorer ganha de lavada, e segue explicando porque, na opinião do autor, o estudo patrocinado pela Microsoft é tendencioso e irrelevante.

Respondi ao René dizendo que concordava com o artigo que ele havia indicado, que realmente o estudo era tendencioso. E usei a frase "o rei está nu." Para mim, a crônica da roupa nova do rei é uma excelente metáfora para a situação. Ele me respondeu que havia visto meu blog e que achava que havia um "viés oculto" em tudo o que eu dizia. Em seguida twittou sobre o fato de as pessoas tratarem essas discussões como se fossem sobre times de futebol. Isso me fez pensar um bocado.

Eu gosto de, numa discussão, ouvir o outro lado. Também gosto muito de lógica. Se tem uma coisa que eu vou defender numa discussão, mais do que meu time de futebol, é o bom uso da lógica. Tento nunca ser irrazoável. Sei que todos somos tendenciosos, mas sempre tento ser mais imparcial que a média.

Talvez seja o fato de a discussão ter acontecido no Twitter, meio pouco propício, mas confesso que fiquei muito preocupado com a impressão que o René teve. Quem me conhece, sabe, trabalho com Linux, Windows ou Mac, sem rabo preso, escolhendo sempre o jeito mais simples de resolver cada problema.

Cada cabeça, uma sentença

Em primeiro lugar, não há um sistema operacional "melhor" e outro "pior". Há um "melhor para você". O fato de aquele seu amigo usuário de Windows não ter enxergado ainda que o Linux é o melhor sistema operacional do mundo talvez seja porque, para o perfil de uso dele, o Windows seja realmente o melhor sistema operacional.

Dificilmente eu tento convencer alguém a usar exclusivamente Linux. Sempre tento convencer as pessoas a experimentar. Se o sujeito me diz que é um heavy gamer, por exemplo, recomendo o uso de Windows. Sei, o Wine está muito evoluído e tal, mas se ele tem dinheiro para pagar as licenças e pode rodar a versão mais nova de cada jogo no ambiente em que ele foi feito para rodar, por que complicar?

Sim, não me esqueci, para certos perfis de uso, Mac OS X também é um sistema fantástico. Estou quase comprando um para minha mulher.

Existem, porém, padrões absolutos

O fato de não existir uma solução "bala de prata" e a paixão que costuma cercar essas discussões têm levado muita gente, principalmente programadores, a uma posição morna tão irrazoável quanto os extremos. É comum ouvir frases como "a melhor linguagem é aquele com a qual você sabe trabalhar" ou "a melhor ferramenta é a que resolve seu problema."

Acredito sim que há casos de uso os mais variados. Mas, dentro de determinado caso de uso, há métricas objetivas que você pode usar para dizer o que é melhor. Falando em linguagem de programação, por exemplo, a melhor não é aquela que faz você se "sentir bem". A não ser que programar para você seja só um hobby, a melhor é aquela que vai te permitir resolver mais rápido o problema do cliente, com a qualidade e a performance necessárias.

Dado um determinado problema do cliente, e uma determinada métrica de performance, deve ser possível apontar a melhor linguagem para essa situação.

Que problema seu software se propõe a resolver?

Se você é desenvolvedor de software, é importante entender isso. Você dificilmente vai encontrar uma oportunidade de desenvolver um produto que é o melhor para todo mundo. Não há unanimidades.

Você pode desenvolver algo que é o melhor para a maioria, pode achar uma minoria endinheirada, ou pode desenvolver algo legal para você mesmo e torcer para que haja gente parecido com você lá fora.

Mas, se você tentar ouvir todas as sugestões que receber e superar os concorrentes em absolutamente todos os perfis de uso, nunca vai terminar de desenvolver.

Mente aberta

Na Visie hoje temos 7 máquinas Windows, 6 Linux e 3 Macs. Sem contar as VMs, o ambiente de testes, e os servidores onde estão hospedadas as aplicações. Desenvolvedor, abra sua mente. Aprenda uma linguagem de programação nova, experimente outro sistema operacional, teste outra solução. Você vai aprender muito.

Aprenda Python, Ruby, Haskell ou Scala. Isso vai tornar você um melhor programador PHP, Java ou .Net. Desenvolva um projeto com uma banco de dados não relacional (estou usando MongoDB em um projeto.) Se você ama Wordpress, faça alguma coisa com Joomla, e vice-versa. Tente outro framework, outro editor, outro jeito.

Sobre navegadores

No dia seguinte a essa conversa estive no escritório do W3C Brasil, assistindo ao Café com Browser com o pessoal do Internet Explorer.

Eles passaram boa parte do tempo falando sobre os recursos do navegador para o usuário final. Coisas como abas (oh!) e favoritos mais legais, webclips, processos independentes em cada aba, melhorias de performance e segurança. Tudo muito interessante mas, eu acho, apresentado para o público errado. Estávamos dentro do W3C, afinal de contas. Queríamos saber sobre as melhorias para o desenvolvedor.

Ao final, a palestra sobre melhorias para o desenvolvedor foi, para mim, parte surpreendente, parte decepcionante. Me surpreendi principalmente pela reação dos desenvolvedores no Twitter. Muita gente não conhecia as developer tools do IE8, ou os modos de compatibilidade, por exemplo. Quando foi apresentado o querySelector, muita gente twittou revoltada, porque a Microsoft estava "inventando um novo jeito proprietário de fazer as coisas". Gente, o querySelector é uma recomendação do W3C (está em Working Draft, mas está lá.)

A parte decepcionante, expressei em minha pergunta:

Em suma, não tenho ódio da Microsoft ou de quem quer que seja. Não quero que o Internet Explorer suma do mapa. Ainda tenho projetos em ASP, VB e .Net, e sou feliz com isso. Só quero poder desenvolver uma vez só minhas aplicações. Quero não ter que cobrar do cliente pelo custo de fazê-la funcionar no Internet Explorer. Quero entregar mais rápido aplicações melhores, mais estáveis, com menos código.

Instalando o CouchDB e o Python-CouchDB no Ubuntu 8.10 (Intrepid)

13/01/2009

Não a versão do repositório, mas a mais nova.

Só a sequência de comandos, que eu estou com pressa agora:

sudo apt-get install build-essential erlang libicu38 libicu-dev libmozjs-dev automake autoconf libtool help2man libcurl-ocaml-dev subversion python-setuptools
mkdir ~/src
cd ~/src
svn co http://svn.apache.org/repos/asf/couchdb/trunk couchdb
cd couchdb
./bootstrap && ./configure && make && sudo make install
sudo adduser --system --home /var/lib/couchdb --no-create-home --shell /bin/bash --group --gecos "CouchDB Administrator" couchdb
sudo chown -R couchdb /usr/local/var/lib/couchdb/
sudo chown -R couchdb /usr/local/var/log/couchdb/
sudo easy_install simplejson
sudo easy_install httplib2
sudo easy_install couchdb

Brincando com a API do twitter

26/12/2008

Resolvi experimentar um pouco a Twitter API. É linda, do jeito que toda API deveria ser. É REST, muito fácil de entender e colocar para funcionar, e devolve dados em XML, JSON, RSS e ATOM.

Essa simplicidade permite interagir com a API usando ferramentas simples da linha de comando do Unix, como o wget e a cURL. Para nossos exemplos, vamos usar cURL. Se você usa Ubuntu, antes de começar faça:

sudo apt-get install curl

Para fazer um simples post, por exemplo, você pode digitar, em seu terminal:

curl -u seu_username:sua_senha -d status="Twittando do terminal. Aprendi com o Elcio: http://blog.elcio.com.br/brincando-com-a-api-do-twitter/" http://twitter.com/statuses/update.json

É isso mesmo, meninos e meninas, é só um post com autenticação, mais nada. RESTful, simples e elegante, deixar qualquer SOAP no chinelo. Inspirador para qualquer um que precise projetar uma API. Isso retorna dados em JSON. Se você quiser os mesmos dados em XML, ATOM ou RSS, basta mudar a extensão na url.

Agora vamos automatizar isso. Eu criei um arquivo /usr/local/bin/twitter com o seguinte conteúdo:

source $HOME/.twitter
curl -u $user:$password -d status="$@" http://twitter.com/statuses/update.json

Naturalmente, criei o arquivo como root e dei permissão de execução para todos os usuários. Agora, no diretório de cada usuário, basta criar um arquivo .twitter com o seguinte conteúdo:

user=seu_username
password=sua_senha

Pronto, tendo feito isso, qualquer usuário que tenha o arquivo .twitter em seu home pode twittar do terminal com:

twitter "Twittando do terminal, aprendi com o Elcio: http://blog.elcio.com.br/brincando-com-a-api-do-twitter/"

Simples e indolor, agora você pode automatizar suas twittadas com shell script. Pode, por exemplo, twittar toda vez que seu servidor baleiar, ou agendar twits com cron.

Search API

A Search API também é espetacularmente simples, dê uma olhada. Fiz a UPBox usando a Twitter Search API, por exemplo, com 22 linhas de código.

Fuja da complexidade

02/11/2008

Abri o OpenOffice Writer, mandei gravar uma macro, escrevi "teste", selecionei e pintei de vermelho. Olha o código gerado:

sub Main
rem ----------------------------------------------------------------------
rem define variables
dim document as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Text"
args1(0).Value = "teste"
dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args1())
rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:SelectAll", "", 0, Array())
rem ----------------------------------------------------------------------
dim args3(0) as new com.sun.star.beans.PropertyValue
args3(0).Name = "FontColor"
args3(0).Value = 16711680
dispatcher.executeDispatch(document, ".uno:FontColor", "", 0, args3())
end sub

Há muito código complexo por aí. Nesse caso, para invocar os métodos dos objetos do OpenOffice, é preciso usar um objeto dispatcher, chamando executeDispatcher, e passando o objeto, o nome do método e um array de argumentos. Que espécie de sadismo leva alguém a projetar uma solução como essa? Vale lembrar o que diz o Zen do Python:

Se uma implementação é difícil de explicar, é uma idéia ruim.

Outro exemplo interessantíssimo é o protocolo SOAP. Se você precisar construir um serviço SOAP do zero, dê uma investigada na documentação que você vai ter que ler. Compare com a documentação do protocolo XML-RPC, para ter uma idéia.

Meninos, o tio vai ensinar um segredo a vocês, a complexidade se reproduz assexuadamente. Há muito código complexo demais por aí. Se você encontrar indícios de complexidade hoje, corte antes que ela se reproduza, porque ela tende a fugir do controle. Cada vez que você deixa uma implementação complexa num componente de um sistema, você está complicando um pouquinho todos os pontos do sistema que usam aquele. Os resultados ruins são exponenciais. Por mais talentoso que você seja, se deixar a complexidade se enraizar e crescer, vai chegar um momento em que a lógica vai "jogar a toalha" e você vai começar a programar na base da tentativa e erro.

Lembre-se, então, partes simples, conectadas por interfaces simples. Complicado é errado, feio e mau, faz você entregar atrasado e com bugs. E, se precisar de inspiração, abra o Python e digite:

import this

Flash 10 no Linux

17/10/2008

Ao contrário do Luis Eduardo Fernando, tenho sido nos últimos anos um feliz usuário de Linux. Funcionava tudo, ou quase. Tenho um LG R405[bb]. Funciona o controle de bateria, de velocidade do cooler, brilho da tela, tenho volumes independentes para o microfone e caixa de som embutidos, e microfone e caixa de som externos. Funciona rede com e sem fio, o modo de hibernação, mouse externo, pen-drive, o modem da Claro[bb], impressora, e tudo mais que precisei.

O Ubuntu é tão simples de configurar e usar na interface gráfica, sem precisar abrir o terminal, que o pessoal aqui faz uma piada chamando-o de "Microsoft Ubuntu". Mas faltava uma coisa. A versão 9 do Flash Player que a Macromedia disponibiliza tem alguns problemas no Linux. Os dois principais são a falta do window mode transparent, o que faz com que aqueles sites que tem um "layer" Flash sobre o conteúdo fiquem bem estranhos, às vezes impossíveis de usar, e a falta de suporte a v4l2. A v4l2 (Video 4 Linux 2) é a biblioteca que faz funcionar a maioria das webcams. Ou seja, minha webcam funcionava em todos os programas, menos no Flash Player. Isso me impedia de, por exemplo, fazer streammings no UStream.

O problema foi resolvido. Você pode baixar a versão 10 do Flash Player direto do site da Adobe. Com ela temos window mode transparent, e minha webcam está funcionando que é uma beleza.

E, para aqueles que têm medo de terminal, a instalação é extremamente simples. Baixe o ".deb" para Ubuntu, salve no Desktop (ou onde você preferir) e dê um duplo clique. Vai aparecer o instalador de pacotes, com as informações do pacote e um único botâo, "Instalar Pacote". Clique nele, coloque sua senha de administração, espere a instalação terminar e reinicie o Firefox.

Integrando o Vim com ferramentas externas

08/07/2008

Depois que comecei a usar o Vim nas palestras em que eu escrevo código, muita gente começou a me escrever com dúvidas sobre o editorzinho. Apesar de eu dizer nas palestras que Vim é complicado, parece que o pessoal não tem medo. E a dúvida mais freqüente é sobre a integração entre o Vim e ferramentas externas, principalmente o txt2tags.

Faz parte da filosofia Unix que um programa seja facilmente integrado a outros através de interfaces de texto, e o Vim implementa isso muito bem. Para começar, abra o Vim e execute:

:!ls

Você vai ver que o Vim vai executar o comando ls. Então guarde isso, o sinal de exclamação (!) executa comandos externos. Há duas maneiras de fazer o Vim falar com esses comandos. A primeira é mandar o Vim ler a entrada do comando. Digite:

:r!ls

Você vai notar que o Vim vai executar o comando ls e colocar o conteúdo no buffer de edição. A outra maneira de fazer o Vim falar com os programas externos é selecionar texto. Aperte i para ir para o modo de edição e digite:

zebra
tesoura
banana
macaco
felicidade
abacate

Ao terminar de digitar, pressione ESC para voltar ao modo de comando, em seguida SHIFT+V para ir para o modo de seleção de linha e selecione todo o bloco. Com o bloco selecionado, digite:

:!sort

O vim vai colocar, antes do comando, os sinais de seleção '<,'>. Não se preocupe, apenas digite o comando e aperte ENTER. Você vai ver que o Vim vai executar o comando sort do sistema operacional, passando como entrada o texto selecionado, e vai substituir esse texto pela saída do comando. Isso, ao final, vai te dar a lista ordenada, assim:

abacate
banana
felicidade
macaco
tesoura
zebra

Usando essa interface simples você pode fazer o Vim falar com qualquer programa Unix.

txt2tags

O programa que eu tenho usado durante as palestras e mais tem deixado as pessoas curiosas é o txt2tags, desenvolvido pelo Aurélio Marinho. O programa está nos repositórios do Debian, então se você usa Debian ou Ubuntu, pode instalá-lo com o comando:

sudo apt-get install txt2tags

O txt2tags lê as primeiras linhas de texto que recebe como títulos do documento. Além disso, precisaremos de várias opções de linha de comando, o que não é conveniente de se digitar. Então vamos criar um shell script para guardar essas opções e fornecer ao txt2tags linhas de cabeçalho de mentirinha. Eu criei um arquivo chamado tags dentro do diretório /usr/local/bin, com permissão de execução (chmod +x) e o seguinte conteúdo:

#!/bin/bash
(echo "
 
 
 
 
 
" && cat ) | txt2tags -t xhtml --infile=- --no-headers

Em seguida, basta abrir o Vim e digitar, por exemplo:

= Aprenda Online =
A [Visie http://visie.com.br/] oferece cursos de Ajax, Javascript e Tableless.

Em seguida selecione essas duas linhas e execute:

:!tags

Pronto, HTML instantâneo.

Não entre em pânico

31/03/2008

Você está usando um terminal conectado a um servidor Unix quando as coisas começam a se comportar de maneira estranha. Depois de algum tempo você descobre o problema. Vai até a mesa de um programador novato e descobre que ele, como root, digitou:

# cd
# rm -rf *

O sujeito percebeu a burrada antes de apagar os diretórios /usr e /users. Nesse caso, /users continha os diretórios home. Mas todo o resto do sistema se foi, incluindo /dev, /etc e /bin.

O que você faria? Para complicar as coisas, esta história aconteceu há um bocado de tempo, numa VAX. Ou seja, não era só fazer um boot com um live-CD, fazer um backup dos dados dos usuários e reinstalar o sistema.

O que fazer? Não entrar em pânico. Uma história e tanto.

Dicas de shell: Greg's Wiki Bash Pitfalls

26/03/2008

No Greg's Wiki você encontra os Bash Pitfalls, uma lista de problemas comuns entre os programadores bash iniciantes.

Encontrei vários dos meus erros comuns lá. E aprendi um bocado.

Intrusividade Windows

17/03/2008

Esses dias precisei desenvolver alguma coisa em Windows para um cliente. Tenho algumas licensas de Windows aqui para essas emergências, então resolvi instalar o Windows XP no VMWare. Diferente da instalação do meu sistema operacional predileto, que está pronto para ser usado em menos de dez minutos, instalar o Windows é uma tarefa bastante dolorosa, que envolve um instalador chato e demorado, ativação, instalação de anti-vírus, anti-spyware, e aplicações básicas como um leitor de PDF, um editor de código, um pacote de escritório e etc.

Tudo isso me faz morrer de medo de ter que instalar meu Windows duas vezes. No dia seguinte ao da instalação desse Windows, o que incluiu a instalação do Flash, do Captivate, do Acrobat e uma porção de outras coisas, uma pessoa me ligou para lembrar de um compromisso. Resolvi desligar o computador e sair imediatamente para não me atrasar. Quando mandei a máquina desligar, veja a simpática mensagem que o Windows me mostrou:

Instalando atualização 13 de 85 (Windows XP)

Que ficava alternando com essa outra:

Não desligue ou desconecte o computador; ele será desligado automaticamente. (Windows XP)

Foram eternos 43 minutos nisso. E eu morrendo de medo de desligar e estragar minha instalação do Windows, esperei. Pode ser que eu esteja enganado, mas não me lembro de o sistema ter me perguntando se eu gostaria de instalar nesse momento as atualizações que ele baixou, ou de sequer me avisar antes que minha máquina precisava permanecer ligada.

Perdi meu compromisso e passei muita, muita raiva. Sistema operacional simpático.

Photoshop agora roda bem no Linux

20/02/2008

Google Sponsors Wine Improvements

O Google usa o Wine para oferecer o Picasa, seu gerenciador de fotos, para usuários de Linux. Para isso, o Google financiou o pessoal da CodeWeavers, que desenvolve o Wine. Wine é uma implementação da API do Windows para Linux, muito útil para usuários que querem migrar para Linux mas ainda dependem daquele software que só roda em Windows. E o software que mais impede gente de migrar para Linux é o Photoshop.

Impedia. O Google também pagou à CodeWeavers para melhorar o suporte ao Photoshop no Wine. De quebra, as melhorias feitas ainda ajudaram a rodar uma porção de outros softwares no Linux, entre eles o Flash. Meu amigo DGMike está agora um passo mais perto da migração total ;-)

O que eu fico me perguntando é porque o Google fez isso? Para diminuir seu custo com licenças de Windows? Ou para jogar sua pá de terra na Microsoft?

De qualquer maneira, é um exemplo que mostra bem o que é software livre. Software livre não é necessariamente software grátis. Nesse caso, o Google pagou os custos de desenvolvimento. E o mundo inteiro vai ser beneficiado, sem que você precise pagar de novo por algo que já foi desenvolvido.

Dicas de shell: testes unitários e commit

12/02/2008

Todas as tarefas relacionadas a contrução, teste e publicação de um desenvolvimento de software[bb] devem ser automatizadas o máximo possível. Escrever software é interar. Você escreve e testa, escreve e testa, escreve e testa dezenas, às vezes centenas de vezes por dia. As tarefas relacionadas a testar o software, de maneira especial, merecem a automatização que for possível dar a elas. Convenhamos, testar é algo muito chato. E se for complicado testar, será uma tentação irresistível para o programador entregar seu código sem testar adequadamente.

Hoje vamos construir um script de commit no subversion[bb] que, antes de enviar o código, executa todos os testes unitários. Vou trabalhar com Python[bb], mas você não deve ter dificuldades em adaptar isso para a sua linguagem de programação predileta.

A primeira coisa importante é que você entenda que todo script executado no shell tem um valor de retorno. Esse valor é retornado pelo comando, e também armazenado na variável especial $?. Veja estes exemplos:

$ echo $?
2
$ ls test
test
$ echo $?
0
$ if ls test2;then echo O arquivo existe.;fi
ls: test2: Arquivo ou diretório não encontrado
$ if ls test;then echo O arquivo existe.;fi
test
O arquivo existe.
$ if ! ls test;then echo O arquivo não existe.;fi
test
$ if ! ls test2;then echo O arquivo não existe.;fi
ls: test2: Arquivo ou diretório não encontrado
O arquivo não existe.

Os testes foram construídos usando o módulo para testes unitários unittest do Python. Cada teste está, no diretório do projeto, junto do arquivo de código que ele testa. E o nome dos arquivos de teste sempre começam com "test". Assim, o arquivo connections.py é testado pelo testconnections.py.

Veja então nosso shell script, salvo com o nome de commit, que será usado durante todo o projeto para rodar os testes antes do commit:

#!/bin/bash
 
# Começamos com um contador de erros em zero
erros=0
 
# Encontramos cada um dos testes
for i in `find -name "test*.py"`;do
echo TESTANDO: $i
echo
 
# Se o teste falhar, incrementamos a variável erros
if ! python $i;then
erros=$(($erros + 1))
fi
 
echo
done
 
# Se os testes passaram, fazemos commit, caso contrário
# avisamos o usuário
if [ $erros == 0 ];then
# Esse $* passa os parâmetros de linha de comando recebidos para o svn.
svn ci $*
else
echo Testes falharam, commit cancelado.
fi

Tendo feito isso, e colocando esse script em /usr/local/bin, o programador vai trocar svn ci por commit, e os testes serão feitos automaticamente antes do commit. Ele também pode passar parâmetros do svn para o script:

commit -m "Criei o link espacial com saturno"

Editores de código para Linux

21/01/2008

Nosso amigo pergunta por e-mail:

Boa Noite Elcio, Me desculpa me fazer essa pergunta que varias pessoas ja dever ter feito é que pesquisei e não encontrei, a pergunta é qual editores você indica para linux?
uso o editplus no windows.

Como a resposta deve servir para mais gente, publico aqui.

Eu uso o Vim. Mas, como eu costumo dizer para o pessoal aqui, Vim não é para qualquer um. Se você quer aprender, um bom lugar para começar é a página do Aurélio sobre Vim (VI). Mas eu já vou avisando, embora seja muito produtivo e eu esteja completamente viciado nele, Vim não é fácil. É um editor modal, em interface texto, e leva algum tempo para aprender a usá-lo.

Para quem me pergunta sobre editores no Linux, costumo recomendar o Kate.

Kate

Entre os recursos legais do Kate estão o auto-completar, que funciona de um jeito bem diferente da maioria dos editores lendo o texto que você já digitou, a integração com o terminal, a possibilidade de navegar e editar arquivos diretamente via FTP ou SSH, os trechos de código, a seleção de bloco, um excelente replace com expressões regulares.

Se você usa Ubuntu, instale também os pacotes kate-plugins e konq-plugins. Se quiser o Kate em português instale também o kde-i18n-ptbr. Para configurá-lo, vá em Configurações, Configurar Kate. Eu costumo usar assim:

  • Sessões, Comportamento ao Iniciar o Aplicativo: Iniciar uma nova sessão
  • Seletor de Arquivos: Eu adiciono o botão recarregar à lista da direita
  • Plug-ins: Eu ligo os plugins "Complementação XML", "Extensão da Barra de Abas", "Ferramentas HTML", "Filtro", "Inserir Comando", "Navegação Python" e "Trechos de Código".
  • Aparência: ligo "Mostrar o Número de Linhas"
  • Editando: ligo o "Inserir espaços ao invés de tabs" e coloco "Largura da tab" como 2. Também marco o "Remover espaços finais".
  • Identação: coloco "Modo de Identação" em "Estilo Python" e marco "Usar espaços para identar, ao invés de tabs"
  • Abrir/Salvar: ligo "Remover espaços finais"
  • Plug-ins: ligo "Busca Incremental" e "Complementação de Palavras". No segundo, clico em "Configurar…" e coloco a quantidade de caracteres em 2.

No "Navegador para Sistema de Arquivos" você vai ver uma estrelinha, que te dá acesso aos favoritos do Kate. Para adicionar um servidor FTP, adicione um favorito assim:

ftp://usuario:senha@servidor.com.br/pasta/

Para um servidor SSH, a sintaxe é a mesma, trocando "ftp://" por "sftp://".

Entre os recursos mais legais do Kate está a integração com comandos shell. Digamos que você queira ordenar determinada lista em seu código. Você seleciona a lista, digita CTRL+\, escreve o comando "find" e dá OK. Bom, você já entendeu, no lugar de find poderia ir qualquer comando do Linux, mesmo uma combinação deles.

Outros Editores

Outros editores que eu costumo recomendar são:

  • Gedit: o editor padrão do Gnome, parece um bloco de notas não é? Então instale o pacote gedit-plugins, depois abra o gedit e vá em Editar, Preferências, Plug-ins. Divirta-se.
  • Komodo: se você não consegue viver sem auto-completar, checagem de sintaxe, tutoriais e assistentes, preview de HTML, macros e muitos botôes e barras de ferramentas, o Komodo é o seu editor. As marcos são escritas em Javascript e você pode criar extensões XPI com XUL, igualzinho ao Firefox. Além disso, o Komodo é multiplataforma. Você pode ter seu editor, com suas macros e extensões, funcionando igualzinho em Windows, Linux e Mac.

Naturalmente, além desses existem dezenas de boas opções de editor de código para Linux. Se você tem alguma dica muito boa, não deixe de comentar.

Dicas de shell: find

08/01/2008

Um dos comandos mais úteis no gerenciamento de arquivos no terminal do Linux[bb] é o comando find. Ele permite realizar e automatizar tarefas que na interface gráfica levariam muito tempo. Executar o comando find sem argumentos faz com que ele liste todos os arquivos do diretório atual e de seus subdiretórios.

Para procurar dentro de um diretório específico, informe o caminho ao find:

find caminho/onde/procurar

O find recebe uma série de parâmetros úteis. É bom lembrar que o diretório de procura precisa ser sempre o primeiro parâmetro. Assim, para procurar por todos os arquivos de extensão bak no diretório atual, faça:

find -name "*.bak"

E para procurar dentro de um diretório específico, use:

find caminho/onde/procurar -name "*.bak"

O find permite a você construir uma série de expressões de procura e operação com os arquivos, algumas bastante complicadas (e poderosas). Vamos dar uma olhada em algumas bem simples. Para apagar os arquivos, use -delete. Então, para apagar todos os arquivos bak no diretório atual e em seus subdiretórios, faça:

find -name "*.bak" -delete

Você também pode passar parâmetros numéricos, que funcionam segundo a seguinte lógica:

  • Um número sozinho significa exatamente aquele número, por exemplo: 3
  • Com um sinal de mais, significa maior do que aquele número: +3
  • Com um sinal de menos, significa menor do que aquele número: -3

Para ver uma lista dos arquivos modificados há menos de três dias, faça:

find -mtime -3

Para ver os que foram modificados a mais de três dias, inverta o sinal:

find -mtime +3

As expressões mais comuns para uso com tempo são:

  • -amin - quando o arquivo foi acessado, em minutos.
  • -atime - quando o arquivo foi acessado, em dias.
  • -cmin - quando o arquivo foi criado, em minutos.
  • -ctime - quando o arquivo foi criado, em dias.
  • -mmin - quando o arquivo foi modificado, em minutos.
  • -mtime - quando o arquivo foi modificado, em dias.

Outras expressões bastante úteis são:

  • -regex: funciona como -name, mas recebe uma expressão regular[bb].
  • -size: filtra pelo tamanho do arquivo. É um número seguido de uma letra. As mais comuns são: c - bytes, k - kilobytes, M - megabytes e G - gigabytes.

Por fim, você também pode mandar o find executar operações nos arquivos. Foi o que fizemos no início, quando usamos -delete para apagar arquivos. Dentre as operações, minha predileta é a -exec.

Quando você coloca -exec numa linha de comando do find, tudo o que vem depois até o próximo ";" é entendido pelo find como um comando, que ele vai executar para cada um dos arquivos encontrados. É obrigatório colocar ";" para terminar o comando, se você se esquecer vai receber o seguinte erro:

$ find -exec ls
find: faltando argumento para `-exec'

Onde você quiser passar para seu comando o nome do arquivo, use {}. Por exemplo, para tirar a permissões de execução de todos os arquivos TXT na busca, você pode fazer:

find -name "*.txt" -exec chmod -x {} ";"

Isso vai executar, para cada um dos arquivos encontrados:

chmod -x ARQUIVO ;

O último truque que eu gostaria que você guardasse na manga é que você pode combinar o find com o excelente comando grep. Grep faz buscas dentro de um arquivo. Com o parâmetro -l o grep apenas lista o nome do arquivo se a expressão regular de busca for encontrada. Então, para encontrar todos os arquivos python[bb] que contém o texto "urllib" você pode fazer:

find -name *.py -exec grep -l urllib {} ";"

O find, é claro, tem muito mais recursos e opções. Se quiser mesmo se aprofundar, man find.

Por que o arquivo ISO abre no compactador de arquivos?

12/12/2007

Olha que coisa interessante, a Marcelle Ramalho resolveu experimentar o Linux. Pelo texto, dá para perceber que ela é bem iniciante em informática, e sem nenhum contato com o Linux[bb]. Veja esse trecho:

Baixei o arquivo da internet e meu primeiro baque foi gravá-lo em CD. O arquivo é compactado e eu prontamente descompactei-o, pois me parece uma coisa lógica a se fazer. Nada como um arquivo descompactado, não é mesmo? Pelo visto não era tão lógico, já que ao falar para o meu "personal Linux teacher" o que tinha feito ele levou uns minutos para responder: "QUEEEEEEEEEEEEEEEEEEEEE?"

Sim, você entendeu, ela baixou um arquivo ISO e não sabia o que fazer com ele. Essa dúvida é muito comum. E antes de culpar a moça pela desinformação, lembre-se de que ela não tem obrigação nenhuma de saber e foi induzida ao erro pelo Windows[bb], que mostrou o ISO com um comportamento e opções semelhantes ao de um arquivo ZIP, com o que ela já está familiarizada.

E o erro não acontece apenas no Windows. Veja, por exemplo, o que acontece aqui no meu Ubuntu quando eu clico com o botão direito em um arquivo ISO:

Arquivos ISO devem ser gravados em CD, não descompactados

Por que o "Criador de CD/DVD" não é a primeira opção? É muito útil poder abrir um arquivo ISO no compactador e extrair arquivos de lá de dentro, mas quantas vezes você realmente usa isso? A esmagadora maioria das vezes que alguém tem um arquivo ISO, quer simplesmente gravá-lo em CD.

Resolvendo o problema no Ubuntu

Para resolver o problema de verdade, o pessoal do Ubuntu precisaria modificar a distro para que a ação padrão para arquivos ISO seja gravar em CD. Mas você pode fazer isso em seu sistema, de maneira que possa gravar arquivos ISO com um duplo clique. Para isso, clique com o botão direito em um arquivo ISO e escolha "Propriedades". Na janelinha que vai se abrir, clique na aba "Abrir com" e escolha o "Criador de CD/DVD". Assim:

abrircom.gif
Pronto, agora duplo clique em arquivos ISO vão abrir no gravador de CD.

Que venham os leigos

Entre os comentários no artigo da Marcelle, há algumas pessoas que fazem questão de deixar bem claro que ela deveria saber o que é um arquivo ISO, que isso é coisa básica e que ela não deveria tentar peripécias no computador sem primeiro estudar o assunto. Teve até um camarada que sugeriu que ela primeiro lesse o Guia Foca Linux. Essa idéia é um absurdo!

Eu aprecio muito o Guia Foca Linux. Aprendi muita coisa com ele. Mas, definitivamente, não é para qualquer um. Dê uma olhada, por exemplo, na versão para iniciantes. São dezesseis capítulos, ensinando coisas como editar o fstab e gravar os dados do cache RAM em disco editar o .bash_profile dentro do /etc/skel e configurar o iptables para filtrar pacotes pelo mac address, tudo pela linha de comando. Ora, a pessoa só quer acessar a web, editar documentos, assistir DVDs e ouvir música, não é pedir demais querer que ela leia isso tudo primeiro?

Vamos deixar as coisas bem claras: eu e você lemos o manual de cada um de nossos aparelhos, muitas vezes antes de ligar e tentar usar. Nós sabemos ligar o closed caption da TV, programar as memórias do telefone e desligar o flash da câmera digital[bb]. Nós somos nerds. A esmagadora maiora das pessoas não lê os manuais, e é muito feliz assim!

Se você quer reclamar das pessoas que não lêem o manual, vá em frente. Vai gastar um bocado de tempo e energia para nada. Nossa obrigação, como nerds espertos, é desenvolver sistemas tão fáceis que pessoas que não lêem o manual consigam usar.

UPDATE: Conforme o Hudson apontou, eu tinha feito conversão entre as versões do Foca. Corrigido. Obrigado, Hudson!

Ssh, sftp e rsync em porta diferente do padrão

12/12/2007

Levei mais tempo do que devia para achar essa solução, então vou deixar registrada aqui, pois pode ter mais gente atrás disso. O protocolo ssh é muito popular no mundo Unix. Com ele você pode administrar seu servidor à distância. O tráfego de dados ssh é todo criptografado[bb], e o protocolo é bastante seguro. Mesmo assim, se você tem usuários em sua máquina com senhas fracas, corre o sério risco de sofrer um ataque de dicionário.

Entre as principais recomendações para tornar seu servidor mais seguro estão:

  • Evite senhas fracas: faça com que seus usuários tenham senhas fortes e não óbvias;
  • Não permita o login como root: assim, para fazer alguma coisa realmente perigosa, um invasor teria que descobrir duas senhas ao invés de uma. No Ubuntu, edite o arquivo /etc/ssh/sshd_config e altere a linha PermitRootLogin para:
    PermitRootLogin no
  • Mude a porta do serviço ssh: a porta padrão para o serviço ssh é a 22. Trocá-la vai dar algum trabalho a um possível invasor. Para isso, no Ubuntu[bb], edite o /etc/ssh/sshd_config e altere o número na linha Port para a porta desejada:
    Port 999

Para se conectar ao servidor, use:

ssh -p999 servidor

Como o protocolo ssh é robusto, seguro e flexível, há vários serviços que rodam sobre ele. Entre os mais populares estão o sftp e o rsync. O sftp é um serviço de ftp sobre ssh. A principal vantagem dele em relação ao ftp comum é que o tráfego é criptografado. Já o serviço rsync é genial, serve para manter sincronizadas cópias de arquivos e diretórios em máquinas diferentes.

Para se conectar via sftp com uma porta diferente da 22, use:

sftp -oPort=999 servidor

Para fazer rsync via ssh numa porta diferente da 22, use:

rsync –rsh='ssh -p42' arquivolocal servidor:/caminho/para/o/arquivoremoto

Ubuntu chega oficialmente ao Brasil

23/11/2007

Boa notícia: Ubuntu chega oficialmente ao Brasil.

“Nossa estratégia será fechar parcerias com fabricantes para oferecer o Ubuntu pré-instalado e pré-configurado, faturando com suporte, serviços, segurança e atualização.”

Vem em boa hora. Um funcionário meu comprou um notebook[bb], um Presario v6210br, que veio com Mandriva. O suporte é uma piada. Não conseguíamos conectar em redes com chave WEP, apenas redes abertas. Em todas as ligações que fizemos os atendentes nos disseram que, se o computador conecta em uma rede e outra não, o problema é na rede, e eles não prestam suporte a configuração de redes. Mesmo argumentando que os outros notebooks na empresa, com Linux[bb] e Mac OS, se conectam normalmente à rede.

Parece que eles colocam Linux nessas máquinas só para reduzir custos, mas não esperam que ninguém vá usar realmente o sistema. A qualidade da instalação é entristecedora. Veio com a rede wi-fi configurada via ndiswrapper e cheia de problemas, e os drivers para a placa de vídeo 3D simplesmente não vieram instalados. Parece que esperam que todo mundo vá instalar um Windows pirata na máquina.

Quem sabe com uma distribuição de verdade, prestando suporte de verdade, notebook com Linux pré-instalado deixe de ser piada no Brasil.