viernes, 23 de enero de 2009

Exprimiendo a Hudson - Parte 1 (Instalación)



Hudson es un CI Server o servidor de integración continua open source. Existen varios productos similares tales como Cruise Control o Continuum de Apache.
Lo que diferencia a Hudson del resto es su potencia mediante la extension por plugins y su facilidad de instalación, configuración y mantenimiento.

En esta primera entrega de una serie voy a explicar como desplegar Hudson en un Servidor Tomcat instalado en Ubuntu Intrepid Ibex, de todas formas en cualquier otra distro de Linux u otro S.O esto no debería ser muy diferente. En las próximas entradas veremos como integrar varias herramientas con los plugins de hudson para reporte de test, cobertura y análisis de código estático para métricas de QA.

Instalación:
  • Paso 1: Descargamos hudson.war desde el sitio oficial o desde este link. Podemos probar hudson iniciándolo con el servidor embebido que trae simplemente con la orden java -jar hudson.war
  • Paso 2: Para poder hacer uso de Hudson de forma profesional necesitamos desplegar el war en un contenedor de servlets/jsp como Tomcat. Necesitamos descargar los paquetes tomcat6 y tomcat6-admin. Esto podemos hacerlo desde el gestor de paquetes Synaptic o escribiendo en una terminal:
sudo apt-get install tomcat6 tomcat6-admin
  • Paso 3: Probamos si tomcat esta funcionando escribiendo en un browser: http://localhost:8080 . Si todo anda bien deberemos crear un usuario administrador con un rol. Para eso editamos el archivo tomcat-users.xml y luego reiniciamos el servidor:
sudo nano /var/lib/tomcat6/conf/tomcat-users.xml

<!--
<role rolename="tomcat"/>
<role rolename="role1"/>
<user username="tomcat" password="tomcat" roles="tomcat"/>
<user username="both" password="tomcat" roles="tomcat,role1"/>
<user username="role1" password="tomcat" roles="role1"/>
-->
<role rolename="manager"/>
<role rolename="admin"/>
<user username="user" password="secreto" roles="manager"/>
<user username="hudson-admin" password="secreto" roles="admin"/>
</tomcat-users>

  • Paso 4: Abrimos el administrador de Tomcat, aquí nos pedira el usuario y contraseña que recien agregamos en tomcat-users.xml. Para esto escribimos la siguiente direccion en el browser: http://localhost:8080/manager/html. En la sección apropiada agregamos el archivo hudson.war para poder desplegarlo en el contenedor.
  • Paso 5: Creamos el directorio de trabajo de Hudson y le otorgamos permisos:
sudo mkdir /home/hudson
sudo chmod 777 /home/hudson
  • Paso 6: En el archivo /etc/init.d/tomcat6 agregamos a la variable JAVA_OPTS la variable -DHUDSON_HOME con el valor del directorio de trabajo de hudson que definimos en el paso 5.
sudo gedit /etc/init.d/tomcat6

JAVA_OPTS="$JAVA_OPTS -Djava.endorsed.dirs=$CATALINA_HOME/endorsed -Dcatalina.base=$CATALINA_BASE -Dcatalina.home=$CATALINA_HOME -Djava.io.tmpdir=$CATALINA_BASE/temp -DHUDSON_HOME=/home/hudson"

Bueno...ahora el ultimo paso es probar si hudson esta andando escribiendo en el browser la dirección: http://localhost:8080/hudson

Espero que les sirva y ante algún problemita ya saben, escribanme preguntando que por ahí a mi ya me paso. Hasta la próxima entrega.

miércoles, 21 de enero de 2009

Subversion en Linux

Para poder mantener controladas las versiones de los proyectos que estamos desarrollando existen los servidores de control de versiones. Uno de los mas populares es Subversion o svn.

Voy a explicar paso a paso como consumi un par de horas de mis vacaciones para instalar svn en mi Ubuntu 8.10. Abrimos una terminal y...
  • Instalamos los paquetes de subversion:
sudo apt-get install subversion subversion-tools
  • Si queremos "browsear" el repositorio necesitamos tener instalado y configurado un servidor Apache con el modulo dav y dav_svn, si no lo tenemos:
sudo apt-get install apache2 libapache_svn
  • Para poder otorgar permisos creamos un grupo llamado subversion:
sudo groupadd subversion
  • Agregamos un usuario:
sudo usermod -Gsubversion nombreusuario
  • Creamos un archivo con el usuario, luego nos pedira una contraseña
sudo htpasswd -c /etc/apache2/dav_svn.passwd nombreusuario
  • Creamos un directorio, indicamos el repositorio, y otorgamos permisos de grupo y de escritura:
sudo mkdir /home/svn/
sudo svnadmin create /home/svn/
sudo chown -R www-data:subversion /home/svn/
sudo chmod -R 770 /home/svn/
  • Editamos el archivo de configuración de Apache para svn:
sudo nano /etc/apache2/mods-available/dav_svn.conf

##
# SVN
#

DAV svn
SVNPath /home/svn
AuthType Basic
AuthName “Repositorio Subversion del proyecto”
AuthUserFile /etc/apache2/dav_svn.passwd

Require valid-user

  • Ahora solo nos queda reiniciar al sevidor Apache y verificar en un browser la dirección http://localhost/svn
sudo /etc/init.d/apache2 restart

Espero que este mini-tutorial les sea útil. Cualquier duda escriban comentarios.


miércoles, 14 de enero de 2009

Chatbots

Continuando con la linea de IA retro me puse a investigar sobre la vida y logros de Joseph Weizenbaum, considerado el padre de la cibernetica. En 1966 Joseph Weizenbaum creo en el MIT un programita simple que lo llamo ELIZA, este programa intentaba mantener una conversación de texto coherente con un usuario. El usuario realizaba preguntas y ELIZA en rol de psicologa contestaba.

Luego ELIZA fue repudiado por su autor aclarando que sólo se trataba de una simulación de IA.

Pasemos al diván de ELIZA con este applet y dejemos que ella nos analize:

Eliza: Hi. I'm Eliza. Tell me your problems!
You : I am afraid
Eliza: How long are you afraid?
You : since last year
Eliza: Perhaps you would like to talk about a problem?
You : are you stupid?
Eliza: Why are you so interested wether I am stupid or not?
You : you are mother fucker
Eliza: Why do you think that I am mother fucker?

You : Fuck you!
Eliza: What does this mean for you, saying " Fuck me "?

El paciente se enojo por la corriente rogeriana de ELIZA :D y la mando a lavar los platos. Más alla de las palabras agresivas del paciente, podemos ver que cuando ELIZA encuentra una palabra en su diccionario responde con una pregunta preparada para esa palabra, como por ejemplo la tupla (afraid, How long are you afraid?). Cuando no encuentra alguna palabra clave, sólo responde con una pregunta lo suficientemente ambigua (a veces irritante) como para esconder su desconocimiento, concatenando además la frase del paciente.

Si te gusta Python aquí tienes otra implementación de ELIZA en éste lenguaje.

Aunque ELIZA no posee IA, dio inicio a una revolución en este campo. Les dejo algunos chatbots más modernos para que se diviertan un rato, algunos de ellos preparados para intentar pasar el Test de Turing:

martes, 13 de enero de 2009

Google y su Inteligencia Artificial

Alan Turing en 1950 confecciono un test para medir la inteligencia de una máquina. La prueba consistía en que un jurado debía interactuar con una máquina y una persona, ambos ubicados en habitaciones distintas a la del juez. En la comunicación la máquina podía valerse de "trucos" para persuadir al juez que era una persona respondiendo preguntas. Si el juez no descubría quien era la persona y quien la máquina, la máquina superaba el test y se la podía considerar inteligente, hasta el momento ninguna ha podido superar este test con el rigor científico que Turing exigía.

Ahora bien. ¿Es suficiente definir la inteligencia artificial simplemente cuando esta no se diferencia de la Inteligencia humana?

Google indexa sus exabytes de información para sus búsquedas en base a mucha retroalimentación de los usuarios. Esta bien, además posee unos cuantos algoritmos. Pero lo que hace poderoso al superbuscador es esa enorme cantidad de información que entrena a lo que imagino seran perceptrones multicapa.

Consideremos lo siguiente: Si fuera posible anular el factor cansancio en un humano, este podría indexar toda esta información de forma similar a como lo hace Google sin mucha diferencia en el resultado final.

Entonces, un usuario del buscador no podría diferenciar si su búsqueda fue ordenada previamente por un ser humano o una máquina ¿Google pasaría el test de Turing? ¿El sistema de ordenado y disposición de la información de google es inteligente? Imagino que Turing diria que si.

PD: Si lo se, la imagen del Terminator es de lo mas amarillo :D

lunes, 12 de enero de 2009

JNA: Invocando código nativo desde Java

Para los que no lo conozcan, JNA (Java Native Access) es un proyecto del JDK-Incubator que nos proporciona un api para poder acceder a código nativo desde java. JNA Nos facilita y acelera el desarrollo al poder invocar funciones de librerías compartidas (.dll en Windows y .so en Linux) sin tener que usar JNI, ya que solamente debemos codificar en java implementando las interfaces y reglas que la api nos expone. La licencia de JNA es LGPL.

