jueves, 24 de febrero de 2011

Aprendiendo a programar con Python

Python es un lenguaje de programación de alto nivel, interpretado y multiplataforma. Cuenta con numerosas ventajas como tener una sintaxis clara y concisa, ser software libre, ser un lenguaje muy versátil (prácticamente de propósito general) con una completa biblioteca estándar, poderse usar tanto de forma estructurada como orientada a objetos, para aplicaciones de consola (incluyendo pequeños scripts) o para aplicaciones con GUI, para aplicaciones de escritorio o para aplicaciones web... Además, si usas Linux, tienes la suerte de tenerlo ya instalado, ya que cada vez más software de este sistema operativo está escrito en Python.

Nombrado así en honor del grupo de cómicos Monty Python, el lenguaje que nos ocupa no es ni mucho menos nuevo. Guido van Rossum, su creador, lo había concebido a finales de los años 80, pero fue en los 90 cuando lo publicó en Internet, abriendo así su desarrollo y potenciando su mejora y expansión, sobre todo a partir de la versión 2.0 publicada en el año 2000. En la década siguiente se hizo popular y sustituyó a Perl, uno de los lenguajes en los que se inspiró, en muchos de sus escenarios de uso. Actualmente se considera requisito técnico imprescindible en la compañía Google, y se usa ampliamente en otros gigantes de Internet como Yahoo o incluso en la mismísima NASA.

Al ser una tecnología ya madura con un modelo de desarrollo abierto cuenta con numerosa documentación y bibliografía, lo que facilita (incluso anima a) su aprendizaje:
  • Su autor, Guido van Rossum, ha publicado un libro introductorio de 165 páginas titulado An introduction to Python, que puede obtenerse en formato electrónico previo donativo de 5$ a la Python Software Foundation.
  • En español hay un buen libro introductorio de 160 páginas titulado Python para todos, escrito por Raúl González Duque y disponible de forma gratuita como documento web para su lectura online y también en formato PDF.
  • Otro libro gratuito introductorio, algo más breve, pero en inglés es A Byte of Python, disponible online y en PDF tanto para la versión 2.x del lenguaje como para la nueva versión 3.
  • Un libro interesante, escrito de forma colaborativa en wikibooks.org, es Python Programming, disponible también en formato PDF.
  • Dive Into Python es un libro más avanzado (entre 300 y 500 páginas) sobre este lenguaje y cuenta con versión electrónica gratuita, tanto para la versión 2.x, como para la versión 3.
  • Think Python (Piensa en Python), subtitulado "How to Think Like a Computer Scientist" (Cómo pensar como un informático) tiene un enfoque más didáctico, ya que fue concebido como un libro de texto académico para aprender a programar sin necesidad de conocimientos previos. El autor se dio cuenta de que Python era el lenguaje ideal para que sus alumnos aprendieran los fundamentos de la programación sin perderse en los detalles técnicos y/o la complejidad intrínseca del lenguaje utilizado (antes usaba Java ;) y además divirtiéndose (este hecho debería interesar a los "expertos" que diseñan los planes de estudios en nuestro país...)
En fin, que Python es, modas aparte, un lenguaje muy a tener en cuenta desde hace unos años y puede convertirse, en tan solo unas pocas semanas de aprendizaje y prueba, en una valiosa herramienta (incluso en el language of choice) en el arsenal de todo informático que se precie. Espero que la bibliografía recomendada contribuya a hacerlo más factible ;-)

sábado, 19 de febrero de 2011

E-mail desde la línea de comandos

El correo electrónico se ha convertido en los últimos años en un medio de comunicación muy popular, algo cotidiano. Esto no significa que sea una tecnología reciente, ya que se viene usando durante décadas en Internet -no en vano es uno de sus servicios básicos- e incluso antes de la invención de ésta. La mayoría del gran público lo ha conocido ya en forma de webmail (al estilo de Hotmail o Gmail) y no ha utilizado (o ni siquiera conoce de oídas) aplicaciones de escritorio (los llamados gestores o clientes de correo) como Pegasus Mail, Outlook Express o Mozilla Thunderbird. Menos aún imaginan clientes de correo con una interfaz de usuario en modo texto o incluso de línea de comandos. Y el caso es que existieron, existen y seguirán existiendo al margen de los entornos gráficos y las modas que los afectan.

