Gnus + Gmail (Part II - Adding Multiple SMTP Accounts)

Filed under:Emacs, LISP — posted by rwanderley on 21 January, 2008 @ 5:25 pm

Unfortunately there is no native method to add multiple SMTP servers on Gnus. But after taking a quick look at the wiki I found this link. I changed it a little bit, so the passwords are searched at the ~/.authinfo file instead of being in your .gnus file.

Here is the code found on my .gnus file:

;; Available SMTP accounts.
(defvar smtp-accounts
  '((ssl   "mymail@gmail.com" "smtp.gmail.com" 587 "key" nil)
    (ssl   "mymail@otherserver.com" "smtp.otherserver.com" 25 "key" nil)))

This lists my SMTP accounts, one line for each server, as you can see both the servers are using SSL.

;; Default smtpmail.el configurations.
(require 'smtpmail)
(setq send-mail-function 'smtpmail-send-it
      message-send-mail-function 'smtpmail-send-it
      mail-from-style nil
      user-full-name "Rodrigo S. Wanderley"
      user-mail-address "mymail@gmail.com"
      message-signature-file "~/emacs/signature"
      smtpmail-debug-info t
      smtpmail-debug-verb t)

The code above just sets some default values. My mail signature is found on the file ~/emacs/signature, I also specify my user name user-full-name and my e-mail address user-mail-address so that Gnus can fill the From header field automatically for me.

The Debug options is also nice so that you get some feedback about what is happening while Gnus is sending the e-mail for you.

(defun set-smtp-plain (server port)
  "Set related SMTP variables for supplied parameters."
  (setq smtpmail-smtp-server server
    smtpmail-smtp-service port
    smtpmail-auth-credentials "~/.authinfo"
    smtpmail-starttls-credentials nil)
  (message "Setting SMTP server to `%s:%s'."
       server port address))

(defun set-smtp-ssl (server port key cert)
  "Set related SMTP and SSL variables for supplied parameters."
  (setq starttls-use-gnutls t
    starttls-gnutls-program "gnutls-cli"
    starttls-extra-arguments nil
    smtpmail-smtp-server server
    smtpmail-smtp-service port
    smtpmail-starttls-credentials (list (list server port key cert))
    smtpmail-auth-credentials "~/.authinfo")
  (message
   "Setting SMTP server to `%s:%s'. (SSL enabled.)"
   server port address))

Those are two functions used to send mail, one with and one without SSL support. Note that smtpmail-auth-credentials is telling Gnus where to find the username and password.

(defun change-smtp ()
  "Change the SMTP server according to the current from line."
  (save-excursion
    (loop with from = (save-restriction
            (message-narrow-to-headers)
            (message-fetch-field "from"))
      for (acc-type address . auth-spec) in smtp-accounts
      when (string-match address from)
      do (cond
          ((eql acc-type 'plain)
           (return (apply 'set-smtp-plain auth-spec)))
          ((eql acc-type 'ssl)
           (return (apply 'set-smtp-ssl auth-spec)))
          (t (error "Unrecognized SMTP account type: `%s'." acc-type)))
      finally (error "Cannot interfere SMTP information."))))

(add-hook 'message-send-hook 'change-smtp)

Finally we create a hook for when me message is going to be sent. This hook basically tries to match the From header with the e-mail address you specified at smtp-account variable and chooses the server accordingly.

Selecionando encoding correto no ERC

Filed under:Administração Linux, Emacs, LISP — posted by rwanderley on 14 January, 2008 @ 7:50 pm

A algum tempo venho tendo problemas de codificação de caracteres no ERC,
o cliente de irc que uso.

Uso o ERC tanto para conectar em servidores IRC, geralmente o freenode,
como para conectar ao MSN e Google talk, usando o bitlbee para converter
os protocolos destes dois últimos para o do IRC.

O problema está que o MSN e o Google talk usam ISO-8859-1 como encoding,
enquanto que o pessoal no freenode usa UTF-8. Eu conhecia a variável
erc-server-coding-system, que na minha configuração estava setada
para “‘(utf-8 . undecided)”, ou seja, eu enviava texto usando UTF-8 e
usava o encoding especial do emacs undecided como o encoding de entrada.

O problema dessa solução é obvio, funciona para o freenode mas não funciona para o MSN. O que eu não sabia é que a variável erc-server-coding-system também pode ser uma função! Como o servidor do bitlbee é o localhost a configuração é trivial. erc-server-announced-name é uma variável dinâmica contendo o nome do servidor IRC sendo usado no momento.

(setq erc-server-coding-system
      '(lambda (target)
     (if (and erc-server-announced-name
          (string-match "localhost" erc-server-announced-name))
         '(iso-8859-1 . undecided)
       '(utf-8 . undecided))))

Essa função apenas checa se erc-server-announced-name bate com a string localhost, ou seja, se é o servidor do bitlbee, caso for seta o encoding para iso-8859-1, caso contrário usa utf8.

Atualizando ID3 no EMMS

Filed under:Emacs, LISP, Uncategorized — posted by rwanderley on 12 January, 2008 @ 8:24 am

Hoje passei umas duas horas atualizando tags ID3. E só
consegui editar as tags dos Guns n’ Roses e metade do
Pink Floyd (1969 até 2005 é muito tempo de carreira :-))

Aqui vai uma dica para se editar tags direto do emacs
usando o playlist buffer do EMMS.

Primeiro configure o EMMS seguindo os passos do Post
anterior, depois adicione uma arvore de diretório
na playlist com o comando M-x emms-add-directory-tree.
Aconselho comecar adicionando um artista apenas e editar
as tags deste artista, depois ir adicionando mais
com o tempo.

Agora precisamos mudar para o buffer contendo a playlist
do emms, para isso usa-se o comando M-x emms-playlist-mode-go,
como uso bastante este comando criei um atalho para ele
no meu arquivo emms.el (ver post anterior):

(global-set-key "\C-xppg" 'emms-playlist-mode-go)

Como não tenho só esse atalho no meu emms.el usei o prefixo C-x p
(’p’ de player) para indicar atalhos do emms, nesse caso eu decoro
o comando da seguinte forma C-x p (prefixo do emms), p (playlist) e
g (go). Você poderá escolher o atalho que quiser.

Na playlist você irá ver que o EMMS já interpretou as ID3 do arquivo
e está exibindo os nomes de acordo com elas. Caso alguma das
ID3 estejam mal formadas basta colocar o cursor em cima da
faixa com problema e digitar a tecla ‘E’. O Emacs irá abrir um
novo buffer, como esse:

Guns N' Roses - It's So Easy name = /home/mp3/Guns'n Roses/Appetite for Destruction (1987)/02 - Guns N' Roses - It's So Easy.mp3 info-artist = Guns N' Roses info-title = It's So Easy info-album = Appetite for Destruction info-tracknumber = 2 info-year = 1987 info-genre = Hard Rock info-note =

Caso alguma das informacoes estejam erradas basta editar e,
quando tudo estiver OK, aperte C-c C-c para salvar as
informacões.

Uma dica para melhorar o desempenho é usar Macros de teclado.
Eu geralmente crio uma macro para inserir o nome do artista,
album, numero da faixa, ano e genero; depois passo manualmente
pelas faixas e adiciono apenas o nome da faixa.

Segue um screenshot mostrando o browser EMMS na parte superior
da tela:

Test drive no EMMS

Filed under:Administração Linux, Emacs, LISP — posted by rwanderley on 11 January, 2008 @ 6:15 pm

Fazem algumas semanas venho testando o EMMS, um sistema multimidia para o Emacs.  Ele atua como frontend para aplicacoes como o mpg321, mplayer e mp3info.  Para quem nao gosta de sair do Emacs ele é perfeito, possui um bom browser, como praticamente tudo no Emacs é bastante configurável e permite que você gerenciar playlists de forma fácil.

Neste post irei mostrar como configurar o EMMS.  Estou usando GNU Emacs 22.1, portanto se você ainda estiver usando o Emacs 21 provavelmente algumas das configuracões a seguir poderão não funcionar.  Também será necessário pelo menos ter o mpg321 e o mp3info instalados.

Se você possui Debian ou Ubuntu é bastante fácil instalar, apenas digite apt-get install emms e pronto!  Em outras distros o processo pode ser diferente, provavelmente vocês terão que baixar os fontes direto do site do emms e instalar na mão, não irei falar desse tipo de instalacão aqui, mas os interessados podem postar suas dúvidas ou me mandar um e-mail.

A configuracão básica também é fácil.  Primeiro colocamos uma linha no .emacs informando onde está o arquivo de configuracao, apenas abra o seu ~/.emacs e coloque o seguinte em algum lugar no inicio do arquivo:

(load-file "~/.emacs.d/emms.el")

Essa linha apenas está dizendo ao emacs para carregar o arquivo ~/.emacs.d/emms.el quando o mesmo for iniciado.

Agora abra ou crie o arquivo ~/.emacs.d/emms.el e insira as seguintes linhas nele:

(require 'emms-setup) (emms-devel) (emms-default-players)

Digite M-x eval-buffer e pronto!  Seu EMMS está configurado.  Para testar digite M-x emms-play-directory e selecione um diretório contendo algumas mp3, o EMMS deverá comecar a tocar as MP3 e mostrar o nome da música na barra de estatus.É só isso?  Não, ainda tem muito mais, ainda tem o browser do emms, algumas funcões de expansão que permitem que você faca forward, pausa, use o dired para selecionar faixas, …  Mas vou dar um tempinho para vocês testarem essa versão básica antes de postar uma configuracão
mais avancada.

Practical Common Lisp

Filed under:Assuntos Gerais, LISP, Programação — posted by rwanderley on 6 November, 2007 @ 1:06 pm

Para quem quiser um ótimo livro de linguagens de programação recomendo o Practical Common Lisp de Peter Seibel.

Ele consegue mostrar a verdadeira cara de Lisp e já nos primeiros capitulos você consegue ver porque outros escritores, como Paul Graham, falam tão bem de Lisp. Eu vinha usando Lisp apenas para configurar o Emacs e já tinha lido livros como An Introduction to Programming Emacs Lisp e Writing GNU Emacs Extensions. Ambos são ótimos livros, mas não chegam nem perto da visão que PCL me deu já nos primeiros capitulos.

Lisp Macros, Closures, Collections e Generic Functions são conceitos que pareciam complicados para mim, mas que Peter Seibel consegue explicar de forma que parecem conceitos simples.

Alguns dizem que se deve aprender Lisp para abrir a cabeça e usar os conceitos aprendidos em outras linguagens. Após alguns capítulos de PCL estou começando a pensar que se deve aprender Lisp para usar essa linguagem e, apenas em raras situações, recorrer a outras linguagens.

MINIX morreu?

Filed under:C, Programação, Sistemas Operacionais — posted by rwanderley on 6 August, 2006 @ 10:53 pm

Hoje resolvi fazer um teste drive no MINIX 3. A arquitetura é interessante e é discutida na terceira edição do livro de sistemas operacionais de Tanenbaum.

A impressão que tive é que é realmente um sistema acadêmico. Apesar de ter praticamente todos os recursos de um sistema UNIX moderno algumas coisas deixam a desejar. Dois exemplos foram:

  1. durante a instalação rodei o GNU Emacs ao mesmo tempo que os binários estavam sendo extraídos, recebi logo uma mensagem indicando erro durante o fork e tive que começar a instalação do zero;
  2. O outro exemplo foi quando estava usando o vi para editar um arquivo. Ao dar o ctrl+z para suspender a edição o sinal foi enviado para todos os processos, inclusive o próprio shell, ou seja, ao invés de eu pegar um prompt de comandos fui direcionado para a tela de login. Nesse caso o erro deve estar no shell e não no sistema operacional.

Fora esses dois erros até agora estou gostando do sistema. O GNU Emacs ficou rápido e estável, mesmo testando o sistema em um emulador e a quantidade de aplicativos disponiveis é bastante significativa (mais de 400 aplicações).
Para quem quer um sistema fácil de entender (a nível de arquitetura e código fonte) e com várias áreas onde se possa contribuir o MINIX 3 é uma boa opção.

C, Perl, Python, agora Turbogears + CSS

Filed under:Administração Linux, C, Diginet, Perl, Programação, Python — posted by rwanderley on 18 July, 2006 @ 1:03 am

Estou começando a adentrar o mundo alto nível do Turbogears. Após passar uma boa temporada fazendo programas em C (em sua maioria para a UFRN) passei por algumas linguagens de Script, até finalmente me dedicar um pouco ao Turbogears o que me levou a estudar um pouco de CSS também. A seguir vai um pequeno estórico dessa minha curta vida de nerd! :D

  • +/- 1997: Minix no windows

Por volta de 1997 eu tive meu primeiro contato com o mundo UNIX. Na época eu costumava usar meu modem USRobotics para conectar na mini-BBS da UFPB (que mudou para UFCG recentemente) de Campina Grande usando uma conta de um primo meu que cursava lá. Lembro como se fosse hoje… A única coisa que sabia eram os comandos finger e talk. Geralmente só encontrava um usuário com um nome estranho, um tal de root… Era o tempo todo: talk root: “oi root!”. Mas ele não respondia :D

Nesse mesmo tempo consegui baixar uma cópia do minix e instalei ele para rodar como processo em cima do windows. Consegui bootar, mas não sabia muito o que fazer depois…

Em 1998 li em algum lugar a respeito do GNU/Linux e baixei o Slackware em diquetes. Após uma semana de aperreio consegui instalar o sistema e acesso a uma shell, onde aprendi meus primeiros comandos UNIX.

Depois resolvi testar o RedHat. Já foi uma mudança bem maior, já tinha acesso a gráficos e tudo mais! Após o RedHat comprei um Conectiva, que na época para mim não era nada mais que um RedHat semi-traduzido. No final de 98 fui para Recife e deixei a nerdisse um pouco de lado por ca de 3 anos…

  • 2001: UFRN, LCC, De volta a nerdisse :D

Em 2001 ingressei na UFRN. No final do primeiro semestre consegui uma bolsa de estudos para administrar o Laboratório dos Cursos de Computação (LCC). Durante essa bolsa tive contato com gente já esperiente no mundo GNU/Linux que tiveram o saco para me ensinar Shell Script (sintaxe Bash) assim como conceitos básicos de administração GNU/Linux.

Foi lá que consegui me aprofundar na filosofia GNU e entender como o sistema funciona. Foi lá também onde comecei a programar em C de forma mais séria.

No final de 2001 consegui um upgrade na bolsa e fui para a superintendência de informática da UFRN, onde atuei como administrador de redes. Lá tinha acesso aos principais servidores da UFRN, e foi onde passei pelos maiores aperreios da minha vida! Até hoje estou devendo uma Pizza ao pessoal do setor, por terem me ajudado a recuperar o banco de dados de um servidor solaris que eu quase apaguei por engano!

Em 2003 consegui me infiltrar na Diginet. Foi lá onde me aprofundei mais ainda na área de administração de redes e conheci galera competente em praticamente todas as áreas da “computação prática”. No periodo de 2003 - 2006 saí e voltei da Diginet várias vezes, passando pelo tribunal de justiça, projeto de televisão digital (SBTVD), … O que vi é que estou no lugar certo e, se deixarem, pretendo passar um bom tempo trabalhando na Digi. Foi aqui que consegui largar um pouco o C e conhecer outras linguagens maravilhosas como o Perl, Python e agora o turbogears, que é um framework que deixa vc fazer complexas aplicações web em questões de minutos usando a linguagem Python.

Nesse exato momento consegui largar um pouco o C, uso apenas quando necessário e quando quero me divertir de verdade :D, gosto de Perl para programas não muito grandes na área de administração de redes, bash script para coisas pequenas ou que involvam muitos comandos (não gosto de usar system()) e, definitivamente, turbogears para aplicações web.

Vou parando por aqui… esse primeiro Post saiu bem maior que eu planejava!

Até o próximo! :D



image: detail of installation by Bronwyn Lace