Luisete

De profesión sus labores

  • Aumentar fuente
  • Fuente predeterminada
  • Disminuir fuente
Home Informática
Informática

Arquitectura JSJ

E-mail Imprimir PDF

Aún a riesgo de hacernos caer en un nuevo golden hammer, las anotaciones han venido a salvarnos de la tiranía del XML. La arquitectura JSJ (JSF 2.0+Spring+JPA) permite minimizar el uso de XML de configuración hasta el límite a costa de maximizar el uso de anotaciones, todo ello dentro de una adaptación del patrón MVC model 2.

Lo bonito de todo esto es que por fin vamos a poder desarrollar una aplicación MVC de forma razonable, sin que nos de un soponcio cada vez que tengamos que hacer algún cambio y sin tener que taparnos la nariz.

 

Lo que voy a mostrar a continuación es una gran simplificación. No pretendo ser ni exhaustivo ni preciso , sino expresar la esencia de la arquitectura, aunque a la vez pueda servir de casi tutorial.

En la imagen de la derecha podemos ver un ejemplo muy esquemático de la relación entre capas. Cada rectángulo representa un elemento de cada capa (Web, Control, Servicios, y Persistencia). El modelo se considera transversal, y puede ser utilizado por tanto en cualquier capa.

Persona.xhtml representa una página JSF 2.0 en la que podemos hacer referencia a los llamados ManagedBeans a través del lenguaje EL. Cuando queremos utilizar una referencia a un atributo o un método de un ManagedBean lo hacemos con la forma "#{xxxx}". En este ejemplo vemos que se está solicitando el campo nombre de una entidad persona que forma parte del controlador personaCtl y que ofrecemos un botón que al pulsarlo invocará el método grabar de la clase PersonaCtl.

PersonaCtl.java  es un ManagedBean controlador. Gracias a la versión 2.0 podemos declararlo simplemente con la anotación @ManagedBean sin necesidad de tocar ficheros XML. El ciclo de vida de este objeto va dirigido por JSF y lo podemos matizar para que sea de request, sesión, etc. Dentro de un controlador podemos tener métodos que sean invocados desde las páginas JSF 2.0. El convenio es que el retorno de estos métodos es un String que si no se dice nada en contra podrá ser el nombre de la vista , página web, a la que queremos navegar tras ejecutar la acción. 

Vemos también que declaramos una instancia miembro de PersonaServicio que va precedida de la anotación @ManagedProperty. Mediante esta anotación le decimos a JSF2.0 que nos inyecte una instancia del servicio obteniéndola a través de su EL-Resolver. En este caso la propiedad es un servicio que declaramos con Spring, así que necesitaremos tunear el EL-Resolver de JSF2.0 para que sea capaz de devolvernos Beans del mundo de Spring. Lo veremos más abajo. Mientras tanto tengamos fé.

PersonaServicioImpl es la implementación de un servicio de la capa de la lógica de negocio. El interfaz no lo representamos aquí por ser obvio. Lo importante de esta clase son de nuevo sus anotaciones. A saber. Utilizamos la anotación @Service para  decirle a Spring que esto es un Bean de la capa de servicios. Por defecto creará una instancia única (Singleton) por lo que debemos cuidar mucho no guardar estado en el servicio.

La anotación @Transactional le dice a Spring que antes de invocar a este servicio se inicie una transacción si es necesario. Podemos matizar muchos detalles referentes a la transacción y la propagación. Vamos a quedarnos de momento con el valor por defecto. En defnitiva, que queremos que siempre que se invoque al servicio se haga dentro de una transaccción y que se haga commit automáticamente al terminar excepto si termino con una excepción de runtime. 

Vemos también la anotación @Autowired que es de Spring y le dice a la variable miembro dao que debe ser instanciada automáticamente obteniendo un bean de PersonaDAO. Tengo que ofrecer un método setDao que no está incluido en la imagen para ser lo más concisos posible.

PersonaDAOImpl.java es una clase de la capa de persistencia. Se marca mediante la anotación de Spring @Repository y gracias a ello es inyectable como vimos en el servicio. 

