Mi receta para aprobar la Oracle Certified Professional, Java SE 7 Programmer

Ayer presente el examen 1Z0-805 de Oracle para obtener la Oracle Certified Professional, Java SE 7 Programmer y con mucho orgullo (producto de muchas horas de estudio) puedo decirles que la he aprobado con 80%. Llevaba preparandome unos 8 meses, con alguno que otro descanso bien merecido en navidad y semana santa, pero en general fui constante y cada semana dedicaba al menos una (1) o dos (2) horas a hacer ejercicios y/o leer al respecto.

Debo admitir que aunque consideraba que habia repasado bastante, el examen fue mas dificil de lo que yo esperaba, pero como ya ven no es imposible. Los objetivos a evaluar en el examen en resumen son los siguientes:

  • Language Enhancements (Mejoras en el lenguaje), que no es más que el project coin: diamond operator (operador <>), try-with-resources, sentencia swith con variables tipo String, etc…
  • Design Pattern (Diseño de patrones): Comprensión del concepto de cohesión, asi como también de los patrones Factory,  Singleton, DAO, diferencia entre un objeto de negocio (Bussiness Object) y un objeto de transferencia de datos (Data Transfer Object o DTO) y Entender los conceptos de herencia, composición y encapsulamiento.
  • Database Applications with JDBC (Desarrollo de aplicaciones utilizando JDBC): Características y métodos de un ResultSet, conocer los distintos tipos de RowSet, poder crear una app de tipo CRUD (Create, Read, Update and Delete) utilando JDBC.
  • Concurrency (Concurrencia): manejo de entorno multihilos, el framework for/join, colecciones seguras para el manejo con hilos, entender los conceptos de starvation, deadlock, liveness.
  • Localization (Localización): Todo lo necesario para poder hacer una aplicación multidioma o como también se le dice, soporte i18n.
  • NIO 2: Conocer las nuevas clases y métodos para el manejo de archivos, tales como la clase Path, FileStore, FileSystem, entre muchas otras.

Ahora bien no perdamos mas tiempo y vayamos al grano ¿Cual es la receta?… Bueno al empezar a preparar esta certificación me tope con que habia un único libro enfocado en la aprobación de la certificación y me refiero a esos libros a los que nos tiene o tenia acostumbrados Kathy Sierra y este era el libro Oracle Certified Professional Java SE 7 Programmer Exams 1Z0-804 and 1Z0-805: A Comprehensive OCPJP 7 Certification Guide (Expert’s Voice in Java) que al revisar por internet los comentarios y opiniones de la gente con respecto al mismo lo que hicieron fue desanimarme a comprarlo asi que opte por yo mismo recabar mi material aunque esto me tomara mas tiempo para preparar la certificación, a continuación se los detallo:

  • The Well-Grounded Java Developer: Es un magnifico libro, en mi opinion digno a estar en la biblioteca de todo buen programador Java, por supuesto es un libro que yo denominaría de nivel intermedio, ya requiere conocimientos fundamentales en Java, pero toca desde cosas basicas del lenguaje (nuevas para Java 7) como el project coin hasta aspectos más avanzados como la concurrencia y el framework fork/join para el trabajo con hilos y otros lenguajes de la JVM tales como Groovy, Scala y Clojure. De este estudie project coin, NIO2 y concurrencia.
  • Java 7 New Features Cookbook: Este libro repasa con bastante detalle las novedades de NIO2, de hecho dedica 5 capítulos del libro a este tema, un libro a recomendar para aquellos que quizás sientan que están un poco desactualizados (digamos que se quedaron en Java 1.4 o Java 5) y quieren de una forma bastante light ir empapandose de las novedades del lenguaje, de este libro estudie los mismos objetivos que del libro anterior (project coin, NIO2 y concurrencia), realmente en mi opinión se complementan muy bien para estudiar.
  • Tutoriales Java de Oracle, específicamente internacionalización, JDBC, Concurrencia, además pueden descargarse en formatos para libro electrónico.
  • Java Practice Questions: Upgrade to Java SE 7 Programmer, este es un libro que consta unicamente de preguntas tipo certificación de todo los objetivos a evaluar en la certificación, por supuesto con sus respectivas respuestas y explicación, a mi este libro me vino muy bien para evaluarme una vez consideraba que ya había cubierto un objetivo especifico y así poder ver si tenia algún tema falto por cubrir.
  • Al final opte por comprar el paquete de whizlabs para actualización a Java 7, no puedo decir que me haya ido mal, porque me permitió hacer simulacros de examen pero si esperaba que tuviese mas preguntas (solo tiene 243) y que estuvieran clasificadas por objetivo/tema, ya que en algún momento tuve interés de solo evaluarme en un tema en especial y no pude.
  • Por ultimo encontre un simulacro de examen gratuito y que sinceramente esta muy bien que de paso se ejecuta mediante JNLP, la página en cuestión es Java Quiz Player.
  • NOTA: Es muy importante programar, programar y seguir programando, sinceramente no conozco otra forma de poder internalizar los conocimientos sobretodo cuando se trata de tantas clases y cada una de ellas con sus respectivos métodos, además de ser una especie de abogado del diablo y plantearse uno mismo interrogantes, intentar conocer en detalle cuando y/o por que un determinado método arroja una exception en particular. En este orden de ideas les diría por ejemplo, ¿Que sucede si a una sentencia switch le paso un String null? ¿Alguna vez han ejecutado un switch donde el case “default” sea el primero de la lista? y así sucesivamente.

