<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>
<channel>
	<title>El Blog de Ana Buigues</title>
	<atom:link href="http://anabuigues.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://anabuigues.com</link>
	<description></description>
	<lastBuildDate>Wed, 07 Dec 2011 16:07:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Cómo fue el Global Day of Coderetreat 2011 en Madrid</title>
		<link>http://anabuigues.com/2011/12/06/como-fue-el-global-day-of-coderetreat-2011-en-madrid/</link>
		<comments>http://anabuigues.com/2011/12/06/como-fue-el-global-day-of-coderetreat-2011-en-madrid/#comments</comments>
		<pubDate>Tue, 06 Dec 2011 20:42:01 +0000</pubDate>
		<dc:creator>Ana Buigues</dc:creator>
				<category><![CDATA[Eventos]]></category>
		<category><![CDATA[coderetreat]]></category>
		<category><![CDATA[eventos]]></category>
		<category><![CDATA[TDD]]></category>
		<guid isPermaLink="false">http://anabuigues.com/?p=3734</guid>
		<description><![CDATA[El pasado 3 de diciembre se llevó a cabo en todo el mundo el evento denominado Global Day of Coderetreat, el cual reunió a unos 2000 desarrolladores alrededor del mundo, todos participando el mismo día en una actividad denominada coderetreat.
¿Y qué es un coderetreat? según Corey Haines que es el impulsor de todo esto, es una práctica que se realiza durante todo un día, centrada en los fundamentos del diseño y desarrollo de software. Suelen resolverse problemas sencillos en un entorno en el que solo es importante aprender. El formato del coderetreat ha demostrado ser un medio altamente efectivo para mejorar nuestras habilidades.]]></description>
			<content:encoded><![CDATA[<p><a href="http://anabuigues.com/wp-content/uploads/2011/12/gdcr2011.png"><img class="alignleft size-full wp-image-3744" title="gdcr2011" src="http://anabuigues.com/wp-content/uploads/2011/12/gdcr2011.png" alt="" width="583" height="260" /></a></p>
<p style="text-align: justify;">El pasado 3 de diciembre se llevó a cabo en todo el mundo el evento denominado <a title="Coderetreat" href="http://coderetreat.com/" target="_blank">Global Day of Coderetreat</a>, el cual reunió a unos 2000 desarrolladores alrededor del mundo, todos participando el mismo día en una actividad denominada <strong>coderetreat</strong>.</p>
<p style="text-align: justify;">¿Y qué es un <strong>coderetreat</strong>? según <a title="Corey Haines" href="http://coreyhaines.com/" target="_blank">Corey Haines</a> que es el impulsor de todo esto, es una práctica que se realiza durante todo un día, centrada en los fundamentos del diseño y desarrollo de software. Suelen resolverse problemas sencillos en un entorno en el que solo es importante aprender. El formato del <strong>coderetreat</strong> ha demostrado ser un medio altamente efectivo para mejorar nuestras habilidades.</p>
<p style="text-align: justify;"><span id="more-3734"></span>Se realizan iteraciones de 45 minutos realizando <a title="pair programing" href="http://en.wikipedia.org/wiki/Pair_programming" target="_blank">pair programing</a> y <a title="TDD" href="http://en.wikipedia.org/wiki/Test-driven_development" target="_blank">TDD</a>. Después de cada iteración se realiza una retrospectiva para saber como ha ido, se cambia de pareja, se borra el código y se empieza con la resolución del problema desde cero. No importa si después de 45 minutos no hemos logrado escribir una sola línea de código o no hemos resuelto el problema completo, siempre y cuando esa línea o todo el código lo hayamos escrito de la mejor manera posible.</p>
<p style="text-align: justify;">El <strong>Coderetreat</strong> de Madrid se celebró en <a title="Camon" href="http://www.tucamon.es/contenido/day-of-global-code-retreat-madrid" target="_blank">Camon</a>, tuvimos como facilitador a <a title="Enrique Comba" href="http://path11.com/people/enrique" target="_blank">Enrique Comba</a> que nos guió en el clásico problema del <a title="Juego de la Vida" href="http://coderetreat.com/gol.html" target="_blank">Juego de la Vida de Conway</a> durante las diferentes iteraciones realizadas.</p>
<h4>1ª Iteración</h4>
<p style="text-align: justify;">En esta primera iteración no había ninguna restricción, sirvió como toma de contacto con el problema. Lo que aprendí en esta iteración es a no empezar a construir la casa por el tejado!</p>
<h4>2ª Iteración</h4>
<p style="text-align: justify;">Las restricciones en esta iteración eran que no podíamos usar tipos primitivos, todo tenía que estar en objetos y no podíamos usar ifs. En esta iteración no tuvimos ningún problema, siempre pensando en OO.</p>
<h4>3ª Iteración</h4>
<p style="text-align: justify;">Varias restricciones&#8230; de primeras no podíamos tener métodos de más de 2 líneas. A mitad de la iteración se añadió la restricción de <a title="Ping Pong Programing" href="http://en.wikipedia.org/wiki/Pair_programming#Ping_pong_pair_programming" target="_blank">programar haciendo ping-pong</a> en silencio. El hecho de no poder hablar con tu compañero hizo que se nos atragantase bastante la iteración. Lo que aprendí es que tenemos que escribir los test y la lógica de una manera suficientemente sencilla y clara para que otro programador sea capaz de entender que hemos hecho.</p>
<h4>4ª Iteración</h4>
<p style="text-align: justify;">En esta iteración teníamos que escribir el peor código que se nos ocurriese, y a mitad de iteración teníamos que hacer lo contrario, intentar cambiar el código escrito para que quedase de la mejor forma posible. Al iniciar esta iteración pensaba que lo de escribir un código feo y malo iba a ser sencillo, pero tengo que decir que la verdad es que nos resulto bastante complicado después de 3 iteraciones escribiendo buen código. Aunque en la retrospectiva me di cuenta que todo era cuestión de imaginación! nombres que no tengan nada que ver lo que se está haciendo, escribir código innecesario simplemente para que no sea legible etc&#8230;</p>
<h4>5ª Iteración</h4>
<p style="text-align: justify;">En esta iteración la restricción era <strong>TDD</strong> as if you meant it, hacer todo el código en el propio test y sólo sacarlo a método cuando se repita, y luego si hay métodos que tengan pinta de clase sacarlos. Es una práctica difícil y dura pero a la vez interesante ver como pasito a pasito se llega a una sencilla solución. Es la iteración que más me gusto.</p>
<h4>6ª Iteración</h4>
<p style="text-align: justify;">Es esta iteración las restricciones eran clases inmutables, no podíamos utilizar fors y no podíamos utilizar algoritmos. Esta iteración nos fue bastante bien, creo que por ser la última.</p>
<p style="text-align: justify;">Fue mi primer <strong>coderetreat</strong>  y tengo claro que voy a repetir, es un día en el que practicas y te diviertes a la vez, cosa que muchas veces no ocurre. Conoces a gente estupenda y te llevas muchos tips a mejorar.</p>
<p style="text-align: justify;">Finalmente podéis ver el vídeo que grabó Enrique Comba, y así ver lo bien que nos lo pasamos!</p>
<p style="text-align: center;"><iframe src="http://player.vimeo.com/video/33143227" width="500" height="300" frameborder="0"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://anabuigues.com/2011/12/06/como-fue-el-global-day-of-coderetreat-2011-en-madrid/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Must Read: Diseño Ágil con TDD de Carlos Blé</title>
		<link>http://anabuigues.com/2011/11/13/must-read-diseno-agil-con-tdd-de-carlos-ble/</link>
		<comments>http://anabuigues.com/2011/11/13/must-read-diseno-agil-con-tdd-de-carlos-ble/#comments</comments>
		<pubDate>Sun, 13 Nov 2011 13:24:43 +0000</pubDate>
		<dc:creator>Ana Buigues</dc:creator>
				<category><![CDATA[Libros]]></category>
		<category><![CDATA[TDD]]></category>
		<guid isPermaLink="false">http://anabuigues.com/?p=3624</guid>
		<description><![CDATA[Recientemente he leido Diseño Ágil con TDD de Carlos Blé y considero que su lectura es una magnifica forma de introducirse en el mundo de la practica del Test Driven Development. Para los que desconozcan que es TDD es una técnica de desarrollo de software enmarcada dentro de la metodología eXtreme Programming que tiene la virtud de minimizar el [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><a href="http://anabuigues.com/wp-content/uploads/2011/11/Diseno_Agil_con_TDD.jpg"><img class="alignleft size-full wp-image-3704" title="Diseno_Agil_con_TDD" src="http://anabuigues.com/wp-content/uploads/2011/11/Diseno_Agil_con_TDD.jpg" alt="" width="225" height="332" /></a>Recientemente he leido <strong><a title="Diseño Ágil con TDD" href="http://www.dirigidoportests.com/el-libro" target="_blank">Diseño Ágil con TDD</a> </strong>de <a title="Carlos Blé" href="http://www.carlosble.com/" target="_blank">Carlos Blé</a> y considero que su lectura es una magnifica forma de introducirse en el mundo de la practica del Test Driven Development.</p>
<p style="text-align: justify;">Para los que desconozcan que es <a title="Test Driven Development" href="http://en.wikipedia.org/wiki/Test-driven_development" target="_blank">TDD</a> es una técnica de desarrollo de software enmarcada dentro de la metodología <a title="Extreme Programming" href="http://en.wikipedia.org/wiki/Extreme_programming" target="_blank">eXtreme Programming</a> que tiene la virtud de minimizar el número de defectos del código y maximizar su calidad creando un código limpio que funcione.</p>
<p style="text-align: justify;">El libro se divide en dos partes, un teórica y una práctica. En la parte teórica realiza una pequeña introducción sobre la importancia del <a title="Agilismo" href="http://es.wikipedia.org/wiki/Agilismo" target="_blank">Agilismo</a>. Pasa a explicarnos el algoritmo del <strong>TDD</strong> y realiza un recorrido por los distintos tipos de test como son los Test de Aceptación, Test Funcionales, Test de Sistema, Test Unitarios y Test de Integración. También nos explica cuando usar los dobles de prueba y como escribir código que cumpla con los principios de diseño <a title="SOLID" href="http://en.wikipedia.org/wiki/SOLID_(object-oriented_design)" target="_blank">S.O.L.I.D</a>.</p>
<p style="text-align: justify;">La lectura de esta primera parte resulta realmente enriquecedora, introduce muchos aspectos del &#8220;como se deben realizar las cosas&#8221;, se nota que la <a title="Software craftsmanship" href="http://en.wikipedia.org/wiki/Software_craftsmanship" target="_blank">artesanía del software</a> es un papel importante dentro de esta técnica de desarrollo, bueno y del desarrollo en general.</p>
<p style="text-align: justify;"><span id="more-3624"></span></p>
<p style="text-align: justify;">La segunda parte es puramente práctica, dónde se aplica todo lo aprendido en la parte teórica paso a paso. Se realiza un ejemplo partiendo de los test de aceptación, de esta forma nos centramos específicamente en el problema a resolver. Se van desarrollando los test utilizando <strong>TDD</strong> y se observa como el código va cambiando y adaptándose a los requisitos de una manera incremental.</p>
<p style="text-align: justify;"><strong>Qué beneficios obtenemos:</strong></p>
<ul>
<li>Escribimos código de calidad.</li>
<li>Los diseños son más simples, nunca escribimos más código del necesario.</li>
<li>Aumenta la fiabilidad del código gracias a los test.</li>
<li>Conseguimos código muy reutilizable.</li>
<li>La tranquilidad de realizar modificaciones, si rompemos algo un test nos lo dirá.</li>
</ul>
<p style="text-align: justify;"><strong>Qué problemas encontraremos:</strong></p>
<ul>
<li>La técnica en sí es muy sencilla, pero llevarla a cabo cuesta, hay que cambiar nuestra forma de pensar las cosas.</li>
<li>Estamos acostumbrados a escribir código que funcione y punto, ni refactorizaciones ni principios&#8230;El dilema del &#8220;no tengo tiempo o no hay tiempo&#8221; ya no vale.</li>
</ul>
<p style="text-align: justify;">Los ejemplos del libro están escritos en C#, yo los realicé en Java, los podéis encontrar <a href="https://github.com/anabuigues/disenoAgilConTDD" target="_blank">aquí</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://anabuigues.com/2011/11/13/must-read-diseno-agil-con-tdd-de-carlos-ble/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Diviértete practicando TDD con Pulse y TDGotchi</title>
		<link>http://anabuigues.com/2011/09/20/diviertete-practicando-tdd-con-pulse-y-tdgotchi/</link>
		<comments>http://anabuigues.com/2011/09/20/diviertete-practicando-tdd-con-pulse-y-tdgotchi/#comments</comments>
		<pubDate>Tue, 20 Sep 2011 17:41:33 +0000</pubDate>
		<dc:creator>Ana Buigues</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Eclipse Plugin]]></category>
		<guid isPermaLink="false">http://anabuigues.com/?p=3597</guid>
		<description><![CDATA[El Test Driven Development  o desarrollo guiado por pruebas es una técnica de diseño de software que se basa en tres sencillos pasos:
Rojo: escribimos la prueba primero cuando la funcionalidad está todavía por implementar, provocando el rojo.
Verde: escribimos el código más sencillo que haga que la prueba funcione, provocando el verde.
Refactorización: arreglar el código, extrayendo métodos, quitando duplicados, mejorando el nombre de métodos, clases, atributos...
Es importante que sigamos los pasos al pie de la letra, porque de lo contrario, no llegaremos a exprimir al máximo la técnica como herramienta de diseño.]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">El <strong><a title="Test Driven Development" href="http://en.wikipedia.org/wiki/Test-driven_development" target="_blank">Test Driven Development</a> </strong> o desarrollo guiado por pruebas es una técnica de diseño de software que se basa en tres sencillos pasos:</p>
<ol style="text-align: justify;">
<li><strong>Rojo</strong>: escribimos la prueba primero cuando la funcionalidad está todavía por implementar, provocando el rojo.</li>
<li><strong>Verde</strong>: escribimos el código más sencillo que haga que la prueba funcione, provocando el verde.</li>
<li><strong>Refactorización</strong>: arreglar el código, extrayendo métodos, quitando duplicados, mejorando el nombre de métodos, clases, atributos&#8230;</li>
</ol>
<p style="text-align: justify;">Es importante que sigamos los pasos al pie de la letra, porque de lo contrario, no llegaremos a exprimir al máximo la técnica como herramienta de diseño.</p>
<p style="text-align: justify;"><a title="Pulse" href="http://www.happyprog.com/pulse/" target="_blank">Pulse</a> y <a title="TDGotchi" href="http://www.happyprog.com/tdgotchi/" target="_blank">TDGotchi</a> son dos plugins de Eclipse que nos ayudan a divertirnos mientras practicamos <strong>TDD</strong>.</p>
<p style="text-align: justify;"><span id="more-3597"></span></p>
<h2 style="text-align: justify;">Pulse</h2>
<p style="text-align: justify;"><strong>Pulse</strong> hace una analogía a lo que sería la representación de los latidos de nuestro corazón en los monitores de los hospitales, de forma que nos muestra nuestro pulso practicando <strong>TDD</strong>. Cuando obtenemos un rojo en nuestros test se mostrará un pico hacia abajo, cuando obtengamos un verde se mostrará un pico hacia arriba y cuando refactorizemos se mostrará un pequeño pico azul hacia arriba. Se muestra como una vista en Eclipse.</p>
<p style="text-align: justify;"><a href="http://anabuigues.com/wp-content/uploads/2011/09/pulse-anatomy.png"><img class="aligncenter size-full wp-image-3660" title="pulse-anatomy" src="http://anabuigues.com/wp-content/uploads/2011/09/pulse-anatomy.png" alt="" width="307" height="136" /></a></p>
<p style="text-align: justify;">¿Y para qué nos sirve? pues para comprobar que realmente seguimos los pasos de <strong>TDD</strong>, a mi me ayudó para darme cuenta de que algunas veces me saltaba algún paso. Además podemos guardar nuestras sesiones de pulsos para posteriormente ver nuestro progreso, o compararlas con otros compañeros a modo de pique por ver quién lo hace mejor <img src='http://anabuigues.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<h2 style="text-align: justify;">TDGotchi</h2>
<p style="text-align: justify;"><strong>TDGotchi</strong> funciona como los famosos tamagotchi que se pusieron de moda hace tiempo (yo tuve uno). Es una mascota virtual que se alimenta de tus tests y tus refactorings. El sistema de puntuación para alimentar a nuestra mascota es el siguiente:</p>
<p style="text-align: center;"><a href="http://anabuigues.com/wp-content/uploads/2011/09/tdgotchi-scores.png"><img class="aligncenter size-full wp-image-3663" title="tdgotchi-scores" src="http://anabuigues.com/wp-content/uploads/2011/09/tdgotchi-scores.png" alt="" width="210" height="211" /></a></p>
<p style="text-align: justify;">Como veis, obtener un doble rojo es penalizado de una forma bastante elevada así que cuidado con ellos porque cuando realizamos tres o cuatro de ellos la puntuación negativa es tan alta que casi imposible de remontar, lo bueno (o malo según se vea) es que cuando abrimos de nuevo nuestro Eclipse, la puntuación vuelve a estar a 0.</p>
<p style="text-align: justify;">La mascota irá aumentado o disminuyendo de nivel, dependiendo de nuestra puntuación, nos podemos convertir en un zombi con una puntuación negativa o ir mejorando nuestro nivel cuanto mayor sea la puntuación obtenida.</p>
<p><img class="aligncenter size-full wp-image-3666" title="tdgotchi-evolution" src="http://anabuigues.com/wp-content/uploads/2011/09/tdgotchi-evolution.png" alt="" width="472" height="138" /></p>
<p style="text-align: justify;">Este plugin ayuda a seguir el sistema de tres pasos de <strong>TDD</strong> a raja tabla, ya que nadie quiere convertirse en un zombie!!!</p>
<p style="text-align: justify;">Por último felicitar a su creador <a title="Sebastian Hermida" href="http://twitter.com/sbastn" target="_blank">@Sebastian</a> por el gran trabajo realizado y hacer que practicar <strong>TDD</strong> sea tan divertido.</p>
]]></content:encoded>
			<wfw:commentRss>http://anabuigues.com/2011/09/20/diviertete-practicando-tdd-con-pulse-y-tdgotchi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Implementación de un Scaffolding con Grails</title>
		<link>http://anabuigues.com/2011/09/12/implementacion-de-un-scaffolding-con-grails/</link>
		<comments>http://anabuigues.com/2011/09/12/implementacion-de-un-scaffolding-con-grails/#comments</comments>
		<pubDate>Mon, 12 Sep 2011 17:47:13 +0000</pubDate>
		<dc:creator>Ana Buigues</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[grails]]></category>
		<category><![CDATA[scaffolding]]></category>
		<guid isPermaLink="false">http://anabuigues.com/?p=3604</guid>
		<description><![CDATA[Problema: necesito crear una interfaz web sencilla para rellenar una base de datos. Solución: realizar un scaffolding con Grails ¿Qué es Scaffolding? El Scaffolding es un término introducido por Rails y que está presente en otros frameworks como Grails, permite la generación automática de código para las cuatro operaciones básicas de cualquier aplicación que son [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><strong>Problema</strong>: necesito crear una interfaz web sencilla para rellenar una base de datos.</p>
<p style="text-align: justify;"><strong>Solución</strong>: realizar un scaffolding con <strong>Grails</strong></p>
<h3>¿Qué es Scaffolding?</h3>
<p style="text-align: justify;">El <a title="Scaffolding" href="http://en.wikipedia.org/wiki/Scaffold_%28programming%29" target="_blank">Scaffolding</a> es un término introducido por Rails y que está presente en otros frameworks como <strong>Grails</strong>, permite la generación automática de código para las cuatro operaciones básicas de cualquier aplicación que son la creación, lectura, edición y borrado, en inglés se conoce como <a title="CRUD" href="http://en.wikipedia.org/wiki/Create,_read,_update_and_delete" target="_blank">CRUD</a>. La idea es que partiendo del esquema de base de datos, generar el código necesario para implementar el CRUD. En <strong>Grails</strong> se consigue escribiendo muy pocas líneas de código.</p>
<p style="text-align: justify;">Grails permite dos tipos de <strong>scaffolding</strong>, dinámicos y estáticos. En el <strong>scaffolding</strong> dinámico el código se genera en tiempo de ejecución, de modo que  cualquier cambio en las clases de dominio genera un nuevo <strong>scaffolding</strong>,  el estático, genera código estático tanto de vistas como de controladores de forma que después podemos modificarlo como queramos.</p>
<p style="text-align: justify;">Para mi problema, con el <strong>scaffolding</strong> estático me salgo.</p>
<p style="text-align: justify;"><span id="more-3604"></span><span class="Apple-style-span" style="font-size: 15px; font-weight: bold;">Crear el proyecto Grails</span></p>
<p style="text-align: justify;">Para la creación del proyecto he utilizado el Netbeans, bien te descargas la versión del Netbeans que incluye <strong>Grails</strong> o bien lo instalas como un plugin desde el Netbeans. Al crear el proyecto veremos la siguiente estructura:</p>
<p style="text-align: justify;"><a href="http://anabuigues.com/wp-content/uploads/2011/08/estructura-proyecto-grails.png"><img class="aligncenter size-full wp-image-3613" title="estructura-proyecto-grails" src="http://anabuigues.com/wp-content/uploads/2011/08/estructura-proyecto-grails.png" alt="" width="288" height="344" /></a>Las partes que nos interesan son:</p>
<ul>
<li style="text-align: justify;">Configuration: entre otras cosas contiene los ficheros de configuración de la base de datos (DataSource.groovy). Por defecto viene configurado hsqldb. Si queremos otra base de datos hay que cambiar la configuración.</li>
<li style="text-align: justify;">Controllers: donde crearemos los controladores.</li>
<li style="text-align: justify;">Domain Classes: donde crearemos las clases de dominio.</li>
</ul>
<h3>Implementación del Scaffolding</h3>
<p>Primero he cambiado la configuración de la base de datos a Mysql:</p>
<pre class="brush: java; title: ; notranslate">
dataSource {
    pooled = true
    driverClassName = &quot;com.mysql.jdbc.Driver&quot;
    username = &quot;root&quot;
    password = &quot;&quot;
}
development {
        dataSource {
            dbCreate = &quot;update&quot; // one of 'create', 'create-drop','update'
            url = &quot;jdbc:mysql://localhost:3306/clm_web&quot;
        }
}
</pre>
<p>Creamos las clases de dominio que necesitemos, para ello, hacemos click derecho sobre Domain Classes -&gt; Nuevo -&gt; Grails Domain Class. Por defecto todas las propiedades en un objeto de dominio son obligatorias, y <strong>grails</strong> realiza una validación automática en el momento de guardar el objeto en base de datos. Para controlar la validación de las propiedades podemos definir restricciones mediante la palabra reservada constraints.</p>
<pre class="brush: java; title: ; notranslate">
class Category {
    static mapping = {
        table 'categories'
    }
    static constraints = {
        id(blank:false,nullable:false)
        seo_url(blank:false,nullable:false)
        title(blank:false,nullable:false)
        description(blank:false,nullable:false)
    }
    Integer id
    String seo_url
    String title
    String description
}
</pre>
<p>Para cada uno de los dominios creamos un controlador para los que se desee tener un scaffold, hacemos click derecho sobre Controllers -&gt; Nuevo -&gt; Grails Controller.</p>
<p>Modificamos el controlador de la siguiente forma:</p>
<pre class="brush: java; title: ; notranslate">
class CategoryController {
    static scaffold = true
}
</pre>
<p>Lanzamos las aplicación y en la página inicial podremos ver un enlace que nos lleva al CRUD del objeto de dominio que hemos creado. Si queremos cambiar el orden en que muestra los campos, es tan simple como cambiar el orden en el código del objeto y reiniciar.</p>
<p>Las vistas que ofrece son las siguientes:</p>
<ul>
<li>Listado</li>
</ul>
<p><a href="http://anabuigues.com/wp-content/uploads/2011/09/grails-scaffolding-listado.png"><img class="aligncenter size-full wp-image-3683" title="grails-scaffolding-listado" src="http://anabuigues.com/wp-content/uploads/2011/09/grails-scaffolding-listado.png" alt="" width="545" height="247" /></a></p>
<ul>
<li>Añadir un elemento nuevo</li>
</ul>
<p><a href="http://anabuigues.com/wp-content/uploads/2011/09/grails-scaffolding-nuevo.png"><img class="aligncenter size-full wp-image-3684" title="grails-scaffolding-nuevo" src="http://anabuigues.com/wp-content/uploads/2011/09/grails-scaffolding-nuevo.png" alt="" width="267" height="338" /></a></p>
<ul>
<li>Modificar o borrar elementos ya creados</li>
</ul>
<p><a href="http://anabuigues.com/wp-content/uploads/2011/09/grails-scaffolding-editar-borrar.png"><img class="aligncenter size-full wp-image-3685" title="grails-scaffolding-editar-borrar" src="http://anabuigues.com/wp-content/uploads/2011/09/grails-scaffolding-editar-borrar.png" alt="" width="399" height="310" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://anabuigues.com/2011/09/12/implementacion-de-un-scaffolding-con-grails/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Apache Barcamp Spain 2011, ¿te lo vas a perder?</title>
		<link>http://anabuigues.com/2011/09/03/apache-barcamp-spain-2011-%c2%bfte-lo-vas-a-perder/</link>
		<comments>http://anabuigues.com/2011/09/03/apache-barcamp-spain-2011-%c2%bfte-lo-vas-a-perder/#comments</comments>
		<pubDate>Sat, 03 Sep 2011 18:58:28 +0000</pubDate>
		<dc:creator>Ana Buigues</dc:creator>
				<category><![CDATA[Eventos]]></category>
		<category><![CDATA[barcamp]]></category>
		<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[eventos]]></category>
		<guid isPermaLink="false">http://anabuigues.com/?p=3626</guid>
		<description><![CDATA[Por si alguien no se ha enterado todavía, el 8 de octubre de 2011, se celebrará en Sevilla la Apache Barcamp Spain. Un evento creado por desarrolladores para desarrolladores, en formato Open Space y por si fuese poco, gratuito. Cualquiera puede proponer su charla y entre todos los asistentes votaran las que crean más interesantes para componer el panel final de [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Por si alguien no se ha enterado todavía, el 8 de octubre de 2011, se celebrará en Sevilla la <strong><a title="Apache Barcamp Spain 2011" href="http://barcampspain.com/" target="_blank">Apache Barcamp Spain</a></strong>. Un evento creado por <strong>desarrolladores</strong> <strong>para</strong> <strong>desarrolladores</strong>, en formato <a title="Open Space Tecnology" href="http://en.wikipedia.org/wiki/Open_Space_Technology" target="_blank">Open Space</a> y por si fuese poco, gratuito.</p>
<p style="text-align: justify;"><a href="http://anabuigues.com/wp-content/uploads/2011/09/apachebarcampspain.png"><img class="aligncenter size-full wp-image-3635" title="apachebarcampspain" src="http://anabuigues.com/wp-content/uploads/2011/09/apachebarcampspain.png" alt="" width="609" height="241" /></a></p>
<p style="text-align: justify;"><span id="more-3626"></span></p>
<p style="text-align: justify;">Cualquiera puede proponer su charla y entre todos los asistentes votaran las que crean más interesantes para componer el panel final de sesiones, y no solamente se limita a frameworks, tecnologías y productos de Apache, se espera que haya talleres introductorios y especializados de todo tipo de lenguajes como: <strong>Ruby, .NET, Python, Java, Scala, Groovy, Lisp JavaScript o HTML5, </strong> soluciones prácticas y debates teóricos sobre <strong>escalabilidad</strong> y <strong>concurrencia, </strong>esto promete!</p>
<p style="text-align: justify;">La idea del evento es compartir con otros, aprender de otros y divertirte con todos! así que no te lo puedes perder.</p>
<p style="text-align: justify;">Además <a title="Atlassian" href="http://www.atlassian.com/es_ES/" target="_blank">Atlassian</a> patrocinará la<strong> fiesta de despedida</strong>, invitando a todos los asistentes al acabar con un cargamento de cerveza y tapas gratis después del largo día de sesiones.</p>
<p style="text-align: justify;">Podéis seguir el evento desde  la página web,  la <a title="Twitter de la Barcampes" href="http://twitter.com/#!/barcampes" target="_blank">cuenta de twitter</a>, la <a title="Newsletter de la Apache Barcamp Spain" href="http://eepurl.com/eusiI" target="_blank">lista de correo</a> y hasta tiene su  propio <a title="Lanyrd Apache Barcamp Spain" href="http://lanyrd.com/2011/apache-barcamp-sevilla/" target="_blank">lanyrd</a>. También podéis ayudar a su difusión sumandoos a la campaña de <a title="Yo también voy" href="http://barcampspain.com/2011/08/yo-tambien-voy/" target="_blank">¡Yo también voy!</a></p>
]]></content:encoded>
			<wfw:commentRss>http://anabuigues.com/2011/09/03/apache-barcamp-spain-2011-%c2%bfte-lo-vas-a-perder/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Code Kata &#8211; FizzBuzz</title>
		<link>http://anabuigues.com/2011/03/31/code-kata-fizzbuzz/</link>
		<comments>http://anabuigues.com/2011/03/31/code-kata-fizzbuzz/#comments</comments>
		<pubDate>Thu, 31 Mar 2011 16:41:59 +0000</pubDate>
		<dc:creator>Ana Buigues</dc:creator>
				<category><![CDATA[Code Kata]]></category>
		<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[12meses12katas]]></category>
		<category><![CDATA[Jasmine]]></category>
		<guid isPermaLink="false">http://anabuigues.com/?p=3437</guid>
		<description><![CDATA[Siguiendo con la iniciativa de 12meses12katas paso a contaros el desafío de este mes, en si el problema es muy muy sencillo, la idea es la siguiente:  para el intervalo de números entre 1 y 100, si uno de ellos resulta múltiplo de 3 o contiene un 3, el resultado debe ser la palabra “Fizz”, [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Siguiendo con la iniciativa de <a href="http://12meses12katas.com/" target="_blank">12meses12katas</a> paso a contaros el desafío de este mes, en si el problema es muy muy sencillo, la idea es la siguiente:  para el intervalo de números entre 1 y 100, si uno de ellos resulta múltiplo de 3 o contiene un 3, el resultado debe ser la palabra “Fizz”, si el número es múltiplo de 5 o contiene un 5, el resultado debe ser la palabra “Buzz”, si el número es múltiplo tanto de 3 como de 5, el resultado debe ser “FizzBuzz”. ¿Sencillo verdad?</p>
<p style="text-align: justify;">Bueno, nos ponemos a ello, este mes he decidio realizarla en <strong>Javascript</strong>, ya que nunca he realizado <strong>TDD</strong> sobre <strong>Javascript</strong> y tenía mucha curiosidad. Así que lo primero fué investigar que frameworks hay disponibles y para mi asombro he visto que hay muchos! como por ejemplo QUnit, jqUnit, JsUnit, YUI Test, JSTestDriver, Jspec, Inspect, <strong>Jasmine</strong> etc&#8230; yo me he decantado por <strong><a href="https://github.com/pivotal/jasmine" target="_blank">Jasmine</a></strong>, ya que es muy sencillito de utilizar, su sintaxis es muy clara y apenas requiere configuración. Además tiene una interfaz para mostrar el resultado de los test, la podeís ver al final del post.</p>
<p style="text-align: justify;"><span id="more-3437"></span>Como siempre recomendaros que os paséis por <a href="https://github.com/12meses12katas/Marzo-FizzBuzz" target="_blank">github del proyecto</a> para ver las distintas soluciones que están aportando a la iniciativa.</p>
<p style="text-align: justify;">A continuación os dejo el código de la <strong>kata<br />
</strong></p>
<pre class="brush: jscript; title: ; notranslate">
function FizzBuzz() {
};
FizzBuzz.prototype.fizz = &quot;Fizz&quot;;
FizzBuzz.prototype.buzz = &quot;Buzz&quot;;
FizzBuzz.prototype.say = function(number) {
 var result = &quot;&quot;;
 if (this.isMultipleOfThree(number) || this.containsTree(number))
 result += this.fizz;
 if (this.isMultipleOfFive(number) || this.containsFive(number))
 result += this.buzz;
 if (result.length == 0)
 result += number;
 return result;
};
FizzBuzz.prototype.isMultipleOfThree = function(number) {
 return number % 3 === 0;
};
FizzBuzz.prototype.isMultipleOfFive = function(number) {
 return number % 5 === 0;
};
FizzBuzz.prototype.containsTree = function(number) {
 return number.toString().indexOf('3') != -1;
};
FizzBuzz.prototype.containsFive = function(number) {
 return number.toString().indexOf('5') != -1;
};
</pre>
<p>Los tests realizados con <strong>Jasmine</strong></p>
<pre class="brush: jscript; title: ; notranslate">
describe(&quot;FizzBuzz&quot;, function() {
 var fizzBuzz;
 beforeEach(function() {
 fizzBuzz = new FizzBuzz();
 });
 it('should return number', function() {
 expect(fizzBuzz.say(2)).toEqual('2');
 expect(fizzBuzz.say(4)).toEqual('4');
 expect(fizzBuzz.say(7)).toEqual('7');
 expect(fizzBuzz.say(19)).toEqual('19');
 });
 it('should return Fizz', function() {
 expect(fizzBuzz.say(3)).toEqual('Fizz');
 expect(fizzBuzz.say(13)).toEqual('Fizz');
 expect(fizzBuzz.say(18)).toEqual('Fizz');
 expect(fizzBuzz.say(96)).toEqual('Fizz');
 });
 it('should return Buzz', function() {
 expect(fizzBuzz.say(5)).toEqual('Buzz');
 expect(fizzBuzz.say(20)).toEqual('Buzz');
 expect(fizzBuzz.say(95)).toEqual('Buzz');
 expect(fizzBuzz.say(100)).toEqual('Buzz');
 });
 it('should return FizzBuzz', function() {
 expect(fizzBuzz.say(15)).toEqual('FizzBuzz');
 expect(fizzBuzz.say(35)).toEqual('FizzBuzz');
 expect(fizzBuzz.say(54)).toEqual('FizzBuzz');
 expect(fizzBuzz.say(75)).toEqual('FizzBuzz');
 expect(fizzBuzz.say(90)).toEqual('FizzBuzz');
 });
});
</pre>
<p>Aquí os muestro la interfaz que nos ofrece <strong>Jasmine</strong> para ver el resultado del los test:</p>
<p><a href="http://anabuigues.com/wp-content/uploads/2011/03/jasmine-test-javascript.png"><img class="size-full wp-image-3455 aligncenter" title="jasmine-test-javascript" src="http://anabuigues.com/wp-content/uploads/2011/03/jasmine-test-javascript.png" alt="" width="620" height="227" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://anabuigues.com/2011/03/31/code-kata-fizzbuzz/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Un colacao muy social</title>
		<link>http://anabuigues.com/2011/03/07/un-colacao-muy-social/</link>
		<comments>http://anabuigues.com/2011/03/07/un-colacao-muy-social/#comments</comments>
		<pubDate>Mon, 07 Mar 2011 18:21:16 +0000</pubDate>
		<dc:creator>Ana Buigues</dc:creator>
				<category><![CDATA[Geek]]></category>
		<category><![CDATA[taza twitter]]></category>
		<category><![CDATA[Twitter]]></category>
		<guid isPermaLink="false">http://anabuigues.com/?p=3417</guid>
		<description><![CDATA[Llevaba cierto tiempo queriendo comprar una taza para el colacao mañanero (no soy de café, ¿qué le vamos a hacer?). El problema es que quería una taza diferente, personal, algo geek y muy muy molona por lo que aunque había encontrado muchas opciones en la red ninguna terminaba de convencerme hasta que encontré avatarmugs, donde [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Llevaba cierto tiempo queriendo comprar una <strong>taza</strong> para el colacao mañanero (no soy de café, ¿qué le vamos a hacer?). El problema es que quería una <strong>taza</strong> diferente, personal, algo <strong>geek</strong> y muy muy molona por lo que aunque había encontrado muchas opciones en la red ninguna terminaba de convencerme hasta que encontré <a title="AvatarMugs" href="http://www.avatarmugs.com/" target="_blank">avatarmugs</a>, donde resulta que además de otros muchos tipos de <strong>tazas</strong>, pueden hacerte una personalizada con tu perfil de tu red favorita (facebook, twitter&#8230;).</p>
<p style="text-align: justify;">En ese momento lo vi&#8230; mi perfil de <strong>twitter en mi taza</strong>&#8230; ya podía notar el calorcito de la leche en mis manos. Así que me puse manos a la obra, contacté con ellos porque tenía algunas dudas y resulta que son una empresa de valencia y además muy majos, me respondieron muy rápido y encargué mi <strong>taza</strong>. En un par de días la tenía en casa.</p>
<p style="text-align: justify;">Al día siguiente la llevé al curro y conseguí que la <strong>taza</strong> fuese el trendin topic del día&#8230; de hecho creo que alguno ya está pensando en hacerse la suya y puede que tu también ehhhh.</p>
<p style="text-align: justify;"><span id="more-3417"></span>Bueno ya solo queda enseñaros mi <strong>taza</strong>. Espero que os guste&#8230; y si os hacéis alguna parecida avisadme que quiero verlo!!!!!!</p>
<p><a href="http://anabuigues.com/wp-content/uploads/2011/03/taza_twiiter_avatarmugs1.jpg"><img class="size-full wp-image-3426 aligncenter" title="taza_twiiter_avatarmugs1" src="http://anabuigues.com/wp-content/uploads/2011/03/taza_twiiter_avatarmugs1.jpg" alt="" width="375" height="500" /></a></p>
<p><a href="http://anabuigues.com/wp-content/uploads/2011/03/taza_twiiter_avatarmugs2.jpg"><img class="size-full wp-image-3427 aligncenter" title="taza_twiiter_avatarmugs2" src="http://anabuigues.com/wp-content/uploads/2011/03/taza_twiiter_avatarmugs2.jpg" alt="" width="375" height="500" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://anabuigues.com/2011/03/07/un-colacao-muy-social/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Code Kata &#8211; RomanNumerals</title>
		<link>http://anabuigues.com/2011/02/15/code-kata-febrero-romannumerals/</link>
		<comments>http://anabuigues.com/2011/02/15/code-kata-febrero-romannumerals/#comments</comments>
		<pubDate>Tue, 15 Feb 2011 21:49:25 +0000</pubDate>
		<dc:creator>Ana Buigues</dc:creator>
				<category><![CDATA[Code Kata]]></category>
		<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[12meses12katas]]></category>
		<guid isPermaLink="false">http://anabuigues.com/?p=3391</guid>
		<description><![CDATA[Siguiendo con la iniciativa lanzada por 12meses12katas en la que ya participé el mes pasado realizando mi primera code kata, este mes sigo experimentando en el mundo de las katas. Recomiendo a todo programador, que si tiene un poco de tiempo (las katas se realizan en un tiempo máximo de 2 horas) que prueben la [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><a href="http://anabuigues.com/wp-content/uploads/2011/02/romannumerals.jpg"><img class="alignleft size-full wp-image-3392" title="romannumerals" src="http://anabuigues.com/wp-content/uploads/2011/02/romannumerals.jpg" alt="" width="256" height="159" /></a>Siguiendo con la iniciativa lanzada por <a href="http://12meses12katas.com/" target="_blank">12meses12katas</a> en la que ya participé el mes pasado realizando <a href="http://anabuigues.com/2011/02/01/mi-primera-code-kata/" target="_blank">mi primera code kata</a>, este mes sigo experimentando en el mundo de las <strong>katas</strong>. Recomiendo a todo programador, que si tiene un poco de tiempo (las <strong>katas</strong> se realizan en un tiempo máximo de 2 horas) que prueben la experiencia, ya que estos ejercicios te permiten mejorar la técnica de desarrollo, aplicando <strong>TDD</strong>, que implica escribir los tests primero, provocar un fallo, implementar la corrección del fallo y refactorizar.</p>
<p style="text-align: justify;">La <strong>kata</strong> de este mes trata de resolver el problema de las conversiones entre números enteros y romanos.  Para hacer que la <strong>kata</strong> sea un reto mayor, he decido resolverla en <strong>Python</strong> que representa un poco más de dificultad que si la realizase en Java, ya que estoy más acostumbrada a programar en Java, En <strong>Python</strong> soy una principiante,  por lo que seguramente el código escrito para solucionar la <strong>kata</strong> se podría mejorar, así que sí veís algún fallo no dudeís en comentarlo!</p>
<p style="text-align: justify;"><span id="more-3391"></span>Podeís ver las distintas soluciones que estan aportando a la iniciativa desde el <a href="https://github.com/12meses12katas/Febrero-Roman-Numerals" target="_blank">github del proyecto</a>. Os aconsejo que os paseís por ahi para ver la multitud de soluciones que se pueden dar a un mismo problema y la diversidad de lenguajes de programación con la que se resuelven.</p>
<p style="text-align: justify;">A continuación os dejo el código de la <strong>kata</strong></p>
<pre class="brush: python; title: ; notranslate">
class RomanNumerals(object):
    def __init__(self):
        #inicializaciones para la conversión de entero a romano
        self.values =[ 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 ]
        self.symbols =[ &quot;M&quot;, &quot;CM&quot;, &quot;D&quot;, &quot;CD&quot;, &quot;C&quot;, &quot;XC&quot;, &quot;L&quot;, &quot;XL&quot;, &quot;X&quot;, &quot;IX&quot;, &quot;V&quot;, &quot;IV&quot;, &quot;I&quot; ]
        #inicializaciones para la conversión de romano a entero
        self.value =[ 1000, 500, 100, 50, 10, 5, 1 ]
        self.symbol = &quot;MDCLXVI&quot;;
    def intToRoman(self, num):
        '''
            Realiza la conversión de un número entero a romano.
        '''
        output = &quot;&quot;
        index = 0
        #finalizamos cuando el número es 0
        while num &gt; 0:
            while num &gt;= self.values[index]:
                #añadimos el símbolo a la solución
                output = output + self.symbols[index]
                #restamos el valor númerico
                num = num - self.values[index]
            index = index + 1
        return output
    def romanToInt(self, num):
        '''
            Realiza la conversión de un número romano a entero
        '''
        indexSymbol = 0
        output = 0
        index = 0
        valid = True
        lastValue = 0
        while valid and index &lt; len(num):
            #obtenemos el símbolo
            car = num[index]
            #obtenemos el índice del símbolo
            indexSymbol = self.symbol.index(car)
            if(indexSymbol &gt;= 0):
                #sumamos su valor correspondiente
                output = output + self.value[indexSymbol]
                # si el valor es mayor que el último valor, tenemos que restar el último valor sumado
                if self.value[indexSymbol] &gt; lastValue:
                    output = output - 2 * lastValue
                lastValue = self.value[indexSymbol]
            else:
                valid = False
            index = index + 1
        return output
</pre>
<p>Con su correspondiente test</p>
<pre class="brush: python; title: ; notranslate">
import unittest
from RomanNumerals import RomanNumerals
class Test(unittest.TestCase):
    def setUp(self):
        self.roman = RomanNumerals()
    def testSimple(self):
        self.checkConversion(1,&quot;I&quot;)
        self.checkConversion(4,&quot;IV&quot;)
        self.checkConversion(5,&quot;V&quot;)
        self.checkConversion(9,&quot;IX&quot;)
        self.checkConversion(10,&quot;X&quot;)
        self.checkConversion(40,&quot;XL&quot;)
        self.checkConversion(50,&quot;L&quot;)
        self.checkConversion(90,&quot;XC&quot;)
        self.checkConversion(100,&quot;C&quot;)
        self.checkConversion(400,&quot;CD&quot;)
        self.checkConversion(500,&quot;D&quot;)
        self.checkConversion(900,&quot;CM&quot;)
        self.checkConversion(1000,&quot;M&quot;)
    def testTens(self):
        self.checkConversion(11,&quot;XI&quot;)
        self.checkConversion(12,&quot;XII&quot;)
        self.checkConversion(13,&quot;XIII&quot;)
        self.checkConversion(14,&quot;XIV&quot;)
        self.checkConversion(19,&quot;XIX&quot;)
        self.checkConversion(20,&quot;XX&quot;)
        self.checkConversion(24,&quot;XXIV&quot;)
        self.checkConversion(31,&quot;XXXI&quot;)
        self.checkConversion(38,&quot;XXXVIII&quot;)
        self.checkConversion(45,&quot;XLV&quot;)
        self.checkConversion(71,&quot;LXXI&quot;)
        self.checkConversion(87,&quot;LXXXVII&quot;)
        self.checkConversion(99,&quot;XCIX&quot;)
    def testHundreds(self):
        self.checkConversion(109,&quot;CIX&quot;)
        self.checkConversion(203,&quot;CCIII&quot;)
        self.checkConversion(303,&quot;CCCIII&quot;)
        self.checkConversion(304,&quot;CCCIV&quot;)
        self.checkConversion(450,&quot;CDL&quot;)
        self.checkConversion(546,&quot;DXLVI&quot;)
        self.checkConversion(671,&quot;DCLXXI&quot;)
        self.checkConversion(788,&quot;DCCLXXXVIII&quot;)
        self.checkConversion(888,&quot;DCCCLXXXVIII&quot;)
        self.checkConversion(999,&quot;CMXCIX&quot;)
    def testThousands(self):
        self.checkConversion(1010,&quot;MX&quot;)
        self.checkConversion(1111,&quot;MCXI&quot;)
        self.checkConversion(1234,&quot;MCCXXXIV&quot;)
        self.checkConversion(2342,&quot;MMCCCXLII&quot;)
        self.checkConversion(2999,&quot;MMCMXCIX&quot;)
    def checkConversion(self,numeral, roman):
        self.assertEquals(roman, self.roman.intToRoman(numeral))
        self.assertEquals(numeral, self.roman.romanToInt(roman))
if __name__ == &quot;__main__&quot;:
    unittest.main()
</pre>
<p style="text-align: justify;">
]]></content:encoded>
			<wfw:commentRss>http://anabuigues.com/2011/02/15/code-kata-febrero-romannumerals/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Cómo configurar Hibernate sin ningún xml</title>
		<link>http://anabuigues.com/2011/02/07/como-configurar-hibernate-sin-ningun-xml/</link>
		<comments>http://anabuigues.com/2011/02/07/como-configurar-hibernate-sin-ningun-xml/#comments</comments>
		<pubDate>Mon, 07 Feb 2011 17:56:12 +0000</pubDate>
		<dc:creator>Ana Buigues</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[JPA]]></category>
		<guid isPermaLink="false">http://anabuigues.com/?p=3359</guid>
		<description><![CDATA[Realizar la configuración de Hibernate con ficheros xml puede llegar a ser bastante engorroso, especialmente en aplicaciones muy grandes. Afortunadamente podemos inicializar la unidad de persistencia de forma programática y realizar los mapeos de las entidades mediante anotaciones, de esta forma conseguimos no tener que utilizar ningún fichero xml para la configuración. A continuación un [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Realizar la configuración de <strong>Hibernate</strong> con ficheros xml puede llegar a ser bastante engorroso, especialmente en aplicaciones muy grandes. Afortunadamente podemos <strong>inicializar la unidad de persistencia de forma programática </strong>y realizar los mapeos de las entidades mediante anotaciones, de esta forma conseguimos no tener que utilizar ningún fichero xml para la configuración.</p>
<p style="text-align: justify;">A continuación un ejemplo de cómo hacerlo.</p>
<p style="text-align: justify;"><span id="more-3359"></span></p>
<h2 style="text-align: justify;">Creación de la unidad de persistencia:</h2>
<pre class="brush: java; title: ; notranslate">
public class PersistenceUnitStarter {
	//Añadimos las propiedades que queramos a la unidad de persistencia
	private static Properties getProperties() {
		Properties properties = new Properties();
		properties.setProperty(Environment.DRIVER, &quot;org.h2.Driver&quot;);
		properties.setProperty(Environment.URL,
				&quot;jdbc:h2:db;LOG=0;CACHE_SIZE=65536;LOCK_MODE=0;UNDO_LOG=0&quot;);
		properties.setProperty(Environment.USER, &quot;&quot;);
		properties.setProperty(Environment.PASS, &quot;&quot;);
		properties.put(Environment.SHOW_SQL, &quot;true&quot;);
		properties.put(Environment.FORMAT_SQL, &quot;true&quot;);
		properties.put(Environment.FLUSH_BEFORE_COMPLETION, &quot;false&quot;);
		properties.put(Environment.TRANSACTION_STRATEGY,
				PersistenceUnitTransactionType.RESOURCE_LOCAL);
		properties.put(Environment.HBM2DDL_AUTO, &quot;create&quot;);
		return properties;
	}
        //Le pasamos una lista con las clases que queremos añadir a la entidad de persistencia
        //Las clases tienen que estar definidas con anotaciones
	public static EntityManagerFactory createPersistenceUnit(List&lt;Class&gt; entities) {
		Ejb3Configuration conf = new Ejb3Configuration();
		conf.addProperties(getProperties());
		//añadimos los entities declarados con anotaciones
		for (Class clazz : entities) {
			conf.addAnnotatedClass(clazz);
		}
		return conf.buildEntityManagerFactory();
	}
}
</pre>
<h2>Creamos las entidades mediante anotaciones</h2>
<pre class="brush: java; title: ; notranslate">
@Entity
public class Persona {
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private int id;
	@Column(nullable = false)
	private String nombre;
	@Column(nullable = false)
	private String apellido;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getNombre() {
		return nombre;
	}
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	public String getApellido() {
		return apellido;
	}
	public void setApellido(String apellido) {
		this.apellido = apellido;
	}
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://anabuigues.com/2011/02/07/como-configurar-hibernate-sin-ningun-xml/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Mi primera Code Kata</title>
		<link>http://anabuigues.com/2011/02/01/mi-primera-code-kata/</link>
		<comments>http://anabuigues.com/2011/02/01/mi-primera-code-kata/#comments</comments>
		<pubDate>Tue, 01 Feb 2011 17:40:00 +0000</pubDate>
		<dc:creator>Ana Buigues</dc:creator>
				<category><![CDATA[Code Kata]]></category>
		<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[12meses12katas]]></category>
		<guid isPermaLink="false">http://anabuigues.com/?p=3344</guid>
		<description><![CDATA[Ayer hice junto a Héctor Rodes mi primera Code Kata, gracias a la iniciativa de 12meses12katas, donde cada mes se propone una nueva kata. Abierta a todo el mundo y a todos los lenguajes de programación, excelente para poder practicar y aprender. Y&#8230;¿qué es una Code Kata? pues una Code Kata hace referencia a un ejercicio de programación en [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><a href="http://anabuigues.com/wp-content/uploads/2011/02/code_kata.png"><img class="alignleft size-full wp-image-3355" title="code_kata" src="http://anabuigues.com/wp-content/uploads/2011/02/code_kata.png" alt="" width="151" height="202" /></a>Ayer hice junto a <a href="http://hectorrodes.com" target="_blank">Héctor Rodes</a> mi primera <strong>Code Kata</strong>, gracias a la iniciativa de <a href="http://12meses12katas.com/" target="_blank">12meses12katas</a>, donde cada mes se propone una nueva <strong>kata</strong>. Abierta a todo el mundo y a todos los lenguajes de programación, excelente para poder practicar y aprender.</p>
<p style="text-align: justify;">Y&#8230;¿qué es una <strong>Code Kata</strong>? pues una <a href="http://en.wikipedia.org/wiki/Kata_(programming)" target="_blank">Code Kata</a> hace referencia a un ejercicio de programación en el cual se resuelve un problema más o menos complejo donde el objetivo es mejorar las cualidades de un programador mediante la práctica y resolución repetitiva de problemas.</p>
<p style="text-align: justify;">Lo que obtenemos de todo esto es obligarnos a encontrar una solución a un problema y además nos permite contrastar nuestra solución con la de otras personas, de esta forma podemos descubrir nuevas formas de resolver el mismo problema, y si la <a href="http://en.wikipedia.org/wiki/Pair_programming" target="_blank">programas en parejas</a> es todavía más divertido.</p>
<p style="text-align: justify;"><span id="more-3344"></span></p>
<p style="text-align: justify;">Para Enero el ejercicio de la <strong>Code Kata </strong>era el<strong> String Calculator</strong>, la idea es hacer un programa que sume  los números de una cadena separados por diferentes delimitadores, por ejemplo: &#8220;8*5%3&#8243; . Si queréis ver el código de la gente que ha realizado la <strong>Code Kata</strong> podéis visitar el <a href="https://github.com/12meses12katas/Enero-String-Calculator" target="_blank">github del proyecto</a>. El nuestro está en el directorio de animalaes.</p>
<h3 style="text-align: justify;">Nuestra solución</h3>
<p style="text-align: justify;">La hemos realizado en Java, con la ayuda de la clase Scanner de Java para parsear la cadena mediante expresiones regulares. Se admiten sugerencias sobre mejoras o lo que sea.</p>
<pre class="brush: java; title: ; notranslate">
package com.anabuigues;
import java.io.ByteArrayInputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.regex.Pattern;
/**
 * Implementación sencilla de la calculadora para la kata de enero.&lt;br /&gt;
 * &lt;br /&gt;
 * La implementación está realizada usando java 6 estándar apoyándose en la
 * clase Scanner que permite trocear al vuelo un imput a partir de un o n
 * delimitadores. Para ello extrae los delimitadores y construye una expresión
 * reguar válida para el scanner al que se le solicitan los diferentes enteros
 * para ir sumándolos.
 *
 *
 * @author A. Buigues (@animalaes), H. Rodes (@hector_rodes)
 *
 */
public class StringCalculator {
	public int add(String numbers) throws Exception {
		int returnValue;
		if (numbers == null || numbers.isEmpty()) {
			returnValue = 0;
		} else {
			ByteArrayInputStream bais = new ByteArrayInputStream(
					numbers.getBytes());
			Scanner sc = new Scanner(bais);
			String delimiters = null;
			// Delimiters
			if (numbers.startsWith(&quot;//&quot;)) {
				sc.useDelimiter(&quot;//|\n&quot;);
				if (sc.hasNext()) {
					delimiters = sc.next();
				}
			}
			delimiters = getScannerFormattedDelimiters(delimiters);
			// Process number lines with numbers to be added
			sc.useDelimiter(delimiters);
			int sum = 0;
			int currentNumber;
			List&lt;Integer&gt; negativeValues = new ArrayList&lt;Integer&gt;();
			while (sc.hasNext()) {
				currentNumber = sc.nextInt();
				if (currentNumber &lt; 0) {
					negativeValues.add(currentNumber);
				} else if (currentNumber &lt;= 1000) {
					sum += currentNumber;
				}
			}
			checkNegativeValues(negativeValues);
			returnValue = sum;
		}
		return returnValue;
	}
	/**
	 * Método auxiliar que comprueba si hay números negativos y forma el mensaje
	 *
	 * @param negativeValues
	 *            Lista de números negativos
	 * @throws Exception
	 *             Si la lista de números negativos contiene algún número
	 */
	private void checkNegativeValues(List&lt;Integer&gt; negativeValues)
			throws Exception {
		if (negativeValues != null &amp;&amp; negativeValues.size() &gt; 0) {
			StringBuilder sb = new StringBuilder(&quot;negatives not allowed&quot;);
			for (int negative : negativeValues) {
				sb.append(&quot; &quot;).append(negative);
			}
			throw new Exception(sb.toString());
		}
	}
	/**
	 * Genera la cadena de delimitadores necesaria para ser usada en el scanner
	 * y así poder procesar los números.&lt;br /&gt;
	 * Siempre introduce el \n como un delimitador válido.&lt;br /&gt;
	 * En caso de que los delimiters sean vacÌos o nulos usa la , y el \n como
	 * delimitadores por defecto
	 *
	 * @param delimiters
	 *            Los delimitadores introducidos
	 * @return Cadena con los delimitadores en el formato que espera el Scanner
	 */
	private String getScannerFormattedDelimiters(String delimiters) {
		String delimitersExpression;
		if (delimiters == null || delimiters.isEmpty()) {
			delimitersExpression = &quot;,|\n&quot;;
		} else {
			String currentDelimiter;
			StringBuilder sb = new StringBuilder();
			Scanner scDelimiters = new Scanner(delimiters).useDelimiter(Pattern
					.quote(&quot;]&quot;) + &quot;|&quot; + Pattern.quote(&quot;[&quot;));
			while (scDelimiters.hasNext()) {
				currentDelimiter = scDelimiters.next();
				if (!currentDelimiter.isEmpty()) {
					sb.append(Pattern.quote(currentDelimiter)).append(&quot;|&quot;);
				}
			}
			sb.append(&quot;\n&quot;);
			delimitersExpression = sb.toString();
		}
		return delimitersExpression;
	}
}
</pre>
<p>Y su test</p>
<pre class="brush: java; title: ; notranslate">
package com.anabuigues;
import junit.framework.Assert;
import org.junit.Test;
/**
 *
 * @author A. Buigues (@animalaes), H. Rodes (@hector_rodes)
 *
 */
public class CalculatorTest {
	private StringCalculator calculator = new StringCalculator();
	@Test
	public void basicCalculator() throws Exception {
		Assert.assertEquals(0, calculator.add(&quot;&quot;));
		Assert.assertEquals(1, calculator.add(&quot;1&quot;));
		Assert.assertEquals(10, calculator.add(&quot;7,3&quot;));
		Assert.assertEquals(10, calculator.add(&quot;7\n2,1&quot;));
		Assert.assertEquals(27, calculator.add(&quot;5\n5\n8,2,4\n2,1&quot;));
	}
	@Test
	public void simpleDelimiterCalculator() throws Exception {
		Assert.assertEquals(16, calculator.add(&quot;//[*]\n5*5*6&quot;));
		Assert.assertEquals(20, calculator.add(&quot;//[*]\n5*5*6\n4&quot;));
		Assert.assertEquals(20, calculator.add(&quot;//[*][;][,]\n5,5;6\n4&quot;));
		Assert.assertEquals(20,
				calculator.add(&quot;//[*][;][pollofrito]\n5pollofrito5;6\n4&quot;));
	}
	@Test
	public void bigNumbersCalculator() throws Exception {
		Assert.assertEquals(1005, calculator.add(&quot;//[*]\n5*1000*1001&quot;));
	}
	@Test
	public void negativeNumbersCalculator() throws Exception {
		try {
			Assert.assertEquals(1005, calculator.add(&quot;//[*]\n5*-23*45*-34&quot;));
		} catch (Exception e) {
			Assert.assertTrue(&quot;-23 must be in error message &quot;, e.getMessage()
					.indexOf(&quot;-23&quot;) != -1);
			Assert.assertTrue(&quot;-34 must be in error message &quot;, e.getMessage()
					.indexOf(&quot;-34&quot;) != -1);
		}
	}
	@Test
	public void notDefinedDelimiterCalculator() throws Exception {
		try {
			Assert.assertEquals(8, calculator.add(&quot;//[*]\n5;3&quot;));
			Assert.fail(&quot;Delimiter ; is not allowed but it has been used&quot;);
		} catch (Exception e) {
		}
	}
}
</pre>
<p style="text-align: justify;">Ahora toca ponerse con la de febrero!!</p>
<p style="text-align: justify;">
]]></content:encoded>
			<wfw:commentRss>http://anabuigues.com/2011/02/01/mi-primera-code-kata/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Feliz Navidad y Próspero Año Nuevo 2011</title>
		<link>http://anabuigues.com/2010/12/25/feliz-navidad-y-prospero-ano-nuevo-2011/</link>
		<comments>http://anabuigues.com/2010/12/25/feliz-navidad-y-prospero-ano-nuevo-2011/#comments</comments>
		<pubDate>Sat, 25 Dec 2010 18:45:05 +0000</pubDate>
		<dc:creator>Ana Buigues</dc:creator>
				<category><![CDATA[Personal]]></category>
		<guid isPermaLink="false">http://anabuigues.com/?p=3313</guid>
		<description><![CDATA[Espero que paséis una Feliz Navidad y desearos lo mejor para el año 2011, que el nuevo año sea mucho mejor que el pasado y que todos los deseos se cumplan.]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Espero que paséis una Feliz Navidad y desearos lo mejor para el año 2011, que el nuevo año sea mucho mejor que el pasado y que todos los deseos se cumplan.</p>
<p style="text-align: center;"><a href="http://anabuigues.com/wp-content/uploads/2010/12/Feliz-Navidad-Año-nuevo-2011.jpg"><img class="size-full wp-image-3314 aligncenter" title="Feliz-Navidad-Año-nuevo-2011" src="http://anabuigues.com/wp-content/uploads/2010/12/Feliz-Navidad-Año-nuevo-2011.jpg" alt="" width="595" height="694" /></a></p>
<p style="text-align: center;">
]]></content:encoded>
			<wfw:commentRss>http://anabuigues.com/2010/12/25/feliz-navidad-y-prospero-ano-nuevo-2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Big Bang Theory, la mejor serie de humor que he visto</title>
		<link>http://anabuigues.com/2010/11/07/the-big-bang-theory-la-mejor-serie-de-humor-que-he-visto/</link>
		<comments>http://anabuigues.com/2010/11/07/the-big-bang-theory-la-mejor-serie-de-humor-que-he-visto/#comments</comments>
		<pubDate>Sun, 07 Nov 2010 13:27:06 +0000</pubDate>
		<dc:creator>Ana Buigues</dc:creator>
				<category><![CDATA[Series]]></category>
		<category><![CDATA[The Big Bang Theory]]></category>
		<guid isPermaLink="false">http://anabuigues.com/?p=3174</guid>
		<description><![CDATA[Cuando vi el primer capítulo de la serie me dije&#8230; ufff, creo que es demasiado friki incluso para mi, aún así, continué viéndola ya que por lo que había leído de la serie la ponían como muy buena. Después de unos cuantos capítulos ya no podía parar!!! The Big Bang Theory narra la vida de [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><!-- @font-face {   font-family: "Times"; }@font-face {   font-family: "ＭＳ 明朝"; }@font-face {   font-family: "ＭＳ 明朝"; }@font-face {   font-family: "Cambria"; }p.MsoNormal, li.MsoNormal, div.MsoNormal { margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: Cambria; }p { margin-right: 0cm; margin-left: 0cm; font-size: 10pt; font-family: Times; }.MsoChpDefault { font-family: Cambria; }div.WordSection1 { page: WordSection1; } --><img class="alignleft size-full wp-image-3190" src="http://anabuigues.com/wp-content/uploads/2010/11/the-big-bang-theory.jpg" alt="" width="279" height="378" />Cuando vi el primer capítulo de la serie me dije&#8230; ufff, creo que es demasiado friki incluso para mi, aún así, continué viéndola ya que por lo que había leído de la serie la ponían como muy buena. Después de unos cuantos capítulos ya no podía parar!!!</p>
<p style="text-align: justify;"><a href="http://es.wikipedia.org/wiki/The_Big_Bang_Theory" target="_blank">The Big Bang Theory</a> narra la vida de Sheldon y Leonard, dos jóvenes científicos que comparten piso y trabajan en el mismo lugar. Son algo frikis, sabiondos e inteligentes, pero cuando tienen que tratar con la gente normal son algo patosos y cortitos. Tienen dos amigos Howard y Raj que son del mismo estilo. Entonces aparece Penny, una chica sociable, muy normal y con cuerpo de escándalo, es por ello que a Leonard le entra por el ojo nada más verla.</p>
<p style="text-align: justify;"><span id="more-3174"></span></p>
<p style="text-align: justify;">La serie va contando la historia de éstas cinco personas repleta de situaciones y comentarios frikis de lo más graciosos, combinando terminología científica sin ningún sentido con referencias del mundo real. El humor de la serie no está destinado para cualquier tipo de público, más que nada por las continuas referencias frikis que alguna gente no entenderá y por consiguiente no le harán gracia. Pero aún así yo os recomiendo que le deis una oportunidad, es una serie fresca y entretenida, con un argumento que engancha.</p>
<p style="text-align: justify;">Algo que llama la atención enseguida es el desfile de camisetas frikis que hay en la serie. Sobre todo las que lleva Sheldon, fijaos en la camiseta de flash de la foto <img src='http://anabuigues.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> . Han causado tanto furor entre los fans que hay páginas centradas solo en esas camisetas como la que podéis encontrar <a href="http://www.sheldonshirts.com/" target="_blank">aquí</a>.</p>
<p style="text-align: justify;">En este <a href="http://www.thebigbangblog.com/" target="_blank">blog</a> podéis estar al día de todo sobre la serie.</p>
<p style="text-align: justify;">Y ya para despedirme os digo una de las frases de Sheldom con las que intenta hacerse el gracioso y que más me gusta de la serie “ZAS!! EN TODA LA BOCA!”</p>
]]></content:encoded>
			<wfw:commentRss>http://anabuigues.com/2010/11/07/the-big-bang-theory-la-mejor-serie-de-humor-que-he-visto/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Comparator vs Comparable en Java</title>
		<link>http://anabuigues.com/2010/09/17/comparator-vs-comparable-en-java/</link>
		<comments>http://anabuigues.com/2010/09/17/comparator-vs-comparable-en-java/#comments</comments>
		<pubDate>Fri, 17 Sep 2010 16:17:12 +0000</pubDate>
		<dc:creator>Ana Buigues</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Comparable]]></category>
		<category><![CDATA[Comparator]]></category>
		<guid isPermaLink="false">http://anabuigues.com/?p=1145</guid>
		<description><![CDATA[Diferencia entre Comparable y Comparator La diferencia principal entre Comparable y Comparator es que Comparable es utilizado para implementar el orden natural, sin necesidad de especificar un Comparator, por ejemplo, los String son comparados alfabéticamente. Usamos Comparator cuando queramos crear otro tipo de orden que no sea el natural. El contrato que implica implementar Comparable [...]]]></description>
			<content:encoded><![CDATA[<h2 style="text-align: justify;">Diferencia entre Comparable y Comparator</h2>
<p style="text-align: justify;">La diferencia principal entre <strong><span style="font-family: andale mono,times;">Comparable</span></strong> y <strong><span style="font-family: andale mono,times;">Comparator</span></strong> es que <strong><span style="font-family: andale mono,times;">Comparable</span></strong> es utilizado para implementar el orden natural, sin necesidad de especificar un <strong><span style="font-family: andale mono,times;">Comparator</span></strong>, por ejemplo, los <strong><span style="font-family: andale mono,times;">String</span></strong> son comparados alfabéticamente. Usamos <strong><span style="font-family: andale mono,times;">Comparator</span></strong> cuando queramos crear otro tipo de orden que no sea el natural.</p>
<p style="text-align: justify;">El contrato que implica implementar <strong><span style="font-family: andale mono,times;">Comparable</span></strong> requiere de un parámetro extra, el objeto con el que comparar <strong><span style="font-family: andale mono,times;">compareTo(obj1)</span></strong> de forma que la comparación se realizará del objeto en si (<strong><span style="font-family: andale mono,times;">this</span></strong>) con el objeto pasado como parámetro. <strong><span style="font-family: andale mono,times;">Comparator</span></strong>, sin embargo obliga a implementar el método <strong><span style="font-family: andale mono,times;">compare (obj1, obj2)</span></strong> de forma que los dos objetos a comparar son pasados como parámetros y el objeto que implementa el método <strong><span style="font-family: andale mono,times;">compare</span></strong> simplemente sirve de apoyo a la comparación.</p>
<p style="text-align: justify;"><span id="more-1145"></span></p>
<h2>Sobreescritura de los métodos <span style="font-family: andale mono,times;">compareTo</span> y <span style="font-family: andale mono,times;">compare</span></h2>
<p style="text-align: justify;">La forma de sobreescribir estos métodos es muy similar al <a href="http://anabuigues.com/2010/07/06/como-sobreescribir-los-metodos-equals-y-hashcode-de-java/" target="_blank"><strong><span style="font-family: andale mono,times;">equals</span></strong></a>. Los dos métodos cumplen las mismas restricciones que podemos objtener del API de Java:</p>
<ul style="text-align: justify;">
<li>Devolvemos un <strong>número negativo</strong> si el objeto es <strong>menor</strong>, devolvemos un <strong>cero</strong> si es <strong>igual</strong> y un<strong> número positivo</strong> si el objeto es <strong>mayor.</strong></li>
<li>Comparamos el objeto con otro objeto del mismo tipo. Si no son del mismo tipo, lanzamos un <strong>ClassCastException.</strong></li>
</ul>
<p style="text-align: justify;">La notación <strong>sgn</strong>(expresion) es la función matemática signum, la cual devuelve -1,0, o 1  según sea negativo, zero o positivo</p>
<ul>
<li>Debemos asegurar que:<strong> sgn(compare(x,y)) == -sgn(compare(x,y))</strong>, para todo <strong>x, y</strong>. Esto implica que <strong>compare(x,y))</strong> lanzará una excepción sii <strong>compare(x,y)</strong> también la lanza.</li>
</ul>
<ul>
<li>Debemos asegurar que la relación es transitiva:<strong> compare(x,y) &gt; 0 &amp;&amp; compare(y,z) &gt; 0 </strong>implica que <strong>compare(x,z) &gt; 0</strong></li>
</ul>
<ul>
<li>Debemos asegurar que:<strong> compare(x,y) == 0 </strong>implica que<strong> sgn(compare(x,z)) == sgn(compare(y,z))</strong>, para todo <strong>z.</strong></li>
</ul>
<ul>
<li style="text-align: justify;">Se recomienda, aunque no es estrictamente neceario, nos puede evitar poblemas al usar colecciones que implementen esta interfaz.<strong> (compare(x,y) == 0) == (x.equals(y))</strong></li>
</ul>
<ul>
<li style="text-align: justify;">El orden natural para una clase &#8220;c&#8221;  tiene que ser consistente con el equals si y solo sí:<strong> compare(e1,e2) == 0</strong> tiene que ser el mismo resultado que para <strong>e1.equals(e2) </strong>para cada <strong>e1</strong> y <strong>e2</strong> de la clase &#8220;c&#8221;.</li>
</ul>
<h2>Uso de Comparable y Comparator</h2>
<p style="text-align: justify;">Podemos usarlos en listas y arrays mediante los métodos <strong>Collections.sort</strong> y <strong>Arrays.sort</strong>.También como claves en un mapa ordenado <strong>TreeMap</strong> o como elementos en un set ordenado <strong>TreeSet</strong>.</p>
<p style="text-align: justify;">En el caso de Comparable los objetos tienen que implementar esta interfaz para que los ordene automáticamente. Para el caso del Comparator debemos especificar el Comparator.</p>
<h2>Ejemplo Comparable</h2>
<pre class="brush: java; title: ; notranslate">
//Ejemplo Comparable
public class Person implements Comparable&lt;Person&gt; {
 private String firstName;
 private String lastName;
 public Person(String firstName, String lastName) {
  if (firstName == null || lastName == null)
   throw new NullPointerException();
  this.firstName = firstName;
  this.lastName = lastName;
 }
 @Override
 public String toString() {
  return String.format(&quot;%s, %s&quot;, firstName, lastName);
 }
 @Override
 public int compareTo(Person p) {
  int lastCmp = firstName.compareTo(p.firstName);
  return (lastCmp != 0 ? lastCmp : lastName.compareTo(p.lastName));
 }
 public static void main(String[] args) {
  Set&lt;Person&gt; p = new TreeSet&lt;Person&gt;();
  p.add(new Person(&quot;Ana&quot;, &quot;Rodes&quot;));
  p.add(new Person(&quot;Hector&quot;, &quot;Lopez&quot;));
  p.add(new Person(&quot;Ana&quot;, &quot;Buigues&quot;));
  p.add(new Person(&quot;Carlitos&quot;, &quot;Perez&quot;));
  for (Person person : p)
   System.out.println(person);
 }
}
</pre>
<p>La salida será:<br />
Ana, Buigues<br />
Ana, Rodes<br />
Carlitos, Perez<br />
Hector, Lopez</p>
<h2>Ejemplos Comparator</h2>
<pre class="brush: java; title: ; notranslate">
//Ejemplo Comparator
public class LengthComparator implements Comparator&lt;Person&gt; {
 @Override
 public int compare(Person p1, Person p2) {
  if (p1.toString().length() &lt; p2.toString().length())
   return 1;
  else if (p1.toString().length() &gt; p2.toString().length())
   return -1;
  else
   return 0;
 }
 public static void main(String[] args) {
  List&lt;Person&gt; p = new ArrayList&lt;Person&gt;();
  p.add(new Person(&quot;Ana&quot;, &quot;Rodes&quot;));
  p.add(new Person(&quot;Hector&quot;, &quot;Lopez&quot;));
  p.add(new Person(&quot;Ana&quot;, &quot;Buigues&quot;));
  p.add(new Person(&quot;Carlitos&quot;, &quot;Perez&quot;));
  Collections.sort(p, new LengthComparator());
  for (Person person : p)
   System.out.println(person);
 }
}
</pre>
<p>La salida será:<br />
Ana, Rodes<br />
Ana, Buigues<br />
Hector, Lopez<br />
Carlitos, Perez</p>
<p>También lo podemos utilizar de forma anónima</p>
<pre class="brush: java; title: ; notranslate">
Set&lt;Person&gt; persons = new TreeSet&lt;Person&gt;(new Comparator&lt;Person&gt;() {
  @Override
 public int compare(Person p1, Person p2) {
  if (p1.toString().length() &lt; p2.toString().length())
   return 1;
  else if (p1.toString().length() &gt; p2.toString().length())
   return -1;
  else
   return 0;
 }
});
</pre>
]]></content:encoded>
			<wfw:commentRss>http://anabuigues.com/2010/09/17/comparator-vs-comparable-en-java/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>La mala educación</title>
		<link>http://anabuigues.com/2010/09/10/la-mala-educacion/</link>
		<comments>http://anabuigues.com/2010/09/10/la-mala-educacion/#comments</comments>
		<pubDate>Fri, 10 Sep 2010 21:07:50 +0000</pubDate>
		<dc:creator>Ana Buigues</dc:creator>
				<category><![CDATA[Opinión]]></category>
		<category><![CDATA[educación]]></category>
		<category><![CDATA[educación 2.0]]></category>
		<guid isPermaLink="false">http://anabuigues.com/?p=1148</guid>
		<description><![CDATA[El otro día estaba desayunando en un bar cercano a mi trabajo cuando la dueña empezó contarme lo caro que le había salido la vuelta al cole. La mujer me comentaba que los libros de texto para sus dos hijos le habían costado sobre los 700€, además de tener que comprar todo el material que el colegio les exigía, que si lápices de la punta tal, que si libretas con el cuadrado de tipo canario etc... por lo que no podía comprar cualquier tipo de libreta de 0'60€ Tampoco entendía porque a su hijo pequeño no le servían los libros del mayor y tenía que volver a comprarlos, con lo que le suponía más gasto cuando en realidad ya había pagado por unos libros similares para su hijo mayor.]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><a href="http://anabuigues.com/wp-content/uploads/2010/09/libros-amontonados.jpg"><img class="size-full wp-image-1151 alignleft" title="libros amontonados" src="http://anabuigues.com/wp-content/uploads/2010/09/libros-amontonados.jpg" alt="" width="255" height="153" /></a>El otro día estaba desayunando en un bar cercano a mi trabajo cuando la dueña empezó contarme lo caro que le había salido la vuelta al cole. La mujer me comentaba que <strong>los libros de texto</strong> <strong>para sus dos hijos</strong> l<strong>e habían costado sobre los 700€</strong>, además de tener que comprar todo el material que el colegio les exigía, que si lápices de la punta tal, que si libretas con el cuadrado de tipo canario etc&#8230; por lo que no podía comprar cualquier tipo de libreta de 0&#8217;60€ Tampoco entendía porque a su hijo pequeño no le servían los libros del mayor y tenía que volver a comprarlos, con lo que le suponía más gasto cuando en realidad ya había pagado por unos libros similares para su hijo mayor.</p>
<p style="text-align: justify;"><span id="more-1148"></span>La realidad es así de cruda, cada año escolar que empieza para las familias es todo un problema y más aún en la crisis en la que estamos. <strong>¿Por qué no sirven los libros de un año para otro?</strong> ¿Tanto cambia geografía española como para tener que cambiar el libro de un año para el siguiente? Además, <strong>¿Qué hacemos con los libros viejos? </strong>Mis libros del colegio y bachillerato están en un cajón guardados muertos de risa y sin usar.</p>
<p style="text-align: justify;"><strong>¿Existe una verdadera necesidad de cambiar los libros con tanta frecuencia? </strong>¿No se podría idear un sistema de reutilización de los libros? Ahh no, claro que no, así las editoriales de que vivirian? Desde mi punto de vista es un gran lastre que arrastramos desde hace muchos años y que nos lleva a no avanzar. Se supone que estamos en la era digital, ¿por qué no hacemos <a href="http://www.elpais.com/articulo/sociedad/Libros/tinta/aulas/elpepusoc/20100901elpepusoc_3/Tes" target="_blank">como los estadounidenses y nos pasamos a los libros digitales</a>?</p>
<p style="text-align: justify;"><strong>Nos dirigimos hacia un gran cambio en el sistema educativo</strong>, queramos o no, la tecnología impulsará mejoras en la educación, los estudiantes ya no irán con 10 libros en su mochila, sino simplemente con un mini-ordenador (ipad, tablet&#8230;) que les permitirá acceder a todo lo necesario su aprendizaje en un instante, <a href="http://sorayapaniagua.com/2010/09/05/me-regalo-una-ilusion-un-sistema-educativo-2-0/" target="_blank">porque yo también sueño con una eduación 2.0</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://anabuigues.com/2010/09/10/la-mala-educacion/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Cómo sobreescribir los métodos equals y hashCode de Java</title>
		<link>http://anabuigues.com/2010/07/06/como-sobreescribir-los-metodos-equals-y-hashcode-de-java/</link>
		<comments>http://anabuigues.com/2010/07/06/como-sobreescribir-los-metodos-equals-y-hashcode-de-java/#comments</comments>
		<pubDate>Tue, 06 Jul 2010 20:18:23 +0000</pubDate>
		<dc:creator>Ana Buigues</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[equals]]></category>
		<category><![CDATA[hashCode]]></category>
		<guid isPermaLink="false">http://anabuigues.com/?p=1051</guid>
		<description><![CDATA[En la clase java.lang.Object (y por lo tanto, por herencia, en todas las demás clases) tenemos métodos que a veces olvidamos y que son importantes: public boolean equals(Object o) public int hashCode() Estos métodos son especialmente importantes si vamos a guardar nuestros objetos en cualquier tipo de colección: listas, mapas&#8230; y más aun si los [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">En la clase<span style="font-family: andale mono,times;"> <code>java.lang.Object</code></span> (y por lo tanto, por herencia, en todas las demás clases) tenemos métodos que a veces olvidamos y que son importantes:</p>
<ul style="text-align: justify;">
<li><span style="font-family: courier new,courier;"><strong>public boolean equals(Object o)</strong></span></li>
<li><span style="font-family: courier new,courier;"><strong>public int hashCode()</strong></span></li>
</ul>
<p style="text-align: justify;">Estos métodos son especialmente importantes si vamos a guardar nuestros objetos en cualquier tipo de colección: listas, mapas&#8230; y más aun si los objetos que vamos a guardar en la colección son serializables.</p>
<p style="text-align: justify;">Estos métodos tienen formas explicitas de cómo hay que implementarlos. Sobreescribir estos métodos puede parecer simple, pero en realidad hay muchas formas de hacerlo incorrectamente lo que nos puede llevar a muchos crebraderos de cabeza. Lo vemos a continuación.</p>
<p style="text-align: justify;"><span id="more-1051"></span></p>
<h2 style="text-align: justify;">Sobreescribir el método <span style="font-family: courier new,courier;"><strong>equals</strong></span></h2>
<p style="text-align: justify;">Cuando sobreescribimos el método <span style="font-family: courier new,courier;"><strong>equals</strong></span> tenemos que tener en cuenta lo que se especifica en el <a href="http://java.sun.com/javase/6/docs/api/java/lang/Object.html" target="_blank">API de Java para Object</a> sobre este método. Debe cumplir las siguientes propiedades:</p>
<ul style="text-align: justify;">
<li><strong>Reflexiva:</strong> para cualquier referencia no nula para un valor <strong><span style="font-family: andale mono,times;">x</span>, <span style="font-family: andale mono,times;">x.equals(x)</span> </strong>debe devolver <strong><span style="font-family: andale mono,times;">true</span></strong>.</li>
<li><strong>Simétrica: </strong>para cualquier referencia no nula para valores <strong><span style="font-family: andale mono,times;">x</span> e <span style="font-family: andale mono,times;">y</span>, <span style="font-family: andale mono,times;">x.equals(y) </span></strong>debe devolver <strong><span style="font-family: andale mono,times;">true</span> sii <span style="font-family: andale mono,times;">y.equals(x) </span></strong>devuelve <strong><span style="font-family: andale mono,times;">true</span></strong>.</li>
<li><strong>Transitiva:</strong> para cualquier referencia no nula para valores <strong><span style="font-family: andale mono,times;">x</span>, <span style="font-family: andale mono,times;">y</span>,<span style="font-family: andale mono,times;">z</span>, si <span style="font-family: andale mono,times;">x.equals(y)</span> </strong>devuelve <strong><span style="font-family: andale mono,times;">true</span></strong> y <strong><span style="font-family: andale mono,times;">y.equals(z) </span></strong>devuelve <strong><span style="font-family: andale mono,times;">true</span></strong>, entonces <span style="font-family: andale mono,times;"><strong>x.equals(z)</strong> </span>debe devolver <strong><span style="font-family: andale mono,times;">true</span></strong>.</li>
<li><strong>Consistente:</strong> para cualquier referencia no nula para valores <strong><span style="font-family: andale mono,times;">x</span> e <span style="font-family: andale mono,times;">y</span>, múltiples llamadas al método <span style="font-family: andale mono,times;">x.equals(y) </span></strong>deben consistentemente <strong>devolver siempre <span style="font-family: andale mono,times;">true</span> o consistentemente devolver <span style="font-family: andale mono,times;">false</span></strong>. Siempre y cuando no se modifique la información usada en las comparaciones.</li>
<li style="text-align: justify;"><strong>No nulo:</strong> para cualquier referencia no nula para un valor <strong><span style="font-family: andale mono,times;">x</span>, <span style="font-family: andale mono,times;">x.equals(null)</span></strong> debe devolver <strong><span style="font-family: andale mono,times;">false</span></strong>.</li>
</ul>
<p style="text-align: justify;">Ahora que sabemos lo que tiene que cumplir, vamos a ver que pasos podemos seguir para su implementación:</p>
<ul style="text-align: justify;">
<li style="text-align: justify;">Usamos el operador <span style="font-family: courier new,courier;">==</span> para comprobar si el argumento es una referencia al mismo objeto.</li>
<li style="text-align: justify;">Usamos el operador <span style="font-family: courier new,courier;">instanceof</span> para comprobar si el argumento es un objeto de nuestra clase.</li>
<li style="text-align: justify;">Hacemos un cast del argumento al nuestro objeto. Ya sabemos que es una instancia de nuestro objeto, por el paso anterior.</li>
<li style="text-align: justify;">Para cada campo significativo de nuestro objeto, comprobamos que se corresponda con el que se pasa como argumento. Primero comprobamos los tipos primitivos y luego los más complejos. Para los tipos <span style="font-family: courier new,courier;">Float</span> y <span style="font-family: courier new,courier;">Double</span>, usamos los métodos <span style="font-family: courier new,courier;">Float.Compare</span> y <span style="font-family: courier new,courier;">Double.Compare.</span> Para el tipo <span style="font-family: courier new,courier;">String</span>, usamos el equals del string. Para comparar arrays usamos <span style="font-family: courier new,courier;">Arrays.equals</span>. Tenemos que tener en cuenta que los campos pueden contener referencias a <span style="font-family: courier new,courier;">null</span>. No debemos incluir campos que tengan que ver con el estado de un objeto, como por ejemplo tipos <span style="font-family: andale mono,times;">Lock</span>. Tampoco tenemos que incluir campos que sean cálculos de otros campos, es redundante.</li>
<li style="text-align: justify;">Cuando terminemos, tenemos que preguntarnos: ¿es reflexivo?, ¿es simétrico?, ¿es transitivo?, ¿es consistente? y ¿no nullo?</li>
</ul>
<pre class="brush: java; title: ; notranslate">
//Ejemplo de cómo sobreescribir el método equals()
public class Casa {
 private int num;
 private String direccion;
 private double precio;
 private List&lt;Propietario&gt; prop;
 public Casa(int num, String direccion, double precio,
            List&lt;Propietario&gt; prop) {
  this.num = num;
  this.direccion = direccion;
  this.precio = precio;
  this.prop = prop;
 }
 @Override
 public boolean equals(Object o) {
  if (o == null)
   return false;
  if (o == this)
   return true;
  if (!(o instanceof Casa))
   return false;
  Casa c = (Casa) o;
  if (num != c.num)
   return false;
  if (direccion == null || !direccion.equals(c.direccion))
   return false;
  if (Double.compare(precio, c.precio) != 0)
   return false;
  if (prop != c.prop &amp;&amp; (prop == null || !prop.equals(c.prop)))
   return false;
 return true;
 }
}
public class Propietario {
 private String nombre;
 private String apellidos;
 private int num;
 public Propietario(String nombre, String apellidos, int num) {
  this.nombre = nombre;
  this.apellidos = apellidos;
  this.num = num;
 }
 @Override
 public boolean equals(Object o) {
  if (o == null)
   return false;
  if (o == this)
   return true;
  if (!(o instanceof Propietario))
   return false;
  Propietario p = (Propietario) o;
  if ((nombre == null) ? (p.nombre != null) : !nombre.equals(p.nombre))
    return false;
  if ((apellidos == null) ? (p.apellidos != null) :
     !apellidos.equals(p.apellidos))
    return false;
  if (num != p.num)
    return false;
  return true;
 }
}
</pre>
<h2>Sobreescribir el método <span style="font-family: courier new,courier;"><strong>hashCode</strong></span></h2>
<p style="text-align: justify;">Siempre que sobreescribamos el método <span style="font-family: courier new,courier;"><strong>equals</strong></span>, también tenemos que sobreescribir también el método <span style="font-family: courier new,courier;"><strong>hashCode</strong></span>. En el API de java para <span style="font-family: andale mono,times;">Object</span> del método <strong><span style="font-family: courier new,courier;">hashCode</span></strong> se especifica lo siguiente:</p>
<ul style="text-align: justify;">
<li>Cuando este método es invocado sobre el mismo objeto una o más veces durante una ejecución en una aplicación, el <span style="font-family: courier new,courier;"><strong>hashCode</strong></span> debe de ser consistente devolviendo siempre el mismo valor, siempre que no se modifique el objeto. Este valor no tiene que ser consistente entre ejecuciones distintas de la aplicación.</li>
<li>Si dos objetos son iguales segun el método <span style="font-family: courier new,courier;"><strong>equals</strong></span>, entonces el <span style="font-family: courier new,courier;"><strong>hashCode</strong></span> de los dos objetos tiene que ser el mismo.</li>
<li style="text-align: justify;">Si dos objetos no son iguales, el <span style="font-family: courier new,courier;"><strong>hashCode</strong></span> no tiene que ser necesariamente distinto, pero es recomendable que lo sea.</li>
</ul>
<p>Unos pasos para implementar un buen método <span style="font-family: courier new,courier;"><strong>hashCode</strong></span> son:</p>
<ul>
<li>Declaramos una variable entera y le asignamos un número, por ejemplo <span style="font-family: courier new,courier;">result=17</span>.</li>
<li>Para cada campo significativo de nuestro objeto, <span style="font-family: courier new,courier;">f:</span>
<ul>
<li>Calculamos en <span style="font-family: courier new,courier;">int c </span>el valor de:
<ul>
<li>Tipo <span style="font-family: courier new,courier;">boolean</span>: hacemos <span style="font-family: courier new,courier;">(f?1 : 0)</span></li>
<li>Tipos <span style="font-family: courier new,courier;">byte, char, short, o int</span>: hacemos <span style="font-family: courier new,courier;">(int) f</span></li>
<li>Tipo <span style="font-family: andale mono,times;">Long</span>: hacemos <span style="font-family: courier new,courier;">(int)(f^(f&gt;&gt;&gt;32))</span></li>
<li>Tipo <span style="font-family: courier new,courier;">Float</span>: hacemos <span style="font-family: courier new,courier;">Float.doubleToIntBits(f)</span></li>
<li>Tipo <span style="font-family: courier new,courier;">Double</span>: hacemos <span style="font-family: courier new,courier;">Double.doubleToLongBits(f) </span>y  <span style="font-family: courier new,courier;">(int)(f^(f&gt;&gt;&gt;32))</span></li>
<li>Si es una referencia a un objeto, llamamos al <strong><span style="font-family: courier new,courier;">hashCode</span></strong> del objeto. Si la referencia es nula, devolvemos un 0.</li>
<li>Si es un <span style="font-family: courier new,courier;">Array</span>, utilizamos el método <span style="font-family: courier new,courier;">Arrays.hashCode.</span></li>
</ul>
</li>
<li>Acumulamos el valor de <span style="font-family: courier new,courier;">c</span> en <span style="font-family: courier new,courier;">result</span> : <span style="font-family: courier new,courier;">result = 31 * result + c</span></li>
</ul>
</li>
<li>Devolvemos el valor de <span style="font-family: courier new,courier;">result</span></li>
</ul>
<p>Podemos excluir los campos que no comprobemos en el método <span style="font-family: courier new,courier;"><strong>equals</strong></span>, pero no es recomendable.</p>
<pre class="brush: java; title: ; notranslate">
//Ejemplo de cómo sobreescribir el método hashCode
@Override
public int hashCode() {
  int result = 17;
  result = 31 * result + num;
  result = 31 * result + (direccion != null ?
           direccion.hashCode() : 0);
  result = 31 * result + (int) (Double.doubleToLongBits(precio)
           ^((Double.doubleToLongBits(precio) &gt;&gt;&gt; 32));
  result = 31 * result + (propietarios != null) ?
           propietarios.hashCode() : 0);
 return result;
 }
</pre>
<p>Fuente: Libro Effective Java de Joshua Bloch</p>
]]></content:encoded>
			<wfw:commentRss>http://anabuigues.com/2010/07/06/como-sobreescribir-los-metodos-equals-y-hashcode-de-java/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Técnicas de explotación de un Data Warehouse</title>
		<link>http://anabuigues.com/2010/06/16/tecnicas-de-explotacion-de-un-data-warehouse/</link>
		<comments>http://anabuigues.com/2010/06/16/tecnicas-de-explotacion-de-un-data-warehouse/#comments</comments>
		<pubDate>Wed, 16 Jun 2010 15:44:46 +0000</pubDate>
		<dc:creator>Ana Buigues</dc:creator>
				<category><![CDATA[Business Intelligence]]></category>
		<guid isPermaLink="false">http://anabuigues.com/?p=407</guid>
		<description><![CDATA[La construcción de un data warehouse es un medio, no un fin en sí mismo. El fin es la necesidad de realizar análisis y toma de decisiones a través del uso de esa fuente de datos. Dependiendo de lo requisitos de análisis que planteé la explotación, podemos hablar de diferentes técnicas: 1. Query &#38; Reporting [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">La construcción de un <strong>data warehouse</strong> es un medio, no un fin en sí mismo. El fin es la necesidad de realizar análisis y toma de decisiones a través del uso de esa fuente de datos.</p>
<p style="text-align: justify;">Dependiendo de lo requisitos de análisis que planteé la explotación, podemos hablar de diferentes técnicas:</p>
<h3 style="text-align: justify;">1. Query &amp; Reporting</h3>
<p style="text-align: justify;"><a href="http://anabuigues.com/wp-content/uploads/2010/03/Imagen-1.png"><img class="alignleft size-full wp-image-409" title="Query &amp; Reporting" src="http://anabuigues.com/wp-content/uploads/2010/03/Imagen-1.png" alt="" width="133" height="96" /></a>Consulta y reporte es el término general para referirse a una técnica de explotación de bases de datos que ofrece a las organizaciones acceso a medida a los datos (query) y capacidades de construcción de informes (reporting) para los usuarios finales. Estos informes incluyen datos de detalle, de gran volumen y con un formato que soporta imágenes, varios tipos de gráficos, tablas, etc, que pueden ser consultados por herramientas de usuario final.</p>
<p style="text-align: justify;">Permite:</p>
<ul style="text-align: justify;">
<li>A los usuarios poco expertos solicitar la ejecución de informes o consultas según unos parámetros determinados.</li>
<li>A los usuarios con cierta experiencia hacer consultas más flexibles mediante una aplicación que proporcione una interfaz gráfica de ayuda.</li>
<li>A los usuarios altamente experimentados puedan escribir, total o parcialmente la consulta en un lenguaje de interrogación de datos.</li>
</ul>
<p><span id="more-407"></span></p>
<h3 style="text-align: justify;">2. Análisis multidimensional OLAP</h3>
<p style="text-align: justify;">Se define <strong>OLAP</strong> como la consolidación, visualización y el análisis de datos de acuerdo con múltiples dimensiones. Se puede hablar de <strong>OLAP</strong> como de una tecnología de explotación de bases de datos que facilita la visualización y el análisis multidimensional de los datos.</p>
<p style="text-align: justify;">El análisis multidimensional consiste en analizar los datos que hacen referencia a hechos desde la perspectiva de sus componentes o dimensiones, abarcando también los diferentes niveles que puedan tener las respectivas dimensiones.</p>
<p style="text-align: justify;">El análisis multidimensional se apoya en una visión conceptual multidimensional (cubo o hipercubo) de los datos para permitir a los sistemas <strong>OLAP</strong>:</p>
<ul style="text-align: justify;">
<li>Soportar requisitos complejos de análisis.</li>
<li>Analizar datos desde diferentes perspectivas (dimensiones)</li>
<li>Soportar análisis contra un volumen considerable de datos.</li>
</ul>
<p style="text-align: justify;">Representación de los datos mediante un cubo OLAP:<a href="http://anabuigues.com/wp-content/uploads/2010/03/olap_cube.gif"><img class="size-full wp-image-410 aligncenter" title="Cubo OLAP" src="http://anabuigues.com/wp-content/uploads/2010/03/olap_cube.gif" alt="" width="405" height="286" /></a></p>
<h3 style="text-align: justify;">3. Data Mining</h3>
<p style="text-align: justify;">El término <strong>data mining</strong> o minería de datos se utiliza para hacer referencia a una técnica de análisis de datos cuyo objetio principal es el descubrimiento de conocimiento que se encuentra en los datos y que no es apreciable de manera directa. La minería de datos supone la búsqueda de similitudes, patrones generales y en general relaciones no obvias en los datos, con el objetivo de transformar la información disponible en conocimiento útil de negocio.</p>
<p style="text-align: justify;">El <strong>data mining</strong> en vez de basarse en métricas de negocio o en información altamente agregada, explota la información detallada del almacén de datos.</p>
<p style="text-align: justify;">No siempre es necesario disponer de un <strong>data warehouse</strong> para hacer <strong>data mining</strong>, pero aporta al <strong>data mining</strong> una fuente de datos de mayor calidad para poder trabajar.</p>
]]></content:encoded>
			<wfw:commentRss>http://anabuigues.com/2010/06/16/tecnicas-de-explotacion-de-un-data-warehouse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Yo fuí al Rock in Rio Madrid 2010</title>
		<link>http://anabuigues.com/2010/06/08/yo-fui-al-rock-in-rio-madrid-2010/</link>
		<comments>http://anabuigues.com/2010/06/08/yo-fui-al-rock-in-rio-madrid-2010/#comments</comments>
		<pubDate>Tue, 08 Jun 2010 17:17:57 +0000</pubDate>
		<dc:creator>Ana Buigues</dc:creator>
				<category><![CDATA[Música]]></category>
		<category><![CDATA[Rock in Rio]]></category>
		<guid isPermaLink="false">http://anabuigues.com/?p=949</guid>
		<description><![CDATA[El pasado fin de semana estuve en el Rock in Rio, un festival a lo grande que no pasa desapercibido y en el que disfruté mucho. A continuación relato un poco lo que vi, oí , me gustó, me disgustó&#8230; en definitiva una pequeña visión en primera persona de este festival. Para comenzar diré quse [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><a href="http://anabuigues.com/wp-content/uploads/2010/06/Rock-in-Rio.png"><img class="size-full wp-image-963 alignleft" title="Rock in Rio" src="http://anabuigues.com/wp-content/uploads/2010/06/Rock-in-Rio.png" alt="" width="188" height="171" /></a>El pasado fin de semana estuve en el <strong>Rock in Rio</strong>, un festival a lo grande que no pasa desapercibido y en el que disfruté mucho. A continuación relato un poco lo que vi, oí , me gustó, me disgustó&#8230; en definitiva una pequeña visión en primera persona de este festival.</p>
<p style="text-align: justify;">Para comenzar diré quse el recinto es enorme, cuenta con 200.000 m2 de superficie, tres escenarios, multitud de zonas donde comprar comida y bebida, áreas comerciales y zonas de césped. También tiene dos atracciones, una tirolina que pasa por delante del escenario mundo, y una noria en la que puedes ver toda la ciudad del rock desde arriba.</p>
<p style="text-align: justify;">El viernes pasado día 4, llegamos a la ciudad del rock temprano, teníamos muchas ganas de ver lo que nos esperaba esa noche. Después de comer algo, nos plantamos en el escenario mundo a la espera de la primera actuación. Los encargados de inaugurar la jornada fueron <strong>Macaco</strong>, el concierto fué de lo más animado, con mucha participación del público, todos bailamos al son de su exito &#8220;Moving&#8221;</p>
<p style="text-align: center;"><span id="more-949"></span>
<p><a href="http://www.youtube.com/watch?v=836r2m2kzOQ">http://www.youtube.com/watch?v=836r2m2kzOQ</a></p>
</p>
<p style="text-align: justify;">Con un poco de retraso debido a problemas técnicos con el sonido, empezó la actuación de <strong>Pereza</strong>, por ello tocaron un tema tras otro casi sin descanso. Cantaron junto Ariel Rot y Carlos Tarque el tema &#8220;Hace calor&#8221;</p>
<p style="text-align: center;">
<p><a href="http://www.youtube.com/watch?v=WP3pm54Lp1k">http://www.youtube.com/watch?v=WP3pm54Lp1k</a></p>
</p>
<p style="text-align: justify;">Y ya, el gran bombazo de la noche, la esperada actuación del grupo Bon Jovi, después de 8 años sin visitar España, se llevarón la palma. El concierto no defraudó a nadie. Se nota que es un grupo que tiene años de experiencia, lo dan todo en un concierto y transmiten sus ganas al público haciendo que la gente disfrute muchísimo. Junto con Richie Sambora ofrecieron un espectáculo muy bueno. El concierto terminó con el tema &#8220;Livin&#8217; on a Player&#8221;</p>
<p style="text-align: center;">
<p><a href="http://www.youtube.com/watch?v=ESCEmUJhyTQ">http://www.youtube.com/watch?v=ESCEmUJhyTQ</a></p>
</p>
<p style="text-align: justify;">El cierre de la jornada del escenario mundo le tocó a el dj alemán <strong>Paul Van Dyk</strong>. Está en puesto 6 del top-ten de los mejores djs del mundo.</p>
<p style="text-align: center;">
<p><a href="http://www.youtube.com/watch?v=vrF__xgKYVY">http://www.youtube.com/watch?v=vrF__xgKYVY</a></p>
</p>
<p style="text-align: justify;">El sábado fué repetición de la jugada, pero esta vez con mucha más gente en el recinto que el día anterior. Los encargados de abrir el escenario mundo fueron <strong>Calle 13</strong>, con sus canciones atrevidas y ritmos variados,  hicieron que todas las voces fueran una. Terminaron con el tema &#8220;Atrevete-tete&#8221;</p>
<p style="text-align: center;">
<p><a href="http://www.youtube.com/watch?v=K9EuS5zQcDw">http://www.youtube.com/watch?v=K9EuS5zQcDw</a></p>
</p>
<p style="text-align: justify;">Ya estabamos más que impacientes cuando por fin apareció <strong>Rihanna</strong> en el escenario y estalló la locura. Nos sorprendió a todos con su nuevo corte de pelo, corto, rapado por detrás y teñido de color rojo. Iba semi-vestida con un body que llevaba un sujetador de pico que recordaba a los que utilizaba Madonna en sus inicios. Tuvo muchos cambios de zapatos, desde unos taconazos excesivos hasta unas botas para moverse más fácilmente. Sin lugar a dudas, fue el mayor espectáculo, acompañada de sus bailarines ofreció una gran puesta en escena. El tema &#8220;Disturbia&#8221; fué el que más impresionó</p>
<p style="text-align: center;">
<p><a href="http://www.youtube.com/watch?v=NiP01zW2kjA">http://www.youtube.com/watch?v=NiP01zW2kjA</a></p>
</p>
<p style="text-align: justify;">Y empieza el concierto de <strong>Shakira</strong>, la gente se vuelve completamente loca al verla comenzando a golpe de caderas mientras suena con &#8220;Ojos&#8221;. Esta radiante de felicidad y la gente también. Todos aullamos el tema de &#8220;Loba&#8221;.</p>
<p style="text-align: center;">
<p><a href="http://www.youtube.com/watch?v=w9VHxSxC1iQ">http://www.youtube.com/watch?v=w9VHxSxC1iQ</a></p>
</p>
<p>El encargado de cerrar la jornada en el escenario mundo fue <strong>David Guetta</strong>, que últimamente se ha puesto muy de moda en españa. Todos brincamos sus temas, al igual que hicieron un par de robots luminosos en el escenario que tiraban humo y fuego por unas pistolas. Está en el puesto 3 del top-ten de los mejores djs del mundo. Se despidió con el tema de Black Eyes Peace &#8220;I gotta feeling&#8221;</p>
<p style="text-align: center;">
<p><a href="http://www.youtube.com/watch?v=FrKITDP1IhM">http://www.youtube.com/watch?v=FrKITDP1IhM</a></p>
</p>
<p style="text-align: justify;">Bueno, hasta aquí todo lo bueno, los conciertos dieron la talla, pero la organización no tanto. El primer día los conciertos se retrasaron unos 30 minutos, pero el sábado Shakira empezó una hora y media más tarde de lo que estaba previsto, es una barbaridad, sobre todo teniendo en cuenta que llevas allí desde las 9 de la tarde de pie. También el primer día pagamos la novatada, dado que no se podía entrar comida ni bebida al recinto, no te quedaba otra que cenar allí, así que nos pedimos unos bocatas para cenar, que en principio no tendrían porque estar malos y por la pinta no lo parecía&#8230; pero lo mejor fué cuando nos dimos cuenta que dentro del bocata nos habían incluido el helado de postre!!! estaban llenos de trozos de hielo, puff.</p>
<p style="text-align: justify;">Otra cosa que me parece increible es que sabiendo la cantidad de gente que se espera para un evento de este tipo no habria más de unas 30 papeleras en todo el recinto, así que os podeís imaginar la forma en que los desperdicios se iban acumulando, tenías que ir pisando el suelo con cuidado de no tropezar de la cantidad de basura que estaba esparcida por el suelo. Además también otro punto crítico fueron los asesos, que más que aseos, como es de esperar son las casetas de plástico, lo mejor es que esos aseos no tenían agua corriente para estirar cuando uno termina, sino que se iba amontonando&#8230; así que os podeís imaginar el mal olor que hacian en seguida, y más con el calor que hacia!!!</p>
<p style="text-align: justify;">Bueno a pesar de todo, redactando la entrada y viendo los videos puedo decir que se me ha puesto la piel de gallina recordando los momentos, y por supuesto Yo voy al Rock in Rio 2012!!!</p>
]]></content:encoded>
			<wfw:commentRss>http://anabuigues.com/2010/06/08/yo-fui-al-rock-in-rio-madrid-2010/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Lie To Me: Miénteme, una serie que deberías ver</title>
		<link>http://anabuigues.com/2010/05/22/lie-to-me-mienteme-una-serie-que-deberias-ver/</link>
		<comments>http://anabuigues.com/2010/05/22/lie-to-me-mienteme-una-serie-que-deberias-ver/#comments</comments>
		<pubDate>Sat, 22 May 2010 18:04:34 +0000</pubDate>
		<dc:creator>Ana Buigues</dc:creator>
				<category><![CDATA[Series]]></category>
		<category><![CDATA[Lie To Me]]></category>
		<category><![CDATA[Miénteme]]></category>
		<guid isPermaLink="false">http://anabuigues.com/?p=930</guid>
		<description><![CDATA[n semana santa, una amiga me recomendó ver la serie Lie To Me, en español Miénteme y ahora yo también os la recomiendo.
En la serie, Tim Roth da vida al doctor Cal Lightman, un científico que se ha hecho experto en reconocer engaños simplemente a través de expresiones faciales, el lenguaje corporal y la voz. Él y sus compañeros detectan verdades y mentiras para ayudar en investigaciones a través de la psicología aplicada. Su proceso deductivo se basa en hacer preguntas a sospechosos y evaluar sus reacciones físicas. La serie se fundamenta en los planteamientos de Paul Ekman, un especialista en el estudio de las emociones y sus relaciones con la expresión facial, además ahora es asesor de los guionistas de la serie.]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><a href="http://anabuigues.com/wp-content/uploads/2010/05/lie-to-me.jpg"><img class="size-full wp-image-931 alignleft" title="lie to me" src="http://anabuigues.com/wp-content/uploads/2010/05/lie-to-me.jpg" alt="" width="297" height="180" /></a>En semana santa, una amiga me recomendó ver la serie <strong>Lie To Me</strong>, en español <strong><a href="http://www.foxtv.es/mienteme/" rel="nofollow" target="_blank">Miénteme</a></strong> y ahora yo también os la recomiendo.</p>
<p style="text-align: justify;">En la serie, Tim Roth da vida al doctor Cal Lightman, un científico que se ha hecho experto en reconocer engaños simplemente a través de expresiones faciales, el lenguaje corporal y la voz. Él y sus compañeros detectan verdades y mentiras para ayudar en investigaciones a través de la psicología aplicada. Su proceso deductivo se basa en hacer preguntas a sospechosos y evaluar sus reacciones físicas. La serie se fundamenta en los planteamientos de Paul Ekman, un especialista en el estudio de las emociones y sus relaciones con la expresión facial, además ahora es asesor de los guionistas de la serie.</p>
<p style="text-align: justify;"><span id="more-930"></span>En la serie nos cuentan algunas de las expresiones que fácilmente podemos dectectar en una persona, como son la ira, el miedo, la tristeza, la sorpresa, el desprecio&#8230; pero solo algunas, ya que según la serie, tenemos 43 músculos en la cara con los que podemos formar unas 10000 expresiones!! Es lo que llaman microexpresiones, ya que pueden durar apenas una fracción de segundo, tiempo suficiente para analizar si uno miente o dice la verdad.</p>
<p style="text-align: justify;">Una de las cosas que remarca la serie es la poca fiabilidad que tienen los polígrafos, algo comúnmente conocido por su uso como detector de mentiras. Afirman que un detector de mentiras es muy fácil que se equivoque ya que los seres humanos somos capaces de sentir varias cosas a la vez pudiendo obtener un falso positivo con el polígrafo.</p>
<p style="text-align: justify;">Bueno, no os cuento nada más, simplemente decir que os divertireís viendo la serie y además aprenderéis un poco sobre la comunicación no verbal.</p>
]]></content:encoded>
			<wfw:commentRss>http://anabuigues.com/2010/05/22/lie-to-me-mienteme-una-serie-que-deberias-ver/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Data Mart y Data Warehouse</title>
		<link>http://anabuigues.com/2010/04/19/data-mart-y-data-warehouse/</link>
		<comments>http://anabuigues.com/2010/04/19/data-mart-y-data-warehouse/#comments</comments>
		<pubDate>Mon, 19 Apr 2010 21:24:03 +0000</pubDate>
		<dc:creator>Ana Buigues</dc:creator>
				<category><![CDATA[Business Intelligence]]></category>
		<guid isPermaLink="false">http://anabuigues.com/?p=396</guid>
		<description><![CDATA[Un Data Mart cumple los mismos principios que un Data Warehouse, construir un repositorio de datos único, consistente, fiable y de fácil acceso. Entonces ¿Qué diferencia hay entre un data warehouse y un data mart? Su alcance. El data mart está pensado para cubrir las necesidades de un grupo de trabajo o de un determinado [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><a href="http://anabuigues.com/wp-content/uploads/2010/03/Data-warehouse-y-data-marts1.png"><img class="alignleft size-full wp-image-403" title="Data warehouse y data marts" src="http://anabuigues.com/wp-content/uploads/2010/03/Data-warehouse-y-data-marts1.png" alt="Data warehouse y data marts" width="207" height="220" /></a>Un <strong>Data Mart</strong> cumple los mismos principios que un <strong>Data Warehouse</strong>, construir un repositorio de datos único, consistente, fiable y de fácil acceso.</p>
<p style="text-align: justify;">Entonces ¿Qué diferencia hay entre un <strong>data warehouse</strong> y un <strong>data mart</strong>? Su alcance. El <strong>data mart</strong> está pensado para cubrir las necesidades de un grupo de trabajo o de un determinado departamento dentro de la organización, en cambio, el ámbito de un <strong>data warehouse</strong> es la organización en su conjunto. Se caracterizan por disponer la una estructura óptima de datos para analizar la información al detalle desde todas las perspectivas que afecten a los procesos de dicho departamento.</p>
<p style="text-align: justify;">Supone una buena opción para pequeñas y medianas empresas que no puedan afrontar el coste de poner en marcha un Data Warehouse. La escalabilidad de los data marts hacia el data warehouse puede ser una solución si el número de data marts aumenta considerablemente.</p>
<p style="text-align: justify;"><span id="more-396"></span></p>
<h3 style="text-align: justify;">Clases de Data Marts</h3>
<p style="text-align: justify;">Existen dos tipos de <strong>data marts:</strong></p>
<h4 style="text-align: justify;">1. Data Marts Dependientes</h4>
<p style="text-align: justify;">Los datos que se utilizan para poblar el <strong>data mart</strong> provienen del <strong>data warehouse</strong>. Esta estrategia es particularmente apropiada cuando el data warehouse crece muy rápidamente y los distintos departamentos requieren sólo una pequeña porción de los datos contenidos en él.</p>
<h4 style="text-align: justify;">2. Data Marts Independientes</h4>
<p style="text-align: justify;">Los datos que se utilizan para poblar el <strong>data mart</strong> provienen de los sistemas operacionales y/o fuentes externas.</p>
<p style="text-align: justify;">Problemática:</p>
<ul style="text-align: justify;">
<li>El hecho de tener varios <strong>data marts</strong> independientes, sin ningún tipo de integración, puede hacer que las tareas de administración y mantenimiento se conviertan en un lastre.</li>
<li>Se puede dar el caso de que algunos <strong>data marts</strong> necesiten los mismos datos para dar respuesta a determinadas preguntas, por lo que tenemos redundancia de datos, ya que cada <strong>data mart</strong> se alimenta con sus procesos de extracción y transformación propios.</li>
</ul>
<p style="text-align: justify;">
]]></content:encoded>
			<wfw:commentRss>http://anabuigues.com/2010/04/19/data-mart-y-data-warehouse/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Mi nick de Twitter en la Tele gracias a Berto Romero!</title>
		<link>http://anabuigues.com/2010/03/29/mi-nick-de-twitter-en-la-tele-gracias-a-berto-romero/</link>
		<comments>http://anabuigues.com/2010/03/29/mi-nick-de-twitter-en-la-tele-gracias-a-berto-romero/#comments</comments>
		<pubDate>Mon, 29 Mar 2010 13:45:47 +0000</pubDate>
		<dc:creator>Ana Buigues</dc:creator>
				<category><![CDATA[Personal]]></category>
		<category><![CDATA[Berto Romero]]></category>
		<category><![CDATA[Twitter]]></category>
		<guid isPermaLink="false">http://anabuigues.com/?p=521</guid>
		<description><![CDATA[El pasado jueves 25, Berto Romero realizó un &#8220;mierdi-concurso&#8221; a través de su twitter que consistía en adivinar de qué saldría disfrazado en el programa de Buenafuente por la noche. Aquí os dejo la convocatoria del concurso Yo dije que iría de King África y aunque habría sido un puntazo finalmente fue de Georgi Dan&#8230; [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">El pasado jueves 25, <strong>Berto Romero</strong> realizó un &#8220;mierdi-concurso&#8221; a través de su <strong>twitter</strong> que consistía en adivinar de qué saldría disfrazado en el programa de <strong>Buenafuente</strong> por la noche. Aquí os dejo la convocatoria del concurso</p>
<p style="text-align: left;"><a href="http://anabuigues.com/wp-content/uploads/2010/03/Twitter-de-Berto-Romero.jpg"><img class="size-full wp-image-525  aligncenter" title="Twitter de Berto  Romero" src="http://anabuigues.com/wp-content/uploads/2010/03/Twitter-de-Berto-Romero.jpg" alt="" width="309" height="48" /></a></p>
<p style="text-align: justify;">Yo dije que iría de King África y aunque habría sido un puntazo finalmente fue de Georgi Dan&#8230; por lo que acabé ganando, seguramente por ser creadores de grandes e inolvidables canciones del verano como&#8230; no recuerdo ahora mismo ninguna así que volveré al tema del &#8220;mierdi-concurso&#8221;. Aquí podeís ver el video donde se ve mi nick en la taza de Berto</p>
<p><span id="more-521"></span></p>
<p style="text-align: center;">
<p><a href="http://www.youtube.com/watch?v=NBG_VY-QZNY">http://www.youtube.com/watch?v=NBG_VY-QZNY</a></p>
</p>
<p style="text-align: justify;">Además el viernes 25 fui a ver el show de <strong>Berto Romero</strong> &#8220;La apoteosis necia&#8221; donde además de divertirme como una enana y reir como hacía tiempo que no reía, tuve la oportunidad de conocerlo brevemente&#8230; pero esto es una historia que contaré en mi próximo post xD (con la taza en mi mano espero en vez de en la de Berto).</p>
]]></content:encoded>
			<wfw:commentRss>http://anabuigues.com/2010/03/29/mi-nick-de-twitter-en-la-tele-gracias-a-berto-romero/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