La anotación @PersistenceContext es cuasi-mágica. Gracias a ella Spring nos inyectará automáticamente un EntityManager, pero atención, nos inyecta lo que se llama un Shared EntityManager, el cual permite la concurrencia. Está demostrado que con este mecanismo, dos hilos concurrentes en la práctica es como si tuvieran dos EntityManager diferentes a efectos de aislamiento. Así que gracias a esto no nos tenemos que preocupar de nada.

Por otro lado también será normal tener un DAO genérico del cual podemos heredar para no tener que hacer la implementación de cada DAO, pero esto se sale un poco del tamaño del artículo.

Persona.java es la clase del modelo de datos de nuestra aplicación y se debe anotar con @Entity para que JPA cuente con ella a la hora de persistir. Es obligatorio la anotación que declara el identificador de la clase ó clave principal y muy recomendable la anotación @GeneratedValue para que la clave sea autonumerada. 

Métodos set: Ojo , por razones de concreción no he incluído los métodos set de las propiedades inyectadas en todas las clases anteriores, pero que no se nos olviden que son necesarios unos métodos públicos setXxxx para que Spring nos pueda inyectar sus valores.

Configuración

Hasta ahora no hemos escrito nada de configuración en XML. Solamente tenemos que hacer un truco para poder enganchar JSF con Spring y es declararle a JSF un EL-REsolver de Spring para que pueda encontrar Beans de este segundo y usarlos como propiedades en JSF. Para ello, escribimos el siguiente faces-config.xml:

   <application>
   		<el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
   </application>

Y por otro lado tendremos que tener un mínimo applicationContext.xml en el cual configurar el EntityManager, el DataSource y donde le debemos decir que nos busque las anotaciones por nuestros paquetes para encontrar los beans:

	<context:component-scan base-package="es.microsocial"/>	 
	<context:annotation-config/> 		 	
	<tx:annotation-driven/> 		 	
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">         
		<property name="driverClass"><value>org.hsqldb.jdbcDriver</value></property>        
		 <property name="jdbcUrl"><value>jdbc:hsqldb:hsql://localhost/</value></property>         
		<property name="user"><value>sa</value></property> 
	        <property name="password"><value></value></property>        
		 <property name="properties">             
		<props>                  
			<prop key="c3p0.acquireRetryAttempts">5</prop>            
		 </props>         
		</property>    
	 </bean> 		 		 
	<bean id="entityManagerFactory"      		class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">      
		<property name="dataSource" ref="dataSource"/> 	 
		<property name="jpaVendorAdapter"> 	       
		 <bean 	        class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 	          
			<property name="showSql" value="false" />
	 	        <property name="generateDdl" value="true" /> 	         
			<property name="databasePlatform" value="org.hibernate.dialect.HSQLDialect" /> 	        
		</bean> 	     
	</property> 	
	</bean>  	  
 
	<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 	    
		<property name="entityManagerFactory" ref="entityManagerFactory"/> 	    
		<property name="dataSource" ref="dataSource"/> 	  
	</bean>			 

Finalmente, nuestro web.xml tiene que estar preparado para el uso de JSF 2.0 y de Spring. Se reproducen a continuación las partes clave del web.xml que se refieren a ello:

     <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>Faces Servlet</servlet-name> 		
		<servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
	</servlet> 
	<servlet-mapping> 		
		<servlet-name>Faces Servlet</servlet-name> 	
		<url-pattern>*.jsf</url-pattern> 	
	</servlet-mapping> 	
 

Librerías

La implementación de referencia de JSF 2.0  se llama Mojarra y es la que mejor funciona a la fecha de este artículo. Son simplemente dos ficheros ".jar" que tenemos que tener en nuestro WEB-INF/lib. Se trata de jsf-api.jar y jsf-impl.jar que nos podemos descargar directamente de la página de Mojarra

La implementación de Spring que he utilizado yo es la 2.5 , aunque lógicamente servirá cualquier implementación posterior.

Necesitamos una implementación de JPA que bien puede ser la de Hibernate.

 

 

LAST_UPDATED2
 

Glidik Puzzle

E-mail Imprimir PDF

 

Glidik is the name of a new puzzle game I've invented. I can say it's a mix between tipical 2D puzzle and 3D Rubik’s cube.

The Rules

