Bienvenida

Como todo en la vida, la innovación es la clave del éxito por lo que nos hemos visto en la necesidad de "evolucionar" este blog para abarcar muchos otros temas que estaban quedando de lado en nuestros cursos "oficiales".

Si deseas aprender o profundizar algunos temas en particular, no dudes en contactarnos.


viernes, 22 de julio de 2011

JSF y Google Maps

Una libreria interesante, especializada en conectarse a las API's de Google Maps es precisamente GMaps4JSF que está alojada en Google Code.

Tiene unos ejemplos bastante interesantes que permiten terminar el proyecto ... por ejemplo, tiene una funcionalidad en la cual le pasan la dirección y les muestra la ubicación en el mapa ( es decir, no requieren indicar las coordenadas ).

 <m:map address="#{addressBean.address}">
         <m:marker/>
         <m:htmlInformationWindow htmlText="#{addressBean.address}"/>
  </m:map>


Sin perjuicio de usar alguna otra implementación como ICEFaces o Primefaces, recomendaría que hagan una pruebita con esto y comenten.

martes, 19 de julio de 2011

Perú 0 - Uruguay 2 .... Grupo 1 +/- vs. Grupo 2 NSP

A propósito del partido de fútbol de hoy ...Creo que ya estaba visto ...

Algunos "hinchas" registraron el famoso "NSP" porque les sobra la nota .. así no vale.

Y los primeros 5 trabajos que voy revisando  van de 13 y en descenso .... Ya pues !! ... o traigo a Markarian para el examen final  ...

Las fotos del evento ( grupo 1 y 2 ) en Facebook ....

Saludos

lunes, 18 de julio de 2011

Acerca de un error curioso ....

A veces nos ha sucedido que importamos un proyecto y al querer ejecutarlo en Tomcat 6 nos aparece un mensaje de error indicando que la versión 3 no es soportada.

Esto se debe a que cada versión de Tomcat soporta una especificación de Servlet:

Y que además, cada proyecto, al momento de ser creado ( en Eclipse)  nos pregunta el "Dynamic Web Module" que vamos a usar ( en el caso del gráfico siguiente, se pone por defecto la versión 2.5 ):


Si obtenemos el error mencionado al inicio, debemos verificar con que versión de módulo fue creado el proyecto ... teniendo en cuenta que NO es posible bajar de versión 3.0 a niveles inferiores. En el siguiente gráfico, el "Dynamic Web Module" está en 3.0


Otra forma de verificar, es mirar el encabezado del web.xml (si dice version=3.0 ): 


Entonces, o reconstruimos el proyecto en una versión inferior o lo ejecutamos en Tomcat 7.


miércoles, 13 de julio de 2011

Facebook : parece que aqui hay más movimiento

 Puedes ubicar la página con las fotos de los "eventos" del curso en este link de facebook.

Opina, escribe en el muro, etiqueta las fotos,  difunde, comparte, etc, etc. ( colabora presionando el botón de "I Like this" ).

A pedido de los fans para el próximo curso prepararemos videos ... 

viernes, 8 de julio de 2011

JSF : Repasando ...

Parece que este es el logo "oficial".

Aunque las herramientas ( IDE ) puedan variar ( recuerden que hay Eclipse, JDeveloper, RAD, Netbeans, etc ), el concepto de como construir la aplicación sigue siguendo el mismo.

Para los fanáticos de NetBeans, aquí hay dos tutoriales muy buenos que explican paso a paso lo que ya hemos venido haciendo en clase.

  1. Introducción a Java Server Faces 2 usando Netbeans
  2. Generating a JavaServer Faces 2.0 CRUD Application from a Database

 Buen fin de semana

miércoles, 6 de julio de 2011

Bonus : Fundamentos de Programación Orientada a Aspectos


Fundamentos de Programación Orientada a Aspectos[1]

Como su nombre lo indica, la Programación Orientada a Aspectos (AOP por sus siglas en inglés) es un tipo de programación que se basa en identificar y crear “aspectos”. La AOP no se contradice con el diseño y la programación orientada a objetos, en lugar de ello se complementan. De esta forma se debe ver a la AOP como el siguiente peldaño en la evolución natural de la programación orientada a Objetos dentro del área de Ingeniería de Software.

En AOP, incumbencias[2] ortogonales a una aplicación como la seguridad y el rastreo[3] (logging) se identifican como incumbencias que se cruzan y solapan con los sistemas. Esto debido a que siempre cortan múltiples unidades de modularidad (como paquetes y clases) a través de una aplicación. La idea de AOP es separar la lógica de esas incumbencias de tal forma que no se mezcle con la lógica funcional propia de una aplicación.


