Publica tu how-to

Dinos como hacer lo que sabes hacer, mándanos un email a wdonet@gmail.com y lo publicamos (dos días máximo) o si te interesa unirte al equipo de redactores, también háznoslo saber por correo.

debugging remoto de scripts Python con winpdb

Usando el programa winpdb se pueden debuggear scripts en Python de manera mas intuitiva que con el clásico pdb.

Una de las ventajas que tiene winpdb es la posibilidad de debuggear scripts que esten ejecutandose en remoto en algun servidor. De esta manera, se pueden debuggear no solo scripts en servidores de producción, por poner un ejemplo, sino también scripts que utilicen curses para manipular la pantalla.

winpdb se basa en una arquitectura de cliente-servidor que comunica al servidor (el cual ejecuta el script a debuggear en sí) a través de sockets con el cliente (el cual ejecuta la interfaz del debugger).

Configurar POI en Spring 3 para generar archivos Excel

He decidido registrar el proceso de como generar archivos Excel con POI mediante Spring 3 para que no se me olvide (aunque es bastante sencillo).  Me sorprendí de terminarlo en tan sólo 3 pasos!

1) Generar un controller que obtiene los valores que se pretenden mostrar en la vista, los agrega al modelmap de MVC que maneja Spring y luego devuelva el nombre de la vista encargada de generar el excel.

@Controller
@RequestMapping("/excel")
public class ExcelController {

    @Autowired
    private Servicio servicio;

    @RequestMapping(value = "/{parametro}", method = RequestMethod.GET)
    public String generarExcelByParametro(
            ModelMap modelMap, HttpServletResponse response,
            @PathVariable("parametro") String nombreVista) {
        modelMap.put("datos", servicio.obtenerDatos(parametro));

        response.setHeader("Content-type", "application/vnd.ms-excel");
        response.setHeader("Content-Disposition","attachment; filename=\"excel.xls\"");
        return "reporteExcel";
    }

}

Observa que el método generarExcelByParametro() del controller responde a una petición http://{servidor:puerto}/{contexto}/excel/{parametro} y realiza algo en un servicio que devuelve cierta información que se espera administrar de lado de la vista (más adelante lo vemos) y lo guarda dentro del ModelMap de spring con el identificador "datos".

Los headers que se agregan al response, son solo para asegurar que cuando se genere el archivo .xls, se identifique como tal y se obligue al usuario a descargarlo.

Finalmente la cadena ("reporteExcel") que se devuelve determina el nombre de la vista que interpretara los datos para generar el documento.

Servidor VNC para sesiones de escritorios remotos

Introducción
VNC (Virtual Network Computer) es el software a través del cual se puede iniciar sesión en escritorio remoto con GNU/Linux.

Otra opción es el RDP de Windows, sin embargo aquí explicaremos únicamente como configurar el servidor para el caso de VNC.

Lo primero que hay que saber es que VNC funciona para controlar escritorios remotos que utilizan el servidor gráfico X-Window , el default de GNU/Linux hasta ahora. Sin entrar en detalles de cómo funciona X-Window, basta saber que en este tutorial explicaremos dos opciones:

  1. controlar el escritorio X real que se tenga en el escritorio remoto
  2. controlar un escritorio X virtual que se crea a demanda en dicho escritorio remoto
Ambas opciones tienen posibilidades de aplicación.

DBUnit lo hace facil

Dado que he trabajado con JUnit y DBUnit y he encontrado en ellos unas buenas herramientas para probar el codigo de las aplicaciones en java, pues me dí a la tarea de investigar un poquito sobre como obtener datasets desde una BD, y como cargarlos para realizar pruebas específicas.  Fue entonces cuando me encontré con este artículo de Bill Siggelkow y me dí a la tarea de traducir una parte, también he agregado notas mías, pero pueden encontrar el original en enlace al final del post.

