Mostrando las entradas con la etiqueta codear. Mostrar todas las entradas
Mostrando las entradas con la etiqueta codear. Mostrar todas las entradas

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

miércoles, 31 de diciembre de 2008

Xplico, un decodificador de tráfico de Red

Gracias al rincón de Laramies me sigo enterando de cosas novedosas acerca de herramientas y noticias sobre seguridad informática; esta vez de la existencia de Xplico, un software para analizar y disecar [1] capturas de red en formato PCap (el más común, utilizado por herramientas como Wireshark o Tcpdump, por ejemplo).

Su objetivo es detectar el protocolo de aplicación (no basado en el número puerto, sino que lo hace interpretándolo realmente), y extraer la información relevante (el stream de datos), mostrarla y darle a uno la posibilidad de guardarla aparte para abrirla con un software que pueda reproducir dicho formato. Por ejemplo, puede detectar el formato SIP (utilizado comúnmente en llamadas telefónicas de VoIP) en una serie de paquetes capturados y guardarlo aparte para poder escuchar la llamada telefónica. :-)

De todas maneras, su página de estado del proyecto nos dice que le falta soporte de varios protocolos más (por ahora soporta decentemente HTTP, SMTP, IMAP, POP, FTP, IPP, PJL y SIP, entre otros) pero insisto que es un proyecto muy interesante, con muchos usos y muy útiles. Además, sería un lindo como add-on para Wireshark, IMHO.

Vean las capturas de pantalla.

Saludos
Marcelo
[1]: Es "disecar", no "disectar"; es la primera acepción de esta palabra. La segunda acepción es la conocida. :-)

lunes, 29 de diciembre de 2008

OpenSolaris 2008.11

Bueno, parece que se pusieron de acuerdo a que (ayer) me instalara en una máquina virtual el OpenSolaris 2008.11, ya que hoy me llegó en forma totalmente gratuita el Live CD que pedí desde esta página a Sun.

El software, por lo poco que pude probar, está muy, muy bueno e interesante. Y más si estamos hablando de un Sistema Operativo que ya viene con ZFS, DTrace y toda la infraestructura de Solaris, más una capa de escritorio Gnome retocada y bastante coqueta (una vez hace bastante tiempo instalé un Solaris Express con CDE... mamita que era "de piedra" [1]).
En fin, por lo que conozco, leí y me dijeron, Solaris es un UNIX completo hecho y derecho, con un desempeño excelente como servidor. Así y todo, el desarrollo de OpenSolaris tiene que ver con llevar paulatinamente esta performance de "roca sólida" de los centros de cómputos a las notebooks de los desarrolladores, administradores de red, geeks en general y usuarios de escritorio (¿por qué no?). Y si bien uno puede pensar "para qué, si ya está Linux" (o más bien Ubuntu, je), creo que el desarrollo de alternativas competitivas fue uno de los pilares del desarrollo del Software Libre como movimiento, y hasta de las especies de la naturaleza (algo que es parte de lo que se llama evolución); por lo tanto, es bueno, más si tiene tanta tecnología high-end con la cual uno en principio puede jugar y experimentar, siendo tan diferente a Linux en sus entrañas [2].

Por ahora les dejo este y este link (y el blog en general, orientado a este SO), para "otros como yo" que están metiendo el dedo gordo en las aguas de Solaris y vienen de Linux. ¡Ah! y no puede faltar este video mostrando el laburo de integración progresiva del escritorio al entorno; esto en particular Linux no lo tiene.




Actualización: Vean la página con info y capturas de las mejoras de esta versión.

Saludos
Marcelo

[1] Si leen el post de este link, verán que disiento totalmente con el autor en cuanto a que esa versión era "tan fácil de usar"... pero bueno, son opiniones.
[2] Una de las cosas que hay que tener en cuenta es que por cuestiones de
incompatibilidad de licencias de los proyectos, no se puede intercambiar código del kernel Linux (GPLv2) en OpenSolaris (CDDL) y viceversa. Sin embargo, ambos proyectos obviamente están considerados como de Código Abierto (aprobados por la OSI - Open Source Initiative). Ojalá esto cambie, por el bien general.

sábado, 27 de diciembre de 2008

Dan Kaminsky en BlackHat 2008 - Japón

Esta presentación es la única que me llamó la atención repasando el archivo del Black Hat de Octubre de este año en Japón. El ya conocido Dan Kaminsky fue el keynote del evento, explicando no sólo (nuevamente) la vulnerabilidad de DNS descubierta por él este año, sino también qué se viene en general en materia de (in)seguridad informática.


