Photoshop agora roda bem no Linux

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

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"