Archivo | 21:24 hrs.

Humor: GUÍA DE INGLÉS ZUBURBIAL (I)

28 mar 2009

Extracto de los consejos que un andaluz da a un amigo para que se defienda con el idioma en la Bretaña de las afueras en las distintas situaciones que se puede encontrar.
EN LA CALLE
Es importante que mantengas el tipo y sepas las expresiones básicas de los ‘zuburbios’ londinenses, donde yo aprendí el inglés. Algunos consejos que te serán útiles:
– Para integrarte, sigue las indicaciones de los lugareños “from letter’s feet” (al pié de la letra).
– Go to dog-face (Ir a cara-perro). Cuando no tienes casi nada que perder.
– To make the cousin (Hacer el primo). Si te dicen esto, lo mejor es que contestes: “I open, uncle”
(Me abro, tío).
LA SEVILLA PROFUNDA
Te guste o no, a los guiris le van los rollos folcróricos sevillanos. Así que apréndete los nombres de los principales pasos (o como ellos los llaman, “The Steps”) que salen en Semana Santa en su bendito idioma:
– The Big Power (El Gran Poder)
– The Hope of Macaren (La Esperanza Macarena)
– The Gipsy Christh (El Cristo de los gitanos)
– The Only Woman (La Soledad)
– The Little Donkey (La borriquita)

(continuará…)

Nueva versión de Maven 2.1.0

24 mar 2009

Acaba de salir publicada la nueva versión 2.1.0 de Maven. Se pueden consultar las modificaciones incluidas en las Release Notes de la versión.

Está calentito calentito; esta misma semana empezamos a trabajar con esta versión, e iremos comentando las novedades que vemos. De momento os puedo anticipar que por fin las contraseñas almacenadas en el settings.xml están ofuscadas :-)

Viafirma ya soporta Internet Explorer 8

20 mar 2009

Como muchos de nuestros lectores sabrán, el día 19/03/2009 a las 18h se vio publicada la nueva versión 8 del navegador de Microsoft, Internet Explorer.

Viafirma ya soporta la autenticación y firma digital con el nuevo Internet Explorer 8, del mismo modo que es 100% compatible con las versiones beta publicadas de Windows 7.

Adjuntamos una captura de pantalla con una operación satisfactoria de firma realizada sobre este navegador.

Viafirma firmando en IE8

Viafirma entra en producción en la Fundación Tripartita

17 mar 2009

En VIAVANSI estamos de enhorabuena, ayer lunes 16/03/2009 entró en producción la Aplicación de gestión de las Acciones formativas de las empresas, de la Fundación Tripartita para la Formación en el Empleo (antiguo FORCEM). En esta institución han escogido Viafirma para introducir las funcionalidades de autenticación con certificados digitales con multitud de CA’s como DNI electrónico, FNMT, IZENPE, Camerfirma, ANCERT, Firma Profesional, etc.

viafirma_loading.png

La aplicación permite a las empresas que realicen actividades de formación comunicar el inicio y finalización de las mismas a la Fundación, como establece la Orden Ministerial que las regula. El alcance final de la aplicación abarca a toda empresa española que tenga planes internos de formación, por lo que el volumen de transacciones que debe soportar es de una enorme magnitud. Pasadas unas horas de la presentación y puesta en marcha de la aplicación ya hemos podido comprobar que se han efectuado varios miles de operaciones de autenticación y firma digital satisfactoriamente. Las estimaciones de carga previstas sobrepasan las 80.000 firmas digitales diarias en momentos de uso masivo de la aplicación.

Gracias al uso de Viafirma, la Fundación Tripartita garantiza un acceso universal a los usuarios. Ello es debido a la gran universalidad de Viafirma, que permite a los usuarios autenticarse y firmar con sus certificados digitales en cualquier sistema operativo (Windows, Linux, Mac, etc.), navegador (Internet Explorer, Firefox, Safari, Google Chrome, etc.), tipo de certificado y disposición en software, tarjeta criptográfica, token USB, etc.

