domingo, 20 de febrero de 2011

El patrón Observer (Observador)

Que no, que no se me ha olvidado que tengo un blog que mantener. Lo que pasa es que uno tiene muchas ocupaciones e historias variass y no puede atender a todo, jejeje. Pero ya estoy aquí de nuevo, y para añadir una nueva entrada, esta vez sobre informática que la tenía muy abandonada (y mi amigo Longi decía que ya no le escribía nada, así que esta entrada va para él).

Siguiendo con mi afición por la Ingeniería del Software y mi afán por las buenas prácticas de la programación, vuelvo a hablar sobre un patrón de diseño. Esta vez el patrón en cuestión es el llamado patrón Observador.

Bien es sabido por todos los entendidos en Ingeniería del Software, que las capas de dominio o negocio (en MVC el modelo) nunca deben conocer a las capas de presentación (en MVC la vista). Con esta medida básica se evita bastante acoplamiento en los sistemas desarrollados. Sin embargo, en ocasiones es necesario que la capa de dominio notifique a la capa de presentación un cambio de estado en el sistema. Puesto que ya hemos dicho que la capa de dominio de tocar a la capa de presentación, pupa no se hace, vamos a necesitar un intermediario, que vaya que casualidad va a ser la propia clase de presentación, eso sí, con un truco del almendruco. El truco es utilizar una interfaz llamada Observador, que será a la que realmente  accederá la clase de Dominio. La clase de dominio utilizará al Observador para notificar a la clase de presentación el cambio de estado. En el siguiente diagrama de clases se puede ver el diseño de una arquitectura que utiliza el patrón Observador.


Como se puede ver, las clases de presentación implementan la interfaz Observador y el método notificar que esta interfaz define. La clase de dominio tendrá una lista de Observadores que utilizará cuando tenga que notificar un cambio de estado.

Un sistema en el que puede ser útil este patrón es aquel que implementa un programa de gestión de entradas para eventos deportivos. Las entradas pueden ser compradas por móvil, desde la web o desde un terminal de venta situado en una taquilla. Desde cada aplicación podrá verse en todo  momento los asientos libres. Si desde una aplicación móvil se reservase en un momento dado un asiento para un evento, el resto de aplicaciones (otras móviles, web o de escritorio) que estuvieran corriendo y mostrando información a otros usuarios deberían ser notificados y actualizar el estado de asientos libres. Con el patrón Observador esto sería posible.

El estado de las reservas de entradas estaría almacenado en un servidor. Este servidor tendría en todo momento una lista almacenada de Observadores. Cada observador sería una aplicación móvil, web o de escritorio que estuviera conectada al servidor en ese mismo momento. Cuando una de estas aplicaciones reservara una entrada para un evento, el servidor actualizaría todos sus observadores, por medio de sus respectivos métodos notificar. Así la aplicación móvil actualizaría la pantallita del dispositivo en cuestión, la aplicación web actualizaría un tabla, y la aplicación de escritorio actualizaría por ejemplo un listbox.

Con el patrón Observador, se eliminan también esperas activas, realizando las notificaciones por interrupción ya que las llamadas se hacen mediante callbacks.

Para esta entrada no he preparado código. Aún así en el enlace de Wikipedia que he añadido anteriormente podréis ver ejemplos.

Ante diversas dudas que podáis tener, no dudéis en dejar vuestros comentarios.

Saludos y hasta la próxima.

domingo, 16 de enero de 2011

OBJETIVO CUMPLIDO!!!!!!!

Costó mucho, pero al final lo conseguí. Acabé los 20 km y por debajo (por poco, pero por debajo) de 2:10:00, exactamente 2:09:23.1.  La verdad que salio todo casi clavado a como lo quería. No estaba, a priori, para ir a menos de 6:30 el km en un 20, pero conseguí ir entre 6:20 y 6:30 casi todos los kilómetros. Excepto el primero que salió a 6:10 y los tres últimos que intuyo  que estuve cerca de 7:00 (y digo intuyo porque ya la cabeza no llevaba para hacer cálculos) los demás el ritmo fue muy parejo.