Y dice así:
Si desarrollas aplicaciones que acceden a datos relacionales necesitas verificar el código de tu aplicación trabaje con los datos, como fue diseñado.  Cuando usas Hibernate o algún otro framework que implemente JPA, deberías confirmar que tus mapeos dirijan a Hibernate para almacenar y recuperar la información correctamente.  Yo implemento este tipo de pruebas usando JUnit.  Nadie puede refutar que las pruebas contra una base de datos activa es fundamental - no hay una mejor forma para verificar tus mapeos.

Pero para probar contra la base de datos se requiere que los datos se encuentren en un estado inicial.  Puedes cargar la base de datos manualmente antes de correr tu prueba pero eso se vuelve monotono y propenso a errores. DBUnit resuelve este problema.  Este puede precargar la base de datos para cada una de tus pruebas, basado en un grupo de datos dentro de un xml (comúnmente llamado dataset).  El formato de este dataset es sencillo de entender; aquí hay un ejemplo de tres tablas de una base de datos MySQL.  Los nombres de los elementos empatan con los nombres de las tablas y sus atributos con los nombres de sus columnas. Cada elemento implica un registro en esa tabla.

<dataset>
    <cliente id_cliente="778899" id_estatus = "1" id_sucursal="98765"/>
    <banco id_banco="1" nombre="BNMX" descripcion="Banamex" activo="1"
valor="0"/>
    <pago id_cliente = "778899" id_estatus = "1" id_tipo_producto =
"1" id_promotor = "1" id_sucursal = "58" />
</dataset>

Para una base de datos pequeña donde solo necesitas cargar unas pocas tablas con unos pocos registros puedes crear el dataset manualmente. Pero seguramente no querás hacerlo con una base de datos empresarial compleja que contiene cientos de tablas con nombres de columnas complejas.  Es más facil si le permites a DbUnit extraer los datos por ti.

Configurar JasperReports en Spring 3.0

Cada vez es más sencillo realizar las configuraciones en Spring.  A pesar de que la configuración se puede seguir usando de diferentes maneras, en la documentación de referencia de spring 3 indica lo siguiente de forma general:
  1. Agregar dependencias a tu proyecto
  2. Configurar el ViewResolver
  3. Crear el template con iReports
  4. Configurar las vistas
  5. Crear el controller

Ahora vamos a los detalles.

Servidor de correos personal con postfix - Spambayes

Éste es el último post de 'Servidor de correos personal con postfix'. Ya configurado el mismo (MTA, MDA, MUA) y recuperando automáticamente correos con Fetchmail, sólo queda velar por la seguridad del servidor...

Se llama spam o correo basura a los mensajes no solicitados, no deseados o de remitente desconocido, habitualmente de tipo publicitario, enviados en grandes cantidades (incluso masivas) que perjudican de alguna o varias maneras al receptor.

El spam se puede convertir en una incidencia de seguridad por varias razones:
  • ocupa espacio en las bandejas de entrada de los receptores. En los casos de cuentas con tamaño limitado esto es un problema.
  • en sistemas vulnerables, el spam suele llegar también acompañado de scripts perniciosos, a ejecutar en el sistema receptor, o un link engañoso para infectar la máquina cliente.
  • también puede incluir información engañosa con la cual realizar un robo de información confidencial, engañando al usuario incauto
Claro está, la mejor política de seguridad en estos casos es ser prudente y no dar click y descargar todo lo que llegue a la bandeja de entrada del correo.

Sin embargo, los servidores de correo también cuentan con protección extra ante esta problemática. En nuestro caso, vamos a configurar Spambayes como detector de spam. Existen muchos otros programas que realizan funciones similares, el más famoso es Spamassasin. Sin embargo en este tutorial nos enfocaremos en Spambayes.

Servidor de correos personal con postfix - Fetchmail

Con este post continuamos con el 'Servidor de correos personal con postfix'. Una vez configurados el MTA, el MDA y el MUA, quedan detalles por afinar...

