lunes, 27 de octubre de 2008

Scrum y XP (1)

Hola, muchas veces cuando debemos desarrollar o implementar rapidamente un software, tenemos demasiado poco tiempo, sobre todo cuendo el asunto es partir de cero y no tenemos tiempo para análisis, modelamiento perfecto de UML, etc.

Para estos casos se ha puesto de moda Scrum y XP, ambas son tecnicas de desarrollo agil de software.

Los equipos de trabajo deben conocer los principios de Scrum. ¿Cómo se crea y se estima una pila de producto? ¿Cómo se transforma en una pila de Sprint?
¿Cómo se gestiona un gráfico de burn-down y se calcula la velocidad del equipo?

Para responder esto veremos una introducción practica de Scrum.

La ejecución correcta de Scrum se está convirtiendo en un factor cada vez más importante para los equipos que buscan inversión de capital.

¿Por qué es esto tan importante? Si los equipos no conocen su velocidad, el Dueño de Producto no puede crear una hoja de ruta del producto con fechas de lanzamiento creíbles. Sin fechas de lanzamiento fiables, la ompañía podría fracasar y los inversores perder su dinero.

Tanto Scrum como Programación Extrema (XP) requieren que los equipos completen algún tipo de producto potencialmente liberable al final de cada iteración. Estas iteraciones están diseñadas para ser cortas y de duración fija.
Este enfoque de entregar código funcional cada poco tiempo significa que los equipos Scrum y XP no tienen tiempo para teorías. No persiguen dibujar el modelo UML perfecto en una herramienta CASE, escribir el documento de requisitos perfecto o escribir código que se adapte a todos los cambios futuros imaginables. En vez de eso, los equipos Scrum y XP se enfocan en que las cosas se hagan. Estos equipos aceptan que puede que se equivoquen por el camino, pero también son conscientes de que la mejor manera de encontrar dichos errores es dejar de pensar en el software a un nivel teórico de análisis y diseño y sumergirse en él, ensuciarse las manos y comenzar a construir el producto.

Este es un proceso de aprendizaje continuo, así que la historia no acaba aquí.
Estoy convencido de que esta empresa seguirá aprendiendo (si se siguen haciendo las Retrospectivas de Sprint) y adoptando nuevas perspectivas sobre las mejores formas de implementar Scrum en su contexto particular.

Si necesitas averiguar más antes de seguir puedes ver los siguientes link's

• http://agilemanifesto.org/
• http://www.mountaingoatsoftware.com/scrum
• http://www.xprogramming.com/xpmag/whatisxp.htm

Sino, no importa, veremos la forma practica de implementar scrum rapidamente, bueno eso es en realidad, imprimir energia y rapidez al desarrollo de software.

Pila de producto.
La pila de producto es el corazón de Scrum, y simplemente es la priorización de los requisitos que debe tener una aplicación solicitada por el cliente.
A esta lista de requisitos le llamamos historias, o funcionalidades, o lo que sea. Cosas que el cliente quiere, descritas usando la terminología del cliente. Llamamos a esto historias, o a veces simplemente elementos de la Pila.
Esta pila de requisitos puede ser escrita en una planilla excel de manera simple para que el cliente la entienda en su lenguaje natural, dejamos de lado aqui los administradores de tareas como Jira u otros bug-tracker.

Para hacerlo simple y productivo nuestra pila de producto (lista priorizada de requisitos) contiene los siguientes campos:

ID – un identificador único, simplemente un número auto-incremental. Esto nos permite no perder la pista a las historias cuando cambiamos su nombre.
Nombre – una descripción corta de la historia. Por ejemplo, “Ver tu historial de transacciones”. Suficientemente claro como para que el Dueño de Producto comprenda aproximadamente de qué estamos
hablando, y suficientemente clara como para distinguirla de las otras historias. Normalmente, 2 a 10 palabras.
Importancia – el ratio de importancia que el Dueño de Producto da a esta historia. Por ejemplo, 10. O 150. Más alto = más importante. Suelo evitar el término “prioridad” porque típicamente “1” se considera la
“máxima prioridad, lo que es muy incómodo si posteriormente decides que algo es más importante. ¿Qué prioridad le daríamos a ese nuevo elemento? ¿Prioridad 0? ¿Prioridad -1?
Estimación inicial – la valoración inicial del Equipo acerca de cuanto trabajo es necesario para implementar la historia, comparada con otras historias. La unidad son “puntos de historia” y usualmente corresponde a “días-persona ideales”. Lo importante no es que las estimaciones absolutas sean correctas (es decir, que una historia de 2 puntos deba durar 2 días), lo importante es que las estimaciones relativas
sean correctas (es decir, que una historia de 2 puntos debería durar la mitad que una historia de 4 puntos).
Como probarlo – una descripción a alto nivel de como se demostrará esta historia en la Demo al final del Sprint. Se trata, esencialmente, de una simple especificación de un test: “Haz esto, entonces haz lo otro, y
entonces debería ocurrir aquello”. Si practicas TDD (Test-Driven Development, desarrollo orientado a test) esta descripción puede usarse como pseudo-código para vuestro test de aceptación.
• Notas – cualquier otra información, clarificación, referencia a otras
fuentes de información, etc. Normalmente muy breve.

