25 junio 2013

Como localizar un recurso dentro de un jar

Supongamos que necesitamos localizar un fichero dentro de un jar de Java, como por ejemplo un fichero de configuración XML. Si programamos con Eclipse, situamos los ficheros de recursos dentro de src/main/resources y/o src/test/resources, en el caso en que estemos haciendo tests de métodos de nuestra aplicación. Posteriormente, una vez que tenemos creada la aplicación, podemos empaquetarla en un fichero .jar para distribuirla. En Eclipse, podemos utilizar la opción "Export...">"Java">"Runnable JAR file"

La pregunta es: cómo puedo cargar un fichero de configuración que hemos guardado en dicho JAR?

La respuesta me ha costado encontrarla y de ahí esta entrada en el blog. Cuando tenemos un fichero "configuracion.xml" en la ruta src/main/resources/configuracion.xml, al empaquetarlo en un jar, Eclipse lo coloca en la carpeta resources, que cuelga de la raíz del jar. Es decir, que para recuperar el fichero de configuración, hemos de hacer lo siguiente:

InputStream is = this.getClass().getResourceAsStream("/resources/configuracion.xml");

Con ésto tenemos ya el fichero en un InputStream y ya podemos tratarlo.

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!

29 agosto 2011

Maven 2 y Maven 3 en la misma máquina?

Hoy me he encontrado con una situación con Eclipse Helios y Eclipse Indigo, Maven 2 y Maven 3. Tengo en una máquina Windows una instalación de Helios, con Maven 2 (2.0.9). Estoy en vías de migrar a Índigo con Maven 3 (3.0.3). En la configuración, se pide que una de las variables de entorno apunte al directorio donde está instalado Maven3. Hecho.

Pero... al intentar ejecutar en Helios un despliegue con Maven2, éste se queja amargamente con un error del tipo:

java.lang.NoClassDefFoundError: org/codehaus/classworlds/Launcher

Buscando por Google he encontrado esta entrada que apunta a una posible solución http://cyntech.wordpress.com/2011/03/09/maven-2-error. Efectivamente ha sido cerrar Helios, modificar la variable de entorno de Maven, volver a abrir Helios y el despliegue funciona perfectamente.

Ahora a buscar algo que me permita fácilmente cambiar el valor de la variable de entorno, y si puede ser desde Eclipse, mejor.

03 diciembre 2010

Recorridos Octubre y Noviembre


De vez en cuando me gusta cargar todos los recorridos que voy haciendo en Google Earth y ver cómo quedan. Esto me hace pensar que si hago siempre el mismo recorrido quedaría un poco monótono, mientras que ir variando me hace ir cambiando de ritmo, de paisaje, y al final queda una cosa hasta chula.
Posted by Picasa

12 octubre 2010

Bucarest

Este puente del Pilar hemos disfrutado de un viaje a Bucarest.

Ciudad con grandes avenidas

La idea que me llevo de la ciudad es que se hizo en unos años buenos, económicamente hablando, y después se dejó de mantener. Eso hace que el aspecto de la misma sea deplorable. Eso sí, unos cuantos miles de millones de euros para rehabilitar la ciudad, y se conseguirían muchos puestos de trabajo en la reconstrucción, y después de reconvertir esos reconstructores en gente dedicada al turismo, se podría disponer de un nuevo centro turístico en toda regla. No en vano dicen que es el París del Este.

Algo que llama la atención al que llega son los perros sueltos. Es chocante. En otros sitios eso no pasa. Algún servicio municipal, los recoge y los aparta de la circulación, pues pueden ser un foco de enfermedades, y en caso extremo de falta de alimentos, pueden ser un peligro para la gente. Aquí supongo que no hay ese servicio, y campan por la ciudad a sus anchas. No es que haya muchos, pero haberlos haylos. Algún control ha de haber sobre ellos, pues hay algunos que llevan en la oreja una etiqueta plástica amarilla.

Otra cosa que llama la atención, al menos saliendo de BCN: no hay inmigrantes. Supongo que es una perogrullada, pero después de estar el año pasado en Berlín y en Londres, donde hay de todo menos alemanes e ingleses, llama la atención que no haya, por ejemplo, chinos. Ni restaurantes, ni bazares, ni nada relacionado. No hay. Ni pakistaníes. Ni negros subsaharianos. Ni sudamericanos. Los pueblos que hemos tenido que emigrar, y hay que recordar el éxodo de españoles a Europa en los años sesenta del pasado siglo, hemos ido a sitios donde había riqueza y trabajo. Aquí se nota que no hay dinero, o si lo hay, que seguro que alguno o alguna acumula, éste no se mueve con la suficiente velocidad.
Lo viejo y lo nuevo

Más cositas, al menos en la zona que hemos recorrido, no hemos visto supermercados al estilo español, ni tampoco tiendas de comestibles. Bares, restaurantes, etc. si. Pero si quieres entrar en un sitio a por un agua, ha de ser un bar. Diferencias. Aquí, aún no ha llegado el consumismo. Al menos a lo bestia.
Precios. Son similares a los españoles. La comida, quizá un poco más barata. La gasolina, tanto o más cara que en España. El transporte un poco más barato. Lo cierto es que nos hemos movido en taxi, y salvo la noche de llegada, que nos clavaron 200 RON, al cambio unos 50EUR, por un viaje desde el aeropuerto hasta el palacio del parlamento, el resto ha sido a muy buen precio. Desde el hotel al centro aprox. 5 RON (poco más de 1 EUR). Eso sí, por la noche se confunden y multiplican por mucho la tarifa. Mucho.

