sexta-feira, 25 de julho de 2008

Ajude a sustentar a Wikipédia e outros projetos, sem colocar a mão no bolso, e concorra a um Eee PC!


…e também a pen drives, card drives, camisetas geeks, livros e mais! O BR-Linux e o Efetividade lançaram uma campanha para ajudar a Wikimedia Foundation e outros mantenedores de projetos que usamos no dia-a-dia on-line. Se você puder doar diretamente, ou contribuir de outra forma, são sempre melhores opções. Mas se não puder, veja as regras da promoção e participe - quanto mais divulgação, maior será a doação do BR-Linux e do Efetividade, e você ainda concorre a diversos brindes!


sexta-feira, 18 de julho de 2008

Shell Script no dia-a-dia 2


Num post anterior, em Shell Script no dia-a-dia, eu falei como poderíamos utilizar shell script para diminuir o tamanho de todas as fotos em um diretório mexendo na qualidade delas. Hoje veremos uma melhoria.

Inicialmente, o script não tratava arquivos com espaços em branco no nome. Bom, depois de quebrar um pouco a cabeça desenvolvi um outro script pra tratar este problema.

A filosofia é trocar os espaços em branco por um caractere (variável $PIVO) e realizar o tratamento dos arquivos. Depois a gente renomeia de volta pro nome original. É simples, segue abaixo:

#!/bin/bash

