Archive for the ‘General’ Category

Cobertura

Tuesday, December 2nd, 2008

JUnit es, a día de hoy, el método más extendido de realizar pruebas unitarias sobre las funciones de nuestro desarrollo. Pero desde luego, no es infalible. Completar con éxito el 100% de las pruebas unitarias solo significa que la aplicación funciona para los supuestos lanzados en las pruebas. Es decir, nuestro código funciona con A+B+C, ¿pero funcionaría para A+C+B?, ¿como podemos saber qué parte del código se prueba con los test que hemos lanzado?

Para poder contestar esta última pregunta podemos usar Cobertura. Un desarrollo opensource con licencia GNU General Public License, Version 2.0.

Cobertura instrumentaliza nuestras clases java. Introduce nuevas instrucciones dentro de las clases compiladas de nuestro proyecto que utiliza para obtener un informe muy completo sobre lo que ha ocurrido en esas pruebas.

Podemos introducir Cobertura en nuestro proyecto empleando las propias tareas de Cobertura para Ant. Dentro del fichero del proyecto Ant (típicamente build.xml) introduciremos la siguiente línea:

taskdef classpath="cobertura.jar" resource="tasks.properties"

Esto será suficiente para comenzar a utilizar los objetivos de Cobertura.

Una vez lanzados los test los resultados se almacenarán en el fichero “cobertura.ser”.
Este fichero lo podremos formatear como un HTML al estilo javadoc o como un XML que nos servirá para procesar y presentar los resultados con nuestra propia herramienta.

Por ejemplo, el resultado de los test para la propia librería de cobertura los podemos ver en la siguiente imagen

reportCoberturaGlobal.JPG

De la misma manera que en un javadoc podremos navegar por los diferentes niveles de la librería y comprobar cuantas lineas de código han sido probadas. Además muestra el indice de complejidad de la clase y el porcentaje de ramificaciones del código probadas

Si pinchamos sobre cualquier clase nos mostrará el código asociado con el número de veces que nuestros test han pasado por cada línea de código. Esto es especialmente útil para comprobar de un vistazo si hemos entrado por todas las ramificaciones de nuestros if-then-else o cuantas veces se ha pasado por un determinado bucle.

reportCoberturaClase.JPG

En la web de Cobertura se pueden descargar las últimas versiones y gran cantidad de documentación (Getting Started, FAQs, samples…)

El USB 3.0 SuperSpeed ya está listo

Wednesday, November 19th, 2008

Después de un largo tiempo ya están concluidas las especificaciones para USB 3.0, tecnología que hará posible copiar un fichero de 25 GB en solo 70 segundos.

¿Cómo es de rápida? 4.8 Gbps para ser exactos. Esto significa que es posible copiar un fichero de 25 GB en 70 segundos, por lo menos en la teoría. Hay otros factores que inciden en la rapidez de transmisión, como por ejemplo la velocidad del disco duro y el desempeño general del sistema.

El nuevo estándar no sólo es más veloz, sino también optimiza el consumo eléctrico, de manera que el usuario no tiene que esperar que dispositivos como teléfonos móviles o reproductores mp3 estén totalmente cargados para que puedan interactuar con el PC.

Los primeros productos con soporte para USB.3 comenzarán a comercializarse hacia finales de 2009, pero 2010 será sin duda alguna el año en que la tecnología se generalice.

Control de errores y argumentos variables

Wednesday, November 12th, 2008

Una de las cosas más importantes y obvias cuando escribimos un programa es preparar un buen control de errores. Esto que al principio parece algo fácil, sencillo y encapsulable, al final terminamos haciéndolo siempre de una manera diferente, ya que poco a poco se va complicando porque:
- controlamos la excepción y devolvemos un código de error, o si simplemente la propagamos
- qué herramienta/librería utilizamos para generar la información de log
- qué nivel de log vamos a mantener
- cómo vamos a informar del error
- …

Pero siempre hay algo que solemos olvidar, y es que, tan importante como la detección del error, es el registro del contexto en el que se estaba ejecutando el programa cuando falló, es decir, con qué datos estaba operando.
Este conjunto de datos, está claro que es variable en cada caso, con lo que pasárselo a un método genérico que registre el error suele ser algo lioso, a no ser que empleemos un método que acepte un número variable de argumentos no determinado inicialmente. Esta es una característica que antiguamente el C era uno de los pocos lenguajes que la soportaba, pero que es común en los lenguajes modernos (.NET, Java…), así en Java podríamos tener algo por el estilo:


public String generarCadenaParaLog(Object...args)
{
    StringBuilder logString = new StringBuilder();
    for(Object argTemp: args)
    {
        logString.append(argTemp);
    }
    return logString.toString();
}

Para llamarlo por ejemplo del siguiente modo:
...

    catch(Exception e)
    {

...

    // Recoger info error no esperado
    String errorNoEsperado =
      ErrorManager.generarCadenaParaLog(
                        "Error no esperado:",
                        "\nidCampaña", idCampaña,
                        "\nidUsuario:", idUsuario,
                        "\nimporte:", importeTransaccion);
    log(errorNoEsperado);
...

}

...

Servicios de windows e impresión de documentos

Friday, November 7th, 2008

  En un reciente proyecto me he encontrado con una situación no demasiado común: necesitábamos imprimir los documentos de Word desde un servicio sin interfaz de usuario. A los ya consabidos problemas de trabajar con documentos de Office en servidor (pero eso ya es otra historia….) se le añadía la dificultad de las pruebas en los entornos intermedios (en nuestro caso: desarrollo, integración y pre-producción), una vez verificado el resultado de la impresión.

  Primeramente intenté configurar uno de los múltiples drivers de impresión existentes en el mercado que acaban generando un documento en formato PDF y/o XPS. El problema era que todos ellos requerían de la interacción del usuario para seleccionar la ubicación del fichero a generar.

  La opción de implementar un mecanismo, que mediante configuración habilitara/deshabilitara la impresión de los documentos, la descarté porque podía acabar ocultando problemas en los entornos.

  La solución implementada consiste en la definición de una IMPRESORA NULA. Esto consiste en definir un nueva impresora local, asignándole un puerto nuevo local con valor “NUL:” En el siguiente paso de seleccionar el modelo podemos elegir cualquiera, puesto que los datos imprimidos se DESCARTAN DIRECTAMENTE. Para finalizar basta con asignarle un nombre significativo “Void Printer”, o “Impresora Pozo Negro” y configurarla en nuestro servicio en el modo adecuado

  De este modo habremos conseguido, sin alterar en lo más mínimo el comportamiento de la aplicación, trabajar con la aplicación evitando talar árboles de manera innecesaria.

  Os dejo unos pantallazos de la configuración de la impresora en mi máqiuna (Windows Vista). Por cierto, esto está probado en Windows Vista y Windows 2003 Server.

Alfresco ECM y MS SharePoint

Tuesday, October 28th, 2008

Desde el año 2004 Microsoft y la comisaria para la competencia de la Comisión Europea venían manteniendo una serie de discrepancias sobre la posición dominante de Microsoft en los mercados europeos, finalmente, en septiembre de 2007, esa discrepancia se resolvió favorablemente a las tesis de la Comisión Europea, y aunque en los medios de comunicación lo que más resaltaban eran los aspectos referentes al Windows Media Player, había una cuestión seguramente más importante, que hacía referencia a la facilitación de los protocolos de comunicación con sus sistemas servidores, entre ellos el protocolo de comunicación entre Office y SharePoint.

Aunque hasta ese momento, existían sistemas que podían intentar algún tipo de funcionalidad similar, siempre dependían del soporte de plugins/addons o similares, que dificultaban enormemente el despliegue de la solución final, sin embargo, desde septiembre de 2007 es posible implementar, de manera segura, un sistema que aproveche la comunicación nativa con Microsoft Office/Outlook y de ese modo poder ofrecer funcionalidades similares a las ofrecidas hasta el momento únicamente por SharePoint.

Un año después, Alfresco es un de los primeros sistemas en ofrecer este tipo de funcionalidad, es decir, simplificando, es un sistema que viene a ofrecer lo mismo que SharePoint, pero si vincularse a un sistema operativo o una base de datos.

