Pages

Wednesday, January 27, 2010

Configurando o SSMTP/MSMTP e o Gmail

Tentando fazer o sendmail funcionar no meu computador, achei esse interessante texto.
Sei o que parece no primeiro momento, funciona apenas no Archlinux, certo ? Mas não é verdade. Funciona apenas com o programa ssmtp, isso é fato.
Você pode dizer que é fantástico, certo ? Mais ou menos, não há mais suporte para o ssmtp (desenvolvimento interrompido).

Assim, chegamos ao MSMTP:
Uma coisa que esse texto não disse, é que ao usar o msmtp não há realmente o programa sendmail instalado.
Das duas uma:
  • crie um link para o programa msmtp chamando sendmail, como root, execute:
    ln -s /usr/bin/msmtp /usr/sbin/sendmail
  • ou use a alternativa (mais elegante) de criar o arquivo ~/.mailrc e colocar nele o conteúdo:
    set sendmail=/usr/bin/msmtp
O lado bom dessas idéias é que não é nada mais nada menos do que usar o serviço de cliente de um servidor de e-mail. O lado desagradável é que sua senha estará escrita em um arquivo de texto simples, ou seja, quem tiver acesso ao seu computador terá acesso a sua senha, exceto se for tão paranóico quanto eu e colocar esse arquivo dentro de uma (ou mais) camadas criptografadas a serem removidas apenas durante o processo de enviar mensagens... Se bem que apenas criar uma conta apenas servir de smtp é uma idéia satisfatória para a grande maioria dos paranóicos.

Para quem não sabe, uma configurado um desses pequenos programas, tudo que está escrito nessa página que explica como mandar um e-mail pela linha de comando torna-se válido.

O uso dessas opções são a alternativa mais simples para utilizar o comando de terminal "mail" e não ter que configurar programas como o exim ou postfix.

O texto original foca no uso do Gmail, mas pode utilizar qualquer servidor pop, alterando, claro, os campos apropriados. Pode-se, inclusive, utilizar um servidor POP3 que não requer autenticação, embora eu não conheça mais serviço com essa característica atualmente.

Sunday, January 17, 2010

Alternando arquivos entre codificações UTF-8 e ISO-8859-1

O um dos textos mais populares desse blog é que escrevi em 2006 explicando como converter arquivos entre as codificações UTF-8 e ISO-8859-1. Esse tópico vai revisitar o assunto. Algumas partes vão parecer cópias, é porque são cópias.

Não posso deixar de agradecer aos inúmeros comentários do tópico original. Foram esses comentários que me ajudaram a entender várias coisas que são apresentadas aqui. Enfim, a leitura dos comentários é fundamental para entender o motivo de eu ter repaginado esse tópico e para entender de onde vem algumas inspirações que serão expostas.

Convertendo o conteúdo do arquivo entre os formatos

O comando iconv é parte padrão de toda distribuição GNU/Linux.
A sintaxe básica é dada por:

iconv -f codificacao_de_origem -t codificacao_de_saida arquivo

Assim para converter UTF-8 para ISO-8859-1 temos:

iconv -f utf-8 -t iso-8859-1 arquivo

Para o contrário utilizamos:

iconv -f iso-8859-1 -t utf-8 arquivo

É necessário redirecionar a saida de arquivo para algum lugar, algo como:

iconv -f utf-8 -t iso-8859-1 arquivo > novo_arquivo

Identificando a codificação do arquivo

O comando iconv não é muito inteligente. Ele não sabe qual é a codificação original do arquivo. Resumindo, ele pode corromper um arquivo caso seja feita uma conversão dupla (ou tripla) de forma equivocada.

Para esses casos, apresento o comando file. Que me foi apresentado pelo Bob nos comentários do tópico original. A sintaxe é muito simples:

file --mime-encoding nome_do_arquivo