¿El puesto? El último, por supuesto. Pero ayer mi competición no era por obtener un buen puesto, si no por superarme a mí mismo, y hacerme creer que podía ser capaz de hacer un 20 después de tanto tiempo alejado del atletismo. Aún así tuve una pequeña recompensa. Estábamos cuatro atletas de Castilla La Mancha, y dos eran promesas. Y dio la casualidad de que separaron las clasificaciones de promesas y senior del Campeonato Regional. Así que por este año soy el Subcampeón de Castilla La Mancha Senior de Marcha Atlética en Ruta. Jejejeje. Parece que no tiene mérito, ya que llegué el último, pero había que apretarse 20 km y aguantar las agujetas que estoy sufriendo hoy domingo y que sufriré mañana lunes.

Del resto de la carrera comentar la ya esperada victoria de José Ignacio Díaz Velázquez que a medio gas (o al menos eso creo yo), hizo una gran marca de 1:29:51 (solamente me sacó una diferencia 39 minutos y 28 segundos y seis vueltas dobladas - adviértase ironía -). Bromas aparte,  fue un honor tenerlo en la carrera y por supuesto compartir podio con él.

En categoría senior femenina una sola atleta, Samantha Mulloni. Pero un carrerón haciendo 1:45:40. 

Para el año que viene animo a todos los marchadores a venir a competir a Campo de Criptana. Se ha visto que podemos organizar una buena carrera de marcha, e incluso de organizar un 20. 

También agradecer a nuestros amigos de Cuntis su presencia un año más. Llevan ya años siendo el alma de la prueba y no me imagino un año la prueba de marcha sin ellos. De nuevo gracias.

Además agradecer a todo el público, atletas y gente que pasaba por allí el ánimo que me dieron. Mira que tiene que ser aburrido estar esperando a que un tío solo acabe una prueba de 20 km. Y allí estuvieron dándome las fuerzas que en los últimos kilómetros ya me iban faltando. De hecho llegando a meta se me llegaron a poner los pelos de punta.

Gracias también a la gente del Club de Atletismo por su apoyo, y a Nacho mi entrenador que en cada vuelta estuvo ahí apoyando.

En los siguientes enlaces podréis ver los enlaces con fotos de la prueba. El primer enlace son fotos sacadas por mi hermano, el segundo enlace es gentileza de AEMA, que sigue apoyando a la marcha atlética y a todos los marchadores allá adonde va.



Foto realizada por Luis Maroto (AEMA)

viernes, 14 de enero de 2011

PREVIA MARCHA ATLÉTICA VILLA DE LOS MOLINOS 2011

Buenas a todos mis lectores. Estamos a un día de la disputa del regional de marcha y ya estoy nervioso. Hace ya 5 años que no  corro un 20 y mañana vuelvo a ello. ¿Expectativas? Pues acabar, cueste lo que cueste (dentro de los límites de la cordura) y tarde lo que tarde. Siento penita por los pobres organizadores que van a tener que estar esperando hasta que acabe y es que previsiblemente  me vaya más allá de las dos horas (sobre las 2h 10 min).

No pasa nada, lo tengo asumido y para mí el mayor premio será finalizar la carrera. Será un paso hacia adelante y un aliciente para hacer mejores marcas en el futuro.

Además viendo los atletas inscritos (faclm.com/doc/inscripciones/11/marcha_crip.xls). Veo que me voy a quedar más solo que la una los últimos 5 km. Y es que este año ha subido un poquito el nivel de la prueba, gracias a la presencia de dos grandes marchadores a nivel internacional. Uno de ellos es habitual en las convocatorias de la Selección Española para Mundiales y Europeos, hablo de José Ignacio Díaz Velázquez. El otro es un antiguo medallista de bronce europeo en Stuttgart en 1986 y uno de los mejores marchadores españoles de siempre, me refiero a Miguel Ángel Prieto. 

La verdad que el añadir la prueba de 20 km ha podido a hacer que muchos atletas se echen para atrás. Sin embargo, creo que ha servido para añadir un punto de nivel a la prueba.

