Category Archives: Programación

Maven, entre el amor y el odio

La plataforma para la creación de aplicaciones a nivel empresarial es por excelencia Java (truenos de fondo…). Por lo normal, en todas las aplicaciones reales y serias que se hacen sobre Java, una de sus principales dificultades es el conjunto (elección y organización) de tecnologías (en este lote incluyo librerías, drivers, plugins, plataformas, servidores, herramientas y un largo etcétera interminable y del cual desconoceré la mayor parte y tú, aunque creas lo contrario, seguro que también). Una vez pasado el largo planteamiento inicial del componente que se desea a realizar, toca mancharse las manos y ponerse a programar. En cuanto te empieces a dar cuenta estarás ante una monstruosidad que sino llega a ser por tu querido IDE (eclipse, netbeans, vim+par de cojones) no podrías compilar y ponerlo en funcionamiento ni en tus sueños eróticos (tarea no trivial, entre otras cosas, por todo el conjunto de tecnologías externas de las cuales se suelen usar). Si a esto le sumas la tarea, no muy rara de darse, de mover todo el proyecto a otro sistema, empezarán a aparecer por ahí curiosas variables y similares que hay que cambiar por que son dependientes de un sistema en concreto. En definitiva, el proceso de gestión y construcción del proyecto se convierte en un autentico infierno, solo comparable al uso de Internet Explorer (OMFG!).
 
Para suavizar e intentar facilitar todo esto, existen herramientas para automatizar todo el proceso, la más conocida y usada actualmente es Ant (Netbeans la usa para todo el proceso de compilación), pero solo hace falta abrir uno de sus ficheros de configuración, build.xml, de un proyecto aleatorio para empezar a plantearse que quizá va a ser peor el remedio que la enfermedad. Vamos que su configuración es de todo menos intuitiva. Y su curva de aprendizaje (y mantenimiento) es pareja a bailar claque con un oso asiático en celo en la espalda.
 

Logo de Maven

Ahora es cuando digo que maven es bueno, bonito y barato y nos soluciona la papeleta. En parte así es, mucho más simple y potente que Ant (Maven hace lo mismo que Ant, y ambos son proyectos de Apache, uno de ellos más nuevo que el otro, adivina cual…), en definitiva un digno sucesor de Ant, mucho mejor, aunque no perfecto. Antes de seguir hablando pondré un “hola mundo” que así ya se entiende mejor qué es todo esto. Atención al pom.xml (project object model):

$ mkdir HolaMundo && cd HolaMundo
$ mkdir -p /src/main/java/com/bicosyes/hola # com.bicosyes.hola será el package
$ cat > /src/main/java/com/bicosyes/hola/Hola.java << EOF package com.bicosyes.hola; public class Hola { public static void main(String [] args) { System.out.println("¡Hola mundo!"); } } $ cat > pom.xml << EOF 4.0.0
com.bicosyes # grupo al cual pertenece el proyecto
HolaMundo # el nombre
1 # versión del componente
$ mvn install # install!, compila y genera el .jar
$ java -cp target/HolaMundo-1.jar com.bicosyes.hola.Hola
¡Hola mundo!

Pues vaya lata tener que hacer todo eso para un puñetero Hola mundo, ¿no?. Pues si, como nos gusta complicamos la vida a veces… Si no fuese porque además, maven, nos permite ejecutar test JUnit, recopilar informes de los test ejecutados, pasar pruebas de checkstyle, generar javadocs en diferentes formatos, crear packages jar/war/ear/ejb, subirlo a servidores remotos y cosas por el estilo que desconoceré. Además de todo esto, me he dejado su principal característica para el final, gestión de dependencias (al más puro estilo apt-get). Se usan repositorios de librerías (ésta es la principal), en el pom.xml se indicará qué librerías son usadas en el proyecto y qué versiones de las mismas (por ejemplo log4j versión 1.2.14). Indicando eso, al intentar realizar el proceso de compilación, maven las descargará, y si éstas, a su vez, dependen de otras librerías, hará lo necesario para que sus dependencias sean resueltas. Ahora ya todo esto del tal maven suena mejor, ¿no?. Sabes que si.
 
Uno de los principales fuertes de maven (desde mi punto de vista) es su facilidad y su modularidad (propio de la fundación Apache) que se traduce en una gran facilidad para escribir plugins y usarlos. Tenemos desde plugins de reporting hasta plugins para ejecutar tareas Ant (si, el de antes), pasando por deployment en servidores tomcat, por citar algunos que conozco de primera mano.
 