La sensación que tengo es que es una ciudad más que menos segura. No como BCN para los “guiris”, que es una ciudad en que hay zonas que impera la ley del más listo. Aquí puedes pasear por la zona del barrio de Lipscani, que es el centro de la ciudad y que no está iluminado en exceso, y no sientes que te vayan a atracar. La gente pasea tranquila. Eso sí, mejoraría la sensación de seguridad el hecho de aumentar (doblar o triplicar, como mínimo) la cantidad de farolas.

Sobre los cables. Esto ya es una deformación profesional, pero yo me fijo en los cables en las ciudades. Si los veo destartalados me da la sensación de desorden, de caos. Aquí están así. Las cabinas de teléfono de algunas compañías están como colladas a la pared y de ellas sale un cable, mondo y lirondo, y se conecta a una caja terminal, sin protección alguna. Ni un triste tubo que salve al cable de las inclemencias meteorológicas, ni de los gamberros borrachos. De los segundos, debe ser que no hay; de las primeras, seguro que sí. Algunas de las fotos dan la sensación de ese caos, de esa falta de mantenimiento que sufre casi toda la ciudad.

Y sobre el mantenimiento de los edificios se da el caso de que hay algunos que sí, que lo hay, y los ves lozanos, limpios, inmaculados, al lado de otros que en otro lugar estarían cerrados por peligrosos. En una esquina nos encontramos el yin y el yang. Uno era la biblioteca nacional, o quizá provincial, vamos pero una biblioteca importante. El edificio mugriento a un paso de estar apuntalado. El otro el edificio del Banco Nacional de Rumanía, impoluto. ¿Dónde está el dinero?

Sobre el idioma. Evidentemente no hemos recibido un curso acelerado de rumano, y eso que la lengua no es complicada, así que hemos tirado de nuestro más o menos limitado inglés. Y esto es una grata sorpresa: los camarer@s y la gente que atiende en tiendas lo entiende, y lo habla, y muy bien. Al menos es la experiencia que hemos tenido. Igualito que en España, donde estos ojitos han visto atender a extranjeros a gritos, como si gritando lo suficiente se fuera a traducir aquello que se le quiere decir al “guiri”.

Agujeros por doquier en las calles
Capítulo aparte merece el aeropuerto de Baneasa. Bucarest es la capital de Rumanía, país que está dentro de la UE. Entiendes que es la puerta de entrada de muchos de los turistas extranjeros es el aeropuerto, y que éste debe dar una buena imagen del país. Bien pues eso no es del todo así en el de Baneasa. Será porque éste es el segundo aeropuerto y el primero (no recuerdo el nombre) sea la caña de Rumanía, pero éste es cutre.

La palabra es la correcta.

El día de llegada, entre que eran las 12 de la noche, las ganas de coger un taxi, que nos llevasen al hotel y ponernos a dormir, no nos percatamos de la magnitud de la tragedia. Las cintas de las maletas eran minúsculas y no cabían muchas. En la tercera oleada de maletas llegó la nuestra sana y salva. Al salir había un gentío enorme, como para recibir una decena de aviones, aunque por la hora dudo que ese fuera el caso. Chocante.

A la vuelta te das cuenta de cómo es. Es pequeño, viejo (que no antiguo) y descuidado. Las salas de espera (tiene dos) son muy limitadas y mucho del personal ha de esperar de pie. No creo que tenga asientos para los pasajeros de un vuelo, por lo que tienes que buscar una postura cómoda de espera. En nuestro caso había tres vuelos con pocos minutos de diferencia. Todos los pasajeros estábamos allí. El aire funcionaba, a Dios gracias, pues de lo contrario aquello sería un infierno. Cerca de 700 pares de pulmones expulsando CO2 a razón de muchos litros por minuto. Impresionante. Alguna foto tengo, pues aunque estaba prohibido, el espectáculo merecía ser recordado. Al final un sujeto de seguridad ha cumplido su labor y me ha amonestado, merecidamente, por mi incumplimiento.

Todo reducidito, chiquitín. Y si a eso le añades que falta un poco de limpieza, pues la sensación es que es un aeropuerto cutre. Si estuviera limpio y lustroso dirías que es simplemente pequeño. No es así.
Lo bueno del aeropuerto, que está cerca de la ciudad, y por cerca entiendo que no es para ir andando, pero casi, y eso es una ventaja.


Restaurante Caru cu Bere
La comida. Con cinco sentadas en la mesa, y dos obligadas en el Pizza Hut, pues Sara también opina, no se puede hacer uno una idea de cómo es la comida rumana. Ahora, lo que probamos estaba muy bueno. El restaurante al que fuimos se llama Caru cu Bere, y está de lujo. Buena comida, buen servicio y buen precio.






Sara disfrutando de la comida

En el barrio de Lipscani


En resumen, un viaje que merece la pena, como todos pues en los buenos y en los malos siempre se aprende algo, siempre descubres una vista diferente y te das cuenta de que no todo es como te lo muestran en la tele o como te cuentan los que han viajado primero. Y siempre hay algo en lo que fijarnos para mejorar. Su inglés por ejemplo es algo que en España es poco usual en los servicios. Y una de las cosas por lo que es bueno es porque las películas no las doblan, sólo las subtitulan. Y la necesidad hace que espabiles.