Ejemplo de Pila de Producto:

Sigamos, vemos en la tabla anterior la implementación de una pila de producto simple, falta completar campos, como la estimación, prueba y notas, estos deben ser completados en conjunto con el equipo Scrum (equipo de desarrollo).


En la practica se pueden agregar otros campos, pero a la larga estos son los mas recurrentes tras los Sprint.

Como mantenemos la Pila de Producto a nivel de negocio.
Si el Dueño de Producto tiene una formación técnica, puede que añada historias del tipo “añadir índices a la tabla de eventos”. ¿Por qué quiere algo así? El auténtico objetivo probablemente será algo como “aligerar el formulario de búsqueda de eventos en el backoffice” (con un índice).
Puede ocurrir que los índices no fueran el cuello de botella que hiciera al formulario ir lento. Puede que fuera algo completamente diferente. El equipo está normalmente mejor capacitado para averiguar como resolver algo, así que el Dueño de Producto debería concentrarse en los objetivos de negocio y no en modificarnos la pila luego de los requisitos ya vistos y entregados.

Pronto, va la segunda parte de este doc. de Scrum.

Saludos y Suerte !!

jueves, 9 de octubre de 2008

Firma digital de PDF

Hola, muchas veces para nuestros sistemas debemos resguardar la integridad de los documentos almacenados en nuestros repositorios, ya sean word, pdf u otros.

Esto lo podemos realizar agregando la firma digital a los documentos, y una manera de hacerlo es mediante las apis de Java, las que nos proveen los metodos apropiados para la firma avanzada de documentos PDF.

Avanzada, porque el mismo Acrobar Reader valida la integridad del documento y la firma digital, ademas de agregar la capacidad de usar nuestro propio certificado pfx.

En el siguiente ejemplo veremos como firmar digitalmente un documento PDF.

1.- Debemos contar con algún certificado pfx valido en nuestro sistema.

Si ya contamos con este certificado PKCS12 (. pfx) procedemos con el ejemplo.

primero vamos a nuestro ide eclipse para Java creamos una clase con el siguiente código.

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.cert.Certificate;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfStamper;
import com.lowagie.text.pdf.PdfSignatureAppearance;

public class FirmarPDF {

public static void main (String [] args) throws Exception{
KeyStore ks = KeyStore.getInstance("pkcs12");
ks.load(new FileInputStream("/home/slack/mycert.pfx"), "quaker77".toCharArray());
String alias = (String) ks.aliases().nextElement();
PrivateKey key = (PrivateKey) ks.getKey(alias, "quaker77".toCharArray());
Certificate[] chain = ks.getCertificateChain(alias);
PdfReader reader = new PdfReader("/home/slack/0X/ccu/documento_inicial_req.pdf");
FileOutputStream fout = new FileOutputStream("/home/slack/compartido/documento_firmado2.pdf");
PdfStamper stp = PdfStamper.createSignature(reader, fout, '\0', new File("/tmp"));
PdfSignatureAppearance sap = stp.getSignatureAppearance();
sap.setCrypto(key, chain, null, PdfSignatureAppearance.WINCER_SIGNED);
sap.setReason("Prueba de firma digital con iText");
sap.setLocation("Chile");
sap.setContact("Empresa Chile");
stp.close();
}

}

Debemos contar con las librerias necesarias que se importan en la clase.

En el código vemos que tenemos un archivo pdf de entrada y otro de salida, pero este ultimo va firmado.

La firma digital de documentos PDF la valida Adobe Acrobat, que es capaz de procesar y validar esta información.

Para verificar visualmente que el documento de salida esta firmado vemos las siguientes caracteristicas en el nuevo documento en acrobat reader.



Bueno, este en un ejemplo practico para firmar pdf con Java.

Ahora faltaría agregar esta implementación a una aplicación web para clientes.

Saludos y Suerte !!

viernes, 3 de octubre de 2008

Instalar pgadmin3 en Linux

Hola, cuando necesitamos administrar un PostgreSql o MySql de manera amigable, muchas veces ocupamos algún administrador grafico, yo he utilizado mucho webmin como administrador de base de datos PostgreSql y MySql, sin embargo para utilizar Webmin necesitas que la maquina donde residen las bases de datos lo tenga instalado y tener habilitado el puerto 10000.