Alfresco nació aproximadamente unos tres años de la mano de gente procedente de Documentun e Interowen con la idea de construir un sistema de Gestión de Contenidos basado en OpenSource y en estándares abiertos que ofreciera el contenido como un servicio, y con esta idea han ido creciendo paulatinamente a lo largo de estos años hasta ofrecer con su versión 3 un sistema que a grandes rasgos ofrece las siguientes capacidades:

  • Gestión Documental
    Manejo sencillo de documentos a través del Explorador de Windows (Shared Drive) o través de la integración nativa con Microsoft Office (igual que SharePoint: grabar, versionar, compartir…)…y lo mismo con Open Office.
    Document Libraries
    Definición de workflows para documentos.
    Definición de reglas para documentos (manejo de sistemas virtuales de ficheros, iniciación automática de workflows, conversiones automáticas de formatos, envío de notificaciones…)
    Búsquedas (aprovechando toda la potencia de Apache Lucene)
  • Gestión de Sites y plataforma colaborativa
    Plataforma para sitios corporativos, intranets…
    Plataforma colaborativa para la gestión de wikis, blogs, páginas personales…
    Gestión de contenidos estáticos
    Gestión de cotenidos dinámicos a través de WebScripts (similares a las WebParts de SharePoint)
    Capacidades de despliegue en servidores de producción, manteniendo múltiples versiones de cada site (SandBox y Staging)

(more…)

Código Fuente y Tienda para Android

Thursday, October 23rd, 2008

Poco antes de que se ponga a la venta oficialmente el T-Mobile G1, el primer móvil con Android, Google hace público el código fuente de Android, tal como exige la licencia de algunos de sus módulos.

Justo antes de que se ponga a la venta oficialmente el T-Mobile G1, el primer móvil con Android, Google hace público el código fuente de Android, tal como exige la licencia de algunos de sus módulos.

Es una de las primeras plataformas móviles que está disponible de forma íntegra, que permitirá a los usuarios y desarrolladores sin ninguna restricción y con la única condición de contribuir con la plataforma.

Hoy se ha lanzado Android Market, la tienda de aplicaciones para este terminal.

Los desarrolladores podrán registrarse y subir sus programas a partir del próximo lunes 27, para ello deberán de pagar 25 dólares, una vez cumplido este requisito podrán poner a disposición de la comunidad todas sus aplicaciones, sin necesidad de validación o aprobación.

A partir de comienzos de 2009, también podrán comenzar a distribuir sus aplicaciones de pago, por cada venta se llevarán el 70 %, el resto irá a las operadoras y a la gestión de la facturación, Google dice que no se quedará con ninguna parte.

Google Chrome

Wednesday, September 3rd, 2008

Google acaba de presentar su browser, Google Chrome:

La versión beta ( hay algún servicio de Google que no sea beta? ;) ) se puede descargar de:

link

Como adelanto publicaron el fin de semana pasado un comic que detalla cada una de las nuevas características y es la mejor forma de conocer el navegador y sus características, es bastante técnico y visual al mismo tiempo:

link al comic

En vez de detallar las features como en todos los blogs del universo propongo discutir qué impacto pueden tener algunas features y qué opináis de la “fragmentación de la web”, para abrir el tema:

Una de las características más comentadas es el aislamiento entre los distintos tabs abiertos, cada uno corre en su propio proceso y el browser actúa como “coordinador”. Con ésto se tienen aislados los espacios de memoria de cada tab y un cuelgue en uno no afectará a otro… pero a cambio cada uno de los tabs tendrá su propio tamaño mínimo de stack, el código que use se cargará repetidas veces en cada proceso… y toda comunicación entre tabs y con el “browser coordinador” será mucho más costosa al ser “remota”.

El motor de javascript, V8, lo venden como la próxima maravilla del mundo: corre en una máquina virtual, entiendo que se precompila a un bytecode en vez de interpretarse, contiene heurísticas para detectar paths de ejecución repetidos y optimizarlos… veremos si sufre de problemas de compatibilidad con otros browsers( que posiblemente sean porque éste sea más fiel a un Standard que otros ).

La cantidad de browsers que una aplicación web debe soportar sigue creciendo y creciendo, desde distintas versiones del mismo navegador a los distintos navegadores disponibles. Todos hemos sufrido páginas webs que no funcionan bien en algún browser, incluso hemos visto o participado en webs donde el código cliente tiene 2 ramas, una para IE y otra para FF…

Dónde está aquella supuesta facilidad de despliegue y esa multiplataforma cuando puedes tener 8-12 browsers distintos y donde sabes que en algún momento saldrá otra versión de algún otro que será más o menos standard y tendrás que retocar-actualizar-probar tu aplicación web.

Todo esto lleva a otra discusión, cómo hemos partido de “la web original”, una arquitectura pensada para transmitir cadenas de texto con formato y mostrarlas por pantalla ( algo así como un visor de documentos simples remoto, sin estado ) a una plataforma de de aplicaciones a base de capas y capas y cantidades inmensas de “pequeños hacks” donde cada uno a ido por su lado. Esa es la historia de la web para lo bueno y para lo malo :)