# Definindo o diretório onde as fotos estão.
if [ $# -eq 1 ]; then
DIR=$1
else
DIR="."
fi

# Diretório destino das fotos diminuidas.
DEST="$DIR/FOTOS_DIMINUIDAS"
TEMP="/tmp/$0-`whoami`-$$"
DEST_TEMP="$TEMP/FOTOS_DIMINUIDAS"


echo
echo "As novas imagens serão enviadas para $DEST"
echo "Pressione qualquer tecla para continuar ou CTRL^C para sair"
read

# Cria diretórios se eles não existem.
test ! -e $DEST && mkdir $DEST
test ! -e $TEMP && mkdir -p $DEST_TEMP

echo
echo "Tratando fotos .jpg ou .JPG em $DIR"
echo

# funcao para diminuir a foto de entrada
diminuir(){
# Foto que será tratada.
ENTRADA="$1"
# Foto que será gerada.
SAIDA="$2"

# Verificando se a foto a ser gerada já existe.
if [ ! -e ${SAIDA} ]; then
echo "gerando ${SAIDA}"
# Comando para converter ou diminuir as fotos
convert -quality 45 "$ENTRADA" "$SAIDA"
else
echo "Não foi possível converter ${FOTO}, pois ela já existe"
echo "Pressione qualquer tecla para continuar ou CTRL^C para sair"
read
fi
}

# Mostra pontilhados (eu sempre quis fazer isso, rsrs)
mostra_pontos(){
echo -n " "
x=0
while [ $x -lt $1 ]
do
sleep 0.1 && echo -n .
x=`echo "$x + 1" | bc`
done
echo -n " "
}

# Executa rotina para cada foto no diretório
PIVO="="
for SEM_ESPACO in `ls -1 ${DIR} | grep -E "*.(jpg|JPG)" | tr [:blank:] "$PIVO" | xargs -n 1 -d "\n" echo`
do
COM_ESPACO=`echo $SEM_ESPACO | tr "$PIVO" " "`
test -f "$COM_ESPACO" && cp "$COM_ESPACO" "${TEMP}/$SEM_ESPACO"
diminuir ${TEMP}/$SEM_ESPACO ${DEST_TEMP}/$SEM_ESPACO > /dev/null
echo -n "gerando ${DEST}/$COM_ESPACO" && mostra_pontos 4
mv "${DEST_TEMP}/$SEM_ESPACO" "${DEST}/$COM_ESPACO" && echo feito
done

# Apagando diretórios temporários
rm -rf $TEMP


terça-feira, 15 de julho de 2008

Instalando o Pidgin no Debian


Pessoas, esta é uma dica de como instalar o mensageiro multi-protocolo Pidgin no Debian.




O Pidgin pode trabalhar com os protocolos abaixo dentre vários outros (veja aqui):
  • AIM
  • Google Talk
  • ICQ
  • IRC
  • MSN
  • XMPP
  • Yahoo!

E o melhor, tudo na mesma aplicação. Legal, né?


Mas como instalar no Debian? É simples, vamos baixar algumas dependências pelo gerenciador de pacotes do Debian, o apt-get (necessário ser root, use su ou sudo):
$ sudo apt-get install libperl-dev libxml-parser-perl libnm-glib-dev libdbus-glib-1-dev libavahi-glib-dev libgtk2.0-dev libxss-dev libstartup-notification0-dev libxml2-dev libgstreamer0.10-dev libmeanwhile-dev libavahi-client-dev network-manager-dev tcl8.4-dev tk8.4-dev libgtkspell-dev

Agora vamos baixar o código fonte da versão mais recente do pidgin aqui com:
$ wget http://downloads.sourceforge.net/pidgin/pidgin-2.4.3.tar.bz2

Vamos descompactar o pidgin com:
$ tar xvf pidgin-2.4.3.tar.bz2

Agora, vamos configurar e compilar e instalar:
$ ./configure && make && sudo make install

Por organização, vamos copiar a pasta do Pidgin para /usr/local/src, que é onde ficarão os códigos fontes de programas compilados. Você pode adotar outro lugar, aqui é por sua conta. Pra economizar espaço, limpe primeiro os arquivos que a compilação gerou e depois copie.
$ make clean
$ sudo cp -R ../pidgin-2.4.3 /usr/local/src/

Com o make clean eu economizei uns 55 MB, que é muito pra mim (rsrs)!

Depois apague a pasta original (já copiamos outra pra /usr/local/src):
$ cd ..
$ rm -rf pidgin-2.4.3

Como podem notar a instalação do Pidgin é simples. Você também ativar um plugin do Pidgin pra te avisar quando houver uma versão nova, já que ele não estará no banco de dados do dpkg .

Vá no menu Ferramentas > Plugins e ative Notificação de nova versão 2.4.3




quarta-feira, 2 de julho de 2008

Dupla diabólica: find e xargs

Hoje veremos uma dupla considerada diabólica no shell, se utilizada sem a devida atenção: o find e o xargs.

O find, como o nome diz, é utilizado para se encontrar arquivos no sistema. Já o xargs facilita a repetição de um certo comando para cada entrada fornecida pra ele. Peraí, vamos entender melhor. Considere que eu queira apagar os arquivos terminados em ~ no diretório atual. Poderíamos utilizar a dupla da seguinte maneira:
$ find . -name "*~" | xargs rm

Aqui o find retornaria uma saída com os arquivos terminados em ~ e o xargs executaria o comando rm para cada uma das saídas.

Por exemplo, crie um diretório teste e entre nele:
$ mkdir teste; cd teste

Agora crie os arquivos "teste" e "teste~":
$ > teste; > teste~
$ ls
teste teste~

Agora vamos apagar os arquivos terminados em ~ do diretório atual:
$ find . -name "*~" | xargs rm
$ ls
teste

Olha aí o resultado acima, deu certo.

Até aí tudo bem, mas se o arquivos terminados em ~ possuíssem caracteres em branco? Experimente e crie um "teste 1~". Proteja-o com aspas para que o shell não interprete mal o que queremos:
$ > "teste 1~"
$ ls
teste teste 1~

Agora experimente apagá-lo com:
$ find . -name "*~" | xargs rm
rm: imposível remover `1~': Arquivo ou diretório inexistente
$ ls
teste 1~

E agora, José? Cadê meu arquivo "teste"? Ele APAGOU O ARQUIVO ERRADO!

Isso aconteceu simplesmente porque o rm tratou o arquivo "teste 1~" como dois arquivos diferentes: um "teste" e outro "1~". Ou seja, o espaço em branco acabou com nossa alegria (e talvez o emprego)!

Mas não se apavore, pois uma solução pra isso é utilizar a opção -print0 do find junto com a opção -0 do xargs.
$ > teste
$ ls
teste teste 1~
$ find . -name "*~" -print0 | xargs -0 rm
$ ls
teste

Pronto, agora sim, funcionou! A explicação é que o find separou os arquivos com um caractere nulo. O xargs interpretou os caracteres nulos como separadores dos arquivos e fez o que queríamos. :]

Para mais informações:
$ man find
$ man xargs