Son un montón de diapositivas (101!), unas cuantas las pasé por alto, pero son útiles; a modo de resumen, enumero los "highlights":

  • Vulnerabilidad DNS: Análisis exhaustivo del problema, demostración del ataque. Es útil porque empieza desde el principio, comenta la impresionante (awesome) reacción de las "software factories" de DNS con un lindo grafiquito, y tiene interesantes conclusiones para los desarrolladores de software en general (ver los Takeaway a lo largo de toda la presentación). También explica porqué atacar DNS: ¡es el MiTM perfecto!.
  • Lo que viene: Bienvenidos a la tercera era del hacking. Ya se explotaron vulnerabilidades en los servidores y en los navegadores. Lo que sigue es aprovecharse del resto del software, que está íntimamente ligado a la red también; a modo de ejemplo cita esta vulnerabilidad del Sidebar de Windows Vista. Incluye a los juegos en red, y a las formas "seguras" de actualizar desde el software que se usa a diario.
  • Cuidado con SSL: Destaca muchos problemas a futuro, tanto técnicos como del usuario: falta de escalabilidad y de difusión, problemas con los virtual hosts, los usuarios no prestan atención a los mensajes de advertencia, el uso de MD5 para su firma, etc. "No es la panacea que pareciera ser".
  • Autenticación - el Bug principal de 2008: elabora una lista las últimas vulnerabilidades importantes conocidas, todas tienen que ver con este punto crucial en la interacción de sistemas.
  • En resumen, la infraestructura y servicios (¡todos ellos!) de Internet y las Intranets dependen del servicio de DNS. Hay que mejorar la infraestructura; esta vez tuvimos suerte, la próxima vez puede que no sea tan "suave" el problema. DNS no debería haber sido capaz de provocar este daño: entonces, ¿Por qué lo fue?
Además, mientras tuve algo de tiempo, también estuve mirando:

The Internet is Broken: Beyond Document.Cookie - Extreme Client Side Exploitation. Presenta una serie de vulnerabilidades en varios componentes de software comunes estos días, provocado por el abuso de confianza en el nombre de dominio (está claramente relacionado con lo que decía Kaminsky, pero bien práctico); en Java, los servidores Web locales de ciertas aplicaciones, etc.

Disclosing Secret Algorithms from Hardware: Confieso que no sé mucho de electrónica, pero así y todo entiendo que esta charla estuvo interesantísima: ¡los tipos hacen ingeniería reversa de algoritmos en hardware! Muestran cómo se hace, en forma muy gráfica, y explican qué herramientas utilizan. Me asombra que digan "acá hay un NAND, así y así..." Y ya que están, agarran un chip RFID de MiFare a modo de (mal) ejemplo para determinar el algoritmo de encriptación (cerrado), como ya lo hicieron anteriormente (aunque la ley impidió la presentación en sí). Nobleza obliga, debo agregar que la compañía relativiza esta cuestión y hace pública su posición al respecto.

Bueno, espero que tengan un feliz año!

Saludos
Marcelo

Fábrica de "Startups Cooperativas": FairSoftware

En mi lista de links pendientes, figuraba visitar este sitio. Realmente olvidé cuándo lo agregué, y me lo puse a leer. Resulta que se trata de un sistema de administración, promoción y gestión administrativa de una startup de software.
La idea es que uno registre un proyecto software (Aplicación Web, Blog, Aplicación Desktop, etc.), pueda reclutar un equipo para colaborar en él, generar ingresos monetarios reales (supongamos que por el Adsense del blog, o por el cobro de la descarga de la aplicación) y luego se dividan las ganancias en el equipo. Cada colaborador tiene un "share" ("acción") virtual del proyecto, y cobra (en $ reales, je) una parte de los ingresos según las acciones que se posean, en forma equitativa.

FairSoftware se encarga de la gestión (virtual) de los ingresos y los pagos (electrónicos), de permitir la búsqueda de colaboradores para ciertas tareas, y de figurar "legales" ante el fisco estadounidense. No se mete con el copyright del desarrollo en sí ni con la gestión técnica del proyecto, y lógicamente un usuario puede colaborar en varios proyectos (lo cual pienso que puede servir de "propaganda personal" también).

Lo bueno de todo esto es que FairSoftware evita que la persona que tiene una idea (más los colaboradores de antemano, por qué no) tenga que lidiar con contratos, abogados, el ponerse de acuerdo en ciertas cuestiones con el equipo, etc., además de permitir que cualquier persona del globo contribuya. El "contrato" que existe entre los miembros de un equipo es lo que llaman el Bill Of Rights, que si bien no lo leí, entiendo que muchos equipos ya lo utilizan; propone la igualdad de derechos, el manejo abierto del proyecto, compartir ganancias, etc.

Claro que este servicio tiene un costo: el 9,9% de los ingresos, que incluye el pago electrónico vía PayPal y/o tarjetas de crédito y la declaración de impuestos frente al gobierno de EEUU.