Por ejemplo en la figura se puede apreciar la implementación de un caché usando  la programación orientada a Objetos (OOP). La lógica de caché ha sido centralizada en un módulo de tal forma que las llamadas a las funcionalidades del caché están embebidas dentro de los módulos clientes y mezcladas a lo largo de la aplicación.

Algunos problemas de esto son:
  • El código es complejo y difícil de comprender permitiendo que se pierda la identificación de la incumbencia principal de la aplicación.
  • El mantenimiento es difícil, pues cualquier trabajo de mantenimiento que involucre la implementación de una de las incumbencias puede afectar a las demás.
  • El código es difícil de probar.
  • La reusabilidad del código disminuye.


La Programación Orientada a Aspectos sirve para resolver estos problemas utilizando la “separación de incumbencias”. AOP ofrece otra forma de estructurar los programas por medio del ensamblaje de código que implementa cada incumbencia dentro de su propio módulo. Así, las incumbencias se modularizan en unidades de trabajo llamadas “aspectos”.

Los aspectos también permiten la encapsulación de los detalles de implementación de las incumbencias. A diferencia de las clases, los aspectos no sólo ocultan el cómo se ejecuta algo, sino también el cuándo se ejecuta.


En la figura se muestra la representación de la incumbencia de “caché” modularizada dentro de un aspecto. Los módulos núcleo  no contienen ninguna llamada a las API’s del caché. De hecho, los módulos núcleo de la aplicación no están enterados del uso de caché.


Los elementos de AOP son:
  • Los puntos de unión (Join points)
  • Los puntos de corte (pointcuts)
  • Los consejos (advices)
  • Las declaraciones Intertipo (inter-type declarations)
  • Los aspectos (aspects)


Los puntos de unión
Son puntos bien definidos durante la ejecución de la aplicación y en los cuales se puede aplicar una corte cruzado de incumbencias. Los puntos de unión disponible en general dependen de la herramienta AOP particular que se esté empleando. En el caso de AspectJ[4]  se tiene disponible:
  • La llamada a un método
  • La ejecución de un método.
  • La llamada a un manejador de excepción.
  • La ejecución de un manejador de excepción.
  • La llamada a un constructor.
  • La ejecución de un constructor.
  • La lectura de un campo.
  • La escritura de un campo.


Debe notarse la diferenciación entre llamar y ejecutar un método. Los puntos de unión asociados a la llamada a un método tienen acceso a la información del contexto de ejecución antes de la llamada al método. Los puntos de unión asociados con la ejecución de un método tiene acceso a la información del contexto de ejecución dentro del cuerpo del método.

En el caso de AspectJ no se puede trabajar directamente con los puntos de unión. En lugar de ello se debe emplear los puntos de corte.

Puntos de Corte:
Para especificar dónde y cuándo se aplica el corte cruzado del código se debe declarar los puntos de corte. Un punto de corte selecciona un conjunto de puntos de unión. La siguiente tabla muestra los puntos de corte más empleados en AspectJ.



En AspectJ, se declara los puntos de corte por medio de los “aspectos”,  clases o interfaces como se muestra en la figura siguiente: 


Como cualquier otro objeto en Java, los puntos de corte pueden tener modificadores de acceso (público, privado, protegido o por defecto) para restringir el acceso a ellos.

AspectJ proporciona un amplio conjunto de operadores y caracteres comodines para permitir ajustar el ámbito de aplicación del punto de corte como sea requerido.

Consejos
Un consejo junta el código que se necesita aplicar junto con el punto de unión seleccionado por el punto de corte. Se coloca el código que se necesita ejecutar dentro del consejo y se especifica cuando se requiere la ejecución respecto al punto de unión. 
Existen tres elecciones para los consejos generales como se muestra en la tabla siguiente:




Aqui un ejemplo de consejos aplicados a diversos puntos de unión:


Declaraciones Inter-tipos

AspectJ permite agregar nuevos miembros (métodos o campos) a clases o tipos existentes, así como para manipular jerarquías de herencias de una manera controlada.

Esas declaraciones adicionales contenidas dentro de aspectos son llamadas declaraciones Inter-tipos. Para los usuarios de estas clases afectadas, los nuevos miembros declarados aparecen como si ellos hubieran sido implementados por la clase o tipo original.

Aspectos
Cuando se emplea AspectJ, el lenguaje de programación Java se extiende con la definición de los aspectos. El aspecto se define de la misma forma en que se define una clase.

Un aspecto permite poner juntos a:
  • Los puntos de corte.
  • Los consejos.
  • Las declaraciones inter-tipos.


 Al igual que las clases Java, los aspectos pueden tener atributos y métodos (estáticos o no). También se puede crear aspectos abstractos como las clases, extender los aspectos o crear nuevos.



