Sep 20

jax-ws, metro y cxf

No hace mucho que empecé a trabajar con web services. Buscando, buscando, vi como opciones axis y jax-ws. Al final, por sencillez, me decidí por jax-ws … pero hoy he descubierto un pequeño detalle que no sabía.

jax-ws no es más que una especificación y hay varias posibles implementaciones. Las más conocidas son metro y cxf. Yo he estado usando metro, confundiéndolo con jax-ws. Ahora que he descubierto que hay dos, he investigado un poco en internet a ver ventajas de una y otra. No he hecho pruebas ni una búsqueda exhaustiva, simplemente comento aquí algunas cosas que he visto.

Por un lado, metro obliga a poner las anotaciones sobre clases, mientras que cxf admite que se pongan en interfaces. No es algo demasiado importante, pero siempre es más elegante tener definido el web service sobre una interfaz.

Metro sólo soporta SOAP, mientras que cxf soporta también otros protocolos. De hecho, una misma interfaz puede llevar simultáneamente anotaciones de SOAP y de REST, de forma que la clase que lo implementa no necesita saber qué tipo de web service habrá detrás.Por su parte, Metro no soporta REST. La implementación de esta gente para REST está en un proyecto separado, Jersey.

Tanto Metro como CXF tienen plugin de maven para generar el WSDL a partir de la clase java o para generar las clases java a partir del WSDL.

Una cosa que he leído pero no he acabado de entender es que parece ser que hay diferencias a la hora de tratar/generar código en los parámetros de un WebMethod si estos parámetros tienen cierta complejidad, como ser colecciones. Intentaré echarle un ojo con más calma a ver.

Sep 10

Sufriendo SAML/XACML

Pues me ha tocado implementar web services seguros, y es requisito que se usen los protocolos SAML/XACML … y ahí empiezan los problemas.

Lo primero, buscar por google qué eso. Tras un rato de búsqueda acabas haciéndote una idea por encima de qué es.

Según SAML, cuando un cliente llama a un webservice debe añadir en el XML correspondientes a la llamada un token (un número de esos largos y crípticos) que luego el webservice es capaz de identificar como válido para permitir o no la llamada. Por supuesto, el cliente debe conseguir ese token de un gestor de identidades o algo parecido.

Con XACML el webservice consulta en un sitio si el cliente concreto que ha sido validado con SAML tiene o no permisos para acceder a determinados webservices, métodos de los mismos o incluso campos de datos.

Así que la idea básica está relativamente clara (con algunas dudas que me quedan todavía), pero hasta ahí el trabajo fácil. Llega el momento de implementarlo … y te encuentras con el caos.

Por un lado, hay dos mil librerías, frameworks y servidores varios que te ayudan a implementar todo esto de SAML/XACML. Unos a nivel bajo, otros soluciones más o menos completas. Googleando te pierdes en ellos, mirando su documentación, sus ejemplos y sin acabar de ver si te valen o no, si necesitas todo o solo parte o si falta algo. 

Al final te decides por uno y dices, vamos a probar. Y llega el segundo caos. Te montas un webservice básico y empiezas a descargarte la herramienta/libería. Luego las dependencias de esa herramienta/libería. Luego un servidor de no sé qué. Luego el plugin de no sé qué para el tomcat, luego borras una librería incompatible con la otra y buscas la alternativa … y después de un día de montar y desmontar tienes una "cosa" que al arrancar da excepciones por todos lados.

En fin, todas estas cosas tan avanzadas tienen un alto precio de aprendizaje. Y la información de google o bien es demasiado básica (conceptos generales), o bien demasiado detallada (referencias y documentos de centenares de páginas) o bien demasiado centrada en un aspecto concreto (pequeño tutorial de como usar una librería concreta de SAML con jax-ws presuponiendo que tienes montado todo lo demás).

Sigo en ello.

Sep 09

Hooks en subversion

Hace ya un par de años que me convertí en el administrador del repositorio de subversion de nuestro departamento. Incluso prestamos servicio de subversion a otros departamentos para sus proyectos.

Uno de los problemas que me he encontrado es que la gente por despiste, por "pasotismo"  o por no saber dónde guardar las cosas, mete en subversion ficheros binarios (.exe, .dll, etc) documentos (.doc, .docx, .pdf), etc, etc que no es el sitio adecuado para guardarlos, además que abusar de ello puede llenar el disco en un pis-pas. Y no es un problema específico de un administrador de subversion, pero tampoco me gusta que la gente suba a subversion sin poner el correspondiente comentario en el commit.