Fetchmail es un programa para recuperar correos desde servidores remotos. En realidad no es más que un cliente para los protocolos POP, IMAP, entre otros, que en lugar de desplegar los mensajes de correo (como cualquier cliente convencional de estos protocolos) los descarga para que sean recibidos en la máquina especificada y leídos posteriormente.

Es útil para conexiones de internet intermitentes (que no siempre están en línea), o para mantener una bandeja de entrada sincronizada con un servicio de correo remoto, como será el caso de este tutorial.

Obra del renombrado hacker Eric S. Raymond, Fetchmail es incluso el ejemplo clásico utilizado en su escrito 'La Catedral y el Bazar' para ilustrar cómo el proceso de desarrollo open source es un éxito, y no un caso aislado como se pensaba hasta el momento del kernel Linux. Este escrito fue de hecho la chispa que encendió el furor por el open source en el mundo empresarial, con lo que Netscape liberó el código fuente de su navegador (del que Mozilla Firefox es su heredero), y demás aventuras y desventuras del mundo del open source y el software libre desde entonces (1998)...

Aquí lo vamos a utilizar para recuperar los correos de una cuenta de Gmail (aunque podría ser cualquier otra, ¡o varias! siempre y cuando acepten los protocolos POP, IMAP o similares) cada cierto tiempo.

Servidor de correos personal con postfix - MUA

Continuamos con los posts dedicados a configurar un 'Servidor de correo personal con postfix'.

Previamente ya configuramos el MTA, Mail Transfer Agent y el MDA, Mail Delivery Agent.

Ahora vamos por el MUA, Mail User Agent, el cliente para leer y enviar correos. Normalmente esta parte es la que la gente toma como si fuera todo el sistema de correo, pero como ya hemos podido ver se trata de toda una infraestructura de sistemas.

En este tutorial vamos a configurar mutt como cliente de correo. Se trata de un cliente de consola muy sencillo pero muy completo a la vez. La razón es que su configuración es sencilla para los propósitos de este tutorial. Además, su sencillez permite entender un poco más cómo funciona el correo electrónico, que es de lo que se trata aquí.

Servidor de correo personal con postfix - MDA

Continuamos con los posts dedicados a configurar un 'Servidor de correo personal con postfix'.

Previamente ya configuramos el MTA, Mail Transfer Agent.

Toca el turno del MDA, Mail Delivery Agent, el cual cumple las funciones de un 'cartero' al que la central de correos (el MTA) le entrega el correo a ser entregado en los buzones correctos.

En la configuración del MTA se especificó que se usaría el programa Procmail para realizar las labores de entrega, y es el software que vamos a instalar y configurar a continuación.

Servidor de correo personal con postfix - MTA

Esta es la parte 1 de una serie de posts que vienen de 'Servidor de correo personal con postfix'.

Para configurar el servidor, vamos a asumir que, teniendo una dirección IP dinámica, se cuenta con un nombre de dominio dinámico, por ejemplo como el que ofrece DynDNS.

Recordar que el MTA, Mail Transfer Agent es el encargado de mandar los mensajes de correo que salgan del servidor, así como de recibir en primer instancia los mismos para entregárselos al MDA que los debe dejar en los buzones correctos.

Como MTA utilizaremos Postfix, un MTA bastante popular hoy en día en servidores GNU/Linux.
Cabe decir que si no se tiene MTA, el comando mail nativo de GNU/Linux permite enviar emails únicamente a los usuarios de la misma máquina que funge como servidor. Fuera de eso no se puede enviar ningún tipo de correo (ni en la misma LAN ni por internet a otros dominios de correo): se necesita configurar el MTA (además de que para usar solamente mail este tutorial pierde todo su sentido...)

Servidor de correo personal con postfix

En mi opinión un sistema de correo electrónico es de los que pueden llegar a tornarse más complicados de configurar. Al contrario de otros tipos de servidores que sólo requieren configurar un programa, y los puertos apropiados en el firewall, un sistema de correo requiere configurar varias cosas en diversos lugares.

