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.


miércoles, 28 de diciembre de 2011

Acerca de Android ....



Buen blog sobre dispositivos móviles ( y Android por supuesto ).

LP-II Ejemplo : Servlets, JSP y PopUp

Despues de un par de ciclos vuelvo a dictar el curso de LP-II. Aunque lo he tomado recien luego de los parciales, algunos alumnos me han pedido que les dé un ejemplo de PopUps. Aunque no soy muy partidario del uso de JavaScript (porque no corre igual en todos los navegadores) , aqui va el ejemplo que he tratado de hacerlo lo más estandar posible para IE, Chrome y FireFox :

La Aplicación es bastante sencilla he obviado el acceso a base de datos  y por ello la data está como variables fijas (por eso el paso 1)

1) Tiene un único servlet que se carga al inicio: en el web.xml vean la línea que dice       <load-on-startup>1</load-on-startup>

Esto se hace con el fin que en el método INIT del servlet se guarde en el contexto de la aplicación el HashMap "allCars" :

    public void init() {
            allCars.put("Renault", carsRenault);
            allCars.put("Fiat", carsFiat);
            allCars.put("Toyota", carsToyota);
            this.getServletContext().setAttribute("allCars", allCars);
    }

2) La aplicación inicia con la página: pagina1.jsp
Esta página es un formulario que tiene 2 botones: uno sirve para invocar al JavaScript que abre la ventana de popup y el otro sirve para hacer submit del formulario ( invocando al alias denominado "s01" que corresponde al servlet ).


3) Cuando se abre la ventana de popup, se recupera del HashMap que está en el contexto de la aplicación  la lista de modelos de auto y se muestran en una tabla (usando JSTL  observen bien el detalle ...)

Si el usuario selecciona un modelo, el JavaScript de esta página se encarga de escribir dicho valor en la ventana padre ( esta es la parte dificil pues se debe escribir así para que sea estandar a todos los navegadores, aunque en IE permite saltarse algunas cosas ) y cerrar el popUp.
 
4) Finalmente, una vez seleccionado el modelo, presionamos el botón "aceptar" para hacer el submit del formulario y se mostrará la página 2 que simplemente es un texto indicando el modelo seleccionado.



Nota: Todas las páginas JSP están con código JSTL. Puedes descargar la aplicación dando click aquí.

¡ Feliz año nuevo ! 


PD: No te olvides de dejar un comentario. gracias !




martes, 27 de diciembre de 2011

JSF: Manejo de imágenes con PrimeFaces

En este pequeño tutorial, trataremos el manejo de imágenes no sólo desde el punto de vista de JSF, sino tambien almacenando y recuperando la imagen desde la Base de datos utilizando para ellos JPA ( EclipseLink).

En primer lugar explicaré que la implementación de referencia de JSF ( Mojarra ) viene con 4 librerías:
h: HTML
f : Core
ui: Facelets
composite: Librería de componentes compuestos.

Pese a todo ello, la implementación de referencia no me permite trabajar con imágenes que no sean archivos en disco o en las "library" dentro del proyecto.

Entonces, tenía que buscar una extensión ( implementación ) que me permita manipular imagenes como arreglos de bytes en memoria ( que es lo que hace JPA cuando saca la imagen de la Base de Datos ). La librería escogida fue "PrimeFaces" debido a que es ligera y no requiere dependencias de otras librerías.

He ejecutado algunos cambios en la base de datos para que las relaciones entre  las tablas y las entidades sean correctas, Aquí está el nuevo modelo de Base de datos.

PARTE 1 : Grabar una imagen
Como vimos en el ejemplo del Banco, queremos registrar a un nuevo cliente, su dirección y su foto que posteriormente serán mostradas.

Para ellos vamos a cambiar alguna partes de la página registroCliente.xhtml para que se visualice así:


Nota que se capturan los datos del cliente ( corresponden a la entidad "Customer" ).

Luego se capturan los datos de la dirección ( corresponden a la entidad "Custadddress" ).