No puedo negarles que estoy muy contento de hecho tenia como 3 años que no presentaba un examen de certificación, pero mas que por el resultado del examen, lo que me  contenta y que de hecho considero que es lo más importante de todo este proceso es que “HE APRENDIDO”, y eso haya o no un papel que lo avale es lo que mas me llena y es por eso que por ahora seguiré invitando a la gente a que lo intente ya que siempre todo lo que conlleva la preparación para presentar una certificación entre estudiar, plantearte interrogantes, programar, nos deja conocimiento y el saber, es PODER.

Otros enlaces de interés:

– Sitio Web en Amazon de Esteban Herrera, este ha publicado libros (de preguntas y respuestas) para los exámenes de certificación 1Z0-803, 1Z0-804 y 1Z0-805, este ultimo es el que les mencione arriba llamado Java Practice Questions: Upgrade to Java SE 7 Programmer.

– Página de enlace a los tutorales de preparación para las certificaciones de Oracle.

– Guia para el examen de certificación (la actualización) 1Z0-805 de Mikalai Zaikin, quien ya lleva un largo recorrido preparando guías de certificación para casi todas las certificaciones Java.

Entonces, quien se anima a preparar esta certificación o para aquellos que están haciéndolo, ¿qué tal les va en la preparación? ¿Añadirían algún otro recurso a la lista que les he detallado anteriormente?

Caused by: java.io.IOException: DerInputStream.getLength(): lengthTag=109, too big.

El día de hoy comienzo una nueva categoría llamada “exceptions“, donde compartiré (en medida de lo posible) como resolver o evitar que en nuestras aplicaciones salten excepciones o al menos indicar la razón por la cual es arrojada. En esta oportunidad les traigo la siguiente exception:

Caused by: java.io.IOException: DerInputStream.getLength(): lengthTag=109, too big.

Esta excepción, se obtiene en Java 6 al haber discrepancias entre el tipo de instancia del keystore y el tipo de almacén de claves, al intentar cargar el almacén de claves. Por ejemplo  si intentásemos cargar el almacén de claves desde un fichero .jks (jks es una implementación por defecto de Java  para el almacenamiento de claves, que por ejemplo puede ser creado con el comando keytool del jsdk), habiendo indicado que la instancia del keystore es “pkcs12” en vez de haber utilizado el valor de “jks”. Como el ejemplo a continuación:

Como evitar entonces la excepción? Muy sencillo, hay 2 alternativas.

  1. Utilizar como tipo para obtener la instancia del keystore el valor de “jks” en vez de “pkcs12” (para este ejemplo específicamente), es decir utilizar el tipo adecuado para obtener la instancia del keystore.
  2. Cargar el almacén de claves adecuado, es decir, para este ejemplo sería indicar el path del certificado digital (por ejemplo de tipo .p12, .pfx) en vez de haber utilizado el path del fichero jks.

Espero pueda ser de utilidad y les quite al menos uno que otro dolor de cabeza. Cualquier información que consideres pueda ser de utilidad relacionada con esta excepción, no dudes en compartirla.

Primeros pasos con maven Parte I

Desde su nacimiento Maven ha ido consolidando y a su vez aumentando su posición como herramienta de gestión y construcción de software en lenguaje Java, poco a poco quitandole terreno a otra famosa herramienta presente en el mercado desde hace mas tiempo que de seguro mucho de ustedes la habran oido mencionar Apache Ant.

A continuación les dejo unas graficas sacadas con el software de estadistica de google donde se puede observar como ha ido incrementandose el interes de Maven con respecto a Ant en distintas categorias

 

