23 April, 2008

Sistemas de plantillas para PHP o PHP como sistema de plantillas

Cuantas veces este ha sido motivo de debate. ¿Merece la pena utilizar un sistema de plantillas estilo smarty para php?. ¿Acaso no es php un lenguaje de script suficientemente limpio y potente como para poder valerse por si solo como motor de plantillas?. ¿Que diferencia encontráis entre estas 2 lineas?:

  1. <div>{nombre}</div>
  2. <div><?=$nombre?></div>

¿De verdad creéis que la primera es mas sencilla?.

Como ya habréis intuido yo nunca estuve de acuerdo en utilizar un lenguaje añadido de plantillas, básicamente porque no me aporta nada. Por supuesto que estoy de acuerdo en separar las capas de presentación y lógica pero esto lo podemos hacer tanto con php como no hacerlo con cualquier motor de plantillas. Todo depende de como lo utilicemos.

Pero yo prefiero esto:

  1. //posts.php
  2. $posts = getPosts();
  3. include("posts.html");

  1. //posts.html
  2. <?foreach( $posts as $post);?>
  3.      <h1><?=$post->getTitle()?></h1>
  4. <?endforeach;?>
  5. </div>

y no esto:

  1. //posts.php
  2. require("smarty/Smarty.class.php");
  3. $template = new Smarty;
  4.  
  5. $template->template_dir=".";
  6. $template->assign("posts",getPosts);
  7. $template->display(posts.html);

  1. //posts.html
  2. {foreach from=$posts item=post}
  3.      <h1>{person.getTitle}</h1>
  4. {/foreach}
  5. </div>

Por cierto tanto cakephp como zend framework han adoptado la primera opción de forma nativa, lo que no quiere decir que no existan plugins para poder utilizar algún lenguaje propio de plantillas.

22 April, 2008

Ejemplo EJB stateless

Lo prometido es deuda y ahora q se me ha pasado la vagancia y además tenía un ratillo libre (combinación compleja donde las halla) ;-) os dejo un ejemplo de un ejb sin estado (stateless).

Yo he utilizado jboss en su última versión estable (4.2.2.GA) como contenedor del ejb, para utilizarlo solo teneis que descargaros una copia y arrancar ejecutando /bin/run.sh, ¿fácil verdad?. Podriamos haber utilizado glassfish, que en ubuntu se queda la instalación en un maravilloso apt-get install glassfish, pero si os parece eso lo dejamos para otro día.

Vamos con nuestro ejb.

Primero nos creamos el bean que encapsula toda nuestra lógica de negocio. En este caso tendremos solo 2 métodos, para sumar y restar 2 números (operaciones básicas de toda calculadora).

  1. package net.jsanroman.ejb3stateless.ejb.stateless;
  2. import javax.ejb.Stateless;
  3. import net.jsanroman.ejb3stateless.ejb.interfaces.CalculadoraLocal;
  4. import net.jsanroman.ejb3stateless.ejb.interfaces.CalculadoraRemote;
  5.  
  6. @Stateless
  7. public class CalculadoraBean implements CalculadoraRemote, CalculadoraLocal
  8. {
  9.     public static final String RemoteJNDIName = CalculadoraBean.class.getSimpleName()+"/remote";
  10.     public static final String LocalJNDIName = CalculadoraBean.class.getSimpleName()+"/local";
  11.  
  12.     public int add( int x, int y ){return x+y;}
  13.     public int subtract (int x,int y){return x-y;}
  14. }

Destacar el uso de la anotación @Stateless para indicar el tipo de ejb que estamos creando.

A continuación creamos las interfaces CalculadoraLocal y CalculadoraRemote para indicar que métodos serán accesibles desde el propio contenedor o desde fuera y que serán implementadas por nuestro bean anterior.

En nuestro caso solo nos interesa acceder desde remoto pues haremos las pruebas desde un script fuera de nuestro contenedor.

  1. package net.jsanroman.ejb3stateless.ejb.interfaces;
  2. import javax.ejb.Local;
  3. @Local
  4. public interface CalculadoraLocal { 
  5. }

  1. package net.jsanroman.ejb3stateless.ejb.interfaces;
  2. import javax.ejb.Remote;
  3. public interface CalculadoraRemote {
  4.     public int add(int x, int y);
  5.     public int subtract( int x, int y);
  6. }

