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.

07 septiembre 2010

Tomcat: errores en el despliegue

Se me ha dado el caso de desplegar una aplicación en Tomcat, hacer las pruebas correspondientes y replegarla. En el proceso hay veces que se quedan librerías .jar sin borrar. Normalmente las librerías están en el directorio WEB-INF/lib. Hasta ahora lo habitual era que se me quedasen en dicho directorio el mail-x.y.z.jar o el mysql-connector-java-x.y.z-bin.jar. No encontraba el motivo. El problema es que al re-desplegar la aplicación, por ejemplo desde Eclipse, no daba error, pero al ir al administrador de archivos, allí estaba todavía la versión antigua, y la nueva no se había desplegado.

Despúes de buscar durante tiempo, no debo ser lo suficientemente hábil, he conseguido entender que las librerías sólo deben estar en un sitio:
  • common/lib, o
  • webapps/[application]/WEB-INF/lib
Así que una vez localizada la duplicidad, hay que eliminarla. En mi caso particular, es necesario dejar las dos librerías en common/lib, ya que utilizo un pool de conexiones y en la configuración pide que esté en dicho directorio, y la librería mail-x.y.z.jar, por alguna razón similar y de la cual no me acuerdo (pero funciona!).

Utilizo Maven dentro de Eclipse desde hace un tiempo, por lo que para corregir la incidencia, me voy al fichero pom.xml y en las dependency que no quiero que se dupliquen utilizo la etiqueta scope:provided para que no se incluya en el fichero war de despliegue, y se utilice el que ya está en el servidor.



...

mysql
mysql-connector-java
5.1.13
provided



javax.mail
mail
1.4.1
provided

...


Y a funcionar!



03 julio 2010

Eclipse Helios y Ant

Si queremos desplegar un war en Tomcat desde Eclipse una de las opciones es hacerlo mediante Ant. Creamos un buildfile que compile, genere el .war y despliegue éste en el Tomcat. Para ello tenemos que hacer algún que otro cambio. Por partes:

1) Tenemos instalado ANT en el directorio que queramos, llamémosle ANT_HOME.
2) Nos vamos a Eclipse, Window, Preferences, Ant, Editor, Runtime y localizamos el directorio ANT_HOME mediante el botón "Ant Home...". Sellecionamos y le damos a OK.
3) En ANT_HOME/lib colocamos la librería catalina-ant.jar. Ésta la puedes encontrar en TOMCAT_HOME/server/lib, siendo TOMCAT_HOME el directorio donde tienes instalado Tomcat. Tenemos que decirle a Eclipse que la tenga en cuenta. Para ello vamos a Eclipse, Window, Preferences, Ant, Editor, Runtime y seleccionamos en el cuadro "Ant Home Entries". Pulsamos sobre el botón "Add External JARs..." y seleccionamos la librería ANT_HOME/lib/catalina-ant.jar
4) Creamos un archivo de texto que llamaremos tomcatTasks.properties y que situaremos en ANT_HOME. El archivo contendrá las siguientes líneas:

deploy=org.apache.catalina.ant.DeployTask
install=org.apache.catalina.ant.InstallTask
list=org.apache.catalina.ant.ListTask
reload=org.apache.catalina.ant.ReloadTask
remove=org.apache.catalina.ant.RemoveTask
resources=org.apache.catalina.ant.ResourcesTask
roles=org.apache.catalina.ant.RolesTask
start=org.apache.catalina.ant.StartTask
stop=org.apache.catalina.ant.StopTask
undeploy=org.apache.catalina.ant.UndeployTask


Espero que sirva de ayuda.

Eclipse Helios y el Charset en Windows

Llegó la hora de probar el nuevo Eclipse Helios. La instalación en Windows es trivial, y sólo hay que descomprimir el ficherito de 204 MBytes y a "fluzear".

La primera prueba es importar un proyecto que gestiono desde el Eclipse Galileo, y todo parece correcto hasta que intento compilarlo. En ese momento aparece el error:

warning: unmappable character for encoding Cp1252

Vaya! El proyecto está en UTF-8, pero al importarlo, Eclipse lo pasa a su codificación por defecto que en Windows XP parece ser Cp1252. Un poco de Google nos da la solución, en concreto en:

http://colab.mpdl.mpg.de/mediawiki/CharsetEncoding#Eclipse

donde nos dan la solución para que compile sin errores de codificación de caracteres.

En Eclipse Helios vamos a
Window | Preferences | General | Workspace | Text file encoding
y ponemos como Text file encoding a UTF-8.

21 junio 2010

Clase CDATA en JDOM

Importante: para evitar errores, es recomendable utilizar en los campos que contengan texto en un documento XML la clase CDATA para incorporar texto a dichos campos. Por ejemplo:

...
Element el= new Element("noticia");

el.addContent(new Element("observaciones").addContent(new CDATA("Noticia ya publicada")));
...