En fin, es una idea muy interesante. De todas maneras, aún está en "beta", por lo tanto no tiene forma (visible, al menos) de buscar startups a las cuales unirse.

Saludos
Marcelo

lunes, 15 de diciembre de 2008

USB 3.0

Más allá de que el video de la señorita de Intel lo pueden encontrar en todos los sitios de noticias (me hace acordar a Chloe de 24, je), es muy interesante el hilo de comentarios de Slashdot, similar a lo que hablaba ayer con un amigo sobre USB 2.0 vs. Firewire (aka IEEE 1394). USB está diseñado para ser muy dependiente del CPU (no por nada lo hizo Intel, guiño, guiño, aunque tiene el side-effect de ser un poco más barato), y Firewire (más dependiente de hardware específico, y por ende un poco más caro) le gana en la práctica por lejos. USB tiene un ancho de banda máximo (teórico) de 480 Mbps, mientras que Firewire viene en sabores de 400 Mbps a 800 Mbps (y ya están saliendo productos de 1600 y 3200 Mbps).


Tratando de ser breve, copio un comentario de Slashdot:
"This is why you can't have USB-to-USB devices like you have Firewire-to-Firewire devices. It's why USB is very bad for time-sensitive data like music and video, because you're always waiting for the host controller to do something on the CPU, which might be busy.. have you ever seen DMA to memory ever work properly on consumer grade hardware anyway?

It's not so much a "scam" as it is designing to the market. Firewire devices have a non-triv
ial price premium because of the device-to-device controller... but that's why they can do things like daisy-chain or direct connect between computers with no special cables. On the other hand USB allows endpoint devices to be made very cheaply.. they have near-zero intelligence if you want. The USB host can be as "thick" or "thin" as the OEM wants... they can put all the host chip control in software drivers to keep chip cost down. They can also put all the control codes for devices in software... remember "wINKjets" that went obsolete with each new Windows version... they have almost no internal software at all."

Por motivos como estos, por ejemplo, hace poquito compré una sintonizadora barata de TV, de tipo PCI, y Ubuntu la tomó sin ningún problema; funciona perfecto, sin ningún "salto", y sin consumir CPU (el cuello de botella para encodear al vuelo pasó a ser mi CPU, je).

Si la hubiera comprado USB (sólo a $60 más).... hubiera tenido otro problema más además del encoding: el consumo de CPU de la misma transferencia de datos quizás me hubiera impedido hacer otras cosas mientras transfería video. Obviamente, al comprarlo PCI tengo que pagar el costo de no poder llevar la sintonizadora de un equipo a otro fácilmente, cuestión que no necesitaba tampoco.

Es por esto que algunas filmadoras DV que conozco vienen exclusivamente con interfaz Firewire, teniendo como alternativa una interfaz USB de compromiso (entiéndase "compromiso" como de "menor calidad", como está documentado). Y el tema del precio mayor no es tan así hoy... en Capital se pueden conseguir controladoras Firewire PCI a $46.

Así y todo, USB es el rey, porque Intel domina claramente el mercado, logró que en su momento todos los fabricantes de motherboards y dispositivos incluyeran dispositivos USB, y porque USB es suficientemente bueno (aka "good enough") en la mayoría de los casos (no es la primera vez que pasan estas cosas en la informática). Algo más a destacar es que al parecer USB 3.0 elimina el polling de dispositivos por parte del CPU, con lo cual el consumo de procesador bajaría considerablemente (pero hay que verlo en acción, Firewire en cambio es una realidad ya probada, donde sus versiones más veloces apenas requieren cambios estructurales).

En fin, como siempre a Slashdot lo elevan muchísimo los comentarios de muy alto nivel. Veremos cómo funciona USB 3.0 (especificación disponible aquí).

Saludos
Marcelo
PD: Qué lindo que las demostraciones las hagan con Linux (Ubuntu); para que se den una idea de la importancia de Linux hoy, USB 1.0 tardó mucho tiempo en soportarse en Linux (1999). Hoy el mismo desarrollo de USB 3.0 se hace sobre Linux...

martes, 18 de noviembre de 2008

Charlas de Software Libre en la Universidad Nacional de Luján

Bueno, este sábado 22 de Noviembre los muchachos del UNLuX (del cual soy orgullosamente integrante) hacen su 2do evento anual sobre tecnología y software libre... a mí se me hace imposible ir por motivos personales (¡realmente un bajón!), pero espero que vayan, ¡va a estar más que interesante y va a haber muy buena onda!

Resumo de su nota principal:
"El Grupo de Usuarios de Software Libre de la Universidad Nacional de Luján (UNLUX) invita a toda la comunidad educativa, profesionales e interesados en Tecnologías de la Información al "Ciclo de charlas UNLUX 2008".