Se o arquivo não for um binário ele vai retornar qual é a codificação. E essa informação pode ser filtrada em um script para evitar conversões erradas entre formatos. O uso da opção "--mime-encoding" é opcional em arquivos de texto puro, mas não é no caso de um código fonte HTML, por exemplo. Ainda assim esse comando tem algumas particularidades. Por exemplo, ele identifica o .vimrc como um binário e não retorna qual é a codificação (que de fato não faz sentido em um binário), o problema é que o .vimrc é texto e ele pode te problemas de codificação.

Convertendo o nome dos arquivos entre os formatos

Para converter o nome dos arquivos entre as duas codificações, o comando é o convmv
A sintaxe á dada por:

convmv -t codificacao_de_saida -f codificacao_de_origem --notest nomes_dos_arquivos

Assim para converter UTF-8 para ISO-8859-1 temos:

convmv -t iso-8859-1 -f utf-8 --notest nomes_dos_arquivos

O inverso, ISO-8859-1 para UTF-8, a comando é dado por:

convmv -t utf-8 -f iso-8859-1 --notest nomes_dos_arquivos

onde nomes_dos_arquivos é a lista de todos os arquivos que deseja decodificar, inclusive, aceita-se asterisco. A opção "-r" permite realizar a operação recursivamente. Esse comando é inteligente o suficiente para não converter arquivos que estejam na codificação de destino.

Essa dica eu peguei aqui. Ao buscar a solução de um problema, o Sérgio escreveu o tópico. Uma grande contribuição para esse tópico e para o script abaixo.

CodeConvert

CodeConvert é um script para conversão entre os formatos mencionados aqui. Ele converte nomes dos arquivos e o conteúdo dos arquivos utilizando o comando file para evitar que ocorra conversão errada. Você pode ler o pegar o script CodeConvert nesse link.

Existe backup para todo arquivo convertido.
Arquivos somente são convertidos com o comando file diz que de fato o formato inicial é aquele imaginado pelo usuário. Assim, se tiver um arquivo em um formato diferente não será feita nenhuma modificação no arquivo.

O Benneh Carvalho modificou o script do Marcelo Oliveira após a dica do comando file. A idéia de incluir a conversão de nomes foi do Sérgio, e note que na época eu achei que não seria interessante por não saber que existia um comando pronto e inteligente para fazer a conversão dos nomes.

Enfim, espero que aproveitem o script. Usem-no no bom espírito da GNU General Public License.

[update]
A nova versão conta com a colaboração do John Robson, mais detalhes nesse outro tópico
[/update]

Conclusão

Eu escrevi o tópico original sem nenhuma intenção de que ele fosse chamar tanta atenção. E olha só o que temos hoje. O quanto de discussão gerou e tudo mais. E você acha que eu escrevi tudo que têm nos comentários de lá aqui ? Nada, veja por exemplo o uso do iconv em um programa em C++ em um trecho de código escrito pelo Rafael. O que eu posso dizer ?

Obrigado a todos pelas contribuições e que esse novo tópico, reescrito e ampliado, possa servir de base para novas conversas agradáveis e de ajuda a quem precisa.

E, por favor, se encontrar bugs e/ou melhores formas de fazer o que foi feito ali ou se tiver novas idéias para acrescentar, não deixe de divulgar por aqui o que pretende fazer ou o que fez...

Notas
  • Para os novatos que quiserem utilizar o CodeConvert, copie o conteúdo do script para um arquivo de texto do computador e salve com o nome CodeConvert (ou outro de sua preferência, esse será o nome do comando). Depois, defina o arquivo como executável, seja pelas propriedades do arquivo ou pelo terminal, executando o comando
    chmod +x CodeConvert.
    Observe também que alinha #!/bin/bash deve ser a primeira linha do arquivo.
  • Eu utilizei o vim para editar esse arquivo e eu uso a opção
    set fmr={{{,}}}
    no meu .vimrc. Assim, os {{{ e }}} definem começo e fim de dobras.

Sunday, January 03, 2010

Embutindo um terminal no desktop do KDE

