jueves, 16 de diciembre de 2010

Avances en la compilación de OpenNI en Mac OS X.

Luego de la liberación de los drivers open source del Kinect de la empresa PrimeSense, estos se encontraban disponibles para Windows y Ubuntu, con esta idea en mente un programador, Diederick, inició un nuevo proyecto para portar estos drivers a Mac.

Como podemos ver en la discusión, Hiv Zendel de PrimeSense (el estudio israelí encargado del proyecto Natal) se interesó por el proyecto de Diederick e iniciaron una plática en irc. Luego de esta plática al parecer hubo avances y el día de ayer (14/dic/2010) Diederick publica en su blog algunas instrucciones para empezar a descargar el código de OpenNI y el sistema de compilación portado para probar dicho sistema de compilación en Mac.

Aquí el blog de Diederick con las instrucciones para bajar y probar el sistema de compilado hecho con cmake.

Básicamente hay que hacer lo siguiente:


  1. mkdir roxlu_openni
  2. cd roxlu_openni
  3. git clone https://github.com/roxlu/OpenNI.git .
  4. # on Mac
  5. cd Platform/Mac/Bin/Release
  6. ./build_release.sh
  7. make
  8. make install
  9. ./Sample-NiAudioSample


He estado probando a compilar el còdigo y sólo he tenido que instalar el cmake disponible aquí. Luego de instalar cmake también tuve que compilar e instalar la versión 8 de las bibliotecas de ljpeg cuyo código fuente se encuentra aquí.

Compilando la biblioteca ljpeg:

Compilar las bibliotecas ljpeg no ha sido muy complicado siguiendo las instrucciones de este blog. Básicamente consiste en bajar el código fuente, descomprimir, colocarnos a la altura de la carpeta descomprimida y ejecutar las siguientes líneas en una terminal:


cp /usr/share/libtool/config/config.sub .

cp /usr/share/libtool/config/config.guess .

./configure --enable-shared --enable-static

make
sudo make install
/usr/local/lib/libjpeg.a

sudo ranlib


Notarán que en la Mac que tengo, cambia un poco la ruta donde encontramos el config.sub y el config.guess de lo mostrado en el blog de DZones y Peter Cooper.

Una vez instalado el cmake y la biblioteca ljpeg el código de la página de Diederick compiló bien, el problema es que cuando ejecuto la línea ./Sample-NiAudioSample me lanza el siguiente mensaje de error:


   27273 [INFO] OpenNI version is 1.0.0 (Build 23)-Mac (Dec 15 2010 23:46:19)
   27354 [INFO] Log system initialized. Console: 1, File: 1, Severity: VERBOSE, Masks: ALL
   27389 [INFO] Log system initialized. Console: 1, File: 1, Severity: VERBOSE, Masks: ALL
Open failed: OpenNI library can't find any module!


Al parecer no tengo instalado un módulo con el que se pueda probar el OpenNI, la buena noticia es que el día de hoy en el mismo blog de Diederick publicó que ha terminado el port del código del SensorKinect, que espero poder probar a compilar el día de mañana.

Al parecer queda poco para poder utilizar los drivers OpenNI en Mac, mientras tanto seguiremos al pendiente.

miércoles, 15 de diciembre de 2010

Introducción a Maven 2.2.1 con Netbeans.

Introducción

Existen una amplia variedad de cosas que se pueden hacer con Maven; sin embargo su principal función es la de ser un administrador de dependencias y versiones para proyectos hechos en Java. Es decir, si en alguna ocasión te has visto en la necesidad de lidiar con proyectos relativamente grandes como lo pueden ser las aplicaciones web, te habrás dado cuenta que mientras más frameworks, jars, utilerías y demás paquetes java se utilizan para un desarrollo, el nivel de complejidad entre las dependencias crece exponencialmente hasta llegar al punto que administrar estas dependencias puede llegar a ser un verdadero problema. Más aún, si el desarrollo de una aplicación se lleva a cabo por un equipo de dos o más personas, el problema puede llegar a ser demasiado grande para ser manejado descentemente sin la ayuda de herramientas como Maven.

Apache Maven (o Maven a secas) es una de esas poderosas herramientas que cuando las ves por primera vez parecen no tener mucho sentido y esto es porque la forma en la que se configura (esto es por medio de archivos xml) la tarea de modificar, leer o introducir nuevos componentes a la configuración de Maven puede llegar a ser tortuosa, e incluso aburrida; pero no te desanimes, detrás de todo ese código xml existe una gran herramienta que con un poco de práctica se puede convertir en una buena aliada.