Día: Sábado 22 de noviembre de 2008
Lugar: Sede Central de la Universidad Nacional de Luján
Organiza: UNLUX - Grupo de usuarios de software libre de la Universidad Nacional de Luján.

Este es un evento libre, gratuito y abierto a la comunidad.
Traer Mate (Condicion de acceso a la actividad)
Esperamos contar con la participación de todos!!"

Por otra parte, si bien hay charlas técnicas para los que estudian (o estudiamos) sistemas, creo que esta vez se intentará captar la atención de aquellos interesados en otras áreas de la ciencia en donde el software libre hoy brinda excelentes soluciones, como la ofimática, gráfica, biología, matemática, etc. Con lo cual, si no sos informático, no importa, ¡Este evento es para vos también!

El cronograma de charlas ya está listo y lo pueden ver acá.

Mientras, voy a seguir como siempre, todos los días, en el canal de IRC #unlux de Freenode. :-)

Saludos!
Marcelo

lunes, 10 de noviembre de 2008

(Mi) Migración a Ubuntu 8.10

(Este es un Post que debería haberse publicado el 31/10/2008 y que por diferentes motivos no pude terminar...)

Bueno, hoy llegó el día... luego de leer este y este documento, ayer bajé tranquilo por BitTorrent las imágenes de Ubuntu 8.10 para la arquitectura x86-64 versión desktop y alternate, con la intención de probar la primera como Live-CD primero y luego, si todo iba bien, actualizar mi Ubuntu 8.04 a 8.10 aprovechando la segunda ISO, tal como está documentado en la página de "Cómo Actualizar a Ubuntu 8.10".

Migración:
La prueba con el Live-CD fue rápida e indolora; simplemente comprobé que funcionara normalmente el hardware: video, wi-fi, red, webcam, etc. y no hubo novedades, todo funcionaba! (al igual que con Hardy). Luego, arranqué del disco como siempre y montando la ISO de alternate, comencé el proceso de actualización, desde una terminal:

sudo mount -o loop ~/Escritorio/ubuntu-8.10-alternate-.iso /media/cdrom0
sudo /cdrom/cdromupgrade &
Arrancó el software de actualización, me preguntó si quería utilizar la conexión a internet para bajar paquetes extra que no estén en el CD y/o paquetes más nuevos, a lo cual acepté y me puse a trabajar mientras esto pasaba en segundo plano.

Luego de un par de horas de bajar a unos ~30 KB promedio[1] unos ~300 paquetes (de ~1500 paquetes a actualizar), comenzó el proceso de instalación real de la nueva versión. Ahí paré de para ir a comer (por hambre y por precaución), ya que a medida que iba transcurriendo el proceso, programa nuevo que abría, programa que aparecía nuevo y "feo", seguramente porque arrancaba con la mitad de las cosas instaladas y/o configuradas.


Cuando vuelvo de comer, me encuentro con un cuadro de diálogo de reemplazo de archivos de configuración (¡Estaría bueno que primero instale el paquete y por último me pregunte todo junto!).
En fin, el actualizador me preguntó si quería reemplazar 3 archivos de configuración del sistema que yo había modificado anteriormente: cups.conf (configuración del servidor de impresión), otroquenomeacuerdo y el archivo de configuración del Apache. Sobreescribí los dos primeros (ya que con apache trabajo[2], no quería que la actualización me lo desconfigurara), y reinicié.

Al reiniciar, todo anduvo bárbaro. ¡Presto!

Problemas (?):
El único "problema" que supongo que tengo es que la performance de mi placa de video Intel cayó mucho, más que nada al renderizar los efectos de Compiz; me alegra saber que no soy el único y que este bug ya estaba creado. Por las dudas, y porque mi Wi-Fi Intel 4965 aparece con algunos problemas conocidos en las Release Notes (aunque yo no tuve ninguno), instalé el paquete linux-backports-modules-intrepid y anda mejor (aunque no tan fluído como con Hardy). Espero que con el correr de los días estos problemas se vayan resolviendo a través de actualizaciones.

Conclusión:
Salvo el detalle anterior, el SO sigue siendo tan sólido como con Hardy, no tuve ningún problema real, digamos... aunque para ser sinceros, salvo la actualización del núcleo, Gnome y el Network Manager (entre otras cositas como PulseAudio nuevo), no hay muchas cosas nuevas. No hay Python 2.6 ni Openoffice 3.0 por ejemplo, así que todo es casi tan estable como lo fue con Hardy.

Bueno, es todo, espero que tengan una dulce migración. :-)

Saludos
Marcelo

[1] Y está bien para mí, hay que considerar que todo el mundo está comiéndose el ancho de banda de los repositorios... además, tanto el sitio como los repositorios no colapsaron (a diferencia de Hardy, por ejemplo), lo cual es bueno.