quedará en el documento XML como:

<noticia>
<observaciones><![CDATA[# Noticia ya publicada]]></observaciones>
</noticia>




06 mayo 2010

Hacer un TRANSFORM con MySQL

Tenemos una tabla que contendrá las claves que queremos totalizar:

CREATE TABLE tCodApi (
CodApi VARCHAR(25) NOT NULL,
PRIMARY KEY(CodApi)
);

La llenamos con las claves que necesitamos.

INSERT INTO tCodApi
SELECT CodApi
FROM tramApis
GROUP BY CodApi;

Ahora generamos una consulta de la siguiente manera, con el select más externo, recorremos la tabla de claves, y el GROUP_CONCAT va generando una única cadena que contendrá todos los valores del grupo. El concat más externo nos facilitará la tarea de generar la cadena final.

select
concat (
"SELECT t.FechaPeticion ",
group_concat(
concat(
", SUM(IF(.tCodApi = '", api.CodApi, "', 1, 0)) as '", api.CodApi, "'"
)
order by api.CodApi
separator " "
),
" FROM TramitacionAPIS t ",
" GROUP BY FechaPeticion ",
" ORDER BY FechaPeticion DESC ",
" LIMIT 0,20; "

) as pepe
FROM tCodApi api
where api.CodApi<>"--"
order by api.CodApi;

27 abril 2010

Acceso desde Tomcat a ficheros en discos externos

Problema: Apache Tomcat en Windows, dentro de un servlet se ha de hacer una operación de lectura sobre un fichero alojado en un disco externo, llamémosle Z:. Para acceder a dicho disco hay que determinar la ruta UNC, es decir:

Z:\carpeta1\carpeta2\fichero.txt

hay que transformarlo en

\\servidor\carpetaCompartida\carpeta1\carpeta2\fichero.txt

Esto por una parte, pero otra tanto otra fundamental es que el usuario sobre el que corre el servicio Tomcat, tenga permisos de lectura/escritura sobre la carpeta compartida, es decir, tenga acceso a

\\servidor\carpetaCompartida\carpeta1\carpeta2\fichero.txt

La prueba del 9 es la siguiente: si desde un programa hecho en java, puedes acceder a dicho fichero sin problemas, pero desde dentro del servlet no, entonces estamos en el caso de problemas de permisos.

Solución: (En Windows XP) Vamos a Panel de Control, Herramientas administrativas, y hacemos que el servicio se ejecute con el usuario que sí tiene acceso a dicho recurso compartido.

Espero que sea de utilidad.

09 diciembre 2009

Cómo detectar el navegador del usuario con JavaScript

Me voy a ir apuntando en algún sitio todas esas búsquedas que voy haciendo por los mares virtuales, para ver si de una vez por todas no hago las mismas cada vez que me enfrento a los mismos problemas.
Hoy hay que localizar el navegador del usuario. Por qué? Bien, la razón es que el Internet Explorer tiene una manera de interpretar las medidas de la caja del modelo CSS. La manera no es ilógica (como en un principio pensé, soy malo, y qué?) pero es diferente a la de los demás, y no cumple la recomendación del W3C. Así que me toca localizar el navegador, y aplicar la hoja de estilos en función del navegado. Amos p'allà...!


Como lo estoy haciendo con jsp, tiramos de google, y probamos una de las millones de opciones, que, como no, funciona. http://www.ericgiguere.com/articles/how-to-detect-internet-explorer.html





<%
String ua = request.getHeader( "User-Agent" );
boolean isFirefox = ( ua != null && ua.indexOf( "Firefox/" ) != -1 );
boolean isMSIE = ( ua != null && ua.indexOf( "MSIE" ) != -1 );
response.setHeader( "Vary", "User-Agent" );
%>

<p> <%=ua %></p>




Por ejemplo, para mi nuevo y flamante Google Chrome para MAC OSX, la respuesta es


Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.30 Safari/532.5

Para el Firefox 3.5.5 para MAC OSX, la respuesta es:

Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; es-ES; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 GTB6

Me quedan las pruebas para los navegadores sobre Windows, para ver respuestas y en función de cada uno cargar un CSS u otro.

02 septiembre 2009

BCN-Cerdanyola-Sant Cugat y vuelta

Día de "descoberta". Desde casa a Torre Baró, de ahí a Cerdanyola por la montaña, pasando por Can Lloses. De Cerdanyola, por carretera hasta Sant Cugat. Allí hay dos posibilidades, volver por Can Borrell o bien seguir hasta coger la Arrrabassada. Segunda opción. La verdad es que se hace largo. Una vez llegado a BCN, quedan 11km. y vuelvo a casa por la montaña llegando de nuevo a Torre Baró, y de ahí a casita.
Posted by Picasa

22 agosto 2009

BCN-Cerdanyola y vuelta

Sábado 07:30h

Hoy era día de descubrimiento. No había hecho esta ruta y tenía tiempo y ganas. De BCN a Torre Baró y de ahí a la Carretera de Cementerio de Horta. Un poco más abajo se abre un camino que te lleva a Cerdanyola. Luego es cuestión de encontrar la carretera que te trae de nuevo a BCN, pasando por Can Coll, el Forat del Vent, etc.... Luego 5km más a Torre Baró y a casa. 1h26min. Lo cierto es que hay una primera parte de bajar mucho y rápido, y luego 8km de subidita.

Otra para el álbum de rutas.


Posted by Picasa

20 agosto 2009

Salida con bici

Hoy he tenido la posibilidad y hay que aprovecharla. Me he levantado prontito y con ganas y a las 06:30h he ido a dar una vueltecita con la bici. Hay que aprovechar las horas de menos calor, porque estos días pega con ganas.

He ido por el lateral de la Ronda, y he subido por la carretera de Vallvidrera. Me ha costado, y sobre todo la parte final, que coge unas rampas importantes. Una vez llegado a la bifurcación hacia el Tibidabo, todo es bajada. En total, 50min. de sufrir y 30min. de bajada casi sin pedales.

08 abril 2009

Carcassonne, el principio del "casulé"

Hemos visitado Carcassonne, bajo una finísima lluvia. La ciudad, llena de personal, y remodelada para los visitantes, es bonita, curiosa, y merece la pena verla.

En ella hemos probado el plato típico de la zona, el "cassoulet", que ha derivado en la comidilla de todas las vacaciones. Le llaman la fabada francesa, y hasta aquí puedo leer.

13 diciembre 2008

Hibernate: Primeros pasos

Este es el intento n mil de comenzar con Hibernate. Por ahora todo me va bien con mi Eclipse, mi Tomcat 5.5.27, mi MySQL 5.0 y unos servlets que me funcionan desde hace tiempo. Ahora hay que dar un paso más y utilizar Hibernate, que me han hablado maravillas, pero que no he podido hacer funcionar. Al lío:

Lo primero es bajarse el hibernate-core y las hibernate-tools. Ok. Hecho. Las tools se utilizan para poder facilitar tareas en Eclipse. Cuando las descomprimimos, tenemos dos carpetas features y plugins. Los contenidos de las mismas, los debemos pasar a las carpetas correspondientes de la instalación de Eclipse que tengamos. Ok. Hecho. Rearrancamos Eclipse con la opción -clean, y vemos qué ha ocurrido. En Software Updates > Installed Software, debemos localizar un elemento Hibernate Tools. Si es así, lo tenemos bien instalado. Continuamos.

Busco algún tutorial en Google para ver cómo comenzar y encuentro éste: http://programacion-shinseiki21.blogspot.com/2008/02/hibernate.html, que está muy bien, pero tiene algún paso demasiado rápido. Por ejemplo, a él le funcionan las librerías que indica que se han de cargar en el Build Path del proyecto, pero falta alguna. En mi caso, aparte del slf4j-api-x.y.z.jar, debía cargar slf4j-log4j12-x.y.z.jar pues de lo contrario me daba error al ejecutar el programa.

Una vez las pruebas hechas, y adaptadas a mi máquina, todo fue "flors i violes".

08 octubre 2008

Ubuntu y los problemas al compilar C



Haciendo una PAC de FPI con el Ubuntu, me he encontrado que con la instalación básica da una serie de errores al utilizar el gcc.

De hecho lo que pasa es que faltan librerías y no encuentra el stdio.h y otros. Una rápida vuelta por Google nos da la solución: hay que instalar algo más. Vamos a ello!.

sudo apt-get install build-essential

Esto instala las librerías que toque y te permite compilar sin problemas.

04 octubre 2008

Fujitsu Amilo M7440G, Disco duro y WiFi

Pues aquí estamos, con un disco duro que ha fallecido en acto de servcio, la garantía caducada y con un poquito de tiempo. Lo primero es comprar un disco duro SATA: 160 Gb, 46 EUR. OK. Segundo, se instala. OK. Probamos de instalar el XP: el ordenador no detecta el disco duro: malo! Probamos de instalar el Ubuntu, detecta el mío el del vecino y no se cuántos más ;-) Tiramos de linux y nos encontramos con que no va el WiFi, y ya me dirás un portátil sin WiFi es un fijo con la pantalla pequeña. Solución: Google, Ubuntu Amilo M7440G WiFi. Nos lleva a la página de una pequeña aplicación que te permite activar el Wifi: http://fsam7440.sourceforge.net/es/install.html. Se siguen las instrucciones al pie de la letra, y ...a navegar!

En mi caso, cada vez que quiero activar el WiFi, tengo que ir a la carpeta donde tengo el programa y hacer un sudo modprobe fsam7440.

En cuanto coja pràctica con el Linux, haré un método más ràpido.