Spring 3.0 + Tiles 2.1.4 + JBOSS 5 = funciona !!!!

Hola de nuevo a todosfoto de Eloy Mier Pérez

Esta vez traigo un articulo distinto a los que tengo acostumbrado al personal, y muy posiblemente no será el ultimo de este tipo.

Hoy voy a presentar un par de tecnologías muy vinculadas al mundo del desarrollo Java/J2EE.  Concretamente vamos a ver por encima dos frameworks muy interesantes Spring MVC y tiles. Como es de suponer, ambos los estoy usando actualmente en la empresa para un proyecto Java, y me he decidido a escribir el presente articulo en gran parte por la cantidad de información antigua y desfasada que se puede encontrar en Internet.

Como comentario inicial Spring 3.0 funciona con tiles 2.1.4 confirmado. Puedo asegurar que actualmente he desarrollado un pequeño piloto funcional con estas tecnologías.

Bien, Apache tiles es un framework para construir plantillas que permiten simplificar el desarrollo la capa de presentación en aplicaciones Web. Tiles permite a los desarrolladores definir pequeños fragmentos de las páginas que pueden ser ensamblados para la construcción de las páginas Web definitivas en tiempo de ejecución. Estos fragmentos o tiles se pueden usar como si se una simple inclusión se tratase o bien embebidos en otros fragmentos con el objetivo de definir una serie de plantillas reutilizables. Estas plantillas logran normalizar la capa de vista a lo largo de toda la aplicación.

Por otro lado Spring MVC es un framework que nos permite organizar el desarrollo de la aplicación Web conforme al modelo MVC (Model-View-Controller). Este framework esta diseñado entorno a un Servlet Despachador (DispatcherServlet) que simplemente redirige las peticiones a los manejadores correspondientes. Las características principales son mapeos a los manejadores configurables, resolución de locales, y soporte de subida de ficheros. El framework ademas permite usar cualquier tipo de objeto java en la capa de la vista sin necesidad de desarrollar interfaces o clases base.

Actualmente estoy desarrollando una aplicación J2EE para la administración. La aplicación es de gestión eminentemente, mucha entrada de datos en los procesos que define. Es por ello que pensé que Spring MVC podría ser una buena opción.

Por otra parte, la aplicación, debe desarrollarse en torno a un menú principal y una barra de botones en la parte superior, variando los contenidos de la página, pero manteniendo constantes los elementos comentados. Esto se puede hacer de la forma tradicional, con los includes al menú y la botonera en todas las páginas, pero presenta un par de inconvenientes a los que quería dar solución. Los inconvenientes son:

  1. En el caso de querer modificar la apariencia del Site, nos veríamos obligados a modificar todas las páginas del mismo.
  2. El control del contenido hay que programarlo manualmente, lo que implica mas lógica en la capa del servidor y que nada tiene que ver con la problemática del negocio.
  3. El control manual de los includes, normalmente lleva a problemas importantes en cuanto a que en ciertos momentos no sabemos exactamente que es lo que se está o no incluyendo.
  4. Normalmente se pierde la homogeneidad en la apariencia en mayor o menor medida.

Por todo ello en el proyecto he decidido incluir ambos frameworks. Spring va a llevar el control del site y tiles va a organizarme las páginas.

Bueno, pues hecha la introducción al proyecto vamos a pasar a ver un poco un pequeño ejemplo de cómo integrar las tecnologías comentadas. El ejemplo que vamos a realizar es muy simple. Con Spring MVC vamos a desarrollar un pequeño controlador principal encargado de recibir las peticiones de cliente y enrutarlas a los controladores especializados. Concretamente y como base, vamos a desarrollar un controlador que filtra una petición a index.htm y la enruta a un controlador para la página de inicio del sitio web.

Por otro lado, y enlazando con la página de inicio del site, no vamos a enrutar a una página simple, sino a una construida en tiempo de ejecución usando tiles.

Comenzamos con un boceto del controlador y luego pasamos al código fuente:

Spring en acción

Mostrada la idea, pasemos al código necesario para la capa de controladores:

fichero de configuración para el controlador frontal (frontController-servlet.xml):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
 "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
  <bean id="frontController"/>
  <import resource="indexController-servlet.xml"/>

  <bean id="urlMapping">
  <property name="urlMap">
  <map>
  <!-- Aquí se define la entrada que redirige al controlador de Index >
  <entry key="**/index*"><ref bean="indexController"/></entry>
  </map>
  </property>
  </bean>