[2] De todas maneras, el programa de actualización te deja el archivo de configuración viejo o nuevo (depende si lo sobreescribo o no) en la ubicación destino pero renombrado en su extensión a "dpkg-old" o ".dpkg-dist", respectivamente . Es decir, pueden plantearse dos casos: si sobreescribo el archivo /etc/cups.conf con uno actualizado, el original queda como /etc/cups.conf.dpkg-old. Caso contrario, si le digo que no me sobreescriba mi /etc/apache2/apache2.conf, me queda un /etc/apache2/apache2.conf.dpkg-dist por si quiero ver más tarde qué diferencias había con el mío.

viernes, 24 de octubre de 2008

Nvidia CUDA

Estoy leyendo un artículo de la última Linux Journal, referido a la tecnología CUDA, que sacó hace un tiempito nomás NVidia. Básicamente se trata de una plataforma de software (compilador + libs + soporte en hardware) para que cualquier programador pueda acceder al enorme poder de cálculo que tienen las tarjetas gráficas actuales, que es mucho mayor que las CPUs que se utilizan todos los días; se comenta que la mejora de performance es de ¡uno a dos órdenes de magnitud como regla general!

Ya hace un tiempo vengo leyendo que están utilizando CUDA para romper WPA/WPA2, comprimir videos, procesamiento paralelo, y hasta acelerar las operaciones de cálculo de un RAID[1]. ¡Me parece bárbaro!, al fin una nueva "cosa" con la cual jugar, usar y aprender.

En primera instancia creo que la vuelta de la tecnología del viejo y querido "coprocesador matemático" viene muy bien, más cuando la arquitectura x86/x86_64 no deja muchas opciones más al momento de escalar; me parece que es un gran mérito de Nvidia poner esta idea primero (masivamente) en el mercado, y como se ve lo viene explotando a pleno (prensa, fama y fortuna, je).

Si no vieron de qué se trata, péguense una vuelta por el sitio/showroom virtual de CUDA, que está buenísimo. En cuanto a lo técnico, resumo:

  • No es software libre, pero sí es gratuito (free as in beer, not as in speech).
  • Ya está disponible para Linux (sólo x86/x86_64) y Windows. Mac está en camino (ahora en forma de beta descargable).
  • Si bien es ideal para usarlo desde C y C++, ya hay bindings para usarlo desde Matlab y ¡Python! :-D
  • Si bien es recomendable usar una tarjeta gráfica soportada (Nvidia 8000 o mayor), puede utilizarse en forma emulada.
  • Compatibiliad binaria: una vez que genero un programa CUDA, funciona en cualquier tarjeta soportada por la plataforma.
  • Ojo, no es "transparente" al programador, ni "mágico". Hay que leer la documentación, entender cómo funciona la arquitectura y escribir desde cero.
Y qué hace la competencia? Los próximos pasos de AMD/ATI parecen ser el desarrollo de Fusion, que es un approach mucho más general, al igual de Intel, que está por sacar Nehalem.

Ambos parecen tener la idea de empezar a fabricar CPUs con varios cores especializados, al estilo del pionero Cell, pero manteniendo la milenaria y vetusta arquitectura x86. Lo bueno es que esta solución, aunque más compleja, me atrevo a decir que será más efectiva ya que no tendrá el cuello de botella del puerto PCI-Express; aunque parece que falta mucho para ver algo concreto, y es atendible que CUDA tenga como objetivo "sólo multiprocesamiento masivo". El tiempo dirá cómo evoluciona la cosa.

Y bueno... hago público mi bajón de no tener una Nvidia serie 8000 y hacer pruebas. :-(

Saludos
Marcelo

[1] Puede ser aplicado, por ejemplo, al módulo md de Linux, el que permite que hagamos RAID por software.

jueves, 23 de octubre de 2008

Tip para vagos (como yo) al usar SSH

Tip estilo "cortita y al pie".

Para el que tiene varios equipos remotos a los que entra usualmente por SSH pero bajo diferentes usuarios al del host propio, termina siendo un garrón tener que escribir diferentes usuarios, y un montón de veces, "ssh usuariopepe@mihost".

Pero con sólo crear un archivo .ssh/config parecido a este:

marcelo@marcelo-laptop:~$ cat .ssh/config
Host *.dominio.com.ar *.dominio server1 server2 server3
User mfernandez

Host desarrollo.dominio.com.ar desarrollo.dominio desarrollo
User usuario1

Host vm1 vm2
User prueba
A partir de ahora sólo hay que escribir "ssh vm1" para entrar!!!

Más info en "man ssh_config". :-)

Saludos
Marcelo

martes, 21 de octubre de 2008

Cómo Conectarse a Oracle desde Python en Ubuntu