Ésto último es debido a que un sistema de correo está en realidad compuesto no por uno sino por varios programas o sistemas que interactúan entre sí, completando y complementando sus funciones para dar lugar al sistema de correo electrónico como lo conocemos hoy: eficiente, robusto, sencillo si se sabe comprender...

Esta división de un sistema en pequeños subsistemas que cumplen funciones específicas es en realidad producto de la filosofía en sistemas como Unix de hacer las cosas bien y una sola vez. Así, por ejemplo el sistema que entrega el correo electrónico se dedica única y exclusivamente a eso, especializándose en ello y con eso no embotando su propio código fuente con funcionalidades para las que existen otros programas especializados, como el sistema que se encarga de obtener el correo a leer, o el que lo envía...

Un sistema de correo puede, en términos generales, dividirse en 3 partes principales, a saber, de afuera hacia adentro:

Compilando FFmpeg para convertir formatos de archivos de medios

FFmpeg es una suite de programas para manipulación de medios. Su sitio oficial es http://ffmpeg.org/

La mayoria de las distribuciones Linux ya incluyen los paquetes para poder utilizar FFmpeg, sin embargo a veces es necesario recompilar el programa para que soporte algunos codecs que no vienen por default en el programa que incluye la distribucion.

El codigo fuente de FFmpeg se baja del sitio oficial. Se puede bajar la ultima version estable o sincronizar con el repositorio SVN o GIT para tener la version de desarrollo mas reciente.

Una vez con el codigo fuente, se aplica la clásica serie de pasos:

configure
make
make install

(este último al menos, requiere de permisos de superusuario)

Ahora bien, para que FFmpeg soporte otros formatos, se deben habilitar en el configure.
Por ejemplo:

--enable-libopencore-amrnb   permite soporte para videos 3GP
--enable-libvorbis   permite soporte para Vorbis
--enable-libmp3lame   permite soporte para audio MP3
--enable-libxvid   permite soporte para AVI
--enable-libfaac   permite soporte para audio AAC


Una vez compilado e instalado, ffmpeg se utiliza para convertir formatos.
Por ejemplo,

de FLV a 3GP:

ffmpeg -i origen.flv -s qcif -vcodec h263 -acodec aac -ac 1 -ar 8000 -r 25 -ab 32k -y destino.3gp

de MOV a FLV

ffmpeg -i origen.mov -ar 22050 -ab 128k -b 400k -s 320x240 -aspect 4:3 -f flv destino.flv

Notese que los parametros que definen las caracteristicas del video (bitrate, etc.) deberian cambiar segun el video origen y el resultado deseado en el destino.

¿Eres un arquitecto de software?

Tomado del original (en inglés) en infoq.com.

La linea que divide el desarrollo de software y su arquitectura es engañosa.  Algunos dirán que esta no existe y que la arquitectura es simplemente una extensión del proceso de diseño hecho por los desarrolladores.  Otros harán de esto un enorme abismo que solo puede ser crusado por desarrolladores avanzados que creen que debes resumir los componentes fundamentales en lugar de detenerte en esos detalles molestos de implementación. Como siempre, hay un balance pragmático en algún lado a mitad del camino, lo cual hace surgir una pregunta interesante sobre como moverte de un lado a otro.

Algunos de los factores clave que a menudo se utilizan para diferenciar la arquitectura del software de su diseño y su desarrollo incluyen un aumento de la escala, un aumento en el nivel de abstracción y un aumento en la importancia de la toma de decisones correctas en el diseño.
La arquitectura del software es acerca de tener visiones holísticas y teniendo una vista general para entender como el sistema trabaja como un todo.  Mientras esto puede ayudar a difrenciar el desarrollo de la arquitectura de software, no necesariamente permite entender como alguien cambia de actividades de desarrollo a las de arquitectura. Tampoco ayuda a identificar quién hará un buen trabajo de arquitectura, ¿como harás para contratar a la gente correcta o sabrás si tu eres un arquitecto de software?