Así que me puse a investigar cómo evitarlo y descubrí los "hooks" de subversion. Son scripts que se guardan en el servidor y que se ejecutan cuando ocurren ciertas acciones en subversion, como un commit, un bloqueo, etc.

En el directorio /path/REPOSITORIO_SVN/hooks de un proyecto basta con poner un script de nombre pre-commit.bat (en windows también vale un pre-commit.exe o pre-commit.com, para unix bastaría un fichero de nombre pre-commit, sin extensión, con permisos de ejecución) que se ejecutará siempre que se intente hacer un commit y se ejecutará antes del commit, pudiendo rechazarlo en un momento dado. Ese directorio ya está lleno de scripts con extensión .tmpl, no ejecutables por tanto. Cada uno corresponde a uno de los posibles "hooks" y nos bastaría con copiarlo poniendo extensión .bat (o dándole permisos de ejecución en linux) y modificarlo por dentro para que haga lo que queramos.

Este script debe salir de forma normal (exit 0) si el commit se acepta, y salir con error (exit 1) si no se acepta el commit. En este último caso, lo que el script saque por la salida de error estándar, será lo que subversion le muestre al usuario como mensaje de error.

El que yo he puesto, pre-commit.bat, verifica las extensiones de los ficheros que se quieren subir y verifica que hay un comentario. El script es el siguiente y me disculpareis si hay forma mejor de hacerlo (seguro que la hay), pero se más bien nada de "scripts" en windows.

 

set REPOS=%1
set TXN=%2
svnlook changed %REPOS% -t %TXN% | findstr ".\exe \.dll \.o \.lib \.a \.so \.jar \.class \.doc \.docx \.pdf \.zip" >&2
if %errorlevel% equ 0 (goto err)
 
svnlook log %REPOS% -t %TXN% | findstr . > nul
if %errorlevel% gtr 0 (goto err2)
 
exit 0
 
:err
echo No se admiten ficheros binarios >&2
exit 1
 
:err2
echo Como no metas un comentario …. >&2
exit 1

 

Como parámetros del script, subversion nos pasará el repositorio y una "cosa extraña" que contiene la información de lo que se está pretendiendo meter. Nos guardamos esos dos parámetros %1 y %2 en las variables REPOS y TXN.

El comando de subversion svnlook, pasándole estas dos cosas, es capaz de darnos información sobre el commit. Así, svnlook changed nos da un listado de los ficheros que se pretenden modificar/añadir/borrar. svnlook log nos da el comentario del commit.

El comando findstr de windows nos permite buscar una cadena. En el primer uso buscamos extensiones de ficheros no permitidos. En el segundo caso, buscamos cualquier caracter (el punto de findstr equivale a cualquier caracter). Este comando findstr da un error si no encuentra la cadena, por lo que inmediatamente detrás pongo un if de %errorlevel% (que es donde se guarda si ha habido error) para decidir si se acepta el commit (exit 0) o saco algún error.

En fin, las posibilidades serían muchas, como verificar si el comentario lleva un número de incidencia para admitirlo, analizar el contenido del fichero que se va a meter buscando cosas no permitidas (código sin comentar, que no cumpla métricas, paths absolutos dentro, etc) o incluso ¿por qué no? si compila o no compila y pasa los test.

Sep 03

Las nintendos y yo

nintendo ds xoTengo hijas, ergo tengo nintendos …y he pasado la mañana entretenido instalando y configurando una tarjeta m3 zero para una nintendo DS XL.Aquí van algunas de las cosas que he aprendido.

Por un lado, nintendo no quiere este tipo de tarjetitas, así que el firmware de la nintendo intenta detectar estas tarjetas para no admitirlas. Por su parte, las tarjetas llevan su propio firmware interno que intenta engañar al de la nintendo para que la tarjeta sea admitida. Las nintendos más modernas tienen wifi y se conectan a internet, por lo que actualizan su firmware en cuanto te descuidas (sí, pregunta si quieres actualizarlo, pero una niña de 8 años contesta aleatoriamente a esa pregunta). Y una actualización del firmware de la nintendo puede hacer que la tarjeta que antes te funcionaba deje de funcionar (dice que se ha detectado un error y que apagues la nintendo).