Pase lo que pase os daré la oportuna crónica mañana al finalizar la carrera.

Un saludo y hasta otra.

P.D.: No he hablado sobre la San Silvestre, pero es que no he tenido tiempo. En próximas entradas haré una breve crónica.


viernes, 31 de diciembre de 2010

Feliz 2011!!!!!!!!!!

Pues al igual que felicité la Navidad hace una semana, aprovecho para felicitar el Año Nuevo. Podría haber hecho las dos cosas en la misma entrada, pero oye, cada cosa en su momento.

Otro año que se va y otro año que viene. Cosas que dejas atrás y cosas que esperas que lleguen. En lo que a mí respecta este año, y más concretamente  en marzo, se me acaba el chollo del Carnet Joven. ¿Qué quiere decir eso? Pues que ya hago 26 años, que en términos matemáticos si lo divides entre 10 y redondeas a entero te queda 3, y en términos de Ingenieros de la Calle, quiere decir que me acerco peligrosamente a los 30 años. ¡¡Vaya Tela!! Pero sin complejo ninguno. Que yo siempre he dicho que tengo que llegar a los 100 años y a partir de entonces me consideraré viejo. Luego la vida dirá.

¿Qué espero del 2011? Pues lo de siempre salud, dinero y amor, como rezaba la mítica canción de los años 60 de Cristina y los Stop. Más detalladamente, seguir creciendo como persona, aprender cada día un poquito más y que la gente que me quiere siga haciéndolo.

A nivel deportivo, pues seguir disfrutando del deporte, intentar coger la forma de antaño y a corto plazo poder con esos 20 Km Marcha.

Para todos vosotros únicamente deseo lo mejor que puedo desear para mí. Salud que no faltE nunca. Mientras haya salud se puede hacer el resto de cosas. Trabajo, sobre todo en estos tiempos de crisis. Y amor mucho amor, que es lo que más falta hace en este mundo lleno de guerra, odio y rencor.

Así que lo dicho ¡¡¡¡ FELIZ 2011!!!!.... y cuidado con lo que bebemos y la cantidad, que una noche de fiesta tiene que ser eso, de fiesta.

viernes, 24 de diciembre de 2010

Feliz Navidad !!!!!!!!!!!!!

Aprovecho que este año tengo mi espacio en la red para felicitar la Navidad a todo el mundo y en especial a atletas, sobre todo marchadores, e informáticos.

No para todos la Navidad significa lo mismo. Para unos es una época de amor, para otros es sólo consumismo, para algunos simplemente vacaciones e incluso hay gente para la que la Navidad significa tristeza y nostalgia.

A mí la verdad que ha significado un poco de todo. Aún así es un momento para aprovechar estar con la familia y si puede ser con el resto de seres queridos y para recordar que la vida hay que vivirla con ilusión y con alegría, aunque muchas veces tengamos todo de frente y hay que luchar para no venirnos abajo. Si obramos bien siempre tendremos nuestra recompensa.

Un saludo y FELIZ NAVIDAD!!!!!!!

viernes, 10 de diciembre de 2010

Marcha Atlética Espada Toledana 2010

Hola a todos!!! Pues vuelvo con fuerza para añadir al blog mi primera entrada sobre atletismo. Y como no, la primera va a ser de ....(tambores).... MARCHA ATLÉTICA!!! Qué para algo soy Franjo Marchador, jejeje. 

Pues el tema a tratar es mi participación en la marcha atlética Espada Toledana que se celebró el pasado sábado 27 de noviembre. La verdad que en una tarde bastante fresquita, sobre todo a la hora de la competición, tengo que decir que el resultado fue positivo. 30:02, todavía lejos del 25:47 que hice en 2005 y del 24:51 que acredito como mejor marca en 5 km marcha. Pero claro, esos tiempos los hacía con 10 kilos menos que ahora y antes de estar tres años parado para acabar la carrera.