The game consist of a grid of mxn. Each cell, except one, is occupied by a Cube. Each cube has 6 faces of different color. At the beginning you have all the cubes in the same position, so if you look the game from top side you look all same color.

The goal is to put all the cubes in other color. No matter what color, but other color than the original one.

You can move the cubes beside the whole, but when you do so, the cube rotates 90 degrees.

Following animation shows an example the legal movements:

 

 

The puzzle has solution. I managed to solve it in 31 minutes and 894 movements, but I am not good solving puzzles so I'm sure it's possible to get the solution in much less time and movements. I got the solution trying to get the opposite color of the initial. For example, if at the initial position the top color is red, then the target color was the yellow, which is the color of the opposite side to the red side. 

The solution I achieved only consists of all top faces the same color but the other hidden sides are not ordered. I don't know if it is possible to get all cubes in perfect final position. Maybe some mathematician could tell me if it is posible.

 

The Mobile Game

I don’t know if that puzzle can be built physically, but by programming all is possible.

I've programmed the game for JavaMe. You need a phone with touch screen, and Java Me with M3G library (All Symbian S60v5 I suposse). I tested the game with Nokia 5800, and a friend of mine tested the game with Windows Mobile on a Samsung.

My intention is to publish it free of charge and Open Source with a GPL licence.

The development is in Beta phase, even I must say in a "proof of concept" phase. But You can download the game and test it. Even you can help me send me your opinion, the problems you encountered, etc. Please sendme your feed back to  Esta dirección electrónica esta protegida contra spam bots. Necesita activar JavaScript para visualizarla .

 

Notes on downloading: You don't need to open the file "glidik.jar". Just put it directly to your phone to install it. If your browse decides to open the glidik.jar directly maybe you can avoid it by clicking right mouse button and selecting "Save link as..." or so.

 

 

 

 

 

LAST_UPDATED2
 

Rubik's Cube

E-mail Imprimir PDF

Latest News 

 

  • 30/01/2010: Jutt69, a meber of dailymobile.se have solved the cube in 2.07 minutes !!
  • Released Versión 2.1 with a correct color disposition and improved face rotation in Z axys.
  • Geek, a member of dailymobile forum has been able to solve the cube in 6 minutes.
  • Released Version 2.0 with important improvements in faces movement and added a timer and a movement counter. 
  • Some blogs about mobile technology have informed about this program.
  • The source code has been moved to SourceForge.net and now accepting collaborators.

 

 
Note: This is an english and shorter version of article "EL cubo de Rubik"
 

Description 

 
I've developed the Rubik's Cube game for mobiles with Symbian S60v5 (Nokia 5800, N97, ...). I hope you like it. It's absolutely free. You only have to send me an email if you like it, even if you don't like it.  Any comments are wellcome.
This program is Open Source so you can also download the source code. You can get the source code in SourceForge.
 

Next improvements

I will continue improving the game adding new functionallity, such: 

  1. Rotating cube in z axis.
  2. Button for solving the cube ?
  3. A Timer
  4. What else ?

 

 
 
 
 
 
 
 
 
LAST_UPDATED2
 

El cubo de Rubik en el móvil

E-mail Imprimir PDF

Novedades

Ya está disponible la versión 2.1 que permite ahora un movimiento mucho más natural de las caras. permite mover más caras dada una misma posición e incluye un cronómetro y un contador de movimientos.

He recibido noticias de que un jugador ha conseguido resolver el cubo en solo 2:07, a ver quién lo hace más rápido. Si lo consigue, que me envíe un mensaje a luismiravallesarrobagmail.com.

Descripción 

El cubo de Rubik, como todo el mundo sabe, fue inventado por el señor Rubik, en 1974. Ya llovió. Y todavía hoy hay competiciones para ver quién es capaz de resolverlo en el menor tiempo.

Lo que os presento aquí es un programa para teléfono móvil para jugar con el cubo de Rubik e que intentéis resolverlo.  El programa es minimalista. Solamente te presenta un Cubo y puedes mover sus piezas de acuerdo a las reglas de movimiento del cubo de Rubik. El programa ni te va a contar el tiempo que tardes , ni los movimientos que lleves, ni siquiera te va a felicitar cuando termines de resolverlo.