estadísticas de Ant vs Maven en la categoria de Programación estadísticas de Ant vs Maven en la categoria Herramientas de desarrollo
estadísticas de Ant vs Maven en la categoría Lenguaje de programación Java estadísticas del crecimiento de las búsquedas de Ant y Maven vs  la categoria Lenguaje de programación Java
estadísticas de las búsquedas de Ant vs Maven en la categoría Software

Además es cuestión de revisar ofertas de trabajo para ver como cada vez piden mas el conocer Maven como requisito indispensable o como poco un requisito deseado a poseer por parte del candidato. Dada esta introducción quiero compartir con ustedes lo poco que se y he aprendido de maven con la finalidad de que pueda serles de utilidad o al menos como incentivo a aprender mas de esta poderosa herramienta.

Instalación

Debemos ir al sitio web de Maven y descargar los binarios, como vamos a ir haciendo cosas sencillas les recomiendo que empecemos con la versión 3 para ir familiarizandonos con las novedades de esta nueva versión (según he leido goza de mejoras de productividad, errores, además de escribir el fichero POM en otros lenguajes no XML como groovy, ruby, scala entre otros).

NOTA: Antes de realizar los siguientes pasos de la instalación, asumimos que ya de antemano existe la variable JAVA_HOME apuntando a la ruta donde tenemos instalado nuestra versión de Java y que a su vez los binarios de Java ya han sido añadidos al PATH del sistema.

Usuarios Windows XP

  1. Una vez descargado el software, descomprimirlo en la carpeta de preferencia, por ejemplo para usuarios windows podria ser la ruta C:\Archivos de programa\apache-maven,
  2. Creamos las variables de entorno en panel de control->Sistema->Opciones avanzadas->variables de entorno. Alli crearemos 2 nuevas variables del sistema. La primera será M2_HOME su valor será la ruta (path) donde hallamos instalado maven p.e. C:\Archivos de programa\apache-maven\apache-maven-3.0.4. La segunda variable será M2 y su valor será %M2_HOME%\bin.
  3. Editamos la variable del sistema PATH, y agregamos al final del contenido del valor de la variable PATH, el valor de la variable M2, de la siguiente manera:valor_variable_path;%M2%.
  4. Probamos que los pasos anteriores se han efectuado correctamente, Por linea de comandos (inicio->ejecutar: cmd.exe) tecleamos mvn -version y deberá aparecer la información de maven, como por ejemplo la versión java, la versión maven, la ruta de instalación, etc.

Usuarios Linux/Mac Os X

  1. Una vez descargado maven, lo extraemos en nuestro lugar de preferencia, pero podriamos utilizar la ruta /usr/local/apache-maven.
  2. En el terminal por linea de comando, exportamos la variable M2_HOME con el valor de la ruta donde hemos instalado maven por ejemplo,  export M2_HOME = /usr/local/apache-maven/apache-maven-3.0.4. De igual manera hacemos con la variable M2, de la siguiente manera, export M2=$M2_HOME/bin.
  3. Agregamos al PATH la variable M2, de la siguiente manera, export PATH=$M2:$PATH.
  4. Probamos que los pasos anteriores se han efectuado correctamente, Por linea de comandos  tecleamos mvn -version y deberá aparecer la información de maven, como por ejemplo la versión java, la versión maven, la ruta de instalación, etc.

Configuración opcional

Si entramos en la ruta donde hemos instalado maven encontraremos el fichero settings.xml dentro de la carpeta conf, este fichero nos permite configurar aspectos adicionales, como pueden ser modificar la ruta por defecto donde se alojara nuestro repositorio o indicar una conexón proxy, entre otras cosas.

Si estamos conectados por medio de un servidor proxy sencillamente descomentamos el contenido de la etiqueta proxies y alli indicamos los valores con lo cual accedemos a conectarnos. por ejemplo

Por otro lado si desearamos modificar la ruta por defecto del repositorio, solo descomentariamos el contenido de la etiqueta local_repository y colocamos la ruta donde deseemos que este ubicado nuestro repositorio, por ejemplo en windows podría ser algo como esto:

 

Ahora que ya tenemos maven instalado, configurado y tenemos constancia de ello (habiendo efectuado las pruebas), vamos a crear nuestro primer proyecto Maven, lo haremos por linea de comandos y tecleamos lo siguiente:

mvn archetype:generate -DgroupId=com.josedeveloper.app -DartifactId=PruebaMaven -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