Finalmente se pide la foto que corresponde a la entidad "Customerinfo".

La página debe sufrir las siguiente modificaciones:

 Notar que se declara una librería "p" para primefaces.





Cuando se trabaja con archivo, el formulario debe incluir el encoding type:




Finalmente, el archivo se maneja con esta linea de código y en donde se observa el campo está asociado a una managed bean llamado UPLOADController ( archivo FileUploadManagedBean.java ).

Cuando se ejecuta el POST, el managed Bean "UsuarioManagedBean" activa el método "registrar". En este método se convierte lo que captura primefaces en un arreglo de bytes para JPA y se ejecuta el insert de 3 tablas en una sola operación gracias a las relaciones de las entidades:



PARTE 2 : Mostrar una imagen
Una vez registrado el usuario, al momento de ingresar al sistema, se debe mostrar lo siguiente:
















Para mostrar esto, el managedBean llamado "LOGIN" ( clase java LoginManagedBean.java) debe convertir el arreglo de bytes de JPA a una clase particular de PrimeFaces 



De tal forma que al lanzar la página, se utilice el tag "p" de la forma siguiente:


¿ que te pareció ? ... Bastante fácil con la ayuda de PrimeFaces.

¡¡ Hasta la próxima !!

PD: Si quieres descargar la aplicación completa, da click aquí (pesa como 11 MB)  y por favor no te olvides de dejar un comentario.

lunes, 26 de diciembre de 2011

Video Curso : NoSQL MongoDB

MongoDB is one of the new open source databases that focus on the ideas of the NoSQL (Not Only SQL) approach. This database is employed to handle documents in a free schema design that gives to the developer great flexibility to store and use data. 

This course focuses in the MongoDB technology as a tool to implement new ways to store and handle data that can be modeled as a document format. 

The videos in the course covers download, installation, configuration, schema design, an overview of the database structure, CRUD operations, aggregations and map-reduce, indexing, integration of MongoDB with PHP, Perl, Pyton, Java, Ruby and .NET drivers, replication, sharding, GridFS and other administrative operations of MongDB. 

All the examples and scenarios discussed are presented in real world situations. 

The main audiences of this course are an IT professional that have basic knowledge of programming and databases who wants to start with NoSQL technology through MongoDB. Since the course focus on beginners and explain every basic concept there is no business requirements needed to be known before the start of the course.

miércoles, 21 de diciembre de 2011

Online Session for Oracle Applications Development Framework (ADF)

Querent Technologies is pleased to invite you to join the upcoming Online Session for Oracle Applications Development Framework (ADF).

Detailed Date and Time of Session

India Standard Time - December 24 at 07:00 AM
Pacific Standard Time - December 24 at 05:30 PM
Central Standard Time - December 24 at 06:30 PM
Eastern Standard Time - December 24 at 08:30 PM
Australian East Standard Time - December 24 at 11:30 AM
UAE Standard Time - December 24 at 05:30 AM

A Free Demo Session is planned on 24th Dec 2011 at 7:00 AM (IST)



miércoles, 16 de noviembre de 2011

JPA: Caso Completo de RelationsShips

Aqui presentamos un caso que comprende todo el tema de relationships en JPA.

El caso es bastante sencillo:
- Hay una entidad propietario que se implementa con una herencia simple ( persona natural y persona juridica ) y que además posee una clase embebida ( direccion).
- Existe una entidad Auto que puede tener servicios relacionados ( mantenimientos ).
Además, cada mantenimiento puede tener varios repuestos utilizados.

El modelo de Objetos y las relaciones es el siguiente:

El proyecto Java ( es un proyecto Java Stand Alone ) lo puedes descargar de aquí. Acuerdate de colocar las librerías para EclipseLink, Hibernate u OpenJPA y del conector de MySQL. EL persistence XML está preparado para funcionar con 3 unidades de persistencia apuntando a una base de datos que debes crear vacía ( con nombre "manytomany" ) .

Luego de ejecutar los programas de Insert, los SQL directos a la base de datos te deben mostrar:



Ejemplos JP-QL: Ahora veremos como navegar entre las relaciones de las entidades. Asegúrate de ver bien los atributos que tiene cada entidad.

Ejemplo 1: Todos los propietarios que tiene automovil
Ejemplo 2: Todos los propietarios que tiene automovil  con los servicios ejecutados


Ejemplo 3: El costo total del servicio por auto ( sin considerar repuestos )


Ejemplo 4:El costo total de repuestos por auto


Hasta la próxima.
No te olvides de dejar un comentario.


domingo, 6 de noviembre de 2011

Configurando el persistence.xml en JPA

Y la pregunta de rigor sería  ¿ Qué contiene el archivo persistence.xml ?
La respuesta es bastante sencilla, contiene las "persistence unit" o Unidades de Persistencia que a su vez, indican con que implementación JPA se trabaja, cuales son las entidades, el tipo de conexión a la base de datos y otros parametros propios de la implementación JPA.



Paso 1: Crear las Entidades Java, lo cual se puede realizar vía programación del código o por Ingeniería reversa desde la Base de Datos.

Paso 2: Configurar el archivo “persistence.xml” que se ubica en el proyecto dentro del folder META-INF.


Luego de crear la Entidad Java, nótese que se marca un error en la clase. Observando el error dentro de la clase Java indica que Class "com.ejemplo.jpa.Person" is mapped, but is not included in any persistence unit.

Esto se debe a que falta configurar el archivo persistence.xml.

Paso 3: Definir la unidad de persistencia. En este caso se llama “DemoJPA

Paso 4: Registrar el provider (implementación de JPA ) que Eclipse lo realiza por defecto:


Paso 5: Registrar las entidades

Se debe registrar una línea por cada entidad del proyecto.

Paso 6: Registrar las propiedades de conexión a la Base de datos:


En JPA 2.0 estas propiedades de conexión a la base de datos son estándares y comienzan con "javax.persistence".

Recordar cerrar el tag “<properties>”.

NOTA: Se definen las propiedades de conexión a la base de datos debido a que estamos empleando Java SE con conexión directa (en el paso 3 se observa que dice “RESOURCE_LOCAL”).  En caso de utilizar DataSource no sería necesario esto (el parámetro del paso 3 sería “JTA”).


¿ Qué pasa si quiero usar otra implementación de JPA ? ... en el siguiente post explicaremos esto.

¿ que te pareció ?. No te olvides de dejar un comentario.

viernes, 28 de octubre de 2011

Entendiendo JPA en pocos pasos ...


Aquí les dejo un resumen bastante 

ilustrativo de como entender el paso de las tecnologías como JDBC e Ibatis a un modelo de Objetos con JPA.



La verdad que el plasmar el  gráfico y la explicación de esa manera no se me habían ocurrido antes, pero más vale tarde que nunca. Y aqui va:





Punto #1:
JPA = Java Persistence API, es una especificación Java basada en el JSR 220.

Al ser una especificación, tiene implementaciones, siendo las más comúnmente utilizadas: EclipseLink (cuyo core se basa en Toplink), Hibernate y OpenJPA.



Punto #2:
En nuestros cursos tradicionales de Base de Datos, aprendimos que una base de datos está compuesta por tablas, las cuales tiene filas (rows) y columnas (fields) y que el modelo actualmente utilizado es el modelo Relacional (RDBMS) que usualmente se modela e implementa utilizando las 3 primeras formas normales ( recordar que hay una 4ta y 5ta forma normal pero que no se utilizan con mucha frecuencia ).




Punto #3:
Cuando pasamos a un modelo OR-M ( object Relational - Mapping ) significa que nuestra fuente de datos está en el modelo relacional, pero la lógica de nuestra aplicación maneja Objetos ( en este caso objetos Java ) y que por tanto, utilizamos una implementación de la API JPA para ello (cualquiera de las tres mencionadas al inicio).