Ya tenemos nuestro ejb creado, lo empaquetamos en un .jar (tareilla ant) y lo soltamos en jboss/server/default/deploy. Si nos fijamos en el log de jboss podremos averiguar si se ha producido algún error, pero para estar completamente seguros nos vamos a la jmx-console http://localhost:8080/jmx-console/ y comprobamos si se ha cargado nuestro ejb, en mi caso aparecen estas lineas que indican que está listo para ser utilizado:

# jar=ejb3_stateless_calculadora.jar,name=CalculadoraBean,service=EJB3
# module=ejb3_stateless_calculadora.jar,service=EJB3

Llegados a este punto tan solo nos queda desarrollar un sencillo cliente que haga uso del ejb recién creado. Con una simple clase que muestre el resultado por consola es suficiente para esta prueba:

  1. package net.jsanroman.ejb3stateless.client;
  2. import java.util.Properties;
  3. import javax.naming.Context;
  4. import javax.naming.InitialContext;
  5. import javax.naming.NamingException;
  6. import net.jsanroman.ejb3stateless.ejb.interfaces.CalculadoraRemote;
  7. import net.jsanroman.ejb3stateless.ejb.stateless.CalculadoraBean;
  8. public class CalculadoraClient {
  9.     public static void main(String [] args){
  10.         Properties properties = new Properties();
  11.         properties.put("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");
  12.         properties.put("java.naming.factory.url.pkgs","=org.jboss.naming:org.jnp.interfaces")
  13.         properties.put("java.naming.provider.url","localhost:1099");
  14.         Context contexto = null;
  15.         try{
  16.             contexto = new InitialContext(properties);
  17.             CalculadoraRemote beanRemoto = (CalculadoraRemote)
  18.             contexto.lookup(CalculadoraBean.RemoteJNDIName);
  19.             int resultado = beanRemoto.add(1, 9);
  20.             System.out.println("El resultado es:"+resultado);
  21.         }
  22.         catch( NamingException e )
  23.         {
  24.             e.printStackTrace();
  25.         }
  26.     }
  27. }

Simplemente destacar la linea contexto.lookup(CalculadoraBean.RemoteJNDIName); causa de posibles rompederos de cabeza y que nos da acceso a nuestro ejb.

Ala y ahora a hacer pruebas con los diferentes ejb's, el ejb-ql, a probar desde otra máquina, y lo que se nos ocurra.

21 April, 2008

Cambio de fecha/hora permanente en gnu-linux

Gnu linux

Logos GNU LinuxUn apunte rápido a esta utilidad, hwclock, que nos permite cambiar la fecha/hora del reloj del sistema hardware. Por ejemplo:

  1. // Cambiamos la fecha/hora del sistema
  2. date –set "2008-04-21 10:30"

  1. // Cambiamos la fecha/hora de nuestro Reloj del Hardware (RTC)
  2. hwclock –set –date="2008-04-21 10:30"

Con esto la próxima vez que reiniciemos también tendremos nuestra fecha/hora actualizada.

18 April, 2008

De nuevo online

Como habéis podido comprobar en los últimos 3 días este espacio ha sufrido continuas perdidas de conexión. Y todo debido una vez mas, como no, a la ineficacia de otro proveedor de hosting, no voy a dar nombres, para que, si al final todos son igual de malos, son buenos hasta el día que te dejan tirado, y creedme que esto sucede siempre tarde o temprano.

Para poneros en antecedentes todo sucedió cuando muy amablemente consulte la posibilidad de disponer de una máquina que corriera php5.x, ¿petición de lo mas lógica a día de hoy verdad?, a lo que me respondieron (y en un buen español :-)) que si, que podían cambiar mi plan de máquina y tendría mi espacio corriendo en php5. Dí permiso para cambiar mi espacio a esa máquina, siendo consciente de que este blog estaría un rato caído, un rato pensaba!!!, después de medio día sin noticias volví a enviar un ticket pidiendo una estimación aproximada sobre la nueva publicación en la nueva máquina, la respuesta no tardó ni 2min en llegar, su máquina esta lista!! me dicen todos contentos, es que si no pregunto a día de hoy estoy esperando todavía.