</beans>

Implementación del controlador (Sip ya se que no hace nada….la redirección se indica en el fichero xml del controlador):

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class FrontController {
 private final Log logger = LogFactory.getLog(getClass());
}

fichero de configuración del controlador index (indexController-servlet.xml)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
 "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
 <bean id="indexController"/>

 <bean id="jstlViewResolver">
 <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>
</beans>

Implementación controlador Index(IndexController.java)

import java.lang.annotation.Annotation;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

public class IndexController implements Controller {
 private final Log logger = LogFactory.getLog(getClass());

 public ModelAndView handleRequest(HttpServletRequest arg0,
 HttpServletResponse arg1) throws Exception {
 // TODO Auto-generated method stub
 return new ModelAndView("index");
 }
}

Fichero de contexto de la aplicación web (aquí he especificado el fichero de configuración de tiles)

<?xml version="1.0" encoding="UTF-8"?>
<beans default-autowire="byName"
 xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

 <!-- Include the configuration files of the other components -->
 <bean id="tilesConfigurer"
 class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
 <property name="definitions">
   <list><value>/WEB-INF/tiles-defs/myTilesConfigFile.xml</value></list>
 </property>
 </bean>
</beans>

Fichero web xml

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
 <display-name>xxxxyyyy Web</display-name>

 <context-param>
   <param-name>contextConfigLocation</param-name>
   <param-value>/WEB-INF/applicationContext.xml</param-value>
 </context-param>

 <listener>
   <listener-class>org.springframework.web.context.ContextLoaderListener
   </listener-class>
 </listener>

 <servlet>
   <servlet-name>frontController</servlet-name>
   <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
   <load-on-startup>1</load-on-startup>
 </servlet>

 <servlet-mapping>
   <servlet-name>frontController</servlet-name>
   <url-pattern>*.htm</url-pattern>
 </servlet-mapping>

 <servlet-mapping>
 <servlet-name>frontController</servlet-name>
 <url-pattern>*.view</url-pattern>
 </servlet-mapping>
</web-app>

Tiles en acción

fichero de plantilla usado por la aplicacion (template01.jsp)

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
   pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
 "http://www.w3.org/TR/html4/loose.dtd">

<html>
 <head>
   <title><tiles:getAsString name="title"/></title>
 </head>
 <body>
 <table border="1">
   <tr><td colspan="2"><tiles:insertAttribute name="header"/></td></tr>
 <tr>
   <td><tiles:insertAttribute name="menu"/></td>
   <td><tiles:insertAttribute name="content"/></td>
 </tr>
 <tr>
   <td colspan="2"><tiles:insertAttribute name="footer"/></td>
 </tr>
 </table>
 </body>
</html>

El fichero de configuración de tiles es:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE tiles-definitions PUBLIC
 "-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
 "http://tiles.apache.org/dtds/tiles-config_2_1.dtd">

<tiles-definitions>
 <!-- Default Main Template -->
 <definition name="mainTemplate" template="/WEB-INF/templates/template01.jsp">
   <put-attribute name="title" value="Simple Tiles 2 Example" type="string" />
   <put-attribute name="header" value="/WEB-INF/jsp/header.jsp" />
   <put-attribute name="footer" value="/WEB-INF/jsp/footer.jsp" />
   <put-attribute name="menu" value="/WEB-INF/jsp/leftMenu.jsp" />
 </definition>

 <definition name="main" extends="mainTemplate">
   <put-attribute name="content" value="/WEB-INF/jsp/blank.jsp" />
 </definition>
</tiles-definitions>

Por último el fichero index.jsp contiene una referencia a la deficicion:

<%@ include file="/WEB-INF/jsp/include.jsp" %>

<tiles:insertDefinition name="main"/>

Resultado de la petición

Referencias

  1. http://www.springsource.org/
  2. http://tiles.apache.org/

Un saludo a todos….y hasta la próxima

Desempaquetado NetGear RNDP6000

Hola a todosfoto de Eloy Mier Pérez

Después de un tiempo sin escribir, ahora saco un momento para continuar con el tema.

A medida que la tecnología avanza, vemos como productos que antes estaban vetados para el usuario domestico, ahora en cambio son prácticamente tan imprescindibles como en el mundo empresarial. Un caso muy claro es el referente a los dispositivos denominados NAS (o almacenamiento de red/Network attached storage).