[1] RUIZ,Alex. “Aspect Oriented Programming with AspectJ”. Las figuras tambien corresponden a esta fuente.
[2] Un  incumbencia (concern) es un área particular de interés en una aplicación.
[3] La comunidad de AOP ha identificado más incumbencias en http://www.aosd.net
[4] AspectJ incluye puntos de unión más avanzados inclusive. El sitio web de AspectJ es http://www.eclipse.org/aspectj/



Bonus : Monitoreo


Una definición de monitoreo lo considera como el proceso de recolección dinámica, interpretación y presentación de información concerniente a procesos de software bajo observación que se ejecutan concurrentemente[1].

El monitoreo es el primer paso para entender un proceso computacional y para ello proporciona una indicación de lo “QUE” sucede sirviendo como prerrequisito para explicar el “POR QUE” sucede[2].

Para Schroeder, el monitoreo recolecta información de un proceso computacional a medida que éste se ejecuta y puede ser clasificado según su funcionalidad[3] como:
  • Monitoreo de Tolerancia a fallos y seguridad (dependability).
  • Mejoras al desempeño del sistema (performance enhancement), que incluyen la configuración dinámica del sistema, afinamiento de la programación y manejo en línea del sistema.
  • Verificación de exactitud (correctness) que consiste en el monitoreo de la aplicación para asegurar su consistencia respecto a las especificaciones formales.
  • Monitoreo de Seguridad (Security monitoring) para detectar intentos de violación de seguridad como accesos ilegales a archivos o al sistema.
  • Control, que considera casos en los cuales el sistema de monitoreo es parte del sistema objetivo siendo a su vez un componente necesario de la funcionalidad de dicho sistema.
  • Depuración (debugging) y pruebas (testing) emplean las técnicas de monitoreo para extraer datos desde las aplicaciones que están siendo probadas.
  • Evaluación del desempeño (performance evaluation) utiliza el monitoreo para extraer datos desde el sistema que posteriormente serán analizados para garantizar el desempeño del mismo.

La técnica ideal de instrumentación para medir la performance debería ser no intrusiva, exacta y fácil de activar y desactivar[4]. Debido a las restricciones teóricas y prácticas para realizar este ideal es que se han desarrollado una plétora de técnicas de instrumentación de hardware y software.

Muchas de las técnicas son variantes de cuatro formas básicas como lo considera Daniel Reed[5]:
  • “Profiling”, es la forma más común de instrumentación y en su forma estándar el contador de programa se muestrea a intervalos fijos por lo que el número total de muestras del histograma es una aproximación al tiempo empleado en ese fragmento de código.
  • “Counting”, elimina el potencial error estadístico del profiling pero a expensas de una instrumentación más intrusiva. Ahora bien, los contadores pueden perturbar la ejecución del programa lo que en un servidor uniprocesador se manifiesta en un incremento del tiempo de ejecución del programa.
  • “Interval Timing”, se realiza insertando llamadas al reloj del sistema dentro del código para computar el  monto de tiempo usado en un fragmento de código en particular.
  • “Event Tracing”, potencialmente es el más invasivo y el más detallado; y al igual que el “counting”  y el “timing”, el código del programa a monitorear debe ser modificado para insertar la instrumentación. A nivel de sistema operativo debe emplearse con cuidado pues produce gran nivel de detalle debido a que los eventos ocurren en la escala de microsegundos.

Sin embargo, en términos generales se reconocen dos formas básicas de monitoreo[6]:
  • Por muestreo basado en el tiempo (“Time Driven” o “Clock Driven”) también conocido como “sampling”.
  • Por eventos basados en ocurrencias que se producen en el proceso o sistema observado (Event Driven), en donde podemos encontrar las técnicas de profiling, counting e interval timing como se puede ver en la figura:

En todos los casos se debe reconocer que el monitoreo genera una carga adicional al consumo de recursos de hardware, pero como indica Almeida[7], esto no llega al 4%, o como indica Bodkin[8], “en la práctica, se añade una inelegible sobrecarga al tiempo de respuesta final de muchas aplicaciones”.

El monitoreo también se puede realizar de dos formas[9]:

1.-  Monitoreo Externo: El consumo de recursos usados por un servidor de aplicaciones o servidor web puede ser monitoreado externamente por medio del envío de peticiones (requests) hacia el sistema operativo donde se ejecutan dichos procesos.

Debido a que las peticiones de monitoreo se originan fuera del servidor a ser monitoreado, algunos denominan a esta forma como aproximación de “caja negra”. Por ejemplo, productos comerciales como Mercury SiteScope y LoadRunner usan esta aproximación.