En las últimas semanas varias instituciones han optado por Viafirma como solución de autenticación y firma digital. Además de la propia Fundación Tripartita, Viafirma ha sido implementado en Toyota España, Col·legi Oficial de Farmacèutics de les Illes Balears (COFIB), en el proyecto de factura electrónica Pymetronica de ETICOM…

viafirma_certs.png

Implementando una caché sencilla de objetos con Ehcache

14 mar 2009

Reciéntemente he estado revisando la arquitectura técnica de un proyecto Java EE que estaba teniendo serios problemas de escalabilidad. En Desarrollo todo iba como un tiro, pero con un número importante pero no escandaloso de registros (apenas 100.000) nos encontrábamos con tiempos de respuesta de algunas de las operaciones online que se podían ir a los 5 minutos. Obviamente esos tiempos no son admisibles para una operación web, por lo que urgía detectar fuentes de problemas y optimizar los procesos.

Realmente no había ninguna parte del código culpable al 100%, sino que la funcionalidad implementada, excesivamente flexible para el usuario,  le permitía a éste realizar búsquedas y operaciones que finalmente implicaban una sucesión de consultas, filtrados, operaciones de unión/intersección de listas enormes, persistencia…

Para muchas de las listas que se manejaban, se podía garantizar su invariabilidad en un tiempo elevado. Datos, por ejemplo, relativos a provincias. Por ello daba la sensación de que implementar una caché de estas listas, y sobre todo de los resultados finales después de las mencionadas operaciones de unión/intersección, etc., podría ser oportuno. Es cierto que Hibernate permite caché de resultados (y de hecho utiliza Ehcache), pero en este caso hablamos de resultados post-procesados, por lo que no sería suficiente.

Cachear objetos en una aplicación Java EE es algo básicamente trivial: siempre disponemos de la opción de ubicar el objeto en contexto de aplicación (ServletContext) y recuperarlo cuando queramos. Sin embargo esta aproximación no deja de ser algo “de juguete”. Decidimos utilizar Ehcache en primer lugar porque sabíamos que Hibernate sacaba un buen provecho de él, pero sobre todo porque, con un desarrollo extremadamente sencillo, obtenemos importantes ventajas funcionales como:

  • Gestión de caducidad del contenido. Pasado un tiempo determinado, la caché elimina el objeto cacheado y comienza a devolver NULL a las peticiones posteriores. Nos elimina la responsabilidad de persistir el tiempo de vida de un objeto cacheado.
  • Configuración del máximo número de objetos a cachear en memoria. Podemos dimensionar la cantidad de objetos que deseamos cachear en memoria. Ehcache se encarga de serializar a disco todo lo que le sobra, y recuperarlo cuando sea necesario. Ni que decir tiene que todos los objetos a cachear deberán ser serializables.
  • Posibilidad de despliegue en cluster.
  • Eliminación de la caché durante el shutdown del servidor de aplicaciones.
  • ¡No reinventar la rueda!

Al final desarrollamos una sencilla clase tipo Manager, implementando el patrón Singleton, que interactúa con Ehcache. Y en determinadas zonas de la aplicación, invocar a la cache para recuperar los objetos que anteriormente se generaban online.

Paso a poner el código, que al final sin chicha esto se queda en nada :-) Eso sí, me gustaría recalcar que el proceso de 5 minutos al final, con un poco de cariño, ha pasado a responder en menos de 10 segundos. Una ganancia de un 3000%…