Dos cosas nos diferencian en este esquema:
1) El modelo Relacional usa SQL --> Tablas
2) El modelo de Objetos usa JP-QL --> Entidades


Tambien, hay dos entornos bien definidos:
1) Las tablas viven dentro de una base de datos ( y esta a su vez dentro de un manejador de base de datos RDBMS)
2) Las entidades viven dentro de un "Entity Manager" (que es similar a un SqlClientMap de Ibatis ).


Punto #4
Es así que una "Entidad" JPA equivale a dos cosas:
1)  A la definición de una clase Java que sigue las reglas de los JavaBeans: implementa Serializable, constructor por defecto y getters/setters.
2) Al momento de instanciar una Entidad (clase), dicha instancia (objeto) equivale a un registro en la Tabla relacional.


Entonces, ¿ cómo convierto un JavaBean en Entidad ? ... Fácil, le agregamos dos anotaciones :@Entity y @Id
Recordar que toda entidad JPA debe tener un ID único.

Según el gráfico, JPA interpreta que:
1) La entidad se llama igual que la clase.
2) La Tabla en la base de datos se llama igual que la clase.


Si queremos hacer cambios, podemos usar:
@Entity (name="nombre-entidad" )
@Table (name="nombre tabla")

Punto #5
Además, necesitamos registrar la Entidad en el archivo "persistence.xml".
Ahora bien, si no queremos utilizar anotaciones, tendremos que escribir el XML del archivo "orm.xml" (que me parece más tedioso ).




El archivo persistence.xml contiene la definición de la "Persistence Unit" a partir de la cual se genera un "Entity Manager". La explicación será materia de un siguiente post.

Hasta aqui, creo que es bastante sencillo. La parte más "complicada" son las relationships entre entidades que veremos en un siguiente post.

No te olvides de dejar un comentario. ¡ Gracias !

miércoles, 19 de octubre de 2011

Struts 2 y Validaciones ( Parte II )

En este post presentamos un gráfico explicativo del funcionamiento de las validaciones en el framework de Struts2.

La validación depende dos interceptores que existen en el default stack:
  • Interceptor  “validation” que ejecuta la validación en sí misma (sea manual, xml, custom o anotaciones) y crea una lista de errores para cada campo específico.
  • Interceptor “workflow” que verifica la presencia de errores de validación. Si existen, retorna el resultado “input” (por default). Si no hay resultado “input” definido, se lanza un error.
Luego el control sigue por el  Interceptor “Prepare” el cual ejecuta un método llamado "prepare()"  (si es que se ha definido dentro de nuestro Action java). El método "prepare()" se ejecuta antes de invocar al método “execute()”.




Tambien una aclaración al ejemplo de validación de fechas: Para que obligue a poner una fecha y a la vez valide que la fecha esté dentro del rango, el archivo XML debe tener lo siguiente:

    <field name="birthDate">
        <field-validator type="requiredstring">
              <message key="Debe ingresar una fecha" />
         </field-validator>
        
        <field-validator type="date">
            <param name="min">01/01/1900</param>
            <param name="max">31/12/2012</param>
            <message> La fecha debe estar entre 1900 y el 2012</message>
        </field-validator>
    </field> 

No te olvides de dejar un comentario.

domingo, 16 de octubre de 2011

Lima Hack 2011 - Con el auspicio de la UPC


LimaHack es un evento organizado por especialistas en seguridad informática, con la finalidad contribuir al crecimiento de la cultura de seguridad informática en el país y colaborar en la formación de profesionales en la materia.


A diferencia de los eventos realizados anteriormente en Lima, LimaHack es netamente técnico, muestra la seguridad desde la perspectiva del atacante, se realizará con demostraciones en vivo.


El evento es gratuito. Pueden encontrar mayor  información en el sitio web.

país y colaborar en la formación de profesionales en la materia.

A diferencia de los eventos realizados anteriormente en Lima, LimaHack es netamente técnico, muestra la seguridad desde la perspectiva del atacante, se realizará con demostraciones en vivo.

ISIT 2011


