martes, abril 15, 2008

Appfuse 2. Creando un nuevo proyecto Spring MVC

Appfuse tiene varias plantillas de proyecto, crearemos nuestro proyecto con la plantilla de Spring-MVC.

En el directorio que queremos crear el proyecto:
mvn archetype:create -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-basic-spring -DremoteRepositories=http://static.appfuse.org/releases -DarchetypeVersion=2.0.1 -DgroupId=com.miproyecto.app -DartifactId=proyecto

Las dos últimas opciones son las que cambiamos para personalizar nuestro proyecto.
-DgroupId=com.miproyecto.app es el paquete raíz que utilizaremos, todos los nuevos paquetes que genera Appfuse se crearán dentro de este.
-DartifactId=proyecto es el nombre de nuestro proyecto.

Luego de ejecutar el comando, Appfuse y Maven bajarán todas las librearías de las que depende el proyecto Spring-MVC, entre ellas, Velocity, Hibernate, Spring, AcegiSecurity,...

Para probarlo primero nois aseguramos de tener un MySQL funcionando con una base de datos lista para el proyecto y editamos el archivo pom.xml en la sección Database Settings que está casi al final para introducir las credenciales.

<!-- Database settings -->

<dbunit.dataTypeFactoryName>org.dbunit.dataset.datatype.DefaultDataTypeFactory</dbunit.dataTypeFactoryName>
<dbunit.operation.type>CLEAN_INSERT</dbunit.operation.type>
<hibernate.dialect>org.hibernate.dialect.MySQL5InnoDBDialect</hibernate.dialect>

<jdbc.groupId>mysql</jdbc.groupId>
<jdbc.artifactId>mysql-connector-java</jdbc.artifactId>
<jdbc.version>5.0.5</jdbc.version>

<jdbc.driverClassName>com.mysql.jdbc.Driver</jdbc.driverClassName>
<jdbc.url><![CDATA[jdbc:mysql://localhost/mibasededatos?createDatabaseIfNotExist=true&amp;useUnicode=true&amp;characterEncoding=utf-8]]></jdbc.url>
<jdbc.username>miusuario</jdbc.username>

<jdbc.password>miclave</jdbc.password>

Para vestir el sitio, editamos las leyendas en /src/main/resources/ApplicationResources.properties


Lo incluimos a un servidor de control de versiones

svn import miproyecto svn://somesvnserver.com/proyecto/trunk -m "Inicio de miproyecto"

Ahora bajamos el resto de los archivos del proyecto

mvn appfuse:full-source

Con este paso dejamos a un lado muchos archivos de appfuse que después podemos integrar al svn cuando creamos necesario.

Generamos los archivos para edición con Eclipse:

mvn install eclipse:eclipse

Ahora probamos nuestra aplicación:

mvn jetty:run-war

Abrimos nuestro navegador en http://localhost:8080 y debemos ver una ventana de bienvenida

¡Listo!


Otros comandos usados comúnmente:



  • Para crear rápidamente una entidad con CRUD
    mvn appfuse:gen -Dentity=Page

  • Para correr y probar todo el sistema
    mvn clean; mvn jetty:run-war -Dmaven.buildNumber.doCheck=false

  • Para correr un JUnit
    mvn test -Dtest=UserFormControllerTest

  • Para exportar la BD usando DBUnit
    mvn dbunit:export -Ddest=sample-data.xml


domingo, abril 06, 2008

SVN mini tutorial

Para importar un proyecto nuevo.

svn import miproyecto svn://somesvnserver.com/miproyecto/trunk -m "Inicio de proyecto"


En el servidor SVN debe de estar configurado un repositorio con el nombre de "miproyecto"

Para extraer un proyecto

svn co svn://somesvnserver.com/miproyecto/trunk miproyecto


Para guardar los cambios
svn ci -m "Resolviendo error de dependencias"

*siempre es bueno poner un comentario corto cada vez

Para agregar un archivo o directorio

svn add nuevo.jsp otro.jsp algo.java


Este minitutorial está incompleto y poco a poco lo iré terminando

viernes, abril 04, 2008

Appfuse 2


Appfuse 2 es una herramienta muy útil para desarrollar proyectos. Conserva las dependencias de las librerías usadas comunmente en los desarrollos con Java/Hibernate/Spring-MVC.

También ofrece un ambiente de desarrollo y pruebas autónomo, que obliga a los desarrolladores a seguir siempre los mismos pasos para crear nuevos objetos, relaciones y tablas.

Se apoya en Maven para la administración del proyecto usando su modelo POM (project object model) facilitando la compilación integrando un ambiente uniforme para desarrollo independiente de la plataforma (Linux, OSX y Windows), ofreciendo información técnica del proyecto (librerías de las que depende con versiones; parámetros de compilación para pruebas y despliegue) y promoviendo la aplicación de mejores prácticas (best practices).

Appfuse crea toda la estructura básica para iniciar un nuevo proyecto. Después de esto puede también crear las configuraciones necesarias para utilizar el IDE de preferencia. Soporta Eclipse, IntelliJIDEA y Netbeans.

sábado, febrero 23, 2008

Convirtiendo de CMYK a RGB

Muchas veces cuando se procesan imágenes para sitios web, los diseñadores guardan los archivos en formato CMYK, que es muy común para impresiones. Cuando nos llegas las gráficas, el Internet Explorer o el Firefox no las muestran mandando un error.

Primero detectar cuáles son los archivos que están con ese formato:

identify -verbose *.jpg | grep -B 6 "Colorspace: CMYK" | awk '/^Image/ {printf $2"\n"}'

Luego, hay que convertir esos archivos a RGB usando otro comando.

convert -colorspace RGB imgCMYK.jpg jpg:imgRGB.jpg

En sistemas Linux se puede automatizar de la siguiente forma:

Copiar todos los archivos jpg en formato CMYK a un directorio temporal y ejecutar el siguiente script.


#!/bin/bash

PROG="/usr/bin/convert -colorspace RGB "

find . -iname '*.jpg' -exec $PROG {} jpg:{} \;


Se podría construir un script que haga todo, detecte los archivos, los copie a un directorio temporal, los convierta y luego los copie al directorio original.

Los comandos gráficos (identify, convert) son de la librería ImageMagick.

martes, octubre 30, 2007

Trigger en MySQL

Tengo el caso de que cada vez que agrego un usuario a una tabla debo de codificar su password a MD5 y agregar el login a una tabla con sus ROLES.


DELIMITER |
CREATE TRIGGER auth_users BEFORE INSERT ON usuarios
FOR EACH ROW BEGIN
SET NEW.passwdmd5 = md5(NEW.passwd);
INSERT INTO authorities (username, privilege) values (NEW.login, "ROLE_USER");
END;
|
DELIMITER ;


Cambio primero el delimitador cuando tengo varias instrucciones, esto para no confundir a CREATE TRIGGER. Inicio el loop poniendo el nuevo valor de passwdmd5 con la instrucción md5(NEW.passwd). NEW es el registro que estoy insertando, por ello lo modifico primero (BEFORE INSERT).

Agrego el nuevo ROLE en la tabla de authorities creando como default "ROLE_USER".

Cabe mencionar que para poder crear un Trigger en MySQL tienes que tener privilegios de super user sobre la base de datos.

Quizás para terminar habría que agregar otro trigger para cuando borro un usuario, pero para este caso es dificil pues el usuario tiene muchas otras relaciones históricas como lo son pedidos y productos favoritos, información que me es valiosa para análisis, así que no aplica lo de borrar usuarios.

*MySQL Reference

sábado, mayo 05, 2007

fmt:message no funciona

Estoy desarrollando un nuevo proyecto usando Spring MVC, me parece una plataforma bastante adecuada, algo entre jsp, struts y jsf.

Cuando seguí los pasos que muestra el tutorial, todo funciona perfectamente, pero cuando quiero desarrollar un nuevo proyecto ya con Spring 2 no me funcionó el dentro del JSP. Me lo traducía como ???title???

Me aseguré de que archivo messages.properties estuviera en WEB-INF/classes.

Que exisistiera en el aplicacion-servlet.xml :
...
<bean id="messageSource"
class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename">
<value>messages</value>
</property>
</bean>
...

y aún así seguía con el error. De casualidad revisando nuevamente el aplicacion-servlet.xml, veo que en el nuevo no tengo una línea en el view resolver y aunque no tenía "nada que ver" ya me faltaban pocas cosas que probar y fué cuando por fin funcionó.
...
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass">
<value>org.springframework.web.servlet.view.JstlView</value>
</property>
<property name="prefix">
<value>/WEB-INF/jsp/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
...

La línea mágica para mi caso fue incluir el viewClass como org.springframework.web.servlet.view.JstlView

Después de resolver el aparente problema, la solución parece muy simple y sobretodo obvia. Aquí estoy llamando al jstlView de Spring para una etiqueta que uso en Spring.

domingo, abril 22, 2007

Renombrar archivos con rename (Linux)

Muchas veces cuando estamos desarrollando nuevos sitios, es común tener que renombrar muchos archivos, generalmente fotos.

Para usar las fotos de un producto de manera sencilla, ponemos la clave del producto como el nombre de este y la extensión jpg pero cuando además de la foto también tenemos el thumbnail usamos la clave con el sufijo _th

Si en un folder tengo cientos de archivos gráficos que serán thumbnails pero que aún no llevan el sufijo, tendré que renombrarlos a todos, con rename es muy fácil.

La sintaxis de rename:
rename [ -v ] [ -n ] [ -f ] perlexpr [ files ]


La parte que quizás más asuste es la del perlexpr. A estas alturas las expresiones regulares con Perl deberían de ser cosa de todos los días, pero aún existen administradores que no se llevan bien con ellas.

-v es para ver los resultados
-n es para ver los resultados sin que haga cambios
-f es para forzar la sobreescritura de los archivos resultantes

Para esta necesidad yo tengo la siguiente lista de archivos:
AA02.jpg
AJ11.jpg
AJ14.jpg
BO12.jpg
...

y los quiero renombrar a:
AA02_th.jpg
AJ11_th.jpg
AJ14_th.jpg
BO12_th.jpg
...

La expresión regular es la siguiente s/\.jpg$/_th\.jpg/ quedando el comando como sigue:
$> rename -v 's/\.jpg$/_th\.jpg/' *.jpg
AA02.jpg renamed as AA02_th.jpg
AJ11.jpg renamed as AJ11_th.jpg
AJ14.jpg renamed as AJ14_th.jpg
BO12.jpg renamed as BO12_th.jpg
...


Mas información:
How to Bulk Rename Files in Linux (Terminal or GUI)