He escrito este programa para jugar con la tecnología Java M3G (Mobile 3D Graphics) y está compilado en particular para los Nokia S60v5 con pantalla tátil. De hecho para mover las piezas hay que usar el dedo o el puntero.  No he probado a ejecutarlo móviles de otras marcas pero yo creo que mientras tengan soporte de M3G (es decir del JSR184) creo que funcionará.

Se puede descargar el juego gratuitamente, (siempre y cuando me envíes un agradecimiento si te ha gustado :) aquí:

  • El Cubo de Rubik (Fichero .jar instalable de 92 Kb). Mucho cuidado, los que uséis Internet Explorer que os lo dejará con extensión ".zip". El fichero en realidad tiene extensión ".jar". Recomiendo usar otro navegador o bien usar botón derecho "Guardar como..." y elegir el nombre "rubik.jar". Luego ya se puede enviar al móvil para instalarlo.
Tampoco tengo mayor inconveniente en compartir el código fuente, ya que yo también he aprendido con el código fuente de otros que lo expusieron amablemente en la red. 
 

El código fuente

Antes de que te bajes el código fuente, un "disclaimer". No hay comentarios. No me critiquéis por ello. He hecho el programa para divertirme y no me divierte escribir comentarios.

Otra petición. Si lo bajáis, sed respetuosos con la autoría. El código libre es así. Se puede hacer libremente todas las modificaciones que se quiera, pero se debe mantener la referencia al autor del algoritmo. 

El código fuente está en SourceForge. Podeis verlo directamente o bajarlo con SVN. Si queréis colaborar para mejorar el programa escribidme.

Entorno de trabajo

Os cuento un poco el entorno de trabajo que he utilizado por si os viene bien. He utilizado el IDE de Eclipse 3.5 en su  versión exprésamente compilada para desarrollo para móviles. Se llama Pulsar for Mobile Java Developers y te lo puedes descargar gratuítamente desde el sitio de Eclipse.

Por otro lado me bajé el SDK de Nokia N97. Es necesario para poder ejecutar en emulación y lo utiliza el propio IDE Eclipse para construir el ejecutable. 

En el propio SDK de Nokia viene el Javadoc completo de la librería M3G, aunque como casi siempre, esto no es suficiente, así que he tenido que consultar lo poco que hay en Internet sobre M3G y problar muuuucho. Recomiendo este tutorial:

 

Algunas cosas que he aprendido

La programación en 3D para móviles tiene cierto parecido con el OpenGL. De hecho es más fácil pasar de OpenGL a móvil que venir de J3D. J3D es el API estándar que propone Sun para Java fuera del ámbito de los móviles. Estuve experimentándolo un poco y no me gustó . Quizás tenga que darle otra oportunidad. El caso es que me parece bastante diferente con respecto al M3G.

M3G es muy sencillo porque es muy limitado, pero eso lo hace muy interesante, ya que te enfrentas solamente a una veintena de clases. El hecho de ser para móviles le obliga a ser conciso. No hay un montón de patrones implementados como cabría esperar de una librería de Java normal. Aquí se va al grano.

La sencillez de la librería es virtud pero también pecado. Para crear una formar en 3D hay que trabajar directamente con triángulos. No hay librerías de primitivas. En mi caso ha sido sencillo porque solamente tuve que trabajar con planos colocados en las 3 dimensiones. Me copié el código que genera un plano de 1x1 y con ello tiré. Pero si hay que programar figuras más complejas entonces convendrá dibujarlas con algún editor 3D y exportar la figura al formato m3G que es capaz de leer esta librería.

Me tuve que pegar bastante con las transformaciones, en especial las rotaciones. La rotación de las caras del cubo fue un suplicio. Intenté hacerlo utilizando la clase Transform pero no fuí capaz. Al final descubrí que las rotaciones que se pueden conseguir con esta clase son rotaciones con respecto a si mismo de cada objeto. No se puede utilizar para rotar respecto a un punto separado del objeto. Finalmente tuve que rotar utilizando una multiplicación de matrices un poco fuera de los recursos que ofrece la librería. Todo este follón quizás tenga algo que ver con el hecho de que en el mundo 3D soy un aficionado.