A pesar que existen GUI para manejar propiamente el xml requerido por Maven (por ejemplo la integrada con Eclipse o con Netbeans) la mayoría de las veces los códigos de configuración referentes a Maven que se encuentra en Internet, en su mayoría vienen en xml plano, por lo que por el momento nos evitaremos el uso de una interfaz gráfica para el manejo del archivo de configuración de Maven.

Las tareas que se pueden realizar con Maven pueden ser muy variadas: desde hacer un deploy automático en un servidor Weblogic hasta aplicar métricas a tu código, realizar estadísticas y entregar un reporte en un documento html configurado con una plantilla específicamente diseñada para tu propia empresa; todo esto por medio de plugins y más y más configuraciones de xml.

Pero antes de poder configurar a Maven para que haga todas estas cosas necesitamos hacer un pequeño proyecto de prueba para probar esta herramienta, así que entremos en materia.

Ejemplo básico

Precondición:
  • Estamos suponiendo que en este punto ya se tiene instalado el Netbeans versión 6.5 o mayor configurado con Maven.
  • Si es la primera vez que ejecutas Maven en tu computadora necesitarás tener conexión a internet ya que la primera vez que se Maven se ejecuta descarga algunos MB's de información para poder ejecutarse.
El primer paso es abrir tu Netbeans y dar click en File > New Proyect y dentro de la pantalla que aparece seleccionamos la carpeta de Maven y del lado derecho seleccionamos Maven Proyect.


En la siguiente pantalla dejamos la opción Maven Quickstart Archetype (1.0). Damos click en Next.

El siguiente paso es importante ya que debemos introducir información que identificará al nuevo proyecto que estamos construyendo. En la pantalla que aparece introducimos la siguiente información:
  • Project Name: test.maven
Aquí le decimos a NB cómo se llamará la carpeta de nuestro proyecto dentro del sistema de archivos de nuestra computadora.

  • Project Location: C:\Documents and Settings\sawbona\Mis documentos\NetBeansProjects
La carpeta dentro del sistema de archivos donde se guardará la carpeta que creamos en el punto anterior.

  • Project Folder: "NB automáticamente llena esta parte y lo hace uniendo los dos campos anteriores. Será la ruta final completa donde estará localizado nuestro proyecto"

En este punto es donde debemos de detenernos un poco para explicar cómo funciona Maven.

La forma en que Maven identifica un proyecto de manera única es mediante la unión de tres etiquetas lógicas "especiales" o cómo algunas personas he escuchado que lo llaman: meta-información. Esta información es la siguiente:

  • Nombre de la compañía que desarrolla el proyecto; o como Maven le llama "groupId"
  • Nombre del proyecto que se está desarrollando; mejor conocido como "artifactId" y finalmente...
  • Versión del proyecto; o "version" (sin asento) para Maven.
Estos son los tres trozos de información que Maven utiliza para identificar todas y cada una de las dependencias, cualquier proyecto o plugin que utilize y es en este punto donde NB nos pide que bauticemos a nuestro nuevo proyecto así que procedemos a darle un nombre.

  • Artifact Id: test.maven

En la versión de NB 6.5 y mayores este campo es tomado automáticamente del nombre que introdujimos como "Project Name", posteriormente este nombre lo podemos cambiar en el archivo de configuración de Maven; sin embargo recomiendo mantener el mismo nombre del Artifact Id con el nombre de la carpeta donde estamos guardando el proyecto, sobre todo porque cuando navegemos en el sistema de archivos vamos a poder reconocer más fácilmente qué carpeta contiene qué proyecto.

  • Group Id: sawbona.code
Aquí podrías poner el nombre del dominio de tu empresa, tu nombre o la escuela donde estudias. Este es un punto importante ya que cuando quieres agregar dependencias de otros grupos o empresar es fácil buscar en internet por el GroupId de la empresa que quieras. Para nuestro caso si alguien quisiera buscar código que nuestra empresa, grupo o nosotros mismos desarrollásemos, sería más fácil que identificaran nuestros productos por un groupId consistente y fácilmente identificable. Normalmente corresponde al dominio en internet.

  • Version: 1.0-SNAPSHOT
En el contexto de Maven, se utiliza la palabra SNAPSHOT para hablar de versiones en desarrollo y pues eso, bautizamos a nuestra aplicación de prueba como la primera versión de desarrollo.