Se debe tener presente que debido a que esta aproximación no tiene un agente, no significa que no sea “intrusiva”, pues el monitoreo siempre impone una sobrecarga al sistema en observación.

2.- Monitoreo con Agente: Esta aproximación se conoce como “caja blanca” debido a que los monitores son instalados dentro de cada servidor de aplicaciones y servidor web bajo observación.

Los monitores se “instrumentan” para reconocer lo que se quiere monitorear.

La clasificación de monitoreo también considera dos grandes formas[10] de realizarlo:

Intrusivo: Utiliza los recursos del sistema en observación para registrar su comportamiento e incluso puede alterar el desempeño actual del mismo. Un ejemplo de esto es la inserción de sentencias “print” en un programa para mostrar el valor de las variables (esto es lo que se conoce como “instrumentation code”). En este caso,  el monitoreo del sistema utiliza recursos del mismo (procesador, memoria, etc.) lo cual puede cambiar el desempeño del sistema en observación, lo que se conoce como el “efecto Heisenberg”[11] para software.

No Intrusivo: No afecta el tiempo ni el orden de los eventos en el sistema bajo observación. Esto es especialmente importante en el monitoreo de sistema de tiempo real en donde dichas características de tiempo y orden son críticas para la seguridad del sistema. Un ejemplo de monitoreo de este tipo es la adición de un procesador para ejecutar los programas de monitoreo que registran el comportamiento de un sistema en tiempo real.

Además, como menciona Aredo, existen dos técnicas de monitoreo fundamentales para recolectar información[12]:

TRACING : En esta técnica, cada ocurrencia de un evento predefinido  es detectada y todas las ocurrencias de estos eventos son recolectadas de manera continua durante un cierto intervalo de tiempo, típicamente mientras dure la ejecución del sistema en observación. Pequeñas piezas de código, usualmente conocidas como “sensores” son incorporados en el sistema a observar, las cuales ejecutan el registro de la información deseada. Los sensores pueden ser desarrollados de diversas formas.

SAMPLING : en esta técnica, la información acerca de las ocurrencias de los eventos predeterminados es recolectada de forma asíncrona, usualmente debido a requerimientos desde un módulo de monitoreo. El “sampling” o muestreo puede ser ejecutado por “sensores” (sensors) o en algunos casos por “sondas” (probes) que residen en el módulo de monitoreo y que tiene acceso directo al espacio de funcionamiento de la aplicación.
  
La aproximación de muestreo es especialmente útil cuando estamos interesados en estadísticas de tipo acumulativo como por ejemplo el número total de mensajes enviados o recibidos por un nodo durante las diferentes etapas de ejecución de la aplicación bajo observación.

El uso de sondas puede minimizar la perturbación en que podría incurrir la aplicación al tener sensores debido a que los sensores se ejecutan de forma continua mientras que las sondas son invocadas después de cierto intervalo de tiempo basado en el ratio de muestreo especificado por el usuario.

Pese a todo, el monitoreo de un sistema distribuido traen dos complicaciones[13] básicas como son:
  • El tamaño del sistema es físicamente grande y lógicamente complejo, lo que lo hace muy difícil de manejar.
  • Los programas distribuidos tienen un comportamiento no determinístico lo que hace que su ejecución sea difícil de reproducir.

Para Schoeder[14] el monitoreo de sistemas distribuidos  tiene otras complicaciones:
  • Existe un retardo en transferir la información, lo que significa que la información pueda estar desactualizada.
  • Retardos variables en la transferencia de la información pueden resultar en eventos que arriban de manera desordenada.
  • El número de objetos generando información para el monitoreo en sistemas grandes puede colapsar fácilmente a los monitores.
  • Debido a que los eventos que ocurren en un sistema distribuido son heterogéneos, se requiere una forma estándar de codificar los mensajes pasados entre máquinas heterogéneas.