Estos dispositivos no son mas que de 1 a n discos que están conectados a la LAN de casa o de la oficina y que permiten, a través de la propia LAN, el acceso a los elementos compartidos que publican.

Dependiendo del dinero que nos gastemos en el dispositivo, así sera el mismo. Normalmente el número de discos que el dispositivo puede albergar es directamente proporcional al precio del cacharro en cuestión. Podemos ver en el mercado dispositivos NAS de 2 huecos (2xHD) sobre los 300€ y también podemos ver dispositivos con 6 huecos (6xHD) que rondan los 1200€.

De igual forma, los dispositivos mas caros, presentan mas funcionalidad, por ejemplo ISCSI, o accesos varios a las comparticiones, por ejemplo HTTP/S, NFS, FTP, etc….también dependiendo del dispositivo puede o no ofrecer servicios adicionales como servicios de streaming (SqueezCenter, itunes server o DLNA entre otros), servicios de descubrimiento (Bonjour o uPnP). Y ya por ultimo, los dispositivos mas abiertos pueden permitir la instalación de addons realizados tanto por el fabricante como por la comunidad, como es el caso del dispositivo que nos ocupa.

Ya he escrito algún articulo en el que estaba involucrada alguna NAS, pero nunca he tenido ocasión de mostrar como viene desde el fabricante ninguna de ellas….la verdad, mas por dejadez que por imposibilidad, pero bueno, vamos a solucionarlo en el presente artículo.

Esta vez traigo un articulo un tanto distinto a lo que estamos acostumbrados por estos lares. Hoy vamos a ver cómo nos llega del fabricante una ReadyNAS Pro 6000 de NetGear. En casa ya tengo una 6350, pero cuando la desempaquete, no me di cuenta de la posibilidad de escribir este articulo. Ahora que tengo una segunda oportunidad no la voy a dejar escapar.

Sin mas pasemos a ver el paquete que me ha mandado el fabricante:

Esta es la caja que me ha llegado, en perfectas condiciones y perfectamente sellada por NetGear como se puede apreciar en los precintos.

Abrimos la parte superior del paquete y aparece otro paquete mas pequeño. Cuando estaba abriéndolo me recordó a las muñecas rusas, xDDD. Menos mal que dentro de esta caja no me encontré otra, sino me da un yuyu.

Sacamos la caja interna y podemos apreciar que viene precintada exactamente lo mismo que la externa:

Con la información del numero de serie y modelo de la unidad (borrado por motivos de seguridad):

Bueno, abrimos la caja interna y ya aparecen los contenidos. En primer plano ya aparece el sobre con la guía rápida de usuario (elemento que no suele valer de nada) y el CD relacionado con el producto que suele contener el software de control del mismo y la documentación completa del producto.

Estos son los cables que acompañan a la unidad, un rj45 de red y 2 mas de alimentación:

Una vez sacado el sobre y los cables podemos ver la unidad empaquetada perfectamente:

La sacamos de la cajita:

Y quitamos las protecciones y plásticos, y esta es la NAS en cuestión:

Aquí se pueden apreciar los 6 huecos para discos que tiene esta unidad. Delante de la unidad podéis ver uno de los cajones en los que se atornilla un disco para proceder a agregarlo al dispositivo NAS.

Bueno, pues hasta aquí la revisión de la llegada de esta máquina.

Como he comentado yo tengo una como esta funcionando en casa. Si alguno de los lectores tiene alguna cuestión mas concreta de la unidad, que no dude en preguntar, que para eso estamos.

Un saludo a todos y buenas noches.

¿Como hacer una imagen de un disco con Windows en Linux?

Hola a todos de nuevo.

Hoy vengo con un tip que seguro que a muchos de vosotros os vendrá que ni pintado. El asunto es cómo generar imagen de disco de un Windows recién instalado con el objetivo de que en el caso de que en el futuro tengamos que reinstalarlo simplemente podamos restaurar la imagen tomada, volviendo Windows a su estado origen sin necesidad de pasar de nuevo por la reinstalación de todo el sistema (que es un poco coñazo).