/*
* File: CacheUtil.java
*
* Created on march 2009
*
*
* Copyright 2006-2029 Javier Echeverría Usúa (javieu at gmail.com)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package com.viavansi.framework.core.cache;


import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;


import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;


import com.viavansi.framework.core.persistencia.servicios.excepciones.ExcepcionServicio;


/**
* @author Javier Echeverria Usua (javieu at gmail.com)
* @author Felix Garcia Borrego (borrego at gmail.com)
* @author Alexis Castilla Armero (pencerval at gmail.com)
*/
public class CacheUtil {


public Object getCachedObject(String key) throws Exception{


if(minutosVidaDefault == 0)
minutosVidaDefault = MINUTOS_DEFAULT;

return getCachedObject(key, minutosVidaDefault);
}

public void putCachedObject(String key, Object info) throws Exception{

if(minutosVidaDefault == 0)
minutosVidaDefault = MINUTOS_DEFAULT;

putCachedObject(key, info, minutosVidaDefault);
}

public Object getCachedObject(String key, int minutosCache) throws Exception{

Cache cacheCustodia = getInstance(minutosCache);
Element element = cacheCustodia.get(key);
if(element != null){
return cacheCustodia.get(key).getValue();
}
else{
return null;
}
}

public void putCachedObject(String key, Object info, int minutosCache) throws Exception{

Cache cacheCustodia = getInstance(minutosCache);
cacheCustodia.put(new Element(key,info));
}

private Cache getInstance(int minutosCache) {
Cache cache = null;
//Todavía no existe
int timeTolife = minutosCache * 60;

CacheManager manager = CacheManager.getInstance();

String nombreCache = "viavansiCachedInfo" + minutosCache;

if (manager.cacheExists(nombreCache)) {
cache = manager.getCache(nombreCache);
} else {
// Configuramos el apagado en caso de Error de la JVM o parada inesperada.
System.setProperty("net.sf.ehcache.enableShutdownHook", "true");
manager.addCache(new Cache(nombreCache, 100, true, false, timeTolife, timeTolife));
cache = manager.getCache(nombreCache);
}

return cache;
}

public static void shutDown() {
CacheManager.getInstance().shutdown();
}

private int MINUTOS_DEFAULT = 60;

private static int minutosVidaDefault = 0;

protected CacheUtil(int minutosVida) {
minutosVidaDefault = minutosVida;
}

public static void init(int minutosVida) {
minutosVidaDefault = minutosVida;
}

/*
* Constructor y accesores
*/

// Patrón Singleton
private static CacheUtil singleton;

//Instancia de Commons Logging
private Log log = LogFactory.getFactory().getInstance(this.getClass().getName());

/**
* private constructor (solo una instancia).
* @return AmbitoBO
*/
protected CacheUtil() throws ExcepcionServicio {
super();
log.debug("Creando nueva instancia de CacheUtil");
}

/**
* Devuelve instancia activa de AmbitoBO.
* Típico método de implementación de patrón singleton
* @return AmbitoBO
* @throws ExcepcionServicio
*/
public static CacheUtil getCurrentInstance() throws ExcepcionServicio {
if (singleton == null) {
try {
singleton = new CacheUtil();
} catch (ExcepcionServicio e) {
throw e;
}
}
return singleton;
}

}

Un saludo a todos, y poned una caché en vuestros corazones :-P

Visteme despacio que tengo prisa!

10 mar 2009

Los programadores se enfrentan a una paradoja de valores básicos. Todos los desarrolladores con algunos años de experiencia saben que desordenes previos son causas de retraso. Y sin embargo todos los desarrolladores sienten que la presión les hace dejar mal algunas cosas para conseguir alcanzar las fechas de entrega. En resumen, no se toman el tiempo necesario para ir rápido.

Los verdaderos profesionales saben que la segunda parte de la paradoja está mal. No llegarás a la fecha haciendo mal las cosas. Es más, hacer las cosas mal te retrasará instantáneamente, y te forzará a incumplir la fecha de entrega. La única manera de llegar a la fecha -la única manera de ir rápido- es mantener el código tan limpio como sea posible durante todo el tiempo.

Parrafos del libro “Clean Code”,  leido en el blog de José Manuel Beas

El Mago de las Cajas de Viavansi

05 mar 2009

Imágenes tomadas por nuestra cámara de seguridad :p.    Con varios proyectos a las espaldas y todavía le queda tikitaka!