Esta sentencia nos creara todo el esqueleto del Proyecto incluyendo un fichero de pruebas y un main (con un “Hola mundo!”), la primera vez puede que tarde un poco, ya que maven estara descargandose las ultimas versiones de los plug-ins a nuestro repositorio, incluso en el sitio web de Maven nos indican que puede que esta sentencia debamos ejecutarla en más de una oportunidad ya que pueden ocurrir time out antes de que se haya terminado la descarga (esperemos que no sea nuestro caso).

Una vez creado el proyecto veremos una carpeta de nombre PruebaMaven (o cualquier otro que hayamos utilizado) si entramos en esa carpeta nos encontraremos con el fichero pom.xml y este no es mas que el fichero que maneja la configuración de nuestro proyecto (haciendo una analogia vendria siendo algo asi como el build.xml de Ant).

Maven funciona en torno a fases, y una fase no es más que un paso dentro del ciclo de vida de construcción de un proyecto, es importante tener en cuenta que para llegar a una fase es necesario haber pasado previamente por las fases que le preceden. Las fases por defecto más comunes de un proyecto serían las siguientes:

  • validate: Valida que el proyecto esta correcto y dispone de la información necesaria.
  • compile: Compila el código fuente del proyecto.
  • test: Prueba el código fuente compilado haciendo uso de frameworks para pruebas unitarias (JUnit).
  • package: Empaqueta el código fuente compilado (por ejemplo creando un jar o war).
  • integration-test: Procesa y despliega el paquete dentro de un entorno de test de integración.
  • verify: Ejecuta los controles necesarios para  verificar si el paquete es válido y cumple con los criterios de calidad.
  • install: Instala el paquete dentro del repositorio local, para poder usarlo como dependencia en otro proyecto.
  • deploy: Copia el paquete final al repositorio remoto para compartir con otros desarrolladores y proyectos.

Analizando lo anterior  y volviendo a lo de las fases, nos damos cuenta que tiene mucha logica el enfoque de fases de Maven, ya que para poder probar un código, es necesario haberlo compilado de antemano, lo cual implica haber pasado por la fase compile, así como para poder instalar un proyecto como dependencia en el repositorio es necesario que el código haya sido compilado, se haya probado, luego empaquetarlo, lo que se traduce que al invocar la fase install previamente tuvo que haber pasado por las fases, compile, test, package… y asi sucesivamente.

Ahora procedamos a construir el proyecto, sencillamente ubicandonos dentro de la carpeta del proyecto, introducimos por linea de comandos, lo siguiente

mvn package

Si navegamos por la estructura de directorio veremos que en la carpeta target nos habra creado un fichero .jar, además que durante la ejecución de la ultima sentencia podemos ver como se van ejecutando las fases previas al empaquetado.

Ya empaquetado el proyecto procedemos a ejecutarlo y lo haremos también por linea de comandos introduciendo la siguiente sentencia

>java -cp .\target\PruebaMaven-1.0-SNAPSHOT.jar com.josedeveloper.app.App

Podremos ver nuestro Hola Mundo! con nuestro primer proyecto maven.

Por ultimo quizás se hayan dado cuenta que algunos warning se arrojaron por linea de comando al momento del empaquetado, eso podemos resolverlo muy facilmente agregando a nuestro fichero pom.xml la siguiente linea

 

quedando este ultimo así

Conclusión

Toparse de repente con maven en un proyecto, al principio puede ser un dolor de cabeza, genera muchas interrogantes, además que la curva de aprendizaje a mi modo de ver no es de la mas rapidas, lo cual puede que nos genere uno que otro enfado, impotencia, pero a medida que se va aprendiendo y poniendo a prueba las bondades de esta herramienta  ocurre un cambio como decir el pasar del odio al amor jajajaja, esto no lo tomen como una generalización sino que es una opinion personal, pero es lo que he percibido a medida que voy avanzado con Maven, entre los beneficios (gracias a la gran cantidad de plugins) pues yo brevemente destaco el poder tener un repositorio centralizado, identificando las dependencias por sus respectivas versiones, es decir, olvidemonos de la cantidad infinita de jars repetidos en cada proyecto, además de poder utilizarlo para temas de testing e integración continua, además de poder crear esqueletos de proyectos adaptados a nuestras necesidades, ya para mi lo anteriormente expuesto ya hace que valga la pena aprender a usar la herramienta, es más si les soy sincero yo aun estoy conociendo las ventajas de usar Maven y espero en medida de lo posible poderlo compartir con ustedes. De igual manera les invito a compartir sus experiencias con maven, que otras ventajas o desventajas observan ustedes de usarlo así como compartir material de interés.