[1] AL-SHAER, Ehab Salem; “A Hierarchical Filering-Based Monitoring Architecture for large-Scale Distributed Systems”. Tesis Doctoral, Universidad Old Dominion, Norfolk, Virginia, Estados Unidos; Diciembre del 1998.
[2] SNODGRASS, Richard. “A Relational Approach to Monitoring Complex Systems”. Universidad de Carolina del Norte, Estados Unidos; pág. 158.
[3] SCHROEDER, Beth A.  “Online Monitoring: A Tutorial”. Universidad Estatal de Nueva York, Binghamton. 1995.
[4] REED, Daniel A., "Experimental Analysis of Parallel Systems: Techniques and Open Problems," Proceedings of the 7th International Conference on Modelling Techniques and Tools for Computer Performance Evaluation, Viena, Austria, Mayo de 1994, pp. 25-51.
[5] REED, Daniel; Op. Cit.
[6] KERGOMMEAUX, J. Chassin; MAILLET, E; VINCENT, J.M. « Monitoring Parallel Programs for Performance Tuning in Cluster Environments »; pág. 139.
[7] ALMEIDA Jussara M.; ALMEIDA,  Virgilio; YATES, David J.; "WebMonitor: a Tool for Measuring World-Wide Web Server Performance", “First Monday, Peer-Reviewed Journal on the Internet”,  vol. 2, No. 7, July 1997.
[8] BODKIN, Ron. “AOP@Work: Performance Monitoring with ApsectJ, Part1“, publicado en IBM DeveloperWorks.
[9] Tomado de MAR, Wilson. En:  http://www.wilsonmar.com/1perfmon.htm
[10] Autor desconocido. Obtenido de la siguiente fuente:  http://media.wiley.com/product_data/excerpt/63/04711840/0471184063.pdf
[11] El efecto Heisenberg describe un sistema en el cual la observación o medida de un evento cambia el evento. Fuente: http://www.inf.ethz.ch/news/focus/res_focus/april_2005
[12] AREDO, Demissie B. “Monitoring and Visualization of Distributed Systems”, pág. 20.
[13] AREDO, Demissie B.;Op. Cit pág 5.
[14] SCHROEDER, Beth A.  “Online Monitoring: A Tutorial”. Pág 74,75.

lunes, 4 de julio de 2011

DAW-II : just kidding !!


Sin comentarios ....
Ya falta poco para terminar el curso ... un último esfuerzo no vendría mal.

Un chistesito para amenizar el post :

La semana pasada compré un producto que costó S/ 158. Le di a la cajera S/ 200 y busqué en el bolsillo S/ 8 para evitar recibir más monedas. La cajera tomó el dinero y se quedó mirando la máquina registradora, aparentemente sin saber que hacer. Intenté explicarle que ella tenía que darme S/ 50 de cambio, pero ella no se convenció y llamó al gerente para que la ayudara. Tenía lágrimas en sus ojos mientras que el gerente intentaba explicarle y ella aparentemente continuaba sin entender

¿Por qué les estoy contando esto?
Porque me di cuenta de la evolución de la enseñanza desde 1950 y de las condiciones actuales que se manejan en muchas escuelas públicas y las privadas, tanto en el ámbito académico como en el trato a los alumnos.

Vean cómo fue el cambio en el área matemática, los ejemplos eran así:


1. Enseñanza de matemáticas en 1950:

Un cortador de leña vende un carro de leña por S/ 100.00. El costo de producción de ese carro de leña es igual a 4/5 del precio de la venta.
¿Cuál es la ganancia?


2. Enseñanza de matemáticas en 1970:

Un cortador de leña vende un carro de leña por S/ 100.00. El costo de producción de ese carro de leña es igual al 80% del precio de la venta.
¿Cuál es la ganancia?


3. Enseñanza de matemáticas en 1980:

Un cortador de leña vende un carro de leña por S/ 100.00. El costo de producción de ese carro de leña es de S/ 80.00.
¿Cuál es la ganancia?


4. Enseñanza de matemáticas en 1990:

Un cortador de leña vende un carro de leña por S/ 100.00. El costo de producción de ese carro de leña es de S/ 80.00. Escoja la respuesta correcta que indica la ganancia:
( ) S/ 20.00 ( ) S/ 40.00 ( ) S/ 60.00 ( ) S/ 80.00 ( ) S/ 100.00


5. Enseñanza de matemáticas en 2000:

Un cortador de leña vende un carro de leña por S/ 100.00. El costo de producción de ese carro de leña es de S/ 80.00. La ganancia es de S/ 20.00.
¿Es correcto?
( ) Si ( ) No


6. Enseñanza de matemáticas en 2010:

Un cortador de leña vende un carro de leña por S/ 100.00. El costo de producción de ese carro de leña es de S/ 80.00. Si Ud. sabe leer coloque una X en los S/ 20.00 que representan la ganancia..
( ) S/ 20.00 ( ) S/ 40.00 ( ) S/ 60.00 ( ) S/ 80.00 ( ) S/ 100.00


¡¡¡No te rias, es en serio!!!

viernes, 1 de julio de 2011

JSF 2.0 : Más Bibliografía

Este libro lo pueden leer "en línea" en el siguiente enlace.

Además, en este enlace hay un tutorial de como trabajar con JSF 2.0.

Saludos