Luego de luchar (y bastante) para acceder a una BD Oracle desde Python, me propuse escribir los pasos a realizar así quedan para la posteridad. Tengo entendido que el único driver que funciona bien para conectarse es el cx_Oracle, así que voy a tratar de explicar cómo se instala todo desde el comienzo, usando Ubuntu Hardy 8.04.

1. Instalación del Oracle InstantClient
Primero, hay que descargar el Oracle InstantClient para la plataforma Linux que se utilice (x86, x86_64, Power, Itanium, etc.) desde acá (es necesario registrarse, pero es gratuito). Los paquetes necesarios son "Instant Client Package - Basic Lite" y "Instant Client Package - SDK". cx_Oracle debería funcionar con cualquiera de las versiones 9.x y 10.x, así que vamos a bajar la última versión de la serie 10.x (que en este momento es la 10.2.0.4).

Primero hay que descomprimir los 2 archivos .zip; por ejemplo:

marcelo@ubuntu-server:~$ unzip basiclite-10.2.0.4.0-linux-x86_64.zip
Archive: basiclite-10.2.0.4.0-linux-x86_64.zip
inflating: instantclient_10_2/BASIC_LITE_README
[...]
inflating: instantclient_10_2/libocijdbc10.so
inflating: instantclient_10_2/ojdbc14.jar
marcelo@ubuntu-server:~$ unzip sdk-10.2.0.4.0-linux-x86_64.zip
Archive: sdk-10.2.0.4.0-linux-x86_64.zip
creating: instantclient_10_2/sdk/
creating: instantclient_10_2/sdk/include/
inflating: instantclient_10_2/sdk/include/occi.h
inflating: instantclient_10_2/sdk/include/occiCommon.h
[...]
inflating: instantclient_10_2/sdk/SDK_README
extracting: instantclient_10_2/sdk/ottclasses.zip
inflating: instantclient_10_2/sdk/ott
marcelo@ubuntu-server:~$
Al descomprimir ambos archivos en el mismo directorio se generó el nuevo directorio "instantclient_10_2" con todo el contenido:
marcelo@ubuntu-server:~$ cd instantclient_10_2/
marcelo@ubuntu-server:~/instantclient_10_2$ ls -l
total 33504
-rw-rw-r-- 1 marcelo marcelo 238 2008-03-12 04:37 BASIC_LITE_README
-r--r--r-- 1 marcelo marcelo 1609607 2008-03-12 04:37 classes12.jar
-rwxrwxr-x 1 marcelo marcelo 67542 2008-03-12 04:37 genezi
-rwxrwxr-x 1 marcelo marcelo 21038613 2008-03-12 04:37 libclntsh.so.10.1
-r-xr-xr-x 1 marcelo marcelo 3796601 2008-03-12 04:37 libnnz10.so
-rwxrwxr-x 1 marcelo marcelo 1664116 2008-03-12 04:37 libocci.so.10.1
-rwxrwxr-x 1 marcelo marcelo 4351321 2008-03-12 04:37 libociicus.so
-r-xr-xr-x 1 marcelo marcelo 138033 2008-03-12 04:37 libocijdbc10.so
-r--r--r-- 1 marcelo marcelo 1555682 2008-03-12 04:37 ojdbc14.jar
drwxrwxr-x 4 marcelo marcelo 4096 2008-03-12 04:37 sdk
marcelo@ubuntu-server:~/instantclient_10_2$
Creamos el directorio /opt/oracle, y después lo movemos al nuevo directorio renombrado como /opt/oracle/instantclient.
marcelo@ubuntu-server:~$ sudo mkdir -p /opt/oracle/
marcelo@ubuntu-server:~$ sudo mv instantclient_10_2 /opt/oracle/instantclient
Ahora debemos decirle al linker de bibliotecas dinámicas del sistema (ld) la ubicación de un nuevo path donde podrá encontrar más bibliotecas software para el programa que lo requiera; en este caso ese "programa" será el módulo de python para acceder a Oracle, cx_Oracle. Es decir, que además de las bibliotecas disponibles en, por ejemplo, /usr/lib y /usr/local/lib, también pondremos a disposición de los programas del usuario las bibliotecas del directorio /opt/oracle/instantclient. Esto se hace con el programa ldconfig:
marcelo@ubuntu-server:~$ sudo -i
[sudo] password for marcelo:
root@ubuntu-server:~# echo "/opt/oracle/instantclient" > /etc/ld.so.conf.d/oracle.conf
root@ubuntu-server:~# ldconfig
root@ubuntu-server:~# ldconfig --print | grep /opt/oracle
libocijdbc10.so (libc6,x86-64) => /opt/oracle/instantclient/libocijdbc10.so
libociicus.so (libc6,x86-64) => /opt/oracle/instantclient/libociicus.so
libocci.so.10.1 (libc6,x86-64) => /opt/oracle/instantclient/libocci.so.10.1
libnnz10.so (libc6,x86-64) => /opt/oracle/instantclient/libnnz10.so
libclntsh.so.10.1 (libc6,x86-64) => /opt/oracle/instantclient/libclntsh.so.10.1
root@ubuntu-server:~# cd /opt/oracle/instantclient
root@ubuntu-server:/opt/oracle/instantclient# ln -s libclntsh.so.10.1 libclntsh.so
root@ubuntu-server:/opt/oracle/instantclient# ln -s libocci.so.10.1 libocci.so
La idea es crear un archivo con extensión .conf en el directorio /etc/ld.so.conf.d/ [1], con un nombre relacionado con nuestro propósito, que sólo indica un nuevo directorio de bibliotecas de ubicación "no estándar".