Antes de começar a ler saiba que essa dica funciona apenas no KDE e não tenho certeza sobre a compatibilidade em outras versões de KDE, que não a 4. Para outros ambientes, tente essas instruções ou essa outra em português.

O objetivo é fazer o terminal ficar embutido de forma elegante no desktop. Há um figura no final desse texto mostrando o que isso significa.

Primeiro passo é escolher o terminal que será utilizado. Por incrível que pareça o terminal que selecionei é o gnome-terminal. Por que usar o gnome-terminal no KDE ? Eu prefiro dizer o porque não usar o konsole no KDE para esse objetivo. Como eu vou embutir o terminal no desktop, eu preciso remover todos os elementos de menu e borda e eu não sei como fazer isso com qualquer terminal (a borda é fácil, o problema é o menu e a barra de rolagem). Além disso, eu vou especificar o comportamento padrão do programa travando uma série de funcionalidade que não permitirá o uso adequado desse programa de outra forma. Em outras palavras, eu vou sacrificar um programa para um objetivo. Se eu fizer isso com o Konsole eu vou ter inúmeros problemas.

O menu que usualmente é utilizado para essa função é o Eterm. O problema do Eterm é que eu quero que ele seja transparente, contudo, eu não consegui definir uma transparência verdadeira no Eterm, tudo que é possível fazer funcionaria perfeitamente se meu desktop não fosse um slide show. Assim, sobrou para o gnome-terminal. Algo que eu nunca usaria tradicionalmente dentro do KDE. Tudo que for feito aqui não interferirá no modo que o programa funcionará dentro do GNOME ou outro gerenciador, eu posso sacrificar o gnome-terminal tranquilamente.

Então, caso você não tenha um wallpaper como slide show pode adaptar essa dica para usar o Eterm, terá de trocar os nomes de gnome-terminal para Eterm e as opções que serão ativadas no gnome-terminal (detalhes do comando, você pode ler aqui).

Uma dúvida interessante que pode surgir é quanto ao desempenho e/ou consumo de memória. A memória consumida por esse terminal é insignificante. O desempenho de abrir o programa não é do mais brilhantes, mas é mais porque estou iniciando todo o desktop ao mesmo tempo que esse programa do que por causa do terminal em si. Resumindo, não há consumo perceptível de recursos do computador.

Primeiro passo, criar um script para iniciar o gnome-terminal ao iniciar o KDE.

Eu criei um script com o seguinte conteúdo
#!/bin/bash
# File: gnome-terminal.sh
# Author: J. F. Mitre
# Created: Seg 21 Dez 2009 19:32:51 BRST
# NOTES: iniciar o gnome-terminal no kde

kstart --desktop 1 --onbottom --skiptaskbar --skippager \
gnome-terminal --geometry 80x18+20+660 \
--profile=DesktopConsole \
-e "sh $HOME/.kde4/confAutostart/gnometerminalinit.sh"
O gnome-terminal é iniciado com o tamanho de 80x18 e na posição +20+660. Isso foi feito para ele ficar no canto inferior a esquerda de uma tela de 1280x1024. O profile DesktopConsole foi criado especialmente para esse objetivo, assim como o arquivo gnometerminalinit.sh.

Esse arquivo, salvo com o nome gnome-terminal.sh, está localizado em $HOME/.kde4/Autostart/. Em algumas distribuições o diretório de configuração do KDE é .kde e não .kde4, substitua se for o seu caso. Não se esqueça de marcar o script gnome-terminal.sh como executável (no terminal: chmod +x gnome-terminal.sh).

O comando kstart permite configurar algumas opções da janela. Essa opções também serão definidas de outra forma. Eu defini essas opções nos dois lugares, pois acredito que um bug esteja atrapalhando o funcionamento adequado das configurações quando marcadas apenas em um único lugar e não há mal algum em usar o kstart. Para mais detalhes digite: kstart --help-all

Outro detalhe desse comando é quanto a largura de 80 px do terminal. Esse valor é importante, pois com menos alguns programas podem se recusar a trabalhar informando que não há largura suficiente para a execução. E nem precisa ser um comando complicado, o comando "w" não funciona com 70 px de largura.