¿Alguna parte negativa? Hombre pues salvo el Monstruo de Espagueti Volador, nada es perfecto. El mayor punto negativo está en que, lógicamente, no vamos a tener todo en el repositorio y resignarse a usar la versión ‘X’ no es una opción, por lo que no es muy raro el tener que instalar en un repositorio propio controlado las versiones de las librerías que necesitemos (con todo lo que esto conlleva… piensa en las dependencias, por ejemplo…). Además el plugin para ejecutar test JUnit funciona dependiendo de la posición de los planetas, he debugeado pero sin mucho éxito, lo tengo como tarea pendiente (de baja prioridad por ahora).
 
Algunos enlaces para empezar

Impresión desde aplicaciones Java con CUPS

Las JVM tienen un bug reportado y solucionado hace poco que afectan a las versiones tanto de java 5 (fixeado en update 12), como java 6 (hasta el update 1). Curiosamente en los repositorios de ubuntu tenemos las versiones justo anteriores a éstas, por lo tanto existe el bug. Este bug consiste en que es imposible imprimir desde aplicaciones Java a impresoras que usen CUPS. Todas tus impresoras te saldrán como “Not accepting jobs” (No se aceptan trabajos). Vaya putada, ¿no?.
 
¿La solución? Muy simple, puedes optar por descargar la última versión de Java de la web de Sun, o usar esta simple solución:

  • Crear enlace simbólico, en ubuntu no existe, en otras distros puede que tampoco

    $ sudo ln -s /usr/lib/libcups.so.2 /usr/lib/libcups.so

  • declarar CUPS_SERVER como localhost

Es decir, si queremos ejecutar una supuesta aplicación Java llamada, por ejemplo, AlAtunTunTun, desde la cual queremos imprimirnos El Quijote, hacemos algo tal que así para iniciarla:

$ export CUPS_SERVER=localhost
$ /ruta/alProgramita/AlAtunTunTun

Y problema resuelto :).

Java, ese “maravilloso” mundo

logo_java.pngUna cosa es conocer java, el lenguaje de programación que más se usa a nivel empresarial. Pero mucha gente dice, incluso, saber programar en Java. Cuando en verdad lo que hacen es copypastear código buscado en google o similares, ejecutar las cosas mil veces hasta que funciona, tener mil plugins de eclipse para hacer tareas que ni llegan a entender o comprender qué hacen realmente (y desde luego que si les quitas el IDE, ni sabrían seguir trabajando).
 
Cuando alguien me pregunta si sé Java, la verdad que siempre dudo en qué contestar, puesto que aún no he llegado a conocer en profundidad y/o usar todas las tecnologías. Podríamos citar: Applets, swing, SWT, AWT, Java 2D, Java 3D, servlets, JSP, CORBA, JB, EJB, JCA, JMS, JDO, EIS, RMI, JCA, JCE, JDBC, JNDI, JAAS, JRMP, JNI, JNLP, JTA, portlets, JAXP, JAXB, JAX-WS, JMX, JMI, JSF, GWT, Struts, Jetty, Ant, Maven, JUnit, Tomcat, JBoss, JOnAS, WebSphere y por supuesto XML (del cual se podría hacer un post similar a este…) y Web Services (aunque el modelo REST es mil veces mejor).
 
Además, seguro que habrá otras tantas tecnologías que no las conoceré. Todas las mencionadas las conozco, pero no puedo decir que sé manejar todas ellas (a decir verdad, de unas cuantas solo he leído cuatro historias para saber qué cojones es, y para de contar). Por lo tanto, cuando alguien me pregunta si Java, suelo contestar que intento defenderme, si quiero respuesta rápida, o, respondo con una contra pregunta para que especifique más, si quiero alargar el tema.
 
Por supuesto, para aprender éstas y otras muchas tecnologías que me habré olvidado, la mejor web del mundo mundial es JCP.

Eclipse bajo demanda

Yoxos consiste en una aplicación web con la cual puedes crearte (seleccionando y añadiendo diferentes plugins) tu propio eclipse. Una vez elegido como quieres que sea, puedes descargarlo y ya estará listo para funcionar. Además también te instala un plugin (yoxos update) para posteriormente ir actualizando todos los plugins que has seleccionado y/o instalar más. Todos aquellos que se han pasado semanas buscando y configurando su eclipse para que quede a su gusto (entre los que me incluyo) esta página se convierte en algo imprescindible.