Centrándonos en las condiciones actuales, hay que decir que la marca muestra que estoy en buena progresión para volver a hacer esas marcas (o por lo menos acercarme). Si comparamos con la marca hecha en esta misma carrera el año pasado ( mi primera carrera después de los tres años de parón) he mejorado 1:05 y de no ser porque fui solo desde casi el km 2, podría haber bajado de 30 minutos. Luego tuve un fallo, y es que no miré en ningún momento el cronómetro, que me hubiera dado referencias y con las que hubiera dado el todo por el todo. ¡Qué pardillo!  Parece mentira que lleve 10 años haciendo marcha atlética y 12 haciendo atletismo. De todas maneras quedé contento con la carrera.

Siguiendo con la marcha, una buena noticia. Y es que a pesar de las malas pretensiones de algún que otro responsable del deporte en Campo de Criptana, este año y como se viene haciendo desde hace 22 ediciones y desde 2003 en un circuito urbano homologado, se volverá a celebrar la Marcha Atlética Villa de los Molinos. Este año vuelve a ser también el regional de Castilla La Mancha. Y como novedad, la categoría absoluta se va a disputar sobre la distancia de 20 km. Buen aliciente para la gente de fuera que quiera venir a hacer marca para el nacional de Benicasim y sobre todo para la prueba que creo que le dará algo más de prestigio (prestigio que hemos estado a punto de perder gracias ciertos personajes que parece que quieren cargarse el atletismo en Criptana).

También indicar que la distancia de 20 km es un aliciente para mí. Otra cosa es que consiga acabar la prueba, porque llevo desde el Campeonato de España de León en 2006 sin hacer un 20 y este año aunque estoy entrenando, no estoy haciendo muchos kilómetros. Pero todo se intentará y si tardo 2h 20 o 2h 30, pues bueno será porque habré acabado, y será otro puntito a mi progresión para volver a ser el que era.

Ya os iré contando más cosas sobre la prueba. Mientras tanto os dejo una foto de mi participación en la prueba de Toledo que ha sido cedida por Luis Maroto de aemarcha, al cual le agradezco no solo la foto, si no que también junto al resto de miembros de aemarcha sigan promocionando esta bella especialidad. (Yo soy el de blanco, rojo y negro, para el que no me conozca).


sábado, 27 de noviembre de 2010

Un Agente CRUD para el uso de Hibernate

Buenas de nuevo. Después de tanto tiempo vuelvo a incluir una nueva entrada. Perdón a los que habéis estado esperando tanto tiempo (según mis cuentas solo mi amigo y compañero Longinos), pero ya tengo preparadas una serie de entradas nuevas con las que ir entreteniéndoos. Adelanto que alguna de ellas no será de informática, para los que esperan ansiosos (todavía solo mi novia, jejeje) que les hable de otros temas.

La presente entrada trata sobre Hibernate. Para los que no conozcan lo que es Hibernate, comentar brevemente que es una tecnología de mapeo objeto-relacional implementada para Java. También existe una versión para .NET llamada NHibernate.

En resumidas cuentas, Hibernate es una herramienta que nos permite abstraer la capa de Persistencia de nuestros programas y aplicaciones, de manera que por ejemplo, para guardar la información de un determinado objeto en base de datos no tenemos primero que serializar el objeto en una consulta SQL y después ejecutarla, si no que directamente "guardas el objeto en la base de datos".


Esto se realiza a groso modo relacionando las tablas de la base de datos con las clases persistentes del programa mediante ficheros XML.

Hibernate es muchísimo más complejo de lo que he explicado de manera somera en los anteriores párrafos. Hay por la Web muchos tutoriales sobre esta tecnología que os pueden dar más información teórica. Yo como chico práctico que soy, voy a ir a eso, a enseñaros cosas prácticas que podáis utilizar directamente en vuestros programas.

Por lo tanto, lo primero sobre Hibernate que voy a añadir va a ser un Agente CRUD (Create, Read, Update, Delete), con el cual vais a poder abstraer en una sola clase el acceso a una base de datos utilizando Hibernate.

