martes, agosto 25, 2009

Embeber gráficas en una JSP. CEWOLF

Según la definición de la página oficial:
Cewolf consta de un servlet que se encarga del renderizado de las imágenes y de una librería de tags que traduce la definición incluida en una JSP en la etiqueta HTML <img> Ésta consulta al servlet de renderizado para la recuperación de la gráfica apropiada.


Los mejores puntos a favor:
  • Es software de licencia LGPL.
  • Puede ser ejecutado en cualquier servidor compatible con J2EE o contenedor servlets.
  • Defines el gráfico mediante XML.
  • Lo tuneas fácilmente extendiendo sus clases.
  • Gran cantidad de gráficas disponibles.


Cómo usamos CeWolf:
Por ejemplo, podríamos hacer una web que nos mostrara una gráfica de tarta de la distribución de errores.

1º Nos bajamos el paquete desde la página oficial. Contiene todos los jars necesarios.
2º Registramos el Servlet de CeWolf en web.xml


<servlet>
<servlet-name>CewolfServlet</servlet-name>
<servlet-class>de.laures.cewolf.CewolfRenderer</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CewolfServlet</servlet-name>
<url-pattern>/cewolf/*</url-pattern>
</servlet-mapping>


3º Ahora por una parte, creamos un bean que implemente la interfaz que ofrece CeWolf (DatasetProducer) y que sea Serializable.


public class GraficoTarta implements DatasetProducer, Serializable{

public String getProducerId() {
// TODO Auto-generated method stub
return "graficoTarta";
}

public boolean hasExpired(Map arg0, Date arg1) {
// Poniendolo a true, se renderizará la imagen cada
// vez que actualicemos la página
return true;
}

public Object produceDataset(Map params) {
// Recogemos nuestro Mapa de parámetros, que ha sido
// rellenado en cualquier otra action y contiene los
// datos que queremos mostrar
Map mapProp = (Map) params.get("mapa");

// Del mapa sacamos los errores, pares
// (, )
HashMap hashErrores = (HashMap)
mapProp.get("errores");

DefaultPieDataset ds = new DefaultPieDataset();
Set categories = hashErrores.keySet();

for (Iterator it = categories.iterator(); it.hasNext();){
String key = it.next();
Integer numErrores = (Integer) hashErrores.get(key);
ds.setValue(key, numErrores);
}
return ds;
}
}

4º Para el ejemplo hemos implementado un servlet que hace de controlador en donde referenciamos el bean tomándolo del contexto. Además, en nuestro caso, estamos usando Spring como contendor de Beans, así que registramos el bean anterior en el applicationContext.xml.

Servlet:
WebApplicationContext _ctx = WebApplicationContextUtils.getWebApplicationContext(config.getServletContext());

reqHttpServletRequest.getSession().setAttribute("pvErroresStd",_ctx.getBean("erroresBean"));


applicationContext.xml:
<bean id="erroresBean" class="com.statistics.datasetproducers.GraficoTarta"/>


5º Por último, definimos en la JSP de salida la definición del gráfico

<jsp:useBean id="pvErroresStd" scope="session"
class=" com.statistics.datasetproducers.GraficoTarta"/>

<cewolf:chart id="pieChart" title="Tipos de Errores" type="pie">
<cewolf:gradientpaint>
<cewolf:point x="0" y="0" color="#FFFFFF" />
<cewolf:point x="300" y="0" color="#CCDDFF" />
</cewolf:gradientpaint>
<cewolf:data>
<cewolf:producer id="pvErroresStd">
<cewolf:param name="mapa" value="<%=mapa%>" />
</cewolf:producer>
</cewolf:data>
</cewolf:chart>
<cewolf:img chartid="pieChart" renderer="/cewolf" width="700" height="300"/>


¡Y ya esta! Ahora tenemos una aplicación J2EE que, dados unos datos genera su gráfico PieChart.

miércoles, febrero 11, 2009

Cómo realizar una transferencia via SFTP con Java

Este tema me surgió en el trabajo y, en principio parecía fácil… en principio. En mi caso, los requerimientos me decían que tenía que ser SFTP y, por requerimientos personales, debía ser una API libre. El problema es que no encontré información clara acerca de cómo realizar una transferencia de un fichero por un canal seguro y de forma sencilla. Las consultas a Google me llevaban siempre al proyecto VFS de Apache, pero el VFS y yo teníamos un problema de entendimiento, vamos que no entendía el procedimiento que hay que seguir para lograr hacer la transferencia. No podía ser todo tan complejo!

Al final claudique, venga, si ha de ser VFS, pues manos a la obra, vamos a ver los ejemplos del código fuente… y ahí lo vi. Parece ser que VFS usa las librerías JSch de JCraft distribuidas por el autor bajo licencia BSD. Esta API es muuuucho más sencilla y más adecuada a mis requerimientos. Pero vamos al tema:


JSch jsch = new JSch();

// Inciciamos el JSch con el usuario, host y puerto
Session session = jsch.getSession(ftpUserName, ftpHost, 22);

// Seteamos el password
session.setPassword(ftpPassword);

// El SFTP requiere un intercambio de claves
// con esta propiedad le decimos que acepte la clave
// sin pedir confirmación
Properties prop = new Properties();
prop.put("StrictHostKeyChecking", "no");
session.setConfig(prop);
session.connect();

// Abrimos el canal de sftp y conectamos
ChannelSftp chan = (ChannelSftp) session.openChannel("sftp");
chan.connect();

// Convertimos el archivo a transferir en un InpusStream
InputStream is = new BufferedInputStream (new FileInputStream("c:\\TEMP\\annexe1.doc"));

// Iniciamos la transferencia
chan.put(is, "/annexe1.doc");

// Cerramos el canal y session
chan.disconnect();
session.disconnect();

Ale, transferencia realizada.

miércoles, septiembre 17, 2008

WTF?

La noticia: "La nueva bandera de la localidad granadina de Jun contiene un mensaje cifrado en código binario que oculta la palabra 'amor' "

La realidad: Resulta ser una bandera normal, pero que incluye esto : " 01 11 111 010 " y yo me pregunto ¿Amor? ¿¿¿Donde leches pone amor???

Pues atención a la explicación en el blog del alcalde de la localidad:

"[...] la bandera de Jun la primera en todo el mundo que contiene un mensaje de estas características y totalmente cifrado. [...] el Ayuntamiento ha querido dejar claro que no quiere olvidar sus antecedentes históricos de mas de 2.200 años y por eso lleva reflejada el templo de Diana pero tampoco quería dejar de mantener sus señas de identidad con las nuevas tecnologías y por eso se refleja una palabra que mueve el mundo de forma encriptada y que para averiguarla es necesario cambiar los ceros del código binario por un punto y cada uno por una raya respetando los espacios y se obtiene la palabra en código morse. "

¿¿Pero que clase de prostitución del binario y del morse se ha llevado a cabo???
El morse es morse, y tiene su propio sistema de codificación con puntos y rayas y el binario es binario!!! y tiene 0's y 1's!! Total, que esto no lo puede interpretar ni alguien que sepa morse ni alguien que sepa binario.

Esta es una medida propagandística cutre, de un consistorio q se cree "way". Además, como en tantos otros consistorios, se llevan a cabo acciones "populistas" para acallar a la gente. Si es que hay que estar "orgullosos" de algo. Unos ponen faldas a los semaforos de peatones y otros "códigos encriptados" en sus banderas. ¡Da igual!, lo que vale es la nota de prensa y la foto. Si es que ya lo dicen por aqui, "Esto es un pais de porteras, 'campechanos', y panderetas".


Q indignación, por diosssssss!!

viernes, agosto 22, 2008

Turismo por Sagunto y El Puerto

Hacía tiempo que no posteaba, entre el trabajo, los exámenes, vacaciones... En fín, no hay excusa, pero para comenzar de nuevo aqui os dejo las localizaciones de los mejores puntos turísticos de la comarca del Camp de Morvedre. Explicaditas y todo.



Ver mapa más grande

martes, mayo 20, 2008

Cambiando de dominio.

Ayer tuve que cambiar el dominio en todas las aplicaciones que mantenemos. Enga, manos a la obra.

Aplicación 1. Búsqueda --> '.net' ... (pensando) ... 1 ocurrencia. Weeee!!! Ok, cambiado, solicito a preproducción.

Aplicacion 2. Búsqueda --> '.net' ... (pensando) ... 27 ocurrencias. Uy, son demasiadas, pero la mayoria en archivos de configuración, path de imágenes y tal... Bueno, cambiado, solicito a preproducción.

Aplicacion 3. Búsqueda --> '.net' ... (pensando) ... (pensando) ... (pensando) ... 795 ocurrencias. QUÉEEEE!!!!! No puede ser!!! Aqui es donde empiezas a ver como puedes usar "Buscar/Sustituir" pero no cuela, he de poner cabecera y pie del cambio. Cachis. Empiezo a ver los fuentes con ocurrencias.

46 tienen 9 ocurrencias --> 414
40 tienen 8 ocurrencias --> 320
1 tiene 1 ocurrencia --> 1
1 tiene 7 ocurrencias --> 7
Las 53 occurrencias restantes en archivos de configuración.

Entro en los fuentes (.java, .jsp y .html). Curioso, de los 40 archivos con 8 ocurrencias, 20 son jsp's y 20 html's. Hay 20 nombres de fichero diferentes pero con una versión jsp y otra html.

Mas curioso todavia... los 20 ficheros diferentes corresponden a ... errores! No existe una página de error con texto parametrizado, son páginas diferentes para cada error y cada error con su versión html y jsp. Dios!

Adentrando más todavia, las ocurrencias estaban en la cabecera del archivo (1 ocurrencia) y en su pie (7 ocurrencias). Los de 9 ocurrencias tenían la misma disposición que los de 8 pero con otra ocurrencia más comentada. Lo veo venir....

Ahi es donde atas cabos.
  1. Cada una de las pantallas de la aplicación se creó como una clase java con sus miles de lineas de tipo System.out.print(""); ...
  2. Cada página de error se creó como html un archivo html para cada error.
  3. Parece q luego se decidieron por migrar los html's a jsp's pero a saco, mucho más facil q pasar un párámetro con el error ni nada de eso.
  4. Alguna mente pensante pensó q podrían usar en los jsp's la inclusión de un archivo de cabecera y otro de pie para "estructurar un poco" pero todo quedó en un conato de lucidez.


Y en ese momento piensas... pues a la fuerza algunos deben de ser obsoletos. Pues no. Aleatoriamente se enlazan html's y jsp's.

Jooooooooo... =(
Te resignas, te pones musica, te 'arremangas' y ale.

miércoles, marzo 26, 2008

München

Esta (finde) Semana Santa estuvimos en Munich (Alemania). Vaya frío q hacia allí. Nada más llegar tuve q comprarme un gorro polar xq tenia las orejillas congeladas. Aquello es muy diferente. Llegamos hacia las 11 de la noche y estaba todo muerto, todo cerrado y ningún sitio para cenar. En un pub-restaurante nos ofrecieron una sopa xq nos vieron esfamidos y les debimos de dar pena =S

Lo cierto es q es una ciudad preciosa, al menos por donde nos movimos nosotros. Hay parques grandísimos como el Englichen Garten con riachuelos y un lago con ocas tontas y patos con melena y los edificios del centro cerca de Marienplatz son señoriales como el "Neues Rathaus" de la foto. Hay quien diría q son civilizados hasta para andar por la calle! La gente parece simpática y tienden a hablarte con una sonrisa.





Es la única ciudad católica de Alemania y estan super-orgullos vendiendo postales del Papa al lado de las fotos típicas de la ciudad, pero, además de esto, hay varias razones por las que yo no viviría en Munich.
  1. El café (kaffe) esta aguachado y te ponen la leche en tarrinillas q solo colorean.
  2. El agua tiene sabor… dejemoslo en desagradable.
  3. La gente come hacia las 12 y cena para las 7!!!! Así q a las 6 ya no se puede merendar, (pero sí beber cerveza – Punto para Peter!).
  4. A las 10 (aprox.) está todo muerto.
  5. Hace un frio q pela!

Diréis, “claro, claro, se queja del frío xq es una friolera!” Si, es cierto lo soy, pero para que veáis el frío q hacia, os dejo esta foto. Juzgar vosotros mismos =P

Resumiendo, es una ciudad para visitar, muy recomendable, pero eso sí, en verano.
Auf Wiedersehen!


jueves, febrero 14, 2008

Por ti.

Creo que somos la suma de los actos que realizamos, de las decisiones que tomamos y de las experiencias que vivimos que condicionan todas nuestras relaciones personales y laborales. Nuestra manera de enfrentarnos a las situaciones depende de ello y pienso que se aprende cuando más hundido estás y encuentras la manera de levantarte.

Me levanté y creí haber aprendido a protegerme, a no exponerme, a blindarme para no dejar ni un hueco al aire. Y cuando más firmemente creía en mi nuevo lema… llegaste tú y todo cambió. Ya no necesito un lema, ahora vuelvo a ser yo.

Quería dedicarte una entrada desde hacía tiempo por que si este blog cuenta mi vida, faltaba la parte más importante: Tú.

Me has hecho cambiar para mejor. Mis metas no son las mismas que hace hoy un año, hoy te incluyen a ti.

Mil Besos, cielo.