yoxos.jpg


Yoxos on demand
Vía markdbd.

Programación con JAVA en Linux

logo_java.pngEn el “curro” (estoy como becario en un departamento) todos los equipos están con alegres y risueños Windowses 2000, cosas del destino hicieron que hace pocos días mi querido Windows 2k del trabajo me mostrase angelicales pantallazos azules constantes al intentar iniciarse :), muy majo todo él. Probé reiteradamente las diferentes opciones de restauración, pero no surgieron efecto en evitar que el amable SO dejase de mostrar la colorida pantalla. Solo había una opción, reinstalar :O.
 
Emoción, intriga, misterio… había que reinstalar un SO!, en esa definición, no entra un Windows ni de cajón (y mucho menos un MacOSX aunque se pudiera xD), así que ya que estamos y como el destino ha querido que así fuera, instalemos un amigable y agradecido Ubuntu :).
 
Ok, ya tenemos nuestro Ubuntu instalado, y resulta que programaremos con tecnología JAVA, así que instalemos eclipse, no?. Hacemos un sudo aptitude install eclipse? NO. Primero de todo mandamos a la puta mierda el GNU Compile for java (gcj)!

sudo aptitude purge gcj-4.1-base

Ok, nuestra vida ya es más facil y placentera. Ahora solo queda instalar el JDK, sudo aptitude install sun-java5-jdk; y eclipse descargarlo de su web, pues solo hay que descomprimir sin más.
 
Que, por qué estoy siendo tan cruel con gcj? Pues instalando eclipse de los repositorios se instala para ser usado con gcj (en verdad se podría cambiar editando el fichero /etc/eclipse/java_home, pero prefiero descargar la última versión de la web) y siendo que eclipse es todo un señor programa (que chupa más que las putas vamos), ejecutandose bajo gcj es increiblemente más lento (si a esto le sumamos el estar usando un ordenador que no entraría en el top500.org, es para tirarse de los pelos). Al cabo de 20 minutos estaba ya preocupandome (e inquitandome) y empecé a programar sin IDE, solo con vim, como los machos ibericos. Luego por casualidad ejecutando ps’s y top’s veo que eclipse estaba con gcj y fue cuando realicé todo lo anterior; ya iba todo perfecto y dejé de ser un macho iberico para convertirme en una nena del eclipse :(, fue bonito mientras duro…
 
Nota para el que no se haya enterado de nada: GCJ es un “programa” que hace lo mismo que el JAVA pero open source, y como sorpresa va, así a ojo, una 10 veces más lento.

Peticiones HTTP con python

python-logo.jpgAunque mis primeras impresiones con python no han sido muy placenteras, he de reconocer que es un lenguaje que tiene algo especial. Una mezcla entre la “libertad” de C o perl y la “seriedad” de Java o Ada (por decir algo xD). Creo que voy a usarlo más a menudo pues me está gustando cada vez más.
 
Bueno a lo que vamos, como mandar una petición POST (o GET) HTTP con python. Como comenté hace un tiempo como hacer esto con perl (aunque usé sockets en vez de un modulo), y ya lo tengo hecho en un script, me ha parecido bien poner el ejemplo:


# paquetes necesarios
import httplib, urllib
# Host y archivo
host = "www.UNApagina.com"
target = "/un/arhicvo/index.php"
# cabeceras HTTP usando sintaxis NOMBRE:VALOR
# si haces un GET, deberías modificar o eliminar la primera cabecera
headers = {
"Content-type": "application/x-www-form-urlencoded",
"Accept": "application/xhtml+xml,text/html;q=0.9,text/plain;",
"Referer": "http://www.UnApagina.com/login/ok.php"
}
# parametros POST, si solo quieres una peticion get no hacen falta
params = urllib.urlencode({
'user': 'paco',
'accion': 'gobernarelmundo'
})
# conectamos con el host remoto
conn = httplib.HTTPConnection(host)
# mandamos la peticion POST con los parametros y las cabeceras anteriores
# para un get sería lo mismo pero poniendo get y sin parametros
conn.request("POST", target, params, headers)
# vemos que narices ha pasado en la petición
response = conn.getresponse()
print response.status, response.reason
# y si todo ha ido bien ahora imprimiremos los resultados :)
data = response.read()
print data
conn.close()

 
Según lo que deseemos hacer, casi seguro que será mejor encapsular todo el código anterior en una clase parametrizada, pero eso ya es dependiente del contexto donde estemos :).