Veamos un ejemplo hola mundo escrito en consola por la función printf de la librería msvcrt si la plataforma es windows o la librería c en caso contrario:



import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;

public class HelloWorld {

   public interface CLibrary extends Library {
       CLibrary INSTANCE = (CLibrary)Native.loadLibrary(
          (Platform.isWindows() ? "msvcrt" : "c"), 
          CLibrary.class);
  
       void printf(String format, Object... args);
   }

   public static void main(String[] args) {
       CLibrary.INSTANCE.printf("Hola mundo!\n");
       for (int i=0;i < args.length;i++) {
           CLibrary.INSTANCE.printf(
              "Argumento %d: %s\n", i, args[i]);
       }     
   } 
} 

Pueden apreciar la simpleza con la que se "wrappea" la funcion printf de c. Noten que además de imprimir el clásico "hola mundo" se imprimen todos los argumentos pasados al metodo main utilizando el formateo que nos ofrece la funcion printf de c.

Esto es solo un ejemplo ilustrativo de uso, pero imaginen el potencial de facilidad que nos permite JNA al utilizar funciones de c en java comparando con el arduo trabajo que nos llevaría con JNI.

Llevo un tiempo utilizando JNA y aunque me he encontrado con un par de inconvenientes, pude dar resolución feliz a todo lo que quise "wrappear" a java desde librerías nativas. Hablo de invocar funciones pasando como parametros estructuras complejas, y parámetros por referencia para poder obtener retornos. Hasta ahora todo lo pude hacer y de forma simple. :)

Para finalizar, algunos proyectos que utilizan JNA:

Cualquier consulta sobre JNA u cualquier otra tecnología la pueden realizar en:




Soporte mejorado de C/C++ en Netbeans 6.5

- Mejoras del editor de código: Esto es lo mejorcito. Mejora el autocomplementado, mejora el resaltado de semántica y errores, identación y formateo automático, búsqueda de uso de variables locales y globales, funciones, clases, directivas de #includes, etc, refactoring de renombrado de variables y funciones.

- Mejor soporte a nivel de proyecto: Unos pocos cambios en las propiedades y configuración del proyecto, para linkear librerías dinámicas y estáticas.

- Grafo de llamados de funciones: Nos muestra una ventana con todas las llamadas a la función seleccionada.

- Ventana de Memoria: Nos muestra el contenido de las direcciones que están actualmente en uso.

- Desarrollo remoto: Esto no le he probado aún, pero promete definir host remotos y y poder realizar builds o correr proyectos desde el cliente.

-Empaquetado : Nos permite empaquetar las aplicaciones para distribuirlas en archivos tar, archivos zip, o paquetes SVR4.

Bueno, éstas son sólo las novedades en la versión 6.5, faltaron enunciar los features que se mantienen de las versiones anteriores.

Para la próxima entrada relacionada a C, estoy preparando un pequeño tutorial para explicar como preparar y configurar un ambiente de desarrollo de C/C++ con Netbeans y las tools GNU sobre Windows.

viernes, 9 de enero de 2009

Python para todos!

Estoy comenzando con Python y tengo que decirles que es el lenguaje de programación más parecido al lenguaje natural que he visto. Un código escrito en python es muy fácil de leer ya que se asemeja bastante al pseudocódigo. Además es muy entretenido y ameno aprenderlo. Como ejemplo de esto miren el siguiente código python:

edad = 0
while edad < 18
print "Tienes " + edad + " años."
edad = edad + 1
print "Ya eres mayor de edad."

Podemos además apreciar que los bloques estan limitados por la identación y no por las llaves { } como en C o Java o por palabras reservadas como begin end de Pascal.

Quiero recomendarles el siguiente libro pdf en castellano: Python para todos.

Para escribir los ejemplos estoy utilizando el interprete Jython y el plugin para netbeans 6.5 que pueden bajar del mismo Ide en Tool->Plugins. Aunque todavia este plugin es beta (al parecer tendra una liberación final junto con NB 7.0) alcanza para poder aprender y ejecutar ejemplos.

Cuando tenga mas novedades y aprenda más cosas sobre Python escribire una entrada con más recomendaciones.

Apertura del blog

Antes que nada, bienvenidos a mi blog!

En este lugar encontraran información sobre tecnologia y programación. Publicare experiencias vividas en mi carrera que espero sirvan de ayuda a los demás.

Este blog va ser una forma de devolver el conocimiento de todo lo que he aprendido.

Espero que les sea grato y nuevamente bienvenidos!!!