Luego hay que refrescar la información de bibliotecas, con el comando "ldconfig". Después, "ldconfig --print" muestra todas las bibliotecas disponibles en el sistema para enlazar dinámicamente, pero como ahora sólo son de nuestro interés las del directorio /opt/oracle, se filtra la salida con un grep acorde.

También hacemos dos enlaces simbólicos a las bibliotecas principales del Instantclient, cuyo número de versión es "genérico", a diferencia de los archivos originales, cuya versión es 10.1. Al momento de compilar el cx_Oracle, éste buscará la versión genérica de estas librerías, no una versión específica (por ende, serán los archivos libclntsh.so y libocci.so). Todo esto debe hacerse como root, por eso el "sudo -i" inicial.

2. Instalación del cx_Oracle
(instrucciones extraídas en parte y basadas del Readme.txt del proyecto)

Una vez que se tiene el Instantclient instalado y configurado, vamos a proceder a instalar el módulo cx_Oracle. Lo "complicado" de la instalación del módulo (a diferencia de la gran mayoría que son 100% python) es que requiere correr un proceso de compilación contra las bibliotecas Instantclient que acabamos de instalar. Lo bueno es que a esta altura ya hicimos casi todo el trabajo. :-)

Primero instalamos algunas dependencias:
marcelo@ubuntu-server:~$ sudo apt-get install python-dev python-setuptools build-essential
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias
Leyendo la información de estado... Hecho
Se instalarán los siguientes paquetes extras:
binutils dpkg-dev g++ g++-4.2 gcc gcc-4.2 libc6-dev libgomp1 libstdc++6-4.2-dev libtimedate-perl linux-libc-dev make patch python-pkg-resources python2.5-dev
Paquetes sugeridos:
binutils-doc debian-keyring g++-multilib g++-4.2-multilib gcc-4.2-doc libstdc++6-4.2-dbg autoconf automake1.9 bison flex gcc-doc gcc-multilib gdb libtool manpages-dev
gcc-4.2-locales gcc-4.2-multilib libgcc1-dbg libgomp1-dbg libmudflap0-4.2-dbg libmudflap0-4.2-dev glibc-doc libstdc++6-4.2-doc make-doc diff-doc
Se instalarán los siguientes paquetes NUEVOS:
binutils build-essential dpkg-dev g++ g++-4.2 gcc gcc-4.2 libc6-dev libgomp1 libstdc++6-4.2-dev libtimedate-perl linux-libc-dev make patch python-dev python-pkg-resources
python-setuptools python2.5-dev
0 actualizados, 18 se instalarán, 0 para eliminar y 0 no actualizados.
Necesito descargar 12,8MB de archivos.
After this operation, 52,9MB of additional disk space will be used.
¿Desea continuar [S/n]?
[...]
Cuando se compilan módulos de python que acceden a librerías nativas (generalmente en C), debe instalarse el paquete "python-dev", que contiene los headers de las estructuras, funciones y demás símbolos del lenguaje. Las setuptools creo que no hacen falta, pero siempre es útil tenerlo para instalar más módulos después. El metapaquete "build-essential" nos provee todo lo básico necesario para compilar programas en C/C++.

