domingo, 17 de diciembre de 2017

Sub Procesamiento Multiple, Threads, Hilos


Probablemente ya estes familiarizado con el termino subprocesamiento multiple o multi tarea: La capacidad de tener mas de un programa trabajando y que pareciera que se realizan al mismo tiempo. Por ejemplo tu puedes estar imprimiendo mientras estas editando o enviando un fax. Por supuesto, al menos que tengas una maquina con varios procesadores, lo que realemente esta pasando es que el sistema operativo esta repartiendo los recursos a cada programa, dando la impresion que trabajan en paralelo. Esta distribucion de recursos es posible porque mientras piensas mantienes el computador en estado desocupado, por ejemplo mientras tecleas, la mayoria de los CPU'S procesan la data en intervalos muy cortos (teclear datos puede tomar alrededor de 1/20 segundos por cada caracter, despues de todo queda mucho tiempo ocioso para el cpu.)

La multitarea se puede hacer de dos maneras, dependiendo de si el sistema operativo interrumpe el progama sin consultar con ellos primero o si los programas son interrumpidos unicamente cuando estan dispuestos a ceder el control. El primero es llamado multitarea preventiva; el ultimo es llamado multitarea cooperativa o simplemente multitarea no preventiva.

En Java, el subprocesamiento multiple se implementa con Hilos, también conocidos como Threads en ingles.

Aquí os dejo una lista de articulos relacionados con Hilos en Java
Swing y Hilos
Swing y SwingWorker

sábado, 2 de diciembre de 2017

Guia Rapida de Maven

Esta es una guía practica de iniciación para Maven, aprenderemos lo esencial de Maven para empezar a usarlo cuando antes, está guía no pretende profundizar en todas las funcionalidades de Maven, solo veremos lo esencial.

El ciclo de vida de construcción en Maven
Repositorios Maven
El archivo pom.xml de Maven
Dependencias en Maven
Plugins en Maven
Estructura de un proyecto Maven
Agregando directorios al classpath


1. El ciclo de vida de construccion en Maven
Maven usa el concepto build lifecycle, este concepto indica que el proceso de construcción y distribución de un artefacto(proyecto) está claramente definido.
Para la persona que necesita construir un proyecto, esto significa que solo se requiere aprender unos cuantos comandos para construir cualquier proyecto Maven. Maven define una serie de convenciones y reglas. Desde la estructura de un proyecto hasta los pasos de construcción. Maven las define para que podamos construir nuestro proyecto con el minimo de configuraciones y de forma facil.

Maven viene integrado con tres lifecycles: default, clean y site. El lifecycle default maneja el despliegue de tu proyecto, el lifecycle clean maneja limpiezas del proyecto mientras que el lifecycle site maneja la creación de los sitios de documentación de tu proyecto.
Cada uno de estos lifecycle está compuesto por una lista de build phases, un buid phase se define como una etapa en el lifecycle.
Por mencionar los más importantes, el lifecycle default comprende las siguientes build phases:
  • validate - Valida que el proyecto esta correcto y toda la información requerida está disponible
  • compile - Compila el codigo fuente del proyecto.
  • test - Prueba el codigo fuente compilado usando un framework de testing unitario.
  • package - Toma el código fuente compilado y lo empaqueta dentro de un formato distribuible, tal com JAR o WAR.
  • verify - Ejecuta algunas verificaciones sobre los resultados de pruebas de integración para asegurar que pasen los criterios de calidad.
  • install - Instala el package (jar) en el repositorio local, para que sea usado como dependencia en otros proyectos localmente.
  • deploy - Se realiza en el ambiente de producción, copia el package final al repositorio remoto para ser compartido con otros desarrolladores y proyectos.

Estas phases son ejecutadas secuencialmente y en el orden mencionado.
En un ambiente de desarrollo, si queremos instalar nuestro artefacto en el repositorio local ejecutaremos el siguiente comando:

mvn install

Este comando ejecuta cada una de las phases del lifecycle default en el orden (validate, compile, test, package, etc,.), hasta ejecutar la phase install. Es decir, solo necesitas llamar a la ultima phase que necesitas.

2.- Repositorios Maven
Un repositorio es el lugar donde los artefactos (jar, war, ear) construidos son almacenados. Hay dos tipos de repositorios, local y remoto. Los repositorios locales están en el directorio del usuario del sistema, más especifico, en Windows la ruta por defecto es "C:\Users\{usuario}\.m2\repository". En este directorio se almacena una copia de todos los archivos que son usados en nuestro proyecto como dependencias. El repositorio remoto se encuentra en un servidor remoto conectado a la red Internet, este es gestionado por un tercero. El repositorio remoto mas conocido es el del propio maven. La URL del repositorio central de Maven se encuenta en http://www.mvnrepository.com, pos si quieres curiosear un rato.

3.- El archivo pom.xml de Maven
Este archivo es el equivalente al archivo build.xml de ANT. El archivo pom.xml de Maven contiene las configuraciones para construir y gestionar un proyecto. Basicamente aquí se definen las propiedades del proyecto, las dependencias del proyecto(librerias jars de terceros o propios) y los plugins de maven a ejecutar.

Un pom debe tener al menos la siguiente información
  • modelVersion
  • groupId
  • artifactId
  • version
Aquí un ejemplo sencillo de un archivo pom.xml



Generalmente no vas a crear este archivo desde cero, para eso maven te proporciona artefactos (plantillas), tu trabajo se enfocará en agregar las dependencias que necesites.