Sin entrar en debates sobre si el uso actual de estos programas se debe a un alarde de "frikismo", nostalgia o incluso masoquismo, el caso es que parece justo y necesario que estos existan para poder ser utilizados en ciertos entornos y situaciones. Una de ellas, la que ha motivado este post, es la provocada por la necesidad de realizar un envío de mensajes de e-mail de forma no interactiva desde un script. Entonces uno agradece las múltiples utilidades de consola que existen para realizar cualquier tarea imaginable y enviar mail no podía ser menos.

Antes de centrarnos en el ámbito de Unix/Linux, comentar que en Windows también puede hacerse recurriendo a programas como MAILSEND, Send Mail o Bmail o mediante el uso de sencillos scripts en VBS. Todas estas opciones se valoran en este interesante documento web.

En el mundo Linux, por su herencia de Unix, hay también múltiples utilidades y programas que proporcionan distintas soluciones al problema:
  • Una solución clásica sería usar la siguiente combinación software: un cliente de correo de consola como mail (el llamado MUA o "agente de usuario de correo") más un servidor de envío / enrutamiento de correo como exim (el llamado MTA o "agente de transporte de correo") configurado para enviar el correo a través de un servidor externo como puede ser el de Gmail. En el caso de distribuciones de GNU/Linux derivadas de Debian como Ubuntu, sólo habría que instalar el paquete mailutils y proceder a la configuración del servidor como se especifica en este blog.
  • Otra solución más sencilla y por tanto recomendable sería usar un derivado moderno y más potente del clásico programa mail que permita el envío directo a través de servidores SMTP externos y nos ahorre la instalación, configuración y mantenimiento de uno propio en nuestra máquina (exim en la solución descrita anteriormente). Ese programa es el llamado Heirloom mailx, híbrido entre el programa mail y una mejora posterior llamada mailx de la que ha cogido el nombre (también se le conoce como nail, su nombre anterior). En Ubuntu lo podemos instalar mediante el paquete heirloom-mailx. Lo bueno es que se puede configurar, no solo mediante el archivo de configuración estándar definido por la variable de sistema MAILRC, sino mediante el uso de sus propias variables de entorno para hacer una configuración "al vuelo" particular para cada script y que se le pasará ejecutándolo con env como puede apreciarse en el siguiente ejemplo:
#!/bin/bash

usuario_mail="usuario@gmail.com"
contras_mail="LaContraseña"

destinatario="administrador@empresa.com"
asunto="$(basename $0): Aviso importante"
mensaje="Este sería el cuerpo del mensaje"
f_mensaje="/tmp/body.msg"

echo "$mensaje" > $f_mensaje

env MAILRC=/dev/null from="$usuario_mail" \
smtp-use-starttls= smtp=smtp.gmail.com:587 \
smtp-auth=login smtp-auth-user=$usuario_mail \
smtp-auth-password=$contras_mail \
mailx -n -s "$asunto" $destinatario < $f_mensaje
El uso del servidor SMTP de Gmail requiere que tengamos una cuenta de usuario en dicho servicio gratuito (los mensajes se enviarán en nombre de ese usuario) y ha sido elegido, además de por proporcionar un buen funcionamiento (que incluye encriptación mediante TLS), para evitarnos los típicos problemas derivados de usar un servidor SMTP estándar (puerto 25) distinto al del ISP con el que conectemos a Internet.

Cuando necesitemos que un shell script de nuestro sistema (nos) notifique cualquier error o eventualidad vía e-mail no tendremos más que instalar el cliente de correo mailx y adaptar el código anterior para lograrlo. Próximamente publicaré una versión de vigila-wifi que lo incorpora para alertarnos de posibles intrusiones en nuestra red inalámbrica doméstica cuando no estemos en casa...