La pantalla resultante de NB debe verse como la siguiente imagen:


Una vez introducida la esta información, damos click en el botón "Finish" tras lo cual NB creará en un directorio en nuestra computadora que contendrá dos clases y mirando dentro del explorador del NB podremos ver que el proyecto tiene la siguiente estructura.


Si nos fijamos en nuestro disco duro, NB ha creado una carpeta con la siguiente estructura:
La filosofía de la organización de Maven radica en que los proyectos hechos en Java siguen una estructura estándar dependiendo de su naturaleza (aplicación de escritorio, EJB, WAR, etc...). Es decir en nuestro caso le hemos dicho a NB que íbamos a crear un proyecto simple en Java con una clase principal que contiene un método main como punto de entrada, por lo que Maven (por medio de NB como intermediario) ha creado la carpeta de nuestro proyecto que contiene un archivo pom.xml y una carpeta src y una estructura predefinida.

Dentro de la carpeta src tenemos dos carpetas, una llamada main, que es donde colocaremos el código "funcional" de nuestra aplicación y una carpeta test que es donde deberíamos, por default, colocar el código de nuestras pruebas unitarias.

Para continuar con la prueba de nuestra aplicación volvemos a nuestro NB, abrimos el explorador de proyectos y navegamos hasta la clase App.java y la abrimos. Damos click con el botón derecho del mouse y seleccionamos "Run File".


Si es la primera vez que ejecutas Maven verás que en la salida de consola de NB (Control + 4) empiezan a aparecer líneas de texto informando que Maven está descargando información (o más formalmente "dependencias") de Internet, este proceso, dependiendo de tu  velocidad de conexión tardará de dos a diez minutos, por lo que deberás ser paciente.

Una vez que Maven ha descargado todas las dependencias necesarias para ejecutarse veras que en la salida de NB aparece la línea Hello World de nuestro proyecto de prueba.

Ya para finalizar...

Hasta este punto hemos creado, compilado e instalado una aplicación con un groupId=sawbona.code, artifactid=maven.test y version=1.0-SNAPSHOT. Para ver dónde es que vivirá nuestra aplicación abrimos nuestro sistema de archivos y en el caso de Windows abrimos la siguiente ruta:

C:\Documents and Settings\sawbona\.m2\repository\sawbona\code\test.maven\1.0-SNAPSHOT

Dentro de esta carpeta debe existir un jar llamado test.maven-1.0-SNAPSHOT.jar que corresponderá a nuestra aplicación ya empaquetada y lista para ser usada. Si nos fijamos en el nombre de este jar vemos que está conformado por el artifactId y por la versión que introdujimos en un principio. De la misma forma si nos fijamos en la ruta que estamos navegando vemos que está conformada por el groupId, donde cada punto lo trasforma a una nueva carpeta dentro del sistema de archivos, seguida por una carpeta que corresponde al artifactId y finalmente la versión de nuestro proyecto.

La otra mitad de la ruta (C:\Documents and Settings\sawbona\.m2\repository) que estamos navegando corresponde a lo que Maven llama nuestro "repositorio local" de dependencias. Cuando Maven necesita un jar para compilar un proyecto el primer lugar que analiza es su repositorio local en busca de los jars (también llamados dependencias) necesarios para compilar el proyecto en turno, estos jars (dependencias) nosotros los declaramos dentro del archivo de configuración de nuestro proyeto al cual Maven lo llama pom.xml. Por default maven primero busca en nuestro repositorio local y después va buscando en orden en diferentes repositorios ubicados en internet.

Si abrimos NB y miramos dentro de la carpeta Project Files de nuestro proyecto de prueba veremos un archivo llamado pom.xml y si miramos el contenido veremos una sección que reza así:


<modelVersion>4.0.0</modelVersion>
  <groupId>sawbona.code</groupId>
  <artifactId>test.maven</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>test.maven</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>



Cuando le dijimos a NB que creara nuestro proyecto, Maven agregó por default una dependencia a junit versión 3.8.1. Si buscamos dentro de nuestro repositorio local veremos que existe la siguiente ruta:

C:\Documents and Settings\sawbona\.m2\repository\junit\junit\3.8.1

Que es la ruta donde Maven ha descargado el jar de junit que incluirá como dependencia de nuestro proyecto y el cual aparece dentro de la carpeta de "Test Libraries" dentro del navegador de proyectos de NB.