Luego descargamos y descomprimimos el código fuente del módulo, en formato .tar.gz (hay RPMs y paquetes para Windows, pero no DEBs). La última versión es la 4.3.1. La descompresión puede ser en un directorio cualquiera, como por ejemplo, el home de un usuario (no es necesario root):
marcelo@ubuntu-server:~$ tar xvzf cx_Oracle-4.3.1.tar.gz
cx_Oracle-4.3.1/
cx_Oracle-4.3.1/test/
cx_Oracle-4.3.1/test/test_dbapi20.py
cx_Oracle-4.3.1/test/LongVar.py
cx_Oracle-4.3.1/test/LobVar.py
cx_Oracle-4.3.1/test/DateTimeVar.py
cx_Oracle-4.3.1/test/test.py
cx_Oracle-4.3.1/test/NumberVar.py
[...]
marcelo@ubuntu-server:~$ cd cx_Oracle-4.3.1/
marcelo@ubuntu-server:~/cx_Oracle-4.3.1$
Luego, para poder compilar/construir primero e instalar después el módulo, hay que establecer la variable de entorno ORACLE_HOME:
marcelo@ubuntu-server:~/cx_Oracle-4.3.1$ export ORACLE_HOME=/opt/oracle/instantclient/
Ahora, a construir el módulo. Puede verse que no hace falta ser root:
marcelo@ubuntu-server:~/cx_Oracle-4.3.1$ python setup.py build
running build
running build_ext
building 'cx_Oracle' extension
gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions build/temp.linux-x86_64-2.5/cx_Oracle.o -L/opt/oracle/instantclient/lib -L/opt/oracle/instantclient/ -lclntsh -o build/lib.linux-x86_64-2.5/cx_Oracle.so
marcelo@ubuntu-server:~/cx_Oracle-4.3.1$
Listo, ya podemos instalar y probar el nuevo módulo:
marcelo@ubuntu-server:~/cx_Oracle-4.3.1$ sudo python setup.py install
running install
running build
running build_ext
running install_lib
copying build/lib.linux-x86_64-2.5/cx_Oracle.so -> /usr/lib/python2.5/site-packages
running install_egg_info
Writing /usr/lib/python2.5/site-packages/cx_Oracle-4.3.1.egg-info
marcelo@ubuntu-server:~/cx_Oracle-4.3.1$ ipython
Python 2.5.2 (r252:60911, Jul 31 2008, 17:31:22)
Type "copyright", "credits" or "license" for more information.

IPython 0.8.1 -- An enhanced Interactive Python.
? -> Introduction to IPython's features.
%magic -> Information about IPython's 'magic' % functions.
help -> Python's own help system.
object? -> Details about 'object'. ?object also works, ?? prints more.

In [1]: import cx_Oracle

In [2]: conn_str='scott/tiger@192.168.1.90:1521/DESARROLLO'

In [3]: db_conn = cx_Oracle.connect(conn_str)

In [4]: cursor = db_conn.cursor()

In [5]: cursor.execute('SELECT username, user_id, created FROM dba_users')
Out[5]:
[<cx_Oracle.STRING with value None>,
<cx_Oracle.NUMBER with value None>,
<cx_Oracle.DATETIME with value None>]

In [6]: registros = cursor.fetchall()

In [7]: for r in registros:
...: print str(r)
...:
...:
('MGMT_VIEW', 46, datetime.datetime(2008, 10, 15, 13, 4, 47))
('SYS', 0, datetime.datetime(2008, 10, 15, 12, 43, 8))
('SYSTEM', 5, datetime.datetime(2008, 10, 15, 12, 43, 8))
('DBSNMP', 24, datetime.datetime(2008, 10, 15, 12, 51, 3))
('SYSMAN', 44, datetime.datetime(2008, 10, 15, 13, 3, 24))
('SCOTT', 49, datetime.datetime(2008, 10, 21, 17, 30, 43))
('PYTK08', 47, datetime.datetime(2008, 10, 15, 13, 54, 37))
('OUTLN', 11, datetime.datetime(2008, 10, 15, 12, 43, 13))
('MDSYS', 43, datetime.datetime(2008, 10, 15, 12, 57, 21))
('ORDSYS', 40, datetime.datetime(2008, 10, 15, 12, 57, 21))
('ANONYMOUS', 36, datetime.datetime(2008, 10, 15, 12, 55, 58))
('EXFSYS', 34, datetime.datetime(2008, 10, 15, 12, 55, 41))
('WMSYS', 25, datetime.datetime(2008, 10, 15, 12, 51, 55))
('XDB', 35, datetime.datetime(2008, 10, 15, 12, 55, 58))
('ORDPLUGINS', 41, datetime.datetime(2008, 10, 15, 12, 57, 21))
('SI_INFORMTN_SCHEMA', 42, datetime.datetime(2008, 10, 15, 12, 57, 21))
('DIP', 19, datetime.datetime(2008, 10, 15, 12, 46))
('TSMSYS', 21, datetime.datetime(2008, 10, 15, 12, 49, 19))

In [8]:
Listo! Ya tenemos acceso a Oracle desde mi lenguaje de programación preferido, Python.

Espero que les sirva.

Saludos!
Marcelo

[1] Esto es así en Ubuntu Hardy 8.04. En versiones más antiguas de Ubuntu, como Dapper 6.06, este directorio no existe y en su lugar se debe agregar una línea con el mismo contenido pero en el archivo /etc/ld.so.conf (creándolo en caso de no existir).