#Pgadmin 4 en #Fedora 26

Preámbulo

El glorioso HP Zbook ya había llegado al final de su vida útil para mí, entonces decidí actualizar mi laptop de trabajo por una Lenovo Flex 4 , sin embargo, tan sólo unos días después fui asaltado en un local de Juan Valdez en Ciudad Bogotica. Lleno de ira y tareas pendientes pero con un muy bajo presupuesto, adquirí una Lenovo Yoga 900 (13isk2) a la cual no logré instalarle Ubuntu, de tal forma que probé con Arch Linux de manera razonablemente exitosa, pero unos días más tarde me cambié a Fedora 26 y soy más feliz (no tanto como con Ubuntu, pero…).

PgAdmin 4

PgAdmin es el mejor cliente para la mejora base de datos libre que existe, postgresql, la versión 3 contenía las funciones básicas necesarias para administrar gráficamente un servidor postgres y hacer consultas y optimizaciones de manera razonablemente fácil. Sin embargo, la versión 3 era fea y tenia varios bugs que resultaban en caídas inesperadas, con la versión 4 PgAdmin dió un salto a una nueva arquitectura, mejor intrefaz y parece que importantes mejoras en rendimiento. El asunto es que para instalarlo en Fedora 26 es difícil porque la ui (App python Flesk) necesita la libreria de traducción Babel > 0.11 asi que para poder instalarlo de manera decente tuve que buscar en varios foros, hasta que encontré la solución:

  • Descargar el repositorio de fedora de postgres 9.5, en la terminal:

curl -o pgdg-fedora95-9.5-4.noarch.rpm https://download.postgresql.org/pub/repos/yum/9.5/fedora/fedora-25-x86_64/pgdg-fedora95-9.5-4.noarch.rpm

  • Agregar el repositorio a dnf e instalar pgadmin 3

sudo rpm -ivh pgdg-fedora95-9.5-4.noarch.rpm

sudo dnf update

sudo dnf -y reinstall pgadmin3 –allowerasing

  • Instalar pgadmin 4

sudo dnf -y install pgadmin4-v1 –allowerasing

  • Desinstalar pgadmin 3

sudo dnf remove pgadmin3

De esta forma es mucho más sencillo trabajar con postgres.

Extra – modelar bases postgresql

Con PgModeler es muy sencillo diseñar bases de datos e importar bases existentes para visualizar o actualizar los modelos.

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.