La experiencia es una buena referencia pero necesitas profundizar más

Llegar a ser un arquitecto de software no es algo que simplemente pase de la noche a la mañana o con un ascenso. Es una función, no un rango.  Es un proceso evolutivo donde gradualmente ganarás la experiencia y confianza que necesitas para ejecutar tu función.

Hay un número de cualidades que puedes buscar en un arquitecto de software y su experiencia pasada es a menudo un buen puntaje para calificar su habilidad en el desempeño de su papel.  Aunque la función de un arquitecto de software es muy variado, se necesita profundizar para entender el nivel de participación, la influencia, el liderazgo y la responsabilidad que ha sido demostrada a través de un número de ámbitos diferentes. Hablando ampliamente, la arquitectura de software en la mayoría de los proyectos puede ser dividida en dos fases; la arquitectura es definida y luego es liberada.

Instalando most como pager en Linux

Casi todos estamos familiarizados con los paginadores más famosos en GNU/Linux, con los cuales un texto largo en consola puede verse tranquilamente pantalla a pantalla...

Puede ser que usemos el clásico more(1), o que por otro lado utilicemos less(1).

¿Tenemos más opciones? La respuesta es sí...

Construye tu propio servidor LAMP

Vamos a instalar varios servidores que en conjunto se suelen conocer como LAMP (Linux-Apache-MySQL-PHP), básicamente necesitamos Apache para poder montar nuestras paginas web, php para poder programarlas y mysql para almacenar nuestros datos pero como ya deben saber para que funciona cada una, voy a enfocarme más a la instalación propiamente sobre un linux ubuntu 9.10.

Instalar Apache2 y configurar PHP5
Debemos descargar los paquetes desde el repositorio de ubuntu usando apt-get de la siguiente forma:

sudo apt-get install apache2 php5 libapache2-mod-php5

El comando sudo te permitirá ejecutar los comandos como administrador, esto es muy común en ubuntu, la única diferencia de hacerlo sin el comando sudo es que te pedirá tu contraseña y listo, te mostrará algo como la siguiente imagen.  Debes responder 'Y' a la pregunta y empezará a descargar primero los paquetes, luego a instalarlos automáticamente.

Prepara tu café porque se va a descargar como de 7 a 10MB.

Uso del comando awk en linux

Algunas de las limitaciones del comando sed se remedian por medio del comando awk, pues aunque se parece mucho a sed, los detalles se basan más en el lenguaje de programación C que un solo editor de textos. Uso:

awk 'programa' archivos
Sin embargo, la constitución del programa es distinta:
patron { acción }
patrón { acción }
patrón { acción }

... (mas patrones y acciones)

A semejanza del comando sed, awk tampoco modifica los archivos de entrada, solamente la salida que imprime. El comando awk lee la entrada de un archivo un renglón a la vez, para el cual compara con cada patrón en orden, de esta manera, para cada patrón que concuerde se efectúa la acción correspondiente.

Los patrones son expresiones regulares como en el comando egrep o condiciones complicadas como en el lenguaje C. Por ejemplo:

awk '/expresión regular/' { print }' archivos
awk '/expresión regular/' archivos


Esta instrucción consiste en imprimir aquellas líneas que concuerden con la expresión regular, si se omite una acción, se imprime, por lo que ambas líneas muestran el mismo resultado. En caso de omitir el patrón, la parte de la acción se ejecuta a cada línea de entrada.

Ciclo de vida en JSF

JSF (Java Server Faces) es un framework de desarrollo basado en el patrón MVC (Modelo Vista Control), su intención es estandarizar el desarrollo de aplicaciones web similar al estilo de Swing o Delphi, donde la interfaz se realiza mediante componentes y basada en eventos, esto permite que sea bastante flexible y sencillo, especialmente para quienes ya están acostumbrados a los componentes y eventos.  No obstante aún no tiene la experiencia de otros frameworks y es importante entender como trabaja.