Y otra batallita distinta va a ser opinar sobre los intereses de Google, claramente es un paso más en intentar llegar a un Sistema Operativo Web, que corra sobre cualquier SO. Está claro que la transición entre la “página web” donde se mostraba texto con un formateo muy básico y la “aplicación web” necesita avanzar muchos aspectos del browser.

JPA/Hibernate, Persistencia de objetos en Java - Sesión KIT (25 de septiembre)

Friday, August 29th, 2008

Dentro de la actividad del KIT, el próximo 25 de septiembre Jesús Jiménez Jabón presentará la sesión “JPA/Hibernate, Persistencia de objetos en Java”.
La sesión tendrá lugar en las oficinas de Media Net y comenzará a las 17:30 horas.

El índice tentativo de la misma será el siguiente:

* Presentacion: Breve presentacion del indice a tratar
- Persistencia
* Introducion (Historia)
* Definicion
* Capas de Persistencia (Arquitectura y alernativas)
* Requisitos de un Framework de Persistencia
* Esquema de persistencia “relacional-objetos” (Problemas y ventajas)
* Modelos de Dominio y Metadatos

- JPA (Java Persistence API)
* Ubicación J2SE y J2EE
* Integracion con servicios Java EE (JTA, JNDI, JMX)
* Relacion de JPA con Subsistemas de Persistencia Java (JDO, SDO, EJB3, TopLink, Hibernate)
+ Caracteristicas a tener en cuenta en la eleccion de un Subsistema de persistencia
* Conceptos JPA (Apoyados en un ejemplo sencillo)
+ Mapeo de entidades
+ Mapeo de relaciones - Tipos
+ Entity Manager
+ Queries
+ Unidades de persistencia
+ Gestión de transacciones

* Integracion de JPA con Spring Transaction
* Hands-On: Ejemplo de uso y despliegue

- Hibernate (Proveedor de Persistencia para JPA)
* Definicion
* Proyectos asociados a Hibernate (Core, Annotations, Shards, Validator…)
* Integración de JPA e Hibernate
* NHibernate (.NET Framework)

La sesión es abierta, todo aquel que esté interesado podrá asistir, siempre y cuando cumpla con las normas de asistencia y la confirme antes del próximo 23 de septiembre. Si alguien estuviera interesado en asistir, pero por las circunstancias de su proyecto no pudiera confirmarlo hasta después del día 23, que lo indique de todos modos para que se le reserve plaza.

MONO, .NET en Linux - Sesión KIT (11 de septiembre)

Friday, August 29th, 2008

Dentro de la actividad del KIT, el próximo 11 de septiembre David Fernández e Iván Alonso presentarán la sesión “MONO, .NET en Linux”.
La sesión tendrá lugar en las oficinas de Media Net y comenzará a las 17:30 horas.

El índice tentativo de la misma será el siguiente:

* Por qué MONO?
- Multiplataforma
- Libre

* Funcionamiento
- Introducción
- EStándar ECMA
- Espacios de nombres/librerías
+ Desensamblado
+ Ingeniería inversa

* Relación/Reacción Microsoft
- Proyectos que apoya (ej.: Moonlight)
- Proyectos que no apoya
+ Patentes (Windows Forms)

* Modo de uso
- IDEs
+ Linux: MonoDevelop, SharpDevelop…
+ Windows: Visual Studio…
- Normas para desarrollo de aplicaciones multiplataforma
- Modificaciones en código (adaptaciones)
- RoadMap
- Caso de éxito de proyectos en Mono

* Hands-On
- Calculadora multiplataforma

La sesión es abierta, todo aquel que esté interesado podrá asistir, siempre y cuando cumpla con las normas de asistencia y la confirme antes del próximo 9 de septiembre. Si alguien estuviera interesado en asistir, pero por las circunstancias de su proyecto no pudiera confirmarlo hasta después del día 9, que lo indique de todos modos para que se le reserve plaza.

He leído: Foundations Of Programming Building Better Software

Monday, July 7th, 2008

Y os lo recomiendo, es un ebook gratuito, muy profesional, donde en 78 paginas muy amenas se tratan por encima muchas de las técnicas de desarrollo modernas:

Agile Development, Domain Driven Design, Persistance, Dependency Injection, Unit Testing, ORM Mappers así como fundamentos de programación como Memoria, Excepciones y el Patrón Proxy componen los temas principales del libro.

El link es http://codebetter.com/files/folders/codebetter_downloads/entry179694.aspx