En mi caso, llevo algunas semanas notando que Windows me esta dando problemas gráficos bastante molestos y hoy me he decidido a reinstalarlo. He instalado el software que considero básico (actualización a la fecha del SO, Firefox con las extensiones necesarias, Winrar y Ultraedit) y así lo he dejado por el momento. La idea es hacer una imagen de ese disco con el estado actual del SO para restaurarlo en un futuro mas rápidamente y no tener que volver a instalar de nuevo.

Escenario

La mayor parte de nosotros conocemos las herramientas Windows que existen del estilo N.Gosth para hacer este tipo de labores e inicialmente, por que no decirlo, había pensado en hacer uso de una de ellas. Luego pensé ¿para que leches voy a instalar en Windows ese software (o alguno similar) si con el dd de linux puedo hacer eso mismo?

Con respecto a mi máquina, actualmente dispone de 2 discos SATA2 de 250Gb c/u. En el disco sda tengo instalado Windows y en sdb tengo instalado Linux Ubuntu 10.04 64b. La idea era desde mi flamante Linux generar una imagen del disco sda de forma directa. Así que ni corto no perezoso lanzo la orden para generar la imagen del primer disco sobre el segundo:

Imagen sin comprimir

Esta es la orden que se debe indicar para la generación de la imagen del disco 1 en el disco 2:

dd if=/dev/sda of=./sda.img

Esta es la imagen que usaríamos para restaurar el disco 1:

dd if=./sda.img of=/dev/sda

El problema de esta solución, es que para generar una imagen de un disco de XGb (capacidad de disco) se requieren XGb libres en el disco de destino, y como ya os habréis dado cuenta, no dispongo de ellos. Así que tenemos que de alguna forma comprimir la imagen del disco 1 (sda) para que quepa en el disco 2(sdb) ¿parece bastante lógico, no?

Por lo tanto y dado el problema de espacio planteado, pasamos a la segunda solución, una imagen de disco comprimida, y para ello nos valemos de dd + gzip:

Imagen comprimida

Para comprimir la imagen a medida que la creamos (unas 9h para un disco como el mio)

dd if=/dev/sda | gzip -c9 > sda.gz

Cuando necesitemos recuperar nuestro Windows a partir de la imagen comprimida con gzip:

gunzip -c sda.gz | dd of=/dev/sda

Bueno, espero que este articulo le valga a alguno. Yo ya tengo la imagen del disco lista para usar en el futuro.

Postdata: Esta misma solución que hemos aplicado hoy en el disco completo es de aplicabilidad en una partición de la misma forma. Lo digo para aquellas personas que tienen dividido el único disco del sistema en 2 particiones, normalmente una para Windows y la otra para Linux.

Saludos a todos y hasta la próxima.

En un capitulo posterior veremos como verificar la imagen generada. Con estas cosas hay que ser cauto así que la verificación de lo que hacemos nunca esta de mas.

Convertir archivos dmg (Mac) a img en Ubuntu 9.10 karmic

Hola a todos

Hoy traigo un articulo de conversión de formatos de ficheros. Estos días he descargado lo que se supone la imagen de Mac OS X 10.6.3 y resulta que al extraer el fichero obtengo un dmg (OMG!!!!, esto es la primera vez que lo veo).

Bien, puestos a investigar ya se lo que es, parece que es un fichero de imagen generado en el sistema operativo Mac. Así que raudo me pongo a investigar cómo leches convertir eso en algo compatible con mi bonito Linux.

He encontrado una herramienta que podría servir para el propósito buscado, se llama dmg2iso lo que pasa es que esta discontinuada y en su lugar se ha desarrollado dmg2img en la dirección http://vu1tur.eu.org/tools/ el problema es que el binario que esta en la página solo es para Windows….

Bien como tenemos la suerte de que esta disponible el código fuente, nos lo descargamos y desempaquetamos en el directorio que nos de la gana.

Para compilar la aplicación necesitamos los siguientes paquetes instalados en la máquina : libglobus-openssl-dev, libghc6-zlib-dev y libbz2-dev y por supuesto las dependencias necesarias, así que ejecutamos

sudo aptitude install libglobus-openssl-dev libghc6-zlib-dev libbz2-dev

y a tirar millas…..Esperamos que se instale todo……y cuando termine ya podemos irnos al directorio donde hemos extraído los fuentes para comenzar la compilación. Para compilar y enlazar la aplicación simplemente nos ponemos en el directorio donde hemos extraído los fuentes y hacemos make.

La salida del comando make es la siguiente:

root@ubuntueeebox:~/dmg2img-1.6.2# make
cc -O2 -Wall -s -o vfdecrypt vfdecrypt.c -lcrypto
vfdecrypt.c: In function ‘main’:
vfdecrypt.c:400: warning: ignoring return value of ‘system’, declared with attribute warn_unused_result
root@ubuntueeebox:~/dmg2img-1.6.2#

El resultado de make debería ser un fichero generado en el mismo directorio de los fuentes llamado dmg2img. En el caso de no tener ya el bit de ejecutable, se lo asignamos (chmod).

Ejecutamos la conversión del fichero dmg de la siguiente forma (estoy en el directorio donde se ha generado el binario):

./dmg2img -v /home/eloy/.jd/downloads/h-mosl1063.dmg h-mosl1063.img

Y esta es la salida del comando:

root@ubuntueeebox:~/dmg2img-1.6.2# ./dmg2img -v /home/eloy/.jd/downloads/h-mosl1063.dmg h-mosl1063.img

dmg2img v1.6.2 is derived from dmg2iso by vu1tur (to@vu1tur.eu.org)

/home/eloy/.jd/downloads/h-mosl1063.dmg –> h-mosl1063.img

reading property list, 1826429 bytes from address 6830548239 …
partition 0: begin=120, size=430, decoded=284
partition 1: begin=778, size=430, decoded=284
partition 2: begin=1428, size=430, decoded=284
partition 3: begin=2085, size=187880, decoded=126524
partition 4: begin=190195, size=430, decoded=284
partition 5: begin=190838, size=1629725, decoded=1097564

decompressing:
opening partition 0 …         [2] 100.00%  ok
opening partition 1 …         [2] 100.00%  ok
opening partition 2 …         [2] 100.00%  ok
opening partition 3 …      [3158] 100.00%  ok
opening partition 4 …         [2] 100.00%  ok
opening partition 5 …     [27434] 100.00%  ok

Archive successfully decompressed as h-mosl1063.img

You should be able to mount the image [as root] by:

modprobe hfsplus
mount -t hfsplus -o loop h-mosl1063.img /mnt

Y ahora ya solo queda probar este fichero de imagen a ver si logramos que funcione como debe…..

Saludos a todos y hasta la próxima.

Agfa SnapScan1212u en Lucid (Ubuntu 10.04)

Hola a todos

Resulta que hoy me he puesto a escanear unos documentos que necesito para un curso y el escaner no funcionaba.
Efectivamente la configuración de este escaner ya la había hecho para Ubuntu 9 el problema es que en su día me dio pereza escribir el articulo correspondiente y hoy he tenido que volver a inventar la rueda. Cosas que suelen pasar cuando las cosas no se dejan hechas cuando de debe.

Bien, los pasos que he seguido para la instalación del escanner AGFA SnapScan1212u en lucid han sido:

  • Conectar el escaner a la alimentación y al PC. Verificar que al conectar el escaner al PC con el comando dmesg sale algo similar a:
  • [ 4804.530325] usb 1-5.4: new full speed USB device using ehci_hcd and address 7
    [ 4804.644091] usb 1-5.4: configuration #1 chosen from 1 choice

  • Del disco del escaner he obtenido un fichero de firmware necesario para que el escaner funcione correctamente en Linux. Concretamente el fichero se llama SnapScan1212U_2.bin. De todas formas me ha costado un poco encontrar el puñetero disco, así que aquí dejo el enlace a la descarga del fichero, para poneros las cosas mas fáciles, que para eso estamos. Aquí lo dejo SnapScan1212U firmware (0)
  • El fichero de configuración importante lo podéis encontrar en /etc/sane.d/snapscan.conf. En este fichero si lo abrís veréis que una de las primeras lineas dice algo como:

    firmware ……

    Bien, pues creamos los directorios necesarios /usr/share/sane/snapscan/ y copiamos en él el fichero de firmware del Agfa SnapScan1212u con nombre SnapScan1212U_2.bin

  • Modificamos la linea de firmware del fichero /etc/sane.d/snapscan.conf para que sea como esta (o la que corresponda con la instalación que tu hayas efectuado):

    firmware /usr/share/sane/snapscan/SnapScan1212U_2.bin

  • Ahora ya podéis abrir xsane para ver cómo funciona. Aquí tenéis una captura:


Bueno, saludos a todos y hasta la próxima.