Algunos conceptos que debemos tener en mente son:
Managed Bean (o Backing Bean) . Es un pojo que se asocia con los componentes de la interfaz de usuario (UIComponent), dentro de sus funciones está
  • Almacenar referencias a los componentes de la vista y ponerlos a la disposición del controller (durante el ciclo de vida JSF).
  • Proveer de las propiedades necesarias para la vista, como el comportamiento de la pantalla, la información que se presenta e inclusive hasta algunos elementos del diseño gráfico.
  • Exponer los métodos que pueden ser usados por los componentes para comunicar al servidor de la iteracción con el usuario.

Mashups con Presto

Después del curso de Presto, hice unas pequeñas anotaciones que me interesó compartir (antes que se queden como borrador en mi correo por una eternidad).

Un portlet es una sección en la pagina web que permite ejecutar transacciones de forma separada, como una mini-aplicación independiente. De esta manera si se conjunta varios para visualizarlos como uno solo, se le llama Orquestación.

Con Presto, la orquestación la realiza 'Mashup engine' y para enlazar los servicios graficamente se hace con 'Mashup Composer'. Ambos son parte de los servicios que proporciona Presto.

Presto utiliza Mashlets, Mashups y Servicios, usando el Jackbe Universal Mashup Protocol (JUMP) y para producir salidas en formato xml o json. Los servicios se registran en 'Service Explorer'.

EMML es un lenguaje de programación que utiliza Presto para crear mashups. Algunos tags que utiliza son los que siguen.
  • <mashup> - inicia el xml para crear un mashup
  • <foreach> - para generar un ciclo
  • <display> - para desplegar el contenido de una variable
  • <constructor> - permite construir la estructura raíz de la salida
  • <operation> - define una operación a ejecutar
  • <annotate> - permite agregar elementos a un xml
  • <invoke> - permite invoca servicios publicados por Presto
  • <directinvoke> - sirve para invocar servicios que no son de Presto
  • <merge> - se usa para hacer una mezcla de los valores de dos o mas variables
  • <filter> - permite filtrar contenido
Presto también usa estos conectores para invocar servicios de Presto desde Excel, JS, Java y Csharp, entre otros.

Glosario
  • xpath es una forma de recorrer la estructura xml
  • xquery es equivalente a SQL pero para datos que vienen en formato XML.
Ejemplos en la red.

Publicar Mashup por linea de comandos

Por si necesitan instalar mashups mediante la linea de comandos (sin necesidad del Eclipse y el plugin de Presto) debes hacer lo siguiente:

  1. En la carpeta \Presto2.7.0\mashupclient\bin dejar el archivo emml (o en tu caso tener identificada la ruta del emml)
  2. Abrir una línea de comandos
  3. Ir a la ruta \Presto2.7.0\mashupclient\bin
  4. Ejecutar la siguiente línea:

emmlpub -f mashup-script-filename -u user-name -p password [-desc description -t tag [...] -app application [...] -P provider -url presto-url]

por ejemplo

emmlpub -f c:/miaplicacion/mashup/fgdasfad.emml -u admin -p adminadmin -url http://localhost:7070/presto/edge/api

Obviamente en la URL debe ser la del server en donde vas a publicar el servicio.

Instalando e iniciandose con Symfony 1.4

Symfony es un framework para desarrollar aplicaciones web de manera rápida bajo PHP.

Actualmente se encuentra en su versión 1.4, y a la fecha es uno de los frameworks más populares para desarrollar con PHP (junto con CakePHP y el Zend Framework...)

El sitio web de Symfony presume su framework como uno de los más rápidos, no sólo para desarrollar, sino también para aprender. Según ellos, siguiendo sus tutoriales en un programa sencillo de aprendizaje, se podría decir que se toman exactamente 2 días (48 horas) en aprender Symfony. En realidad se podría llevar un poco más, dependiendo el tiempo libre que se tenga (además de que hay que dormir, comer y demás...)

La instalación, configuración y levantamiento de un primer proyecto en Symfony es, en realidad, sencillo: