Exportar #OpenOffice / #LibreOffice chart to SVG

UPDATE (10/04/2013): Actualmente Libreoffice 4.x soporta exportar directamente un gráfico desde Calc a formato SVG

UPDATE 2 (10/04/2013): Sería super si se pudieran usar los estilos XKCD (Es posible en processing y en python)

Hace un tiempo una persona preguntó en StackOverFlow cómo exportar un gráfico desde una hoja de cálculo a formato SVG, como mi respuesta ha sido la más votada hasta ahora creo que vale la pena recordarla:

  1. Create your chart on Calc
  2. Copy the chart into Draw
  3. Export Draw file to svg (File->Export)
  4. Open the svg on Inskcape
  5. Right click on the chart and select Ungroup

Reutilización de configuración de cache: Spring, Hibernate y EhCache

Desde hace un buen tiempo es conocido el beneficio y los cuidados necesarios del (ab)uso de sistemas de Cache en nuestras aplicaciones. Hibernate soporta el uso de varios proveedores de caché (en la inminente versión 3.5 se incluirá un nuevo jugador a la lista, el muy interesante Infinispan, que a juzgar por el benchamark sobre aplicaciones locales publicado en su blog es muuuy eficiente -cerca de un 20% más que EhCache 1.7-, sin embargo aún no he encontrado una comparación contra el reciente EhCache 2.0 y la cantidad de dependencias de Infinispan es realmente grande).
Sigue leyendo

Spring, DbUnit, Xml y otras hierbas

Hace algún tiempo trabajé en un proyecto grande como consultor, en ese proyecto se tenia una instancia de la bd -compartida por todos los equipos de desarrollo- para realizar las pruebas -tanto unitarias como de integración- generalmente se presentaban problemas porque el estado de la bd no era conocido al iniciar las pruebas y termino siendo un desastre ya que muchos de los equipos de desarrollo terminaron omitiendo las pruebas y lanzándose a la guerra de codificación con las conocidas consecuencias a la hora de entregar.

Luego trabajando en CakePHP aprendi que el framework permite crear fixtures de los modelos (CakePHP implementa el patrón ActiveRecord) para acceso a datos de prueba y dentro de ellos es posible definir un arreglo de arreglos con los datos que son insertados en una copia de la base de datos que es creada y los datos son insertados en la tabla correspondiente al modelo.

Ahora bien, en Java es recomendable usar DbUnit para insertar registros para pruebas y mediante una sencillisima integración con Spring framework aprovechar las anotaciones y los interceptores para lograr pruebas con bases de datos inciializadas a un estado conocido. En el blog Zenika se encuentran dos (1, 2) post al respecto con toda la información necesaria para aprender a hacer dicha integración.

Bueno, yo he adaptado un poco los ejemplos pero los conceptos son los mismos, sin embargo para obtener los datos en el formato mas simple de los que acepta DbUnit (XML plano) descargue desde Google Fusion Tables (conjuntos de datos publicos agrupables, presentables como graficas y descargables como csv, mugre google esta en todo), los converti en XML y finalmente mediante XSLT los transforme en el formato DbUnit.

Para pasar de CSV a XML use csv2xml, la instalación en Ubuntu es sencilla y esta muy bien descrita en la ayuda en linea de Ubuntu. Esta herramienta nos da como resultado un XML que no esta bien formado con la siguiente estructura:

<row>
 <nombre_columna_1>valor1</nombre_columna_1>
  <nombre_columna_2>valor2</nombre_columna_2>
</row>
<row>
 <nombre_columna_1>valor3</nombre_columna_1>
  <nombre_columna_2>valor4</nombre_columna_2>
</row>

Para hacer la transformación solo agrego un tag inicial y mediante XML Copy Editor (excelente herramienta open source para manejo de XML disponible para Linux/Win2) y la transformo mediante la siguiente XSLT:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:template match="*">
<xsl:copy>
<xsl:for-each select="@*|*[not(* or @*)]">
<xsl:attribute name="{name(.)}"><xsl:value-of select="."/>
</xsl:attribute>
</xsl:for-each>
<xsl:apply-templates select="*[* or @*]|text()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

La cual transforma los elementos en atributos para obtener finalmente un archivo de este tipo:

<dataset>
 <row nombre_columna_1="valor1" nombre_columna_2="valor2"/>
 <row nombre_columna_1="valor3" nombre_columna_2="valor4"/>
</dataset>

row es interpretado como el nombre de la tabla, así que es buena idea reemplazarla por nuestro nombre de tabla (o modificar la XSLT), los nombres de columnas corresponden a la primera fila en el archivo CSV, así que es buena idea asegurarse de que coincidan con los nombres de columnas en la tabla.

Struts2, Jquery y validación Ajax

Debido a la experiencia de trabajo en LetMeGo he aprendido un poco de JQuery (No al nivel de Lucho pero si como para hacer un trabajo decente).