Al final, después de muchos problemas con los nuevos DNS del dominio conseguí que todo volviera temporalmente a la normalidad. Y digo temporalmente porque después de 1h+- de correcto funcionamiento todo volvió a fallar, primero un dominio luego otro y otro hasta que jsanroman.net solo mostraba un "Welcome jsanroman.net" como habéis podido comprobar. Todavía estoy a la espera de la respuesta a mis 4 tickets a soporte pidiendo amablemente ayuda primero, y explicaciones, amablemente también, después.

Como comprenderéis mi decisión no podía ser otra que migrar, escapar!!!, primero transferimos el dominio y luego el hosting y cada a uno a un lugar diferente, para minimizar posibles problemas futuros.

Ahora todo vuelve a la normalidad, esperemos que por una buena temporada. Eso si, lo conseguimos, tenemos php5! y wordpress actualizado a 2.5!, versión que corrige importantes agujeros de seguridad respecto a la antigua versión de este blog y facilita enormemente la gestión del mismo desde su renovado panel de control.

Y no enrollo mas, a ver si estos próximos días escribo las 3 semanas que ya tengo atrasadas sobre el curso de j2ee, y alguna cosilla mas que tengo en la recamara, aunque antes todavía me quedan 2 practicas por enviar a mis profesores de la uoc.

Buen fin de semana a todos!

7 April, 2008

Experiencias con java y el escritorio

Logo Java

Como pasa el tiempo.

Ya van casi 4 años desde que comencé a hacer mis pinitos en java swing con aquel entrañable fmap(algún día tendréis noticias de el). Por aquella época programaba con struts y junto con algún que otro pequeño script en java habían sido mis únicas experiencias con este lenguaje. Me decidí entonces a conocerlo un poco mas a fondo (con struts siempre era lo mismo: modelo, actions, daos, mapeo struts-config.xml y a la vista jsp, html, javascript, etc. Puras aplicaciones de gestión) y como en la empresa para la que trabajaba no tenía la oportunidad no se me ocurrió mejor forma que plantearme un pequeño proyectillo personal utilizando swing para ir haciendo cosas prácticas.

Al principio me golpee varias veces con los layouts siempre engorrosos de swing, y al final cuando ya le había cogido el truco apareció matisse, tan bueno me pareció este diseñador de interfaces que acabé por sustituir todo mi trabajo anterior por una esplendida y sencilla interfaz "matisse".

Fué en esa época en la que aprendí a utilizar los hilos en java (mi pequeña aplicación no se podía congelar recorriendo un sistema de ficheros!), a utilizar los listeners swing, a utilizar apache derby, a conocer mas a fondo los típicos componentes (jlist, jtree, jbutton, etc...), a tener mucho cuidadito con el consumo de memoria (java se encarga de la memoria si, jejeje, pero no siempre cuando tu quieres), a utilizar el patrón singleton, etc.

En fín, que desde entonces hasta ahora no fueron demasiados los avances en la librería de escritorio oficial de java, que por otro lado siempre ha ido detrás de las librerías gráficas y lenguajes nativos de cada S.O. Quizás el mas destacable antes de java6 fue la aparición allá por el 2006-2007 del swing application framework para intentar poner un poco de orden en todo lo que se hacía con swing. Mediante este framework se nos guía acerca de creación de acciones (listeners) mediante anotaciones, manejo de recursos, uso de tareas(hilos), persistencia de datos, y nos provee de una arquitectura básica inicial con una serie de métodos predefinidos que conforman el ciclo de vida de la aplicación: launch, initialize, startup, ready, exit, shutdown.

Pero con java 6 se introducen novedades importantes: las nuevas clases SystemTry y TryIcon nos permiten enviar la aplicación al área de notificación de tu S.O. y a través de la Desktop Api podremos interactuar con determinados servicios del S.O.

Lo que parece claro es que el futuro de swing pasa cada vez mas por una mayor integración con el S.O. a todos los niveles, esperamos acontecimientos.

http://www.netbeans.org/kb/60/java/gui-db

http://www.netbeans.org/kb/60/java/gui-saf.html

https://appframework.dev.java.net/intro/index.html

http://java.sun.com/developer/technicalArticles/javase/swingappfr/#code9

Powered by WordPress
Bajo licencia Creative Commons
Contacto sanroman.javier at gmail.com