Este agente está hecho a partir de la clase HibernateUtil, que se crea automáticamente en muchos entornos de desarrollo, y el objetivo es crear las cuatros funciones  básicas de acceso a una base de datos, como son Insertar, Leer, Actualizar y Borrar.

Los que leísteis mi entrada anterior (y los más avanzados en conocimientos de Ingeniería del Software), comprobareis que esta clase implementa el patrón Singleton, lógico, ya que no vamos a querer por seguridad que dos instancias accedan a la vez a la base de datos.

Aquí os muestro el código.
import java.util.ArrayList;
import java.util.List;

import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
import org.hibernate.collection.PersistentSet;



/**
 * Clase Agente que permite el acceso a una base de datos relacional utilizando Hibernate.
 * Incluye las  cuatro funciones básicas de acceso a una base de datos como son Insertar,
 * Consultar, Editar y Borrar.
 * Implementa el patrón Singletón de manera que solo haya una instancia, y no haya conflictos
 * en el acceso a la BBDD.
 * @author Franjo
 *
 */
public class Agente {
 private SessionFactory sessionFactory;
 protected static Agente instancia;
 
 public static Agente getAgente() {
  if (instancia==null) 
   instancia=new Agente();
  
  return instancia;
 }
 
 /**
  * Constructor que configura hibernate para que la comunicación sea correcta
  */
    protected Agente(){
        try {
            sessionFactory = new Configuration().configure().buildSessionFactory();            
        } catch (HibernateException e) {
            e.printStackTrace();
        }
    }
    
    
    /**
     * El método insertar, añade el objeto que tiene por parámetros mediante el método
     * save de hibernate
     * @param obj, el objeto que se desea insertar
     */
    public void insertar(Object obj) {
        try {
            Session session = sessionFactory.openSession();
            Transaction tx = session.beginTransaction();
            session.save(obj);
            tx.commit();
            session.close();
        } catch (HibernateException e) {
            throw new RuntimeException(e.getMessage());
        }
    }
    
    /**
     * El método select, realiza la consulta que hay por parámetros como String mediante
     * el método find de hibernate 
     * @param sql, es la sentencia SQL que debe ejecutar el agente
     * @return Lista de objetos que da como resultado la consulta
     */
    public List select(String sql) {
        try {
            Session session = sessionFactory.openSession();
            Transaction tx = session.beginTransaction();
            List result = session.find(sql);
            tx.commit();
            session.close();
            return result;
        } catch (HibernateException e) {
            throw new RuntimeException(e.getMessage());
        }
    }
    /**
     * El método editar, modifica el objeto que tiene por parámetros mediante el método
     * update de hibernate
     * @param obj, el objeto que se desea editar
     */
    public void editar(Object obj) {
        try {
            Session session = sessionFactory.openSession();
            Transaction tx = session.beginTransaction();
            session.update(obj);
            tx.commit();
            session.close();
        } catch (HibernateException e) {
            throw new RuntimeException(e.getMessage());
        }
    }
    
    
    /**
     * El método borrar, elimina el objeto que tiene por parámetros mediante el método
     * delete de hibernate
     * @param obj, el objeto que se desea eliminar
     */
    public void borrar(Object obj) {
        try {
            Session session = sessionFactory.openSession();
            Transaction tx = session.beginTransaction();
            session.delete(obj);
            tx.commit();
            session.close();
        } catch (HibernateException e) {
            throw new RuntimeException(e.getMessage());
        }
    }

}
  
Espero que os sirva esta clase para vuestras prácticas (pensando en los pobres estudiantes de Ingeniería Informática, como yo era antes de acabar la carrera). Si os sirve para sacar buena nota gracias al código que  os pongo lo único que espero es que insertéis un comentario en el blog para que os pueda felicitar, jejeje.

En futuras entradas tengo previsto seguir hablando sobre Hibernate. Para la próxima entrada sobre Hibernate estoy preparando una mini-aplicación sobre el uso de Hibernate con bases de datos SQLite

Así que un saludo, y hasta la próxima entrada que será bastante pronto. Ciaoooooo!!!!!!!!