Pero que ocurre cuando esa maquina no cuenta con Webmin. Tenemos 2 opciones, una es solicitar la instalación de Webmin y otra en utilizar en este caso PgAdmin3.

Por defecto las distribuciones Linux no lo traen instalado, pero si esta en los repositorio del source.list, por lo tanto abrimos una consola y lo buscamos con apt de la siguiente forma.

slack@slacktop:~$ apt-cache search pgadmin
pgadmin3 - graphical administration tool for PostgreSQL
pgadmin3-data - graphical administration tool for PostgreSQL - documentation
pgagent - job scheduler for PostgreSQL
phppgadmin - Set of PHP scripts to administrate PostgreSQL over the WWW
postgresql-contrib-8.2 - additional facilities for PostgreSQL
postgresql-contrib-8.3 - additional facilities for PostgreSQL

En el listado de resultado vemos que el primer paquete corresponde a lo que buscamos, por lo tanto procedemos con apt-get a su instalación en nuestro sistema.

slack@slacktop:~$ sudo apt-get install pgadmin3
[sudo] password for slack:
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias
Leyendo la información de estado... Hecho
Se instalarán los siguientes paquetes extras:
libwxbase2.8-0 libwxgtk2.8-0 pgadmin3-data
Paquetes recomendados
pgagent
Se instalarán los siguientes paquetes NUEVOS:
libwxbase2.8-0 libwxgtk2.8-0 pgadmin3 pgadmin3-data
0 actualizados, 4 se instalarán, 0 para eliminar y 12 no actualizados.
Necesito descargar 8381kB de archivos.
Se utilizarán 24,0MB de espacio de disco adicional después de desempaquetar.
¿Desea continuar [S/n]? S


Confirmamos con S la descarga del paquete PgAdmin3 y continua su instalación.

Des:1 http://cl.archive.ubuntu.com hardy/universe libwxbase2.8-0 2.8.7.1-0ubuntu3 [675kB]
Des:2 http://cl.archive.ubuntu.com hardy/universe libwxgtk2.8-0 2.8.7.1-0ubuntu3 [3500kB]
Des:3 http://cl.archive.ubuntu.com hardy/universe pgadmin3-data 1.8.2-0ubuntu1 [1070kB]
Des:4 http://cl.archive.ubuntu.com hardy/universe pgadmin3 1.8.2-0ubuntu1 [3136kB]
Descargados 8381kB en 23s (358kB/s)
Seleccionando el paquete libwxbase2.8-0 previamente no seleccionado.
(Leyendo la base de datos ...
160747 ficheros y directorios instalados actualmente.)
Desempaquetando libwxbase2.8-0 (de .../libwxbase2.8-0_2.8.7.1-0ubuntu3_i386.deb) ...
Seleccionando el paquete libwxgtk2.8-0 previamente no seleccionado.
Desempaquetando libwxgtk2.8-0 (de .../libwxgtk2.8-0_2.8.7.1-0ubuntu3_i386.deb) ...
Seleccionando el paquete pgadmin3-data previamente no seleccionado.
Desempaquetando pgadmin3-data (de .../pgadmin3-data_1.8.2-0ubuntu1_all.deb) ...
Seleccionando el paquete pgadmin3 previamente no seleccionado.
Desempaquetando pgadmin3 (de .../pgadmin3_1.8.2-0ubuntu1_i386.deb) ...
Configurando libwxbase2.8-0 (2.8.7.1-0ubuntu3) ...

Configurando libwxgtk2.8-0 (2.8.7.1-0ubuntu3) ...

Configurando pgadmin3-data (1.8.2-0ubuntu1) ...
Configurando pgadmin3 (1.8.2-0ubuntu1) ...

Processing triggers for libc6 ...
ldconfig deferred processing now taking place
slack@slacktop:~$

El log nos dice que ya esta ok la instalación, ahora lo vamos a ejecutar, lo podemos hacer directamente por consola escribiendo pgadmin3 y enter o podemos encontrar pgadmin en el menú del sistema: Aplicaciones --> Herramientas del Sistema.

para el ejemplo lo abriremos por consola.

slack@slacktop:~$ pgadmin3

Esto abre el siguiente entornos grafico de pgadmin3.




Hacemos click con el mouse en el icono de conexion lo que nos abre la siguiente ventana donde tenemos que ingresar los datos de conexión a las base de datos, para este ejemplo lo estoy apuntando a mi local, sin embargo se puede apuntar a otra ip.



Hacemos click en Aceptar y nos despliega el contenido de nuetro Postgre Local, como muestra la figura.



Podemos apuntar a una ip remota, siempre y cuando el puerto 5432 de Postgre este aceptando conexiones.

Saludos y Suerte !!