Também note a existência da barra invertida no script. Após a barra, não pode ter caracteres, nem mesmo espaço.

O arquivo gnometerminalinit.sh tem o seguinte conteúdo:
#!/bin/bash
# File: gnometerminalinit.sh
# Author: J. F. Mitre
# Created: Seg 21 Dez 2009 19:27:51 BRST

export VARTERM=gnome-terminal
bash
O objetivo desse arquivo é criar a variável $VARTERM apenas nessa execução específica do gnome-terminal. Esse arquivo NÃO é executável, é um arquivo comum, coloquei a extensão .sh apenas para lembrar a funcionalidade. Esse arquivo foi colocado no diretório $HOME/.kde4/confAutostart/, esse diretório não é padrão do sistema, então deve ser criado. Coloquei ali apenas para não misturar com outros arquivos do computador e por acreditar que esse nome é muito simples e de fácil correlação com o objetivo do seu conteúdo.

O perfil DesktopConsole foi inspirado nas instruções dessa página.
Crie um novo perfi e dele a ele o nome de "DesktopConsole".
  • Na aba "Geral" desmarque a opção "Mostrar barra de menu por padrão em novas janelas"
  • Na aba "Rolagem" defina "Barra de rolagem está:" como "desabilitada"
  • Na aba "Efeitos" configure o background do aplicativo. Eu uso "Fundo Transparente" e transparência quase zero, para permitir apenas uma sombra na tela.
Salve o perfil e não defina ele como padrão, assim o gnome-terminal continuará intocável dentro do GNOME.

Agora abra as configurações do sistema e selecione "Comportamento da Janela". Nesse item, selecione "Específica da Janela". Selecione "Novo..." e configure as abas conforme estão nas figuras abaixo (clique nas imagens para ampliar).





Agora veja o resultado final...


Viu o desktop na parte inferior a esquerda ? Não confunda com a região de notas que está na parte superior também a esquerda.

Mas ainda não acabou. Lembra que criamos um script apenas para definir a variável $VARTERM apenas para esse pequeno terminal ?
Agora é a hora de usar esse recurso. No meu ~/.bashrc eu tenho o seguinte conjunto de linhas:
if [ "$VARTERM" == "gnome-terminal" ]; then
unalias exit
alias exit='clear'
alias reload="source $HOME/.bashrc"
alias Restart='$HOME/.kde4/Autostart/gnome-terminal.sh; unalias exit; exit'
fi
Para mim essa foi a "cereja do bolo" dessa configuração. Até então, se eu digita-se exit por engano, eu fecharia o terminal. O que esse pedaço de código faz é redefinir o que significa exit para clear. Mas não é somente isso, qualquer coisa que eu queria definir apenas para aquele pequeno terminal eu posso colocar dentro desse condicional. Dessa forma, eu posso produzir efeitos diversos, como o comando "reload" que me permite recarregar o .bashrc. E o comando Restart para reiniciar o aplicativo sem precisar abrir outro terminal.

Conclusão
Para quem usa muito o terminal, sempre há comandos curtos a serem executados. Iniciar um serviço, parar um serviço, montar ou desmontar um dispositivo ou volume encriptado, chamar um programa rapidinho, etc. Ter o terminal no desktop, assim, no cantinho e de forma elegante, é um meio termo entre o visual e a disponibilidade e um aumento de produtividade.

Contudo, nada impede que o terminal tome uma parte maior da tela, tenha um fundo preto, etc. Cada um pode buscar o melhor conceito visual para seu próprio computador. O que posso dizer é que estou muito feliz com o resultado final alcançado.

Por fim, eu configurei o meu KDE para sempre iniciar com uma sessão vazia. Não faço idéia de quais seriam as conseqüências de salvar a sessão. Ainda assim, acredito que quem fizer isso e colocar o "gnome-terminal" como um aplicativo a ser excluído da sessão, não terá qualquer problema.