Un amigo que trabaja en Java – Struts2 (snif) me pidio el favor de darle una luz respecto a validaciones ajax, puesto que en s2.0 se hacia mediante un tema llamado Ajax de s2 (que importaba un monton de librerias Dojo las cuales bajaban el rendimiento) y en s2.1 recomiendan un método similar pero a través del uso combinado del plugin dojo y el interceptor json-validator, en ese tutorial también presentan cómo es posible hacer la validación Ajax mediante Prototype, sin embargo no hay ejemplo de JQuery.

Aquí esta mi versión, lo único que cambia es el script de envío ajax del formulario y la presentación de los mensajes de error, en el método que usa Prototype incluyen los scripts ${pageContext.request.contextPath}/struts/utils.js y ${pageContext.request.contextPath}/struts/xhtml/validation.js, en la versión JQuery no son necesarias, en su lugar usamos el plugin Struts-JQuery para importar desde el CDN de google (mugre google esta en todo) las librerias JQuery, aquí está la versión del script para el tema “simple” de s2 (creo que tambien debería funcionar para el tema xhtml o cualquier otro):

<%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@taglib prefix="sj" uri="/struts-jquery-tags" %>
<%@ taglib prefix="s" uri="/struts-tags" %>

<html>
<head>
    <title>Validation - Ajax</title>
    <!-- JQuery -->
    <sj:head compressed="true" loadFromGoogle="true"/>
</head>

<s:url id="url" namespace="/validation" action="quizAjax"/>

<body>

<s:form method="post" theme="simple" namespace="/nodecorate" action="quizAjax" id="form" onsubmit="return validate(this);">
	<table>
		<tr>
			<td><s:label key="name"/></td>
			<td><s:textfield name="name" /><br/><s:fielderror fieldName="name"/></td>
		</tr>
		<tr>
			<td><s:label key="age"/></td>
			<td><s:textfield name="age" /><br/><s:fielderror fieldName="age"/></td>
		</tr>
		<tr>
			<td><s:label key="color"/></td>
			<td><s:textfield name="color" /><br/><s:fielderror fieldName="color"/></td>
		</tr>
	</table>
    <s:submit />
</s:form>


<script type="text/javascript">
function validate(form) {
    var dataToBeSent = $(form).formSerialize()+'&amp;struts.enableJSONValidation=true&amp;struts.validateOnly=true';

	$.ajax({
		type : "post",
		url : $(form).attr('action'), 
		data : dataToBeSent,
		datatype : "json",
		success : function(data, textStatus) {
			//elimina los mensajes de error previos
			$(".errorMessage").remove();
			//las respuestas Json usan un wrapper por seguridad que debe ser removido para usar el objeto JSON
			var responseObject = eval("("+data.substring(data.indexOf("\/\*")+2, data.lastIndexOf("\*\/"))+")");
			
			if (isEmpty(responseObject) == false) {
				$.each(responseObject.fieldErrors, function(i,fieldError){
					$('[name='+i+']').after(
							'<ul class="errorMessage"><li>'
							+fieldError+'</li></ul>');
				});
			} else {
				$(form).submit();
			}
		}
	});
	return false;
}
</script> 

Me alegra poder responder de vez en cuando a preguntas de amig@s, existe otro plugin para s2 de JQuery que permitirá hacer esto sin tanto esfuerzo, sin embargo no está dentro del plugin-registry de s2 y me parece que aún no tiene una versión estable, a pesar de eso, creo que a la validación de s2 le haría bien un tema que integre el muy buen JQuery validator plugin como alternativa al modelo de validación s2. Supongo que lo intentaré cuando no esté tan atrasado con mi trabajo.

Desde Fox a Feynman

Durante la universidad y a través de las lecturas que proponía nuestro profesor de física moderna (nada complejo, solo una introducción) me enteré de varios físicos que participaron en el proyecto Manhattan entre ellos el doctor Richard Feynman. El doctor Feynman tenía entre sus pasatiempos abrir cerraduras (En este post relatan una historia muy buena acerca de ese gusto durante el proyecto Manhattan).

Otro de los pasatiempos del doctor Feynman era descifrar jeroglíficos mayas -los mayas fueron una civilización centroamericana pre colombina muy avanzada- y durante mi visita a tierra Guatemalteca tuve oportunidad de ir a Tikal y subir en las pirámides mayas construidas milenios atrás, en ese momento comprendí la raíz del pasatiempo del doctor Feynman.

En la inmersión hubo un episodio de apuesta en el que perdí un poco de dinero, pero dio pie para recordar al doctor Feynman por una presentación llamada “Growing up Geek: My Dad, the Computer Scientist” y desde allí saltar a los varios intentos (pocas victorias he de admitir) de abrir cerraduras usando manuales encontrados en la red, ahora por petición de mi buen amigo Tufla dejo este enlace que si bien no garantiza una victoria contra una cerradura, quizás sirva como inicio de un pasatiempo barato y entretenido sin necesidad de muuuucha tecnología.

Manual de Intercambios Virtuales

Finalmente solo queda recomendar dos libros del doctor Feynman que están en mi lista de cacería para la próxima feria del libro en Ciudad Bogótica:

¿Esta usted bromeando Sr Feynman?

Ojalá los supiera!