2nd International Symposium on Innovation and Technology


ISIT 2011

November 28-30, 2011, Lima - PERÚ

Costo para peruanos S/. 100 nuevos soles.
Para información y registro ir al Sitio web

viernes, 14 de octubre de 2011

NoSQL Databases



Hasta que por fin ... Oracle sale al mercado con una base de datos NoSQL: "Oracle NoSQL Database"  para hacerle competencia a las ya existentes como: MongoDB y CouchDB o Voldemort y BigData entre otras.

Lamentablemente, la versión "Community Edition" Open Source aun no está disponible. Estaremos atentos.

jQuery Plugin con Google Code


El objetivo de esta sesión fue repasar Struts2, DAO's y JDBC (Recuerda que ya dejaremos de usar JDBC para entrar de lleno a JPA), además de analizar como funciona la "grid" de éste plugin. 

Si gustas lo pruebas con Tomcat o con WAS ( igual va a funcionar ).

En esta sesión, por fin nos entregaron los manuales del curso, sin embargo éste tema no está dentro del manual porque considera el ejemplo de la "grid" muy similar a jMesa o a DisplayTag ( acuerdate de LP-II ). 

El objetivo es consultar una tabla ( "Person" ) y mostrar los datos dentro de una "grilla": 
  • Aquí está el material en formato PDF correspondiente a las páginas JSP.
  • Descarga la aplicación base aquí. En esta aplicación funciona el ejemplo 1 completamente ( no te olvides de incluir el driver de MySQL en el folder lib del proyecto o en el classptah de tu servidor Tomcat ... sino, te dará un error. 
  • Descarga el esquema de la base de datos MySQL aquí. La base de datos se llama "quickstart" y sólo tiene una tabla "person". 

Como tarea completa las otras 3 opciones del proyecto. Analiza cuidadosamente como los tags dela página JSP envían datos al Action y este a su vez los pasa al DAO.

Por favor ... deja un comentario. ¡ Gracias !


miércoles, 12 de octubre de 2011

Proyecto 2011-II


Aquí dejo el documento con los requerimientos del proyecto final del curso para que lo vayan analizando.

Como estamos en la eliminatorias del mundial para el 2014, el proyecto está relacionado a esto ( así le ponen más empeño y dedicación ).

Deberá implementarse con JPA y JSF. Ante cualquier duda o consulta, por favor coloquen un comentario.

¡ Suerte !

lunes, 10 de octubre de 2011

Nuevo ciclo 2011-II

Bienvenida


Bienvenidos a una nueva edición del curso "Desarrollo de Aplicaciones Web II".

Los aspectos introductorios del curso los pueden ver en este enlace.

A partir de esta edición, los comentarios deben tener autor ( no se aceptan anónimos ). El blog está enlazado tambien con Facebook. Se ruega participación tanto en los comentarios como en las encuestas y demás opciones del curso.

¡ Saludos !

SegurInfo 2011




XVII Congreso y Feria Interamericana de Seguridad de la Información.

Para registrarse en el evento ir al siguiente enlace  

domingo, 9 de octubre de 2011

Traducción del discurso de Steve Jobs (Parte III)


La tercera historia es sobre la muerte

Cuando tenía 17 años, leí una cita que decía algo parecido a “Si vives cada día como si fuera el último, es muy probable que algún día hagas lo correcto”. A mí me impresionó y desde entonces, durante los últimos 33 años, me miro al espejo todas las mañanas y me pregunto: “Si hoy fuera en último día de mi vida, ¿querría hacer lo que estoy a punto de hacer hoy?” Y cada vez que la respuesta ha sido “No” por varios días seguidos, sé que necesito cambiar algo.

Recordar que moriré pronto constituye la herramienta más importante que he encontrado para ayudarme a decidir las grandes elecciones de mi vida. Porque casi todo –todas las expectativas externas, todo el orgullo, todo el temor a la vergüenza o al fracaso – todo eso desaparece a las puertas de la muerte, quedando solamente aquello que es realmente importante. Recordar que van a morir es la mejor manera que conozco para evitar la trampa de pensar que tienen algo que perder. Ya están desnudos. No hay ninguna razón para no seguir a su corazón.

Casi un año atrás me diagnosticaron cáncer. Me hicieron un scanner a las 7:30 de la mañana y claramente mostraba un tumor en el páncreas. Yo ni sabía lo que era el páncreas. Los doctores me dijeron que era muy probable que fuera un tipo de cáncer incurable y que mis expectativas de vida no superarían los tres a seis meses. Mi doctor me aconsejó irme a casa y arreglar mis asuntos, que es el código médico para prepararte para la muerte. Significa intentar decirle a tus hijos todo lo que pensabas decirles en los próximos 10 años, decirlo en unos pocos meses. Significa asegurarte que todo esté finiquitado de modo que sea lo más sencillo posible para tu familia. Significa despedirte.

Viví con ese diagnóstico todo el día. Luego al atardecer me hicieron una biopsia en que introdujeron un endoscopio por mi garganta, a través del estómago y mis intestinos, pincharon con una aguja mi páncreas y extrajeron unas pocas células del tumor. Estaba sedado, pero mi esposa, que estaba allí, me contó que cuando examinaron las células en el microscopio, los doctores empezaron a llorar porque descubrieron que era una forma muy rara de cáncer pancreático, curable con cirugía. Me operaron y ahora estoy bien. Fue lo más cercano que he estado a la muerte y espero que sea lo más cercano por unas cuantas décadas más. Al haber vivido esa experiencia, puedo contarla con un poco más de certeza que cuando la muerte era un útil pero puramente intelectual concepto: Nadie quiere morir. 

Incluso la gente que quiere ir al cielo, no quiere morir para llegar allá. La muerte es el destino que todos compartimos. Nadie ha escapado de ella. Y es como debe ser porque la Muerte es muy probable que sea la mejor invención de la Vida. Es el agente de cambio de la Vida. Elimina lo viejo para dejar paso a lo nuevo. Ahora mismo, ustedes son lo nuevo, pero algún día, no muy lejano, gradualmente ustedes serán viejos y serán eliminados. Lamento ser tan trágico, pero es muy cierto. Su tiempo tiene límite, así que no lo pierdan viviendo la vida de otra persona. No se dejen atrapar por dogmas – es decir, vivir con los resultados del pensamiento de otras personas. No permitan que el ruido de las opiniones ajenas silencien su propia voz interior. Y más importante todavía, tengan el valor de seguir su corazón e intuición, que de alguna manera ya saben lo que realmente quieren llegar a ser. Todo lo demás es secundario.

Cuando era joven, había una asombrosa publicación llamada The Whole Earth Catalog, que era una de las biblias de mi generación. Fue creada por un tipo llamado Steward Brand no muy lejos de aquí en Menlo Park, y la creó con un toque poético. Fue a fines de los 60, antes de las computadoras personales y de la edición mediante microcomputadoras, por lo tanto, en su totalidad estaba editada usando máquinas de escribir, tijeras y cámaras polaroid. Era un tipo de Google en formato de edición económica, 35 años antes de que apareciera Google: era idealista y rebosante de hermosas herramientas y grandes conceptos.

Steward y su equipo publicaron varias ediciones del The Whole Earth Catalog, y luego cuando seguía su curso normal, publicaron la última edición. Fue a mediados de los 70 y yo tenía la edad de ustedes. En la tapa trasera de la última edición, había una fotografía de una carretera en el campo temprano en la mañana, similar a una en que estarían haciendo dedo si fueran así de aventureros. Debajo de la foto decía: “Manténganse hambrientos. Manténganse descabellados”. Fue su mensaje de despedida al finalizar. Manténganse hambrientos. Manténganse descabellados. Siempre he deseado eso para mí. Y ahora,cuando se gradúan para empezar de nuevo, es lo que deseo para ustedes.

Permanezcan hambrientos. Permanezcan descabellados.