Una de las cosas más complejas ha sido la interacción.  Es dificil manejar un objeto 3D desde una pantalla 2D. Los gestos con el puntero son muy dificiles de trasladar al movimiento 3D. En 2D los movimientos en el eje y,x son ambiguos. Puse a probar el juego con usuarios y fracasé varias veces porque no conseguía que supieran deducir cómo funcionaba el movimiento y no conseguí en ningún caso que el primer gesto guiado por la intuición respondiera a lo que el usuario esperaba. Al final lo cambié todo. En la versión 2.0 espero tener éxito porque ahora se mueve como teóricamente esperan los usuarios, pero sólo teóricamente. En el momento de escribir esto , no está probado con usuarios.

Aunque este programa lo he creado para divertirme a veces uno piensa si debe pedir dinero por ello o no. La tentación de intentar venderlo se me ha quitado de la cabeza al saber lo que tengo que hacer para publicar el programa en un sitio como Ovistore. Ovistore es un sitio como el AppStore de Apple pero en este caso de Nokia. Es como un almacen enorme de aplicaciones para el móvil. Lo bueno de este almacen es la visibilidad que tiene, porque todos los móviles se venden configurados con enlaces hacia a él. Pues bien, para poder colgar un programa en este almacen hay que:

 

  1. Pagar a Nokia 50€ por registrarse. Luego, Nokia se queda el 30% de las ventas.
  2. Un requisito es que el programa debe estar firmado digitalmente. Para conseguir un certificado válido se necesita comprar a una entidad cerificadora reconocida como verisign. Estamos hablando de 500€. La verdad es que en esto de la firma digital  patino un poco. En este momento no sé si se podría firmar un ".jar" con el certificiado digital del DNI electrónico ya que es gratis. Por favor, si alguien lo sabe que me lo diga. Lo busqué por Internet, pero no lo encontré.

 

Otros Cubos

Sé que no soy el único. De hecho ya he encontrado un par de Cubos de Rubik para Móvil:

  • Offscreen Technologies tiene un Cubo de Rubik para Symbian . Está muy logrado.
  • En el OviStore de Nokia también puedes encontrar otro Cubo de Rubik de 2, 3, y 4 piezas por lado.
  • Destacar también este Applet que se Josef Jeniskel que está muy logrado. Al ser un Applet lo podemos ejecutar desde el navegador.
Además es digno de ver:
  • El Rubik's Touch Cube roza ya la esquizofrenia. Es un cubo de rubik real, con forma de cubo, pero sus caras son virtuales. hay que verlo para entenderlo.

Curiosidades

¿ Sabías que ?

 

  • El record del mundo de resolución del cubo está en 8.72 segundos.
  • El número de combinaciones posibles del cubo supera el trillón.
  • Un niño de 12 años encontró un algoritmo para resolver el cubo, y lo publicó allá por los años 70 y fué un éxito mundial.
  • Se ha demostrado que en el peor de los casos el cubo se puede resolver en 23 movimientos.

 

Mejoras futuras

Si me animo me gustaría hacer las siguientes mejoras:

 

  • Añadir un botón para resolver el cubo.
  • Hacer el cubo con fotos en vez de poner colores.

 

 

 

 

 

 

 

LAST_UPDATED2
 

Connect4

E-mail Imprimir PDF

(This is a reduced english version of the article "Cuatro en raya", sorry for my bad english)

Connect4 is a simple turn game. The goal is to put 4 counters aligned horizontally , vertically or diagonally. 

I've developed this game for the Symbian S60V5 mobile operating system using JavaMe with the eSwt library, so you can use the 360x640 resolution and use the touch display to play if you have a Nokia 5800, N97, or so.

You play against the machine. It is difficult to win but it's possible. Try it. 

You can download here: 

  • Connect4 . This is a Jar File you can install directly on your mobile.
Also, if you like programming, you can get the source code :
  • Juego.java : Graphic layer of the game, responsable of the user interface.
  • Modelo.java : Thinking layer of the game. The strategy algorithm is implemented here.
  • Main.java Main program. Acts as a container of the game in the Midlet.
Hope you like it. 
  
More details in Spanish in this page: Cuatro en Raya 
 

 


JPAGE_CURRENT_OF_TOTAL