4.- Dependencias Maven
Dependencias son aquellas liberias (jars) externas que nuestro proyecto requiere, por ejemplo el famoso Log4J, libreria para escribir registros. Toda dependencia que nuestro proyecto requiera debe ser declarado en nuestro POM (pom.xml). Maven buscará estas dependencias en nuestro repositorio local, si no los encuentra entonces los descargará desde el repositorio remoto y los guardará en el repositorio local. Para agregar una dependencia tenemos un elemento disponible, el elemento dependency. Aquí un ejemplo las dependencias que tengo en mi proyecto.


Generalmente para agregar una dependencia lo primero será asegurarnos que se encuentra en el repositorio central de Maven, definirlo en el POM incluyendo el groupId, artifactId, version, type y scope. Lo que yo hago es buscar el artifactId en el repositorio centrar de Maven, copiar la porcion del xml y pegarlo en mi POM.
Por ejemplo para log4j


Los elementos groupId, artifactId y version, se entienden por si solos, te explico los otros dos elementos.
  • type: El tipo de empaquetado que usa la dependencia, generalmente esto lo sabes por el tipo de extensión de la dependencia; jar, war o ear. No siempre el tipo corresponde a la extensión, pero si en su mayoria.
  • scope: Este elemento se refiere al contexto del uso de la dependencia en relación con el classpath, es decir, se desea usar la dependencia en compilacion, en tiempo de ejecución o en testing. Hay cinco tipos de scope disponibles, pero las mas usadas son:
    • compile: Es el scope usado por defecto, en caso de que no se especifique alguno.Dependencias con scope compile son agregados al classpath, es más, estás dependencias son propagadas a proyectos dependientes.
    • runtime: Dependencias con scope runtime no son requeridas para la compilación, pero si para la ejecución.
    • test: Dependencias con scope test no son requeridas para uso normal de la aplicacion, sólo están disponibles para la fase de pruebas y ejecución.
5.- Plugins en Maven
Todo proceso en Maven es realizado por plugins. Un plugin es mapeado y ejecutado como una phase. Una phase es mapeada a multiple objetivos. Estos objetivos son ejecutados por el plugin. Nosotros podemos invocar explicitamente un objetivo cuando ejecutamos Maven.
Un plugin muy usado es el plugin 'compiler', este plugin es el encargado de compilar el codigo fuente Java. El plugin compiler tiene dos objetivos, compiler:compiler y compiler:testCompile.
Usando el elemento configuration, podemos pasar parametros al plugin. Aquí podemos ver una poción de mi pom.xml que usa plugins.


Para proyectos básicos no necesitas agregar explicitamente los plugins, mas adelante veremos los arquetipos, ellos se encargan de agregar los plugins necesarios.

6.- Estructura de un proyecto en Maven
Maven tiene bien definido una convención para la estructura de directorios de un proyecto. Si seguimos está convención no necesitaremos configuraciones adicionales para definir donde están localizados los elementos. Maven conoce donde se encruenta el código fuente, casos de pruebas, recursos, etc,. Para conocer un poco más veamos la estructura de un proyecto web.

Las carpetas más importantes son: src, resources, webapp, test, target.
De nuevo, para proyectos básicos no necesitas crear explicitamente el directorio, Maven o hace por tí

7.- Archetype en Maven
En Maven tenemos los 'Archetype' o arquetipos, los arquetipos son como plantillas para crear proyectos. Maven proporciona estas plantillas para iniciar un proyecto, usando arquetipos podemos iniciar rapidamente un proyecto Maven. Los arquetipos definen la estructura de directorios de nuestro proyecto, definen los plugins a usar, definen las dependencias. Más especifico, ademas de definir la estructura de directorios también definen un pom.xml.

8.- Creando nuestro primer proyecto en Maven
Ahora si, vamos a crear nuestro primer proyecto Maven, asumiendo que tienes Maven instalado correctamente. 
Lo primero que haremos será abrir una ventana de comandos, navegar hasta el directorio donde queremos crear el proyecto, luego ejecutar el siguiente comando:

mvn archetype:generate -DgroupId=com.macrob.sample -DartifactId=first-mavenapp -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
Donde
  • -DgroupId: Es la combinacion de la organización y producto.
  • -DartifactId: El nombre del artefacto, o el nombre del jar. Este nombre es también usado para nombrar el directorio raiz del proyecto.
  • -DarchetypeArtifactId: El arquetipo a usar

 

Lo que hemos hecho es crear un proyecto vacío, un proyecto con una estructura de directorios definido, en donde podemos ir agregando clases, recursos, etc,. Ademas de la estructura de directorios, también tenemos un archivo pom.xml dentro del directorio raiz del proyecto creado,en el pom.xml podemos ir agregando dependencias. Este es un proyecto estandard, si necesitas un proyecto para una aplicación web, necesitas ejecutar un arquetipo para un proyecto web.
Para finalizar, vamos a crear el jar de nuestro proyecto, si lo unico que quiero es generar el jar, vamos a ejecutar el build phase package  

mvn package



Si entras al directorio target vas a ver un jar con el nombre first-mavenapp-1.0-SNAPSHOT.jar
Si necesitas instalar este artefacto en tu repositorio local, solo tienes que ejecutar el build phase install
mvn install

9. Agregando directorios al classpath de Java

Agregar directorios al classpath de Java es otra actividad escencial en Java, recuerda que los directorios que se agregan al classpath en su mayoría se necesitan en tiempo de ejecución.




El directorio se agrega como un recurso dentro de la lista de cursos en la sección build. La ruta es relativa al archivo pom.xml

Referencia