08 agosto 2012

MySQLdb y Python en Mac OSX Lion

Estos días estoy aprendiendo algo de Python. El porqué? Es un poco complejo, pero el inicio de todo es que el entorno de desarrollo que me veo obligado a utilizar es una máquina virtual Windows XP, dentro de una máquina Windows XP (no entraré en bucle...) con sólo 3Gb de RAM. Esto implica que mi MV sólo dispone de 1.7Gb, y si dentro tengo que trabajar con Eclipse Indigo, que le gusta la memoria más que a mi el chocolate, pues... tenemos una situación.

He intentado pasar parte del código a PHP, y durante una semanita he estado dándole vueltas, hasta que he descubierto que PHP también consume memoria en cantidades industriales, y que para tratar un fichero de texto de 10Mb, y meterlo en un Excel con una librería el problema de la memoria se disparaba.

Así que vamos a probar con Python. Es sencillo de aprender. No me acaba de gustar que no sea un lenguaje muy tipado, eso de que puedas meter cualquier cosa en una caja, sin decir, qué forma ha de tener la caja, no me acaba de cuadrar. Pero está muy bien. También he aprovechado para programar en Mac con el Vi. Me siento casi como un informático...!

Cuando después de un par o tres de días, mi proceso ya "parsea" convenientemente el fichero, llega el momento de guardar los datos de manera persistente. Y entran entonces en juego tres opciones: Excel, que será el producto final; MySQL, que es como lo tengo actualmente implementado en la versión Java; y MongoDB, que es algo nuevo para mi y al cual le veo grandes posibilidades.

Con el MySQL es con el que he tenido más problemas a la hora de instalarlo. He localizado al final cómo hacerlo:

Primero, instalo la librería con easy_install:

sudo easy_install MySQL-python

Pruebo que todo esté bien:


MacBookPro-de-JoseLuis:Downloads jherranzm$ python 
Python 2.7.2 (v2.7.2:8527427914a2, Jun 11 2011, 15:22:34) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import MySQLdb
Traceback (most recent call last):
  File "", line 1, in
  File "build/bdist.macosx-10.7-intel/egg/MySQLdb/__init__.py", line 19, in
  File "build/bdist.macosx-10.7-intel/egg/_mysql.py", line 7, in
  File "build/bdist.macosx-10.7-intel/egg/_mysql.py", line 6, in __bootstrap__
ImportError: dlopen(/Users/jherranzm/.python-eggs/MySQL_python-1.2.3-py2.7-macosx-10.7-intel.egg-tmp/_mysql.so, 2): Library not loaded: libmysqlclient.18.dylib
  Referenced from: /Users/jherranzm/.python-eggs/MySQL_python-1.2.3-py2.7-macosx-10.7-intel.egg-tmp/_mysql.so
  Reason: image not found



Para encontrar dónde está realmente la librería que falla utilizo el comando locate:

locate libmysqlclient.18.dylib

El sistema espera encontrar la librería en /usr/lib. Para solucionarlo hay que crear un enlace simbólico de la librería que queremos a la posición donde se ubicará el enlace:

sudo ln -s /usr/local/mysql-5.5.23-osx10.6-x86_64/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib 

Con estes cambio, vuelvo a probar, y voilà, funciona (ya no da el error) :


MacBookPro-de-JoseLuis:Downloads jherranzm$ python Python 2.7.2 (v2.7.2:8527427914a2, Jun 11 2011, 15:22:34) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import MySQLdb
>>> quit()

Ahora me toca seguir con el programa...

01 julio 2012

Cursa Vall-Mar

Hace unos días, mi compañero José Luis, me envía un correo con un enlace de una cursa (carrera) de montaña: Cursa Vall-Mar. La carrera en sí, es una travesía desde Granollers a Mataró atravesando la Serralada Litoral. Miro el mapa y digo, esto tiene que ser chulo! Además es la primera vez que se hacía una cursa como ésta, así que tenía un aliciente añadido. Nos apuntamos los dos.

La salida era a las 8h de la mañana, y allí había 250 valientes, dispuestos a llegar hasta el mar. El nivel era importante. Nada que ver con las cursas populares a las que estoy habituado. Allí había gente preparada.

Vamos a ver qué tal. Con mi compañero decidimos que cada uno vaya a su ritmo. Es lo correcto.

La cursa se inicia rápida y más o menos plana hasta que cruza la autopista y se mete en el bosque y empieza a subir, y subir. Hay momentos en los que tienes que caminar, aún así la gente va rápida. Se llega al km.11 que es el punto más alto, donde hay un avituallamiento líquido. No me acuerdo si es el segundo o tercero. La organización, por cierto, está de lujo, el camino bien señalizado, y varios avituallamientos y gente que te ayuda en pasos complicados.

Desde la cima, bajada a Orrius a tumba abierta. 4Km (aprox.) a un ritmo impresionante. Ha sido uno de esos momentos sublimes.

Luego vuelta a subir durante un par de kilómetros, y desde allí hasta el km.21 bajada con algún repechón en medio. El camino pasa por en medio de un bosque con pinaza en el suelo, y hay que hacer slalom con los árboles. Otro de esos momentos grandes.

Por fin llegamos a la riera, y allí nos encontramos que el camino es de... arena de playa! Cómo se sufre! No hay manera de avanzar como acostumbras, y no estoy habituado a pisar en suelo blando que absorve la fuerza, y no me la devuelve con igual magnitud y sentido contrario. En fin, que la arena de la playa la tercera ley de Newton se la pasa por...

Cuando estamos a punto de llegar al agua, giro de 90º y nos metemos en zona urbana, y de ahí al paseo marítimo. Y voilà, fin de la carrera. Camiseta, bolsa con regalos, bocata, bebida y a descansar!

El año que viene más y mejor, y al revés, ya que la organización tiene previsto hacerla desde Mataró a Granollers. Las subidas serán espectaculares, todo lo que lo han sido las bajadas esta vez!

Salut i kms!

Dejo el recorrido de la misma, por si alguien está interesado: Recorrido Cursa Vall-Mar 2012


02 abril 2012

Extraer un objeto Connexion de un EntityManager

Llevo tiempo intentando pasar toda la parte de persistencia a JPA. Además de tener que reescribir código, me encuentro con problemas. Por ejemplo, tengo código que funciona con CachedRowSet, en el cual paso una consulta a la base de datos, y el resultado se almacena en un CachedRowSet, y éste se vuelca en una pestaña de un libro de Excel.

Para poder utilizar JPA, hay que sacar la conexión de un objeto EntityManager. Tenemos nuestro objeto EntityManager, y de él se puede extraer la conexión, siempre que esté dentro de una transacción!

Por ejemplo:

String sql = "la consulta SQL";
EntityManager em = emf.createEntityManager();
//Iniciamos la transacción
em.getTransaction().begin();
//Obtenemos el objeto conexión..
Connection con = em.unwrap(java.sql.Connection.class); 
// Creamos el CachedRowSet
CachedRowSet ret = CachedRowSetFactory.getCachedRowSet();
// informamos de la consulta a ejecutar
ret.setCommand(sql);
// ejecutamos la consulta y tenemos el resultado en el CachedRowSet
ret.execute(con);
// Cerramos la transacción...
em.getTransaction().commit();

Este tipo de solución viene bien cuando hemos de hacer consultas sobre una base de datos, y el resultado no lo podemos asociar a una entidad de nuestro modelo.

Espero que a alguien le sea de utilidad!