También viendo el archivo pom.xml podemos ver que la información que introdujimos en el momento de la creación del proyecto con NB está plasmada en este archivo.

Así llegamos al punto final de esta entrada: el archivo pom.xml.

Este es el archivo principal de configuración de los proyectos hecho en y para Maven. En este archivo podemos configurar todo sobre maven: plugins, dependencias, reporteadores y una larga lista de etc. Estas modificaciones puedes ser hechas mediante un editor de texto plano como el NotePad++ o con una GUI destinada para estos propósitos. Cuando le decimos a NB que nos cree un proyecto hecho en Maven básicamente NB funciona como in termediario que manda a ejecutar unas tareas específicas de Maven (llamados plugins) para que cree un esqueleto básico (también llamado archetype) y es este el que crea la estructura básica del proyecto junto con el archivo pom.xml que hemos analizado.

Y eso es todo. Esta es mi pequeña introducción a apache Maven con Netbeans que espero que a alguna persona le sea útil.

Saludos.

    martes, 14 de diciembre de 2010

    Incursionando en un nuevo mundo.

    Como programador de aplicaciones Java desde hace más de dos años, puedo decir que la transición al mundo de los API's de Apple, la adopción de un nuevo sistema operativo (Mac OS X Snow Leopard), la experimentación en ActionScript de Flash y el poco acercamiento al lenguaje de programación Objective-C  que he podido tener, ha sido un camino lleno de sorpresas, frustraciones y mucho, pero mucho aprendizaje.

    Cuando uno viene del "armonioso" camino de Java, se piensa que normalmente la vida es sencilla. Luego de algunos años de práctica llegué a pensar que la recolección automática de basura era el pan diario de cada día en todos y cada uno de los mundos. También llegué a pensar que sólo había una forma de modelar interfaces, clases, herencia y en general que aquella cosa que nos enseñaron en la escuela que se llama programación orientada a objetos (PPO) sólo existe y vive para ser hecho con y para Java... y lo único que puedo decir de esto es "vaya ingenuo que he sido".

    Cuando se ha vivido la mayor parte del tiempo atado a un ambiente Windows y programando en Netbeans, la vida se va haciendo cada vez más sosa, parsimoniosa hasta el punto algorítmico. Eso era mi escuela, mi trabajo y hasta cierto punto lo que llegué a anhelar como mi sustento económico. Es decir, aún pienso que ser un honorable programador en Java puede ser en un futuro no muy lejano aquello que termine de llenar mi vida, pero por el momento no puedo negar que mis intereses se inclinan a aquello que siempre he querido hacer: programar videojuegos.

    Por el momento no digo que estar viviendo esta etapa como programador JavaEE no sea edificante y educativo, más bien todo lo contrario: de esta vida (que en un principio se llega a pensar que es lo máximo y que nada lo puede superar), estoy aprendiendo grandes cosas y seguramente en el futuro seguiré aprendiendo aún más.

    Es con esta convición de querer ir un paso más allá que en julio de este mismo año 2010 pude comprarme finalmente una de esas tan afamadas (¿debería pedir perdón por usar tal palabra... ^_^?) computadoras Mac y es de esta compra que todo este post viene a colasión, ya que el tener entre mis manos una linda Macbook Pro ha hecho que por fin pueda enfrentarme a todo un mundo hasta el momento desconocido para mí. Finalmente pude ir un paso más allá de las fronteras de Java y enfrentarme por primera vez a uno de los sabores de C -sí, uno de esos enemigos que durante tanto tiempo he visto como inquebrantable e indescifrable-, es decir Objective-C y poco antes de él, debí enfrentarme a un poco de ActionScript, Flash e Illustrator.

    Trataré en lo medida de lo posible de escribir de los pocos avances que vaya haciendo y de las cosas que vaya aprendiendo en el camino para que este blog sea algo más útil para mí y para los que lo puedan leer en algún momento. Por supuesto no puede quedar fuera todo aquello que he aprendido de Java y en la medida de lo posible trataré de poner cosas de Spring, EJB's y todo lo que se me vaya ocurriendo en el camino. =)

    Por ahora sólo quiero publicar una entrada nueva y dejar este pequeño post como el inicio de una nueva etapa en este espacio de tiempo que me ha tocado vivir.

    "Las grandes victorias requieren de grandes decisiones." - Neson Rocha Jr. ;)