Buscar este blog

martes, 21 de septiembre de 2010

MAVEN - RESOLUCION DE PROBLEMAS

Problemas que me he ido encontrando y como solucionarlos.

PROXY
Aunque tengas configurado un proxy para todo el sistema, maven no entiende eso. Hay que configurarlo de forma específica en su fichero /etc/maven2/setting.xml

ENCODING
Cuando intentas compilar desde una máquina linux, el código desarrollado en un windows, suele ocurrir, que los encodings utilizados son diferentes.
Esto suele acarrear que el compilador no reconozca algunos caracteres de los ficheros fuentes y por tanto sea incapaz de compilarlos.

Para resolver esto, podemos informar explícitamente en qué juego de caracteres están nuestras fuentes.

A mi me gusta hacerlo mediante variable de entorno, ya que es un caso muy común y si intento que el equipo de trabajo desarrolle en UTF-8, seguro que a alguno se le escapa.

MAVEN_OPTS=-Dfile.encoding=ISO-8859-1

Aunque esto se puede establecer desde la lína de comandos cuando lanzas el maven o incluso en el propio pom.xml

ARTEFACTOS EN REPOSITORIOS EXTERNOS
Es muy cotidiano encontrase con que para construir nuestros proyectos, no encontremos algunas dependencias, ya sean de librerías o de plugins.

Para esto debemos tener registrado el repositorio en el que se encuentran para que se los traiga a nuestro repositorio local en el primer acceso.

En estas URL's podemos hacer una búsqueda rápida de artefactos para saber de donde podemos obtenerlos.

http://mvnrepository.com/
http://www.mvnbrowser.com/index.html

lunes, 20 de septiembre de 2010

MAVEN

En esta serie de entradas intentaremos tomar apuntes de los temas claves para comprender y usar MAVEN.

En esta entrada hablaremos de...
  1. Plugins y Goals
  2. LIFECYCLE
  3. COORDENADAS
  4. DEPENDENCIAS

Plugins y Goals
Una imagen vale más que mil palabras.
Efectivamente, podríamos decir que un plugin, es un conjunto de goals.

A nivel de línea de comandos, cuando podemos invocar un plugin y un goal de la siguiente forma:

mvn plugin:goal

Como por ejemplo cuando lanzamos:

mvn dependency:purgue-local-repository

En realidad lo que estamos haciendo es lanzar el goal purgue-local-repository del plugin dependency

Estos son algunos de los colorarios que podríamos arrojar sobre los GOALS
  • El goal, es la unidad básica de trabajo en MAVEN.
  • Un goal se puede ejecutar por si solo, o formar parte de un complejo proceso de construcción
  • MAVEN no sabe compilar tu proyecto. Se descarga el plugin y ejecuta el goal correspondiente. Como tampoco sabe empaquetar tu proyecto en un JAR.
LIFECYCLE
mvn install no es un goal específico de un plugin. Se trata de una fase en un LIFECYCLE.

Un lifecycle, es una secuencia ordenada de fases o pasos que conforman la construcción de un proyecto.

Una fase de un lifecycle, puede tener ninguno o varios goals asociados.

Cuando invocamos MAVEN con una fase, maven ejecuta todas las fases precedentes a dicha fase en determinado lifecycle (se entiende que si no se configura o especifica un lifecycle, se establece uno por omisión), hasta llegar a la fase indicada en la linea de comando.

Por lo tanto cuando ejecutamos mvn install, ejecuta compile, test y package previamente.

Un gráfico de como se ejecutan los goals asociados a un lifecycle:




Ejecutar mvn install tendría el mismo resultado que ejecutar:
mvn resources:resources \
compiler:compile \
resources:testResources \
compiler:testCompile \
surefire:test \
jar:jar \
install:install
En este ejemplo, especificaríamos el goal que deseamos usar.

COORDENADAS
Existen unos atributos a forma de coordenadas que permiten identificar un proyecto de forma unívoca.




Tal y como aparece en la imagen, podemos identificar las COORDENADAS de un proyecto en su pom.xml y la forma de hacer referencia única a dicho proyecto es la siguiente:

groupId:artifactId:packagin:version

Estos 4 parametros conforman lo que se llama ESPACIO MAVEN.

DEPENDENCIAS
Cuando creamos un proyecto maven, solo hay que indicar las dependencias directas de nuestro proyecto. Maven calcula las dependencias de estas dependencias.
Es decir, si necesitamos junit para testar nuestro proyecto, solo tenemos que indicar que depende de junit.
Las dependencias de junit, serán resueltas de forma automática.

Esto es lo que Maven denomina dependencias transitivas:

Las dependencias tiene un ámbito. Si indicamos que junit tiene el ámbito de test, no estará disponible para el goal compile.

En concreto el ámbito provided, indica que el contenedor de la aplicación (tomcat, weblogic...) proveerá dicha dependencia, no incluyendose dentro del empaquetado (war, ear...)

Esto puede ocasionar que un proyecto compile, y se empaquete, pero a la hora de desplegarse lance un error si dichas dependencias no están debidamente provistas (un típico ClassNotFoundException)

Fuente: manual de maven de SONATA

miércoles, 19 de mayo de 2010

Que no te la den con el código!!

Alguna vez habéis pensado en como guardaros la espalda cuando entregáis un código.

¿Romperán el proyecto y luego te dirán que lo arregles?

La ingeniería de el software ya es bastante complicada como para tener parámetros como este en cuenta.

Sería buena práctica resolver las incidencias sobre un código fuente que valide el checksum y por tanto NO MODIFICADO.

Para comprobar que el fuente no se ha modificado (y sobre el que se desarrollarán los parches) realizaremos los siguientes pasos.

1. - Entrega el código y calculo del checksum

find \( -name "*.java" -o -name "*.jsp" -o -name "*.jar" -o -name "pom.xml" \) -type f -exec md5sum {} \; > PROYECTO.md5

En el fichero PROYECTO.md5 se guardarán los checksum de los ficheros fuentes jsp, java, jar y el pom.xml

2. - Verificación del código para hacer uso de la garantía.

md5sum -c PROYECTO.md5

El resultado de este comando indica si se ha modificado algún fichero y cual o cuales se han modificado.

NOTA: Si en lugar del código, entregáis un binario, solo habría que hacer el md5sum del fichero binario.

Crear formularios PDF en LINUX

<modo_evil>
En realidad es multiplataforma... pero los usuarios de microshoft, que paguen del producto de adobe.
</modo_evil>

Pues eso, que desde linux también se pueden crear formularios rellenables (fillable) en PDF.

¿Ventajas de estos formularios? que los puedes rellenar en el ordenador, e imprimirlos.

Con los otros tendrías que imprimirlos y rellenarlos a mano.

Bueno, para hacer esto, solo necesitas el OpenOffice (yo estoy usando la versión del repositorio del Ubuntu Lucid).

1. - Mostrar la barra de herramientas de formularios
Ver -> Barras de herramientas -> Campos de control de formularios

2. - Componer tu formulario
Arrastrar campos a diestro y siniestro.

3.- Exportar como PDF y a disfrutar difundiendo tus formularios con acabados profesionales.

martes, 18 de mayo de 2010

Google Maps

Ya en su momento, trabajé el tema de la Geo-Referencia.
Eran otros tiempos y otros requisitos.

Por entonces exploré el tandem geoserver-openlayers.

Hoy nos toca pelearnos con la api de google-maps.

Importar las librerías.
Sacado de un ejemplo de la ayuda de google maps, tenemos lo siguiente.


<html>
<head>
...
<script
src="http://maps.google.com/maps?file=api&v=2&key=[KEY]"
type="text/javascript"></script>
...
</head>
<body>
...
</body>
</html>


KEY
Es necesario solicitar una KEY para utilizar la api de google aquí.

Crear Mapa Básico

Código básico para poner un mapa.


function initialize() {
if (GBrowserIsCompatible()) {
var map = new GMap2(document.getElementById("map_canvas"));
map.setCenter(new GLatLng(37.4419, -122.1419), 13);
map.setUIToDefault();
}
}


Establecer un Centro

<script type="text/javascript">
function LoadMapSearchControl() {

var options = {
zoomControl : GSmapSearchControl.ZOOM_CONTROL_ENABLE_ALL,
title : "málaga",
url : "http://www.google.com/corporate/index.html",
idleMapZoom : GSmapSearchControl.ACTIVE_MAP_ZOOM,
activeMapZoom : GSmapSearchControl.ACTIVE_MAP_ZOOM
}

new GSmapSearchControl(
document.getElementById("mapsearch"),
"1600 Amphitheatre Parkway, Mountain View, CA",
options
);

}
// arrange for this function to be called during body.onload
// event processing
GSearch.setOnLoadCallback(LoadMapSearchControl);
</script>


Cargar una marca en el mapa

var point = new GLatLng(lat,lon);
map.addOverlay(new GMarker(point));


Capturar la geo-referencia

GEvent.addListener(map, "click", function(overlay,latlng) {
if (latlng) {
var myHtml = "The GPoint value is: " + map.fromLatLngToDivPixel(latlng) + " at zoom level " + map.getZoom();
map.openInfoWindow(latlng, myHtml);
}
});



Y creo que con esto, tenemos para empezar!!

Ingeniería de Datos

¿No os habéis encontrado nunca con una migración de datos, parseo de datos, o elaboración de informes con una cantidad ingente de datos?

¿Esos datos os vienen de las fuentes más diversas? ¿CSV, excel, Oracle, MySql...?

En esta ocasión, he tenido que realizar una serie de scripts SQL de inserción, desde unos registros en base de datos de Oracle.

Estoy seguro de que se os ocurren muchas formas de hacer esto, pero yo recuerdo a un ex-compañero (saludos rubio!) de trabajo que se divertía mucho con el Pentaho.

Pentaho, es una herramienta Open Source para la minería de datos. Aunque es Open Source, hay una empresa detrás que quiere sacar tajada.

Uno de los componentes de esta herramienta, es Kettle. Implementa la parte de integración de datos (data-integration).

Con esta herramienta podemos hacer precisamente esto.
  • Obtener datos desde diferentes fuentes de datos (BBDD, CSV, excel...)
  • Cruzar los datos para obtener unos registros más ricos.
  • Filtrar los datos.
  • Operar los datos, creando columnas resultantes.
  • Concatenar los datos, reemplazar cadenas.
  • Obtener salidas a diferentes fuentes de datos (ficheros sql, tabla de BBDD...)
La documentación de esta herramienta no es la más rica en contenidos precisamente, pero no hay que dedicarle demasiado tiempo antes de empezar a obtener resultados.

Por desgracia, el desconocimiento de la herramienta, como su falta de documentación, me han requerido apoyarme en scripts de Linux para finalizar el trabajo solicitado. Pero el resultado es satisfactorio.

La web oficial de Kettle http://kettle.pentaho.org/
Descarga... y gratis!!! http://sourceforge.net/projects/pentaho/files/

Una captura un poco obsoleta, para que veáis la pinta de la herramienta.

Metodología en el Trabajo

Siempre he pensado que la metodología es lo que diferencia a los buenos profesionales del resto.

Como profesional, puedes confiar en alguien que es metodológico.

Este es equipo que suelo implantar como herramientas compañeras de la metodología allá donde voy y me lo permiten:

SVN + MantisBT + WIKI.

Esto podemos llevarlo montado en una VMWare (o una VirtualBox aunque requiere más configuración para el acceso a red) con una DEBIAN, un LAMP... (y otras cosas que quizás explique en otro momento) y tenemos un entorno de desarrollo de bolsillo.

Este equipo, podemos complementarlo con el plugin MyLyn de eclipse, orientado a tareas y el conector de mantis que nos permitirá:
  • Obtener un registro de los recursos modificados por tareas.
  • Una vista reducida de recursos por tareas
  • Comentarios de sincronización orientados a tareas (+info)
Sé que no es mucho... pero establece orden en el caos y espero poder ir ampliando este equipo con el tiempo.

Script de Linux

Una de las cosas que más me gusta de mi trabajo, es poder aprender e investigar cosas.

Y cada vez que tengo que realizar un script de Linux, tengo que remangarme, ajustarme las gafas para tener la frente bien abierta.

Ahí va, lo que pretende ser una chuletilla de scripting en linux.

Recorrer los ficheros de una determinada carpeta


VARIABLE=`ls $RUTA_BASE`
for carpeta in $VARIABLE
do
# Codigo a ejecutar por cada carpeta
done

Reemplazar texto de una cadena


VARIABLE=${TEXTO_ORIGEN//CADENA_BUSCADA/CADENA_REEMPLAZO}

En este caso, se reemplazan todas las ocurrencias.

Para reemplazar la primera tendríamos que hacer lo siguiente.


VARIABLE=${TEXTO_ORIGEN/CADENA_BUSCADA/CADENA_REEMPLAZO}

Reemplazar texto de un fichero


sed "s/CADENA_BUSCADA/CADENA_REEMPLAZO/" FICHERO_ORIGEN >> FICHERO_DESTINO

Incluir el texto de un fichero en otro


cat FICHERO_ORIGEN >> FICHERO_DESTINO

Aritmética Básica


CONTADOR=$[$CONTADOR + 1]


Control de flujo


if [ -e FICHERO ]
then
#Codigo a ejecutar
else
#Codigo a ejecutar
fi


Especial mención a la forma en la que se comprueba que el fichero existe.
Podemos comprobar el resto de flags en en TLDP

viernes, 14 de mayo de 2010

Ficheros de Bolsillo

Malidita compatibilidad hacia atrás con sistemas de ficheros (como no... de windows!).

Os pongo en situación.

Estáis en casa de un colega y os enseña un buen repertorio de cosas interesantes y jugosas... isos de juegos, películas con super calidad HD y sonido laxante... y otros grandes éxitos pesados.

Los ojos os hacen chirivitas y resulta que tienes un super pendrive de 32GB o más...

Lástima que para mantener retro compatibilidad tenga un sistema de ficheros en fat, fat32 o vfat, que solo te va a dejar llevarte ficheros de hasta 2GB.

Otra vez, linux al rescate.

Paso 1. - Partir los ficheros
split -b [tamaño_byte] [archivo_origen] [archivo_destino]

por ejemplo:
split -b 1000 perfil.jpg perfil.

genera los ficheros:
perfil.aa
perfil.ab
...
perfil.zz (depende del tamaño del fichero)

Paso 2. - Unir los ficheros
Esta es la parte complicada...

cat perfil.?? > perfil_pegado.jpg

Paso 3. - Sé limpio, por lo que más quieras!!
rm perfil.??

martes, 11 de mayo de 2010

HTC Magic

Hoy me han preguntado qué tal era la magic.

Ya llevo un tiempo disfrutando de ella y este es el resumen que puedo hacer:

PROS
  • Es muy divertida
  • El market
  • El GPS
  • Los juegos
  • Conectado eternamente
  • Android = Linux
  • Poder escuchar los podcasts (gomaespumaaaaaa!!!)
  • Poder consultar el correo electrónico
  • Poder hacer deporte y registrar los resultados.
  • Escuchar música.
  • Leer libros (ebooks).
  • google maps, my track, maps editor, place directory... etc...
  • Tener la agenda de teléfonos en la "nube" (cuantas veces perdiste esos números de teléfono?).
CONTRAS
  • La batería no dura más de un día con uso. Día y medio en espera.
  • La mía se apaga eventualmente (volvió de la garantía igual :()
  • El GPS hace que la batería dure mucho menos... llegando a durar medio día.
  • Muy limitada de Hardware. Las aplicaciones van lentas, pocos juegos potentes...
  • La funda del móvil es una porquería... sobre todo la blanca (solo vale para perderla).
  • No terminan de actualizarla a la versión 2 de android.
  • Pagar más de teléfono por tener tarifa de datos.
  • No poder usar voz-ip.
  • No poder hacer video-conferencia.
  • EL TECLADO!!!
  • Es difícil llamar!
RESUMEN
Solo la cambiaba por otro android (nexus quizás?).
Por cierto, alguien ha visto en los contras... que no es multitactil? Por que la verdad... no lo echo en falta.

Esto es de lo que me acuerdo ahora mismo... pero hay más, seguro.

Crear código de barras EAN 128 en java

Di tu que alguna vez lo necesito!!

/**
*
*/
package javeando.test;

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

import org.krysalis.barcode4j.impl.code128.EAN128;
import org.krysalis.barcode4j.output.bitmap.BitmapCanvasProvider;

/**
*
*/
public class BarCodeEan128 {

/**
* @param codigo TODO
*/
public static void main(String []codigo) {
/*
* La idea es generar una imagen de codigo de barras
* con codificacion ean 128
*/


String code = "12345678";
System.out.println(code.length());
System.out.println(barCodeEan128(code));


}

/**
* Metodo que permite obtener un array de byte que generan una imagen
* en PNG del codigo de barras en ean 128.
*
* @param codigo
* @return
*/
public static byte[] barCodeEan128(String codigo){
EAN128 bean = new EAN128();

final int dpi = 150;

//Configure the barcode generator

//Open output file
ByteArrayOutputStream out = null;
out = new ByteArrayOutputStream();
try {
//Set up the canvas provider for monochrome PNG output
BitmapCanvasProvider canvas = new BitmapCanvasProvider(
out, "image/x-png", dpi, BufferedImage.TYPE_BYTE_BINARY, false, 0);

//Generate the barcode
bean.generateBarcode(canvas, codigo);

//Signal end of generation
canvas.finish();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return out.toByteArray();
}
}

domingo, 9 de mayo de 2010

Buscar texto en ficheros

Muchas veces no recordamos en que fichero hay cierto contenido.

Cuanto los proyectos son megatónicos, se vuelve una tarea importante encontrar ese recurso que andas buscando.

En linux se hace así:

grep "system-message" `find -name *.php`

En este caso se busca la cadena system-message en todos los ficheros .php de la carpeta actual y subcarpetas.

El tiempo de espera dependerá del número de ficheros en el que buscar (aunque en cualquier caso, es mucho más rápido que cualquier IDE), por lo que se recomienda se acote en medida de lo posible la sentencia find

LAMP

Queréis una forma fácil y rápida de instalar un LAMP?

sudo apt-get install phpmyadmin

Ya lo dice el refran, A buen linuxero... pocos comandos bastan.

Ah, se me olvidaba... con este comando también instaláis el phpMyAdmin.

PHP - LINUX

Desarrollar en PHP sobre linux...
Llevo tiempo buscando un conjunto de herramientas para esto.
Cansado de la cantidad de recursos que consumen monstruosos IDE's como Eclipse o NetBeans, finalmente me decanto por un buen editor de textos que esté ligeramente orientado al lenguaje.

Estas son las herramientas que utilizaré a partir de ahora.

Edición
Gráficos
  • Edición de Gráficos - Gimp
  • Edición de Gráficos Vectoriales - Inkscape
Base de Datos
Servidor
Control de Versiones
Algo se me olvidará.

A modo de apostilla... a ver si se va a poder desarrollar con software libre!!

Utilizar un home existente

Después de haber recuperado vuestro sistema, quereis recuperar vuestros ficheros que están en otra partición... incluso puede que de otro disco.

Pues bien, estos serían los pasos:

1. Identificar el disco
Genralmente están en /dev/sda o /dev/sdb, que son los discos duros conectados al PC.

Dependiendo del disco hay que identificar la partición... pero bueno, no es el objetivo de esta entrada/nota aunque me lo apunto para explicarlo en mayor profundidad.

2. Una vez identificado, creamos una entrada en el fichero ftab de la siguiente forma.

/dev/sda2 /home/carpeta_ejemplo ext3 errors=remount-ro 0 2

Tratandose de un partición que se encuentra en el disco primario (sda) la 2da partición.

Se montará en /home/carpeta_ejemplo y tiene un sistema de ficheros ext3

Lo demás, son opciones que si encontramos porblemas tendríamos que tocarlas, pero nos valdría igual.

3. Una vez realizado esto, ejecutamos el comando sudo mount -a para no tener que reiniciar nuestro sistema.

NOTA: En caso de problemas, lanzar el comando dmesg | tail puede arrojarnos la causa del error (generalmente, no hemos puesto bien el sistema de ficheros).

4. Ahora solo falta hacer propietario al usuario que va a disfrutar de su home.

sudo chown -R usuario:usuario /home/carpeta_ejemplo

Y disfrutar comprobando que no hemos perdido nada y podemos seguir producciendo.

Acceder a Particiones desde Ubuntu Live

Seguro que alguna vez se os ha jodido el equipo y quereis recuperar (o al menos comprobar) la información de los discos antes de reinstalar el sistema operativo.

En caso de que la respuesta sea negativa... posiblemente tengais que cerrar esta ventana del navegador!!!

Bien, pues para esto podemos usar los live-cd o live-usb de ubuntu.

Por desgracia, en la nueva versión no parecen traer soporte para montar las unidades de forma gráfica. Pero pasa nada.

Montamos manualmente las unidades.

Para montar las unidades, va a depender de sistema de ficheros que tengais.
Primero creamos una carpeta donde montar las unidades.

Normalmente en /media

sudo mkdir discob

Montamos la unidad

sudo mount -t ext3 /dev/sdb1 /media/discob

En este caso se ha montado una unidad del tipo ext3 sobre la carpeta /media/discob

Si teneis la desgracia de tener que trabajar con unidades del tipo NTFS, no pasa nada... por que si microshoft, pone barreras, linux pone puentes.

Creamos la carpeta para montar la unidad

sudo mkdir /media/discoa

Montamos la unidad

sudo mount -t ntfs-3g /dev/sda1 /media/discoa/ -o force

Y ya teneis vuestras unidades montadas para hacer los backups o trapichear a gusto.

Para más referecias, siempre tendreis a mano la opción man (man mount en el caso que nos ocupa) pero para los que todavía no usais linux como sistema por omisión, podeis disfrutar de páginas como esta http://linux.die.net/man/8/mount

Ciclo básico de SVN

Bueno, un control de versiones es algo ya a estas alturas no debería de tener secretos para nosotros.

Pero en ocasiones o bien no tenemos a mano un cliente gráfico o simplemente no queremos consumir esos recursos extras que estos requieren.

Por eso voy relatar/anotar cual sería un ciclo básico de trabajo con SVN desde línea de comando.

Antes de ponerse a trabajar
  1. Actualizarse svn update
Realizar los cambios necesarios (es decir... trabajar)
Comprobar el estado de las modificaciones
  1. svn status
  2. svn diff
Deshacer posibles cambios
  1. svn revert
Resolver conflictos
  1. Realizar la mezcla... generalmente de forma manual.
  2. Marcar como resuelto svn resolve
Subir los cambios
  1. Añadir documentos nuevos svn add
  2. Subir el trabajo svn commit
Tengo pendiente hacer un listado de buenas prácticas en el trabajo de SVN