Y aquí viene el primer detalle importante a la hora de elegir tarjeta (hay muchas marcas y modelos). El firmware de la tarjeta debe ser actualizable. Si el firmaware de la tarjeta no es actualizable y deja de funcionar en nuestra nintendo, podemos tirar la tarjeta y comprarnos otra. Si el firmware de la tarjeta es actualizable, sólo es cuestión de esperar unas semanas (suele ser rápido) a que el fabricante de la tarjeta saque la nueva versión de firmware. La forma de actualización también es importante, porque en algunas se puede hacer desde un PC, pero otras requieren que se haga desde una nintendo … y esto último no es posible en nuestra nintendo si la tarjeta ha dejado de funcionar, por lo que necesitaremos que alguien nos preste una nintendo con firmware antiguo para hacerlo.

Y la instalación desde cero de una tarjeta o su actualización es un mundo. Hay montones de tarjetas, montones de versiones de tarjetas y montones de actualizaciones de firmware y sistema de las mismas. Encontrar la versión adecuada en internet puede ser tedioso si no se sabe exactamente qué se necesita. Pongo el ejemplo de la m3 zero que he comprado.

Primero es necesario instalarle el firmware, viene sin él. Es un fichero F_CORE:dat que hay que poner en la microSD, meter la microSD en la tarjeta y enchufar la tarjeta con un adaptador en un USB del PC (el adaptador viene con la tarjeta y sólo sirve para darle voltios a la misma). Esto hará que el firmware se instale (parpadea un led en la tarjeta mientras lo hace). Una vez hecho esto, debemos borrar el fichero F_CORE.dat de la microSD). La descarga de dicho fichero …. por supuesto la versión más moderna que navegando por la página de http://www.m3adapter.com/index.htm en downloads te redirige a otra página que en donde las news te lleva a http://www.handheldsources.net/M3DS/Download_M3DSR.html que es donde está el fichero dichoso. Como hemos podido ver, fácil de encontrar.

Luego necesitamos meter en la microSD el directorio SYSTEM con todos los ficheros necesarios (este directorio y ficheros deben estar en la microSD, no forman parte del firmware de la tarjeta). Un zip con todo esto se puede descargar también de la página anterior. Una vez hecho esto, ya debería funcionar la m3 en la nintendo… pero no, da un error. La última actualización del firmware de nintendo es muy reciente y el software descargado no está lo suficientemente actualizado. Así que buscamos la actualización y aquí está http://www.m3adapter.com/SLOT-1_Series_M3i-Zero_G003.htm Hay un SYSTEM para descargar que no es un SYSTEM completo, sino sólo los ficheros que debemos machacar del descargado anteriormente. También hay que descargar un "firmware update" que es un fichero de extensión .nds (como los juegos) al que debermos "jugar" para actualizar el firmware de la tarjeta. Y aquí otro problema, si nuestra nintendo no reconoce la tarjeta, difícilmente podremos "jugar" a este juego alojado en la tarjeta. Así que necesitamos una nintendo con firmware antiguo que admita nuestra tarjeta, da igual que tipo de nintendo. Arrancado el juego se actualiza el firmware de la tarjeta y ahora sí, ya funciona en la nueva nintendo.

Los detalles, mejor explicados, aquí http://www.planetadejuego.com/tutorial-m3i-zero-con-actualizacion-1-4-3

Sep 02

¿Enseñanza gratuíta? No hay tutía

Nos salimos en este post de lo que es programación para comentar una cosa que me ha llamado la atención desde hace mucho, la expresión "no hay tutía". Sí, "tutía" se escribe todo junto y no tiene nada que ver con "tu tía", la hermana de tu padre o madre.

atutía (también tutía) era una especie de ungüento medicinal hecho con óxido de zinc y otras sales minerales que con el tiempo empezó a considerarse como un remedio universal para cualquier tipo de enfermedad. La expresión "no hay tutía" se usa en la actualidad para indicar que algo no tiene remedio o solución.

http://es.wikipedia.org/wiki/Atut%C3%ADa

Y aprovecho la salida de tema de este post para comentar algo que tampoco tiene nada que ver ni siquiera con lo que acabo de escribir : ¡¡ 600 € en libros de texto !! para mis dos hijas (material escolar y libro de biología y geología, que no quedaba, excluidos). No me extraña, cada asignatura tiene dos libros, el de teoría y el de problemas. Cada libro vale unos 30€ de media,  aunque no sea más que un "cuadernillo" de unas 100 hojas (tapas plastificadas, papel satinado, a todo color, etc, etc). Así que suma ¿7 asignaturas? incluida "educación física" que también tiene libro, a dos libros por asignatura y unos 30 € por libro … y tienes lo de una de las niñas, falta la otra.

Menos mal que la enseñanza es gratuita.