Usando regex para formatear SQL

En algunas ocasiones llegue a leer  de regex, también lo estudie (muy poco) para sacar la certificación SCJP y en rara ocasión utilizarlo para alguna validación, aunque sin dudarlo donde mas pude conocer de su potencial fue conversando con colegas de profesión.

En esta oportunidad quiero compartir con ustedes una solución que pude dar a un problema, agilizando (mucho) mi trabajo y facilitando lo que tenia que hacer.

El problema: Un script para la inserción de un gran numero de registros (aproximadamente por el orden de los 16000) que afectaba a varias tablas. Dicho script era producto de una exportación de una BD oracle, la exportación le otorgo a los valores de las fechas un formato especial de la forma {d ‘yyyy-mm-dd’}. Por ejemplo {d ‘2010-09-14’}.

Al ejecutar los script arrojaba un error, ademas de que el formato de la fecha en mi BD local era de la forma ‘dd-mm-yyyy’, entre las soluciones que me aconsejaban era utilizar un editor al estilo notepad++, ultraedit y de esta manera poder eliminar las llaves y la letra d, pero esto no solucionaba totalmente el problema ya que aun estaba de por medio el formato en el que estaba representada la fecha. Fue en ese momento que pensé regex y de toda su potencia y aunque no estaba seguro de que pudiese ser la solución sentí que tenia que darle un vistazo en detalle a las características que podría darme.

Después de visitar algunos sitios web, pude dar con lo que necesitaba y me dispuse a implementar una solución (java) para mi problema, que de antemano se que puede hacerse mas elegante e incluso por que no decirlo, implementarse mejor, pero el entusiasmo que tengo en compartirlo con ustedes hace que no me dedique a refinar mi programa, pero lo que mas deseo que evitar que algún colega tenga que editar 10000 INSERT.

Aquí les dejo el código

Como podrán ver la funcionalidad de este programa consiste en recibir 2 argumentos y en cuyo caso que no los reciba arrojar un mensaje de error. El primer argumento es la ruta donde esta ubicado el fichero SQL y el segundo argumento es el nombre del nuevo fichero SQL que habrá sido formateado.

La clave: El patron regex utilizado.

String patternStr = “\\{[d]\\s\\'(\\d{4})-(\\d{2})-(\\d{2})\\’\\}+”;

Tiene las siguientes características:

  • \\{      busca existe una llave “{“.
  • [d]      seguida de la letra d.
  • \\s      seguido de un espacio en blanco.
  • \\’      busca el carácter “‘” (comilla simple)
  • (\\d{4})-(\\d{2})-(\\d{2})     seguido de 4 dígitos más “-” seguido de 2 dígitos mas “-” y por ultimo 2 dígitos. Como podrán notar los dígitos aparecen dentro de paréntesis, esta es una particularidad de regex que nos permite hacer grupos y esto resulto fundamental para poder resolver el formato de la fecha.
  • \\’    busca el carácter “‘” (comilla simple).
  • \\}    busca el carácter “}”.
  • + Nos indica que al buscar este patrón, este puede aparecer en más de una oportunidad.

Por ultimo está la sentencia utilizada para llevar a cabo el reemplazo:

bos.write(line.replaceAll(patternStr, “‘$3-$2-$1′”)+”\n”);

Donde al hallar el patrón, es sustituido por el segundo parametro utilizado “‘$3-$2-$1′”, aqui enlazamos con los grupos definidos, ya que eso es a lo que hacen referencia las variables $, donde por ejemplo $1 significa el primer grupo definido  en el patrón que se corresponde con el año, $2 el mes y $3 el día.

Como pudieron ver regex no solo ha de ser utilizado para llevar a cabo validaciones sino que además nos permite utilizarlo para llevar a cabo funciones de formateo y a en mi caso me ahorro editar a mano 15000 registros o en el mejor de los casos hacer un programa Java muy rebuscado trabajando con cadenas.

 

Lo nuevo en Java 7

Tal como dice el titulo, si deseas conocer algunas de las novedades de Java 7, descárgate de forma gratuita este ebook y accede a el con tu aplicación kindle desde cualquiera de tus dispositivos, ya sea tu computadora, teléfono móvil (celular), tablet o dispositivo kindle.

Mas libros aquí

NOTA: Amazon también proporciona una aplicación Web en HTML5 para visualizar tus ebooks, que al igual que la app nativa te sincroniza tus notas, resaltados y ultima pagina alcanzada en la lectura del libro.