martes, 26 de mayo de 2009

Adios Blogger, adios...

Bueno, este es el último post de mi blog en esta dirección. A partir de ahora, me mudo a un dominio propio, con un sistema bastante más robusto, lindo y con muchas más características: Wordpress.

El nuevo sitio es: http://blog.marcelofernandez.info

Este post cuenta un poquito más: http://blog.marcelofernandez.info/2009/05/hola-mundo/

Básicamente dejo Blogger porque tiene muy pocas features, y me cansé de esperar que implementen cosas como colorización de código fuente, editor mejorado (donde escribo tiene unas 15 líneas de alto más o menos), mejores diseños, posibilidad de plugins, etc.

No hace falta actualizar el feed RSS, al utilizar FeedBurner el switch lo hago yo. :-)

Bueno, nos vemos en el nuevo site!

Saludos
Marcelo

domingo, 24 de mayo de 2009

PostgreSQL Conference 2009

Gracias a este post del sitio de PostgreSQL en español, me entero que terminó la conferencia anual de la comunidad de PostgreSQL, llamada PGCon 2009. Obviamente, la nueva versión que está al caer (8.4) acaparó todo un track completo, así que acá está la lista de charlas para ver de qué se trató.

Particularmente, a mí me interesó mirar los slides de:

  • Introducing Windowing functions: Es una nueva e importante característica de PostgreSQL 8.4, el soporte de consultas con varios niveles de aggregates, no sólo el primero con la cláusula GROUP BY, sino que también se pueden subdividir estos grupos (llamados Windows) y ejecutar funciones dentro de cada subrango. Muy interesante.
  • No More Waiting: La clásica y necesaria charla sobre las nuevas cosas de PostgreSQL 8.4.
  • SkyTools3: Replication (Londiste3): Si hay algo que se le puede "recriminar" a PostgreSQL es la falta de replicación built-in (está prometido para la 8.5, tough). Sin embargo, hay muchas herramientas extra para hacerlo, y Londiste es una de ellas (desarrollada por la gente de Skype, que usa PostgreSQL para todo).
En fin, PostgreSQL es una base de datos muy robusta y confiable, la vengo utilizando profesionalmente y nunca me dejó de a pie. Tiene una excelente documentación, una licencia extremadamente libre (BSD), casi todas las características de las grandes, y un muy buen soporte en la lista de PostgreSQL en español.

Saludos
Marcelo

sábado, 2 de mayo de 2009

Renderizando PDFs en Python con Poppler

Buenas... hoy voy a mostrar una forma de renderizar archivos PDF dentro de nuestras aplicaciones y desde Python, para casi cualquier plataforma con la estemos trabajando.

Introducción
Si bien cuando se arma una aplicación de escritorio se suele "llamar" a un software externo (Acrobat Reader, Fox-It, Evince, etc.) para que muestre el contenido de un archivo PDF, generalmente queda "feo"; nuestro programa pierde la interacción y el control de lo que el usuario hace con el mismo, implica superponer un programa arriba del otro, etc. Esto suele producir una experiencia dificultosa para el usuario de nuestro querido programa, y como corresponde, los programadores nos ponemos tristes. :-(

Como una alternativa tenemos, en plataformas Windows, y estando el Acrobat Reader instalado previamente, la posibilidad de embeber en nuestro programa el mismo como un control ActiveX (hay otras alternativas) pero en el resto de las plataformas este problema no tenía solución (que yo conociera, al menos), ni siquiera algo más "liviano". El resultado de embeber todo el Acrobat Reader es más o menos lo que hacen los navegadores web cuando tienen el plugin de Adobe instalado y hacemos click en un link a un archivo PDF de la web:

(Después de 1 minuto, y si el usuario no cerró la ventana, aparece esto)

Hace unos días, en la lista de usuarios de las bibliotecas wxPython preguntaron si se podía renderizar un PDF dentro de una ventana del mismo programa, pero sobre Linux, y buscando la solución me encontré con un binding Python para Poppler.

Solución: Poppler-Python sobre Cairo
Veamos, Poppler es una biblioteca de código abierto desarrollada en C con el objetivo de renderizar (es decir, interpretar y dibujar) archivos PDF, siendo la evolución del viejo Xpdf. Es una pieza de software imprescindible en el escritorio de cualquier Sistema Operativo Libre, ya que es un trabajo bárbaro el que hace, y además es la piedra fundamental de programas como Evince y Okular (más allá de que el PDF es un formato de archivo universal). Y lo mejor es que dibuja sobre cualquier contexto de dibujo de Cairo, así que donde haya Cairo y compilador de C, puede estar Poppler*.

Hasta acá, bien, Poppler se puede utilizar desde C (como lo hace Evince, el visor de PDFs de Gnome). Pero 'ete aquí que me encontré con estos bindings de Poppler para Python, y si bien el ejemplo que éstos incluyen utiliza PyGTK, en realidad, sólo necesita de un Canvas Cairo (GTK dibuja mucho sobre Cairo y provee mecanismos para que el desarrollador lo utilice también); es el mismo Cairo que incluye wxPython a partir de la versión 2.8.9.0 (aunque se puede utilizar con ctypes desde versiones anteriores a la 2.8.9).

Un poco de Código
En fin, voy a tratar de explicarlo mejor, esta es la manera de renderizar un PDF dentro de una aplicación PyGTK. Voy a pegar acá abajo lo relevante:
def __init__(self):
[...]
self.document = poppler.document_new_from_file (uri, None)
self.n_pages = self.document.get_n_pages()
self.current_page = self.document.get_page(0)
self.scale = 1
self.width, self.height = self.current_page.get_size()
[...]
self.dwg = gtk.DrawingArea()
self.dwg.set_size_request(int(self.width), int(self.height))
self.dwg.connect("expose-event", self.on_expose)

[...]

def on_expose(self, widget, event):
cr = widget.window.cairo_create()
cr.set_source_rgb(1, 1, 1)

if self.scale != 1:
cr.scale(self.scale, self.scale)

cr.rectangle(0, 0, self.width, self.height)
cr.fill()
self.current_page.render(cr)
Como se puede ver, Poppler-Python se encarga de cargar el archivo, devolver la cantidad de páginas, etc., mientras que con GTK creamos el contexto de dibujo Cairo, y todo lo que hacemos es decirle a Poppler "dibujá acá, en este contexto Cairo".

Entonces me puse a jugar con wxPython para hacer lo mismo, !y funciona!

Acá está el ejemplo:
#!/usr/bin/env python
import wx
import wx.lib.wxcairo
import sys
import poppler

class MyFrame(wx.Frame):

def __init__(self):
wx.Frame.__init__(self, None, -1, "Cairo Test", size=(500,400))
self.Bind(wx.EVT_PAINT, self.OnPaint)
uri = "file://" + sys.argv[1]
self.document = poppler.document_new_from_file (uri, None)
self.n_pages = self.document.get_n_pages()

self.current_page = self.document.get_page(0)
self.scale = 1
self.width, self.height = self.current_page.get_size()
self.SetSize((self.width, self.height))

def OnPaint(self, event):
dc = wx.PaintDC(self)
cr = wx.lib.wxcairo.ContextFromDC(dc)
cr.set_source_rgb(1, 1, 1)

if self.scale != 1:
cr.scale(self.scale, self.scale)

cr.rectangle(0, 0, self.width, self.height)
cr.fill()
self.current_page.render(cr)

if __name__=="__main__":
app = wx.App()
f = MyFrame()
f.Show()
app.MainLoop()
Y acá está la captura de pantalla obligada, luego de ejecutar "python ejemplo.py /path/al/archivo.pdf" (click para agrandar):

De esta manera, es posible utilizar Python, Poppler y wxPython (o PyGTK) para mostrar y manejar el contenido de un archivo PDF dentro de nuestra aplicación y en casi cualquier plataforma, sin recurrir a componentes de terceros. :-)

Consideraciones:
Bueno, quisiera comentar que poppler-python parece ser un proyecto "joven", ya que todavía sólo está incluido en los repositorios de Ubuntu 9.04 en adelante. Con lo cual, en caso de utilizarlo en otras distribuciones y/o plataformas, hay que hacer un checkout desde sus repositorios y compilarlo; sus únicas dependencias son pycairo y poppler (0.10.x o posterior). Es muy sencillo hacerlo (el típico ./configure, make y make install), y no tuve ningún problema, utilizando Ubuntu 8.10.

En caso de querer utilizar Poppler-Python sobre el Cairo que incluye wxPython, lo mejor es utilizar una versión 2.8.9.x o superior de wxPython (ya con eso es suficiente, porque incluye Cairo en el paquete). Ubuntu 9.04 trae wxPython 2.8.9.1, Poppler 0.10.x y Poppler-Python en los repositorios, así que con un único apt-get ya tenemos todo lo necesario para hacer andar el ejemplo de arriba.

En mi caso, para probarlo en Ubuntu 8.10, tuve que compilar poppler desde los fuentes (traía la versión 0.8.x) y después compilar python-poppler, por un lado. Por el otro, para utilizar Cairo sobre wxPython 2.8.8.0 (el que viene en Ubuntu 8.10), llamé a Cairo con ctypes, como dice acá, y me quedó este ejemplo. Este procedimiento sería similar para cualquier otra distribución con versiones viejas de Poppler y/o de wxPython. Para la distribución de nuestro software todo se simplifica, ya que se puede usar tranquilamente Py2Exe, cx_Freeze o PyInstaller, por nombrar algunos. Pero eso es tema de otro post ;-)

* Poppler denomina Frontend a las diferentes APIs que tiene para ser utilizado, entre ellas QT4 (base de KDE) y Glib (GTK principalmente, base de Gnome). Y tiene como backend (es decir, necesita para dibujar) no sólo a Cairo, sino que también puede dibujar sobre Splash (ignoro qué es, y Google no me devuelve nada relevante).

Bueno, espero que al menos le sirva a alguien, que lo aprovechen y lo mejoren!

Saludos
Marcelo

martes, 28 de abril de 2009

Charla sobre Virtualización - Slides

Estos slides los estuve preparando para dar una charla sobre virtualización en el último FLISOL en la UNLu. No se dio (¡era mucha gente para atender instalando máquinas! :-D), pero las subo acá por un lado, y por el otro no va a faltar la oportunidad en darla. Es más, estamos pensando seriamente en hacer algún "pequeño evento" en la UNLu no muy lejano para juntar charlas...

En fin, los slides en cuestión, están disponibles aquí formato OpenOffice, y aquí en formato PDF.

Si encuentran algún typo, error, omisión o se les ocurre alguna mejora, ¡bienvenida sea!

Saludos
Marcelo

martes, 14 de abril de 2009

Flisol 2009

Este año, y como todos los años, se realiza el Festival Latinoamericano de Instalacion de Software Libre, más conocido como FLISOL. Yo voy a estar dando una mano en la que se realiza en la ciudad de Luján, sin embargo se realizan en un montón de ciudades del país y latinoamérica... en fin, ¡los esperamos!
Va a haber alguna que otra charla, regalada de CDs, instalación de nuevos equipos y reunión del grupo del UNLuX.

miércoles, 8 de abril de 2009

PyCon Chicago 2009

Hace algunos días que están disponibles los videos (versión más "navegable" acá) de unas cuantas charlas de PyCon 2009 - Chicago (terminó hace unos pocos días), y como me apasionan este tipo de eventos, suelo dedicarle algún tiempo libre a ver las que más me interesan (que "filtro" por el título, no me queda otra).

Les dejo una lista de las más importantes según mi criterio* (aclaro, sin haberlas visto):

¡Puff! Son un montón, y revisando un poco los títulos, se ve que me interesaron los temas bien técnicos. Para cada uno tengo un motivo, pero en vez de gastarme escribiendo (el tiempo es tirano, je), prometo que a medida que las vaya viendo (cada una dura algo así como 40 minutos), voy a actualizar este post.

*Mi criterio de interesante tiene que ver con algo totalmente arbitrario, es decir, sólo lo que me gusta. :-P

Saludos
Marcelo

PD: Muy copado que podés levantar todo el canal completo de PyCon con Miro! Si lo tienen instalado, hagan click acá para registrarse al canal PyCon y bajar tranquilo los videos para ver offline y recibir las actualizaciones del mismo...

jueves, 12 de marzo de 2009

Novedades en Firefox 3.1 beta (será 3.5)

Si bien la mayoría de los sitios de noticias tiene un enlace a esta página, detallando las novedades más importantes y generales en la aplicación, me gustaría destacar algunas de las novedades "bajo el capó" del próximo Firefox 3.5, que se describen en esta otra página ("Firefox para desarrolladores web").

Veamos, las que me parecen más interesantes son:

Bueno, son bastantes cambios, esto sumado a TraceMonkey seguramente va a hacer que Firefox esté preparado para las aplicaciones web de acá a unos años; aunque pensándolo bien, yo iría tachando la palabra "web" de la frase anterior, dejando "aplicaciones" a secas...

¡Saludos!
Marcelo

martes, 10 de marzo de 2009

Otra vez el Cambio de Horario en Ubuntu

Este post es sólo para comentar, amigos sysadmins, que este domingo a las 00:00 hs. se "atrasará" una hora el reloj del lado este del país, y que todos aquellos que tengan actualizados el paquete tzdata van a tener actualizados el reloj automáticamente, a diferencia de otras oportunidades donde lo repentino de los caprichos las decisiones políticas hicieron que hubiera que hacer esto a mano.

Para comprobar esto, pueden correr en la consola:

marcelo@marcelo-laptop:~$ zdump -v /etc/localtime | grep 2009
/etc/localtime Sun Mar 15 01:59:59 2009 UTC = Sat Mar 14 23:59:59 2009 ARST isdst=1 gmtoff=-7200
/etc/localtime Sun Mar 15 02:00:00 2009 UTC = Sat Mar 14 23:00:00 2009 ART isdst=0 gmtoff=-10800
/etc/localtime Sun Oct 18 02:59:59 2009 UTC = Sat Oct 17 23:59:59 2009 ART isdst=0 gmtoff=-10800
/etc/localtime Sun Oct 18 03:00:00 2009 UTC = Sun Oct 18 01:00:00 2009 ARST isdst=1 gmtoff=-7200
Las dos primeras líneas representan las reglas con el cambio mencionado. Si no aparece nada después de correr este comando, actualizen el paquete tzdata. :-)

Saludos,
Marcelo

miércoles, 18 de febrero de 2009

Artículo sobre Optimización en Software

En este artículo el autor (Shlomi Fish) discute un poco sobre optimización de algoritmos, y está orientado bastante a lo pragmático, desmitificando (o intentando derribar) algunos viejos "axiomas" de la programación.

Para mí fue muy interesante la introducción de la idea de que optimizar factores constantes en la complejidad de un algoritmo también sirve; es decir, no sólo reducir órdenes de magnitud como único objetivo al optimizar, sino que también es importante hacerlo en factores. Con lo cual tiende a derribar dentro de su criterio el mito de "O(N²) es igual a O(2N²)", por ejemplo.

Finalmente, dispara un montón de links para otros lados también muy interesantes... en fin, aprendí un montón. :-)

Es lectura para un día lluvioso, ideal para revoleárselo a pibes que hacen Programación II en una facultad.

http://www.shlomifish.org/philosophy/computers/optimizing-code-for-speed/

Saludos
Marcelo
PD: Es más, veo que el sitio mismo del autor tiene bastantes artículos similares sobre computación... será cuestión de agendar el sitio y leerlo de a poco.
PD2: Ignacio: habla de lo "malo" y lo "bueno" que puede llegar a ser el inlining de funciones, vos que sos un defensor tan acérrimo :-P . También habla de la pobre performance de algunas llamadas de la Glib, cosa que vos también nos demostraste en su momento con el Quicksort.

miércoles, 14 de enero de 2009

QT será licenciado como LGPL

Creo que es la mejor noticia de los últimos (¿años?) con respecto al mundo del software libre en el escritorio: las bibliotecas de desarrollo QT, en su versión desktop y embedded, piedra fundamental de todo el entorno de escritorio KDE (y de muchísimas aplicaciones más), se distribuirá con licencia LGPL, a partir de su versión 4.5.


Ahora los programadores seremos libres de desarrollar aplicaciones cerradas ("comerciales") o no con QT, tanto para móviles/smartphones (Windows CE, S60) y/o dispositivos varios como para el escritorio (Windows, Linux, Mac, y más). No todos podíamos pagar la licencia comercial de QT (no lo dice, pero era muy salada, por asiento y en euros), y nos perdíamos de usar una de las mejores bibliotecas de desarrollo de su tipo en existencia.

Ajá, y para el usuario "de a pie"... ¿Qué quiere decir? En principio, se me ocurre:
  • Firefox (para empezar) y luego un montón de aplicaciones van a tener la posibilidad de integrarse mucho mejor con KDE.
  • Gnome y KDE podrán intercambiar código y hasta hacer un proyecto conjunto de librería única (a mediano/largo plazo... quién sabe?). Pero al menos será más sencillo hacer que tanto aplicaciones como escritorios interactúen mejor.
Noticias como esta me ponen muy contento, Desde que compró Trolltech (creadores originales de QT), parece que Nokia no para de invertir en el software libre para su propio beneficio (tal como hacen varios otros)...

Ars Technica tiene un buen artículo sobre la noticia, resumiendo la situación anterior de QT y explicando porqué es tan significativa en el "mundillo" del software libre.

(¿Será tiempo de aprender C++?... no creo, tengo la impresión de que no vale la pena... en todo caso prefiero usar QT desde Java.)

Saludos
Marcelo
PD: El 2009 se viene con todo...

domingo, 4 de enero de 2009

Sobre KVM - Virtualización en Servidores

Leyendo la blogósfera, me detuve en esta crónica de una migración de VMWare Server a KVM, explicando las razones de porqué elegir KVM y no el resto. :-)

Las enumero, tratando de traducirlas lo mejor posible:

  • El host corriendo KVM es un Linux estándar sin modificar. Para ambos (Xen y VMWare ESX) se necesita correr un Sistema Operativo modificado especialmente (que lo hace relativamente difícil de mantener al día con actualizaciones de seguridad).
  • Siendo incluído en Linux, usted obtiene soporte de KVM en el mismo momento que usted compra soporte estándar de Ubuntu Server. Como de todas maneras teníamos planeado adquirir soporte Ubuntu, tuvimos soporte para nuestra plataforma de virtualización sin costo adicional.
  • Performance: La velocidad de KVM es muy buena, ya que está basada en extensiones de hardware. (N. del T.: Ojo, tengo entendido que tanto Xen como VMWare también soportan extensiones de hardware en caso de estar disponible).
  • VMBuilder: Ubuntu desarrolló una herramienta (ubuntu-vm-builder, ahora llamada vmbuilder) que puede construir un appliance virtual en aproximadamente un minuto. Esta es una mejora enorme en comparación a la forma que solíamos crear VMs (VMbuilder también puede ahora crear imágenes para Xen y VMWare). (N. del T.: En mi experiencia, sirve únicamente si vamos a crear VMs con SO Ubuntu).
  • KISS - Keep It Simple, Stupid (Mantenlo Simple, Estúpido!): KVM utiliza todo lo que Linux provee de antemano. Cada VM es un simple proceso, usa su planificador de procesos (scheduler), uno puede reasignar la prioridad (renice) del proceso, asignarlo a una CPU específica... esto resulta en una base de código fuente mucho más pequeña que Xen por ejemplo, de manera que asumo que será más fácil y barato mantenerlo a largo plazo, haciendo que el proyecto más confiable.
  • Y lo más importante: Las companías involucradas. Aún cuando a KVM le faltan algunas características, los posts en la lista de desarrolladores muestran parches de código desde empresas como RedHat (que compró KVM el año pasado), AMD, Intel, IBM, HP, Novell, Bull... ¿A quién va a creerle, a un proyecto manejado por una única compañía (Citrix, VMWare), o a un proyecto soportado por tantos actores diferentes?
Para mí le falta otra cosa importante: Tiene un desarrollo totalmente abierto y es software de cóodigo abierto. :-)

En donde laburo estuvimos metiendo KVM en un servidor y si bien las herramientas de configuración/administración tienen sus quirks (aunque funcionan relativamente bien), la parte de KVM en sí anda perfectamente y con una excelente performance y confiabilidad. ¡Ah! y Canonical ya había anunciado que iba a soportar KVM como plataforma principal de virtualización también, así que... IMHO, KVM tiene todas las de ganar de acá en adelante.

Espero postear próximamente un poco las experiencias que tuve armando VMs con este software, mientras tanto dejo este enlace que resume la mayoría de las cuestiones con KVM en Ubuntu.

Saludos
Marcelo