<?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>{ :lazy =&#62; loading } &#187; Uncategorized</title>
	<atom:link href="http://mgaravaglia.com.ar/blog/index.php/category/uncategorized/feed/" rel="self" type="application/rss+xml" />
	<link>http://mgaravaglia.com.ar/blog</link>
	<description>So far the universe is wining.</description>
	<lastBuildDate>Tue, 31 May 2011 17:25:17 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>la W3C es obsoleta</title>
		<link>http://mgaravaglia.com.ar/blog/index.php/2010/11/29/la-w3c-es-obsoleta/</link>
		<comments>http://mgaravaglia.com.ar/blog/index.php/2010/11/29/la-w3c-es-obsoleta/#comments</comments>
		<pubDate>Mon, 29 Nov 2010 20:39:42 +0000</pubDate>
		<dc:creator>mauricio</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[w3c]]></category>

		<guid isPermaLink="false">http://mgaravaglia.com.ar/blog/?p=124</guid>
		<description><![CDATA[Despues del papelón de Ian Hickson diciendo que hay que esperar hasta 2022 para tener una especificacion de html5 completa me encuentro con esto revisando element input[type=number]:
autocomplete =         &#8220;on&#8221;  or  &#8220;off&#8221;
Specifies  whether the element represents an input        [...]]]></description>
			<content:encoded><![CDATA[<p>Despues del papelón de <a title="Ian Hickson" href="http://en.wikipedia.org/wiki/Ian_Hickson">Ian Hickson</a> diciendo que hay que esperar hasta 2022 para tener una especificacion de html5 completa me encuentro con esto revisando element <a href="http://www.w3.org/TR/html-markup/input.number.html">input[type=number]</a>:</p>
<blockquote><p>autocomplete =         &#8220;on&#8221;  or  &#8220;off&#8221;<br />
Specifies  whether the element represents an input         control for which a UA  is meant to store the value entered         by the user (so that the UA  can prefill the form         later).</p>
<p>autofocus =         &#8220;autofocus&#8221;        or &#8220;&#8221; (empty string) or <a id="syntax-attr-empty_xref80" href="http://www.w3.org/TR/html-markup/syntax.html#syntax-attr-empty">empty</a><br />
Specifies  that the element represents a control to which         a UA is meant to  give focus as soon as the document is loaded.</p></blockquote>
<p>¿Qué nos hace pensar que la w3c va a poder hacerlo bien en esta oportunidad? ni siquiera pueden ponerse de acuerdo en como representar un valor booleano en dos atributos que estan adyacentes en la especificacion. Despues es facil hecharle la culpa a los fabricantes de navegadores&#8230; Como bien dice el dicho: Un camello es un caballo diseñado por un comité</p>
]]></content:encoded>
			<wfw:commentRss>http://mgaravaglia.com.ar/blog/index.php/2010/11/29/la-w3c-es-obsoleta/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SourceMonitor</title>
		<link>http://mgaravaglia.com.ar/blog/index.php/2009/02/18/sourcemonitor/</link>
		<comments>http://mgaravaglia.com.ar/blog/index.php/2009/02/18/sourcemonitor/#comments</comments>
		<pubDate>Thu, 19 Feb 2009 01:50:18 +0000</pubDate>
		<dc:creator>mauricio</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://mgaravaglia.com.ar/blog/?p=65</guid>
		<description><![CDATA[SourceMonitor es una aplicación freeware que examina el codigo fuente de nuestros proyectos y calcula distintas metricas acerca la complejidad que encuentra. Una caracteristica muy interesante es la posibilidad de tomar &#8217;snapshots&#8217; de los valores arrojados por las metricas para poder compararlos a lo largo de tiempo . Soporta Java, C, C++ y unos cuantos [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.campwoodsw.com/">SourceMonitor </a>es una aplicación freeware que examina el codigo fuente de nuestros proyectos y calcula distintas metricas acerca la complejidad que encuentra. Una caracteristica muy interesante es la posibilidad de tomar &#8217;snapshots&#8217; de los valores arrojados por las metricas para poder compararlos a lo largo de tiempo . Soporta Java, C, C++ y unos cuantos lenguajes más</p>
<p>Muy util para saber en que momento hay que empezar a refactorear.</p>
]]></content:encoded>
			<wfw:commentRss>http://mgaravaglia.com.ar/blog/index.php/2009/02/18/sourcemonitor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Contadores Atómicos</title>
		<link>http://mgaravaglia.com.ar/blog/index.php/2008/07/17/contadores-atomicos/</link>
		<comments>http://mgaravaglia.com.ar/blog/index.php/2008/07/17/contadores-atomicos/#comments</comments>
		<pubDate>Thu, 17 Jul 2008 03:46:00 +0000</pubDate>
		<dc:creator>mauricio</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://mgaravaglia.com.ar/blog/?p=54</guid>
		<description><![CDATA[Cuanto tiempo sin escribir&#8230; en fin. Siempre me llamo la atención que en Java muchas de las operaciones sobre primitivos no son atómicas. El statement c++; por ejemplo no es atómico y puede traernos muchos dolores de cabeza en entornos de multithreading. Vale recordar, consideramos una instrucción como &#8220;atómica&#8221; si no puede ser interrumpida para [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Cuanto tiempo sin escribir&#8230; en fin. Siempre me llamo la atención que en Java muchas de las operaciones sobre primitivos no son atómicas. El statement c++; por ejemplo no es atómico y puede traernos muchos dolores de cabeza en entornos de multithreading. Vale recordar, consideramos una instrucción como &#8220;atómica&#8221; si no puede ser interrumpida para darle paso a otro thread. En el siguiente ejemplo se presentan el caso de dos threads que consumen concurrentemente un contador. Si ejecutan el código podrán ver que no se obtiene el resultado esperado.</p>
<pre name="code" class="java">public class Main {

public static void main(String[] args) {
Contador c = new Contador();
new Corredor(c).start();
new Corredor(c).start();
}
}

class Corredor extends Thread {

private Contador contador;

@Override
public void run() {

for (int i = 0; i &lt; 20; i++) {
try {
System.out.println(contador.incrementAndGet());
Thread.sleep(500);
} catch(Exception e) {
}
}

}

public Corredor(Contador contador) {
this.contador = contador;
}
}

class Contador {

private int value = 0;

public int incrementAndGet() {
return ++value;
}
}</pre>
<p>En la pantalla terminamos con algo parecido a</p>
<p>1 2 2 3 3 4 4 5 6 6 7 7 8 8 9 9 10 10 11 &#8230;&#8230;</p>
<p style="text-align: justify;">De alguna forma estamos forzando un poco esa situacion poniendo a dormir el Thread luego de llamar al metodo incrementAndGet() pero es una situacion que perfectamente se puede dar cuando hay muchos threads en ejecución. Podriamos corregir esta situación synchronizando el metodo incrementAndGet() pero produciría una sobrecarga que quizá no estemos dispuestos a pagar.</p>
<p style="text-align: justify;"><strong> java.util.concurrent.atomic.AtomicInteger</strong> es la clase que vamos a usar para solucionar este problema. AtomicInteger se comporta como un Integer comun y corriente pero es mutable a traves de metodos atómicos. Lo mejor es que los metodos no son sincronizados de forma tradicional sino por otras oscuras tecnicas que en su momento trataré. Esta clase posee metodos tales como addAndGet(int delta) que incrementa en un delta de forma atomica, decrementAndGet(), getAndAdd(), getAndIncrement() y muchos otros que hacen más o menos lo que indican los nombres pero siempre siempre de forma atómica.</p>
<p>Más información en <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/atomic/AtomicInteger.html">http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/atomic/AtomicInteger.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://mgaravaglia.com.ar/blog/index.php/2008/07/17/contadores-atomicos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Manejando XML con XStream</title>
		<link>http://mgaravaglia.com.ar/blog/index.php/2008/06/18/manejando-xml-con-xstream/</link>
		<comments>http://mgaravaglia.com.ar/blog/index.php/2008/06/18/manejando-xml-con-xstream/#comments</comments>
		<pubDate>Thu, 19 Jun 2008 01:38:20 +0000</pubDate>
		<dc:creator>mauricio</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://mgaravaglia.com.ar/blog/?p=53</guid>
		<description><![CDATA[Existen muchas librerias que permiten manejar archivos XML dentro de Java. Tenemos desde Apache Commons Digester hasta StAX incorporado en la JRE6 pasando por incontables alternativas con menos fama. Si a estas alturas hay algun desprevenido que no sabe que es XML le recomiendo este articulo. Si bien hay muchas alternativas algunas son algo complicadas [...]]]></description>
			<content:encoded><![CDATA[<p>Existen muchas librerias que permiten manejar archivos XML dentro de Java. Tenemos desde <a href="http://commons.apache.org/digester/">Apache Commons Digester</a> hasta <a href="http://stax.codehaus.org/">StAX</a> incorporado en la JRE6 pasando por incontables alternativas con menos fama. Si a estas alturas hay algun desprevenido que no sabe que es XML le recomiendo <a href="http://sherekan.com.ar/blog/2008/05/16/introduccion-a-xml/">este</a> articulo. Si bien hay muchas alternativas algunas son algo complicadas y otras presentan una sobreingenieria extrema para algo que parece tan trivial como el mapeo de un documento xml a un grafo de objetos.</p>
<p><a href="http://xstream.codehaus.org/">XStream</a> es una de esas librerias que hacen fáciles las cosas simples. Con XStream no hay que armar grandes descriptores para hacer funcionar el mapeo sino que todo apela a la vieja y querida <a href="http://mgaravaglia.com.ar/blog/?p=15">API Reflection</a>, además XStream mantiene al minimo las dependencias con otros proyectos (exactamente lo opuesto que ocurre con Digester que requiere casi todo el apache commons para funcionar). La forma de usar XStream es muy sencilla. Veremos como hacer para pasar de Objetos a XML y de XML a Objetos. Supongamos que tenemos una clase Persona y una Telefono.</p>
<pre name="code" class="java">
public class Persona {
private String nombre;
private long id;
private String fechaNacimiento;
private float sueldo;
private Telefono[] telefonos = new Telefono[10];

//setters y getters.....

}

public class Telefono {
private String codigoPais;
private String codigoArea;
private String numero;
private String interno;
//getters y setters....

}</pre>
<p>Más POJO imposible, ni siquiera hay que hacer a la clase Serializable o algo así. Para hacer mas claros estos ejemplos y no bombardear la pantalla con código inutil <img src='http://mgaravaglia.com.ar/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  voy a apoyarme en una clase <a href="http://freetexthost.com/h0gdus5i10">Generator</a> a partir de la cual obtengo un objeto Persona o un String con la definicion XML. La definicion XML estará en un archivo, o en internet o en cualquier lado, como sea, la operatoria es la misma.</p>
<p><strong>Ejemplo XML -&gt; Objeto</strong></p>
<pre name="code" class="java">
import com.thoughtworks.xstream.XStream;

public class TestRead {
public static void main(String[] args) {
XStream xs = new XStream();
xs.alias("persona",Persona.class);
xs.alias("telefono",Telefono.class);
Persona p = (Persona)xs.fromXML(Generator.getXML());
//listo! en 3 lineas hace la conversion de XML a un Objeto de clase Persona.
System.out.println(p.getId());
System.out.println(p.getNombre());
System.out.println(p.getSueldo());
for(Telefono t:p.getTelefonos())
System.out.println(t.getNumero());
}
}</pre>
<p><strong>Ejemplo Objeto -&gt; XML</strong></p>
<pre name="code" class="java">
public class TestWrite {
public static void main(String[] args) {

Persona p = Generator.getPersona();
XStream xs = new XStream();
xs.alias("persona", Persona.class);
xs.alias("telefono",Telefono.class);
String xml = xs.toXML(p);

// toXML() devuelve un string con la definicion xml para el objeto p. Todo en 3 lineas!
System.out.println(xml);
}
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://mgaravaglia.com.ar/blog/index.php/2008/06/18/manejando-xml-con-xstream/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Rentas, Patentes y RegExp</title>
		<link>http://mgaravaglia.com.ar/blog/index.php/2008/05/07/patentes-y-regexp/</link>
		<comments>http://mgaravaglia.com.ar/blog/index.php/2008/05/07/patentes-y-regexp/#comments</comments>
		<pubDate>Wed, 07 May 2008 06:06:20 +0000</pubDate>
		<dc:creator>mauricio</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://mgaravaglia.com.ar/blog/?p=47</guid>
		<description><![CDATA[Introducción
Esto es una historia real que me ocurrio hace unos instantes. No sabia si postearlo acá pero como es mi blog hago lo que quiero. Hace un rato queria ver cuanto debía del impuesto de patente de mi auto. Por motivos que no es prudente comentar acá hacia tiempo que no me llegaban las boletas [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><strong>Introducción</strong></p>
<p style="text-align: justify;">Esto es una historia real que me ocurrio hace unos instantes. No sabia si postearlo acá pero como es mi blog hago lo que quiero. Hace un rato queria ver cuanto debía del impuesto de patente de mi auto. Por motivos que no es prudente comentar acá hacia tiempo que no me llegaban las boletas y no reclamaba asi que quise ver si internet me daba una solución. Vaya si me dio una solución&#8230; Por prudencia no voy a poner la dirección donde pueden encontrar las páginas que destriparé en los párrafos siguientes, confio en que sabrán googlear <img src='http://mgaravaglia.com.ar/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p style="text-align: justify;"><strong>Prolegómenos</strong></p>
<p style="text-align: justify;">Sin problemas encontré que en la página web de rentas de la ciudad autónoma de buenos aires es posible consultar el estado de la deuda con tan solo poner el número de patente. Sin embargo es necesario ingresar un &#8220;digito verificador&#8221; por motivos que, estimo, tienen que ver con salvaguardar la información del deudor. Dicho digito se encuentra impreso en la boleta pero como comente mas arriba, hace tiempo que no la tengo.</p>
<p style="text-align: justify;">La página presentaba dos cuadros de texto donde introducir la patente y el digito verificador (se llama digito verificador a pesar de estar formado por Dos digitos). Puse la patente de mi auto y tire algunos digitos al azar. Naturalmente, no acerte con el digito verificador pero me llamó poderosamente la atención de que la validación se hacia instantaneamente y un hermoso alert() se encargaba de avisarnos de nuestro error. Algo olía a Javascript.</p>
<p style="text-align: justify;">En pleno siglo XXI cuesta creer que alguien use javascript para realizar este tipo de validación, sin embargo las tecnicas de ofuscación de codigo a veces confunden a ciertas personas. Digo las confunde porque a veces se olvidan de ofuscar su código&#8230; asi que, <a title="get firebug!" href="http://www.getfirebug.com/">firebug</a> mediante, pude hacerme con el código de validación que comparto <a title="validacion" href="http://www.textdump.com/v/?k=MTQ1MQ==" target="_blank">en este link</a>.</p>
<p style="text-align: justify;">Años atras, cuando el tiempo libre era algo que me sobraba, curioseando por ahí habia podido comprobar en incontables veces lo patético que son los emprendimientos informaticos del estado, sobretodo en lo referente a seguridad, desde el servicio meteorológico de las fuerzas aereas hasta el ministerio de educacion. Más cerca en el tiempo habia sufrido con las aplicaciones de rentas y los tramites via web de la afip. Sabía de las limitaciones del estado. Pero no sabia que se habian vuelto a superar&#8230;</p>
<p style="text-align: justify;"><strong>Tratamiento</strong></p>
<p style="text-align: justify;">Todo empieza con una curiosa función titulada ValidarDigitoPatente() la cual, increiblemente, valida nuestra patente y el digito verificador. Efectivamente la lógica que hace la validación esta del lado del cliente y el codigo no esta ofuscado&#8230; bueno&#8230; no a la manera tradicional porque se las ingeniaron para que cueste entenderlo <img src='http://mgaravaglia.com.ar/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="text-align: justify;">Lo primero que hace esta función es validar que la patente ingresada sea valida (para los hermanos latinoamericanos en argentina las patentes, ó matriculas, de los autos tienen 3 letras seguidas de 3 digitos. ABC 123, DFG 167 y UIO 654 son ejemplos de patentes validas. Antiguamente se usaba una codificación formada por una letra y 7 numeros). El codigo que se encarga de hacer esto, contengan las risas, es el siguiente:</p>
<pre class="java">if (EsLetra(n.charAt(0))) {
if (n.length == 8 &amp;&amp;
isDigit(n.charAt(1)) &amp;&amp;
isDigit(n.charAt(2)) &amp;&amp;
isDigit(n.charAt(3)) &amp;&amp;
isDigit(n.charAt(4)) &amp;&amp;
isDigit(n.charAt(5)) &amp;&amp;
isDigit(n.charAt(6)) &amp;&amp; isDigit(n.charAt(7))) {</pre>
<p style="text-align: justify;">Javascript posee una de las implementaciones mas lindas de expresiones regulares que existen. Los estatales argentinos, sin embargo, no saben usarlas. Esa maraña de código para chequear la validez de una patente se puede reducir a:</p>
<pre class="java">if(n.match('[a-zA-z]{3}[0-9]{3}')) {</pre>
<p style="text-align: justify;">Esta bien, no seria taaaaan grave que no dominen el arte oscuro de las expresiones regulares. Sucede que hay patentes de otro tipo de vehiculos, e incluso las patentes que se usaban antiguamente, que tienen otro formato. ¿Como hacen para evaluar los otros formatos? Facil, seguimos enmarañando el código.</p>
<pre class="java">if (isDigit(n.charAt(0))) {
if (n.length &gt; 1 &amp;&amp; isDigit(n.charAt(1))) {
if (n.length &gt; 2 &amp;&amp; isDigit(n.charAt(2))) {
if (n.length == 6 &amp;&amp;
EsLetra(n.charAt(3)) &amp;&amp;
EsLetra(n.charAt(4)) &amp;&amp; EsLetra(n.charAt(5))) {</pre>
<p style="text-align:justify">Más alla de esto lo que nos importa es poder averiguar el bendigo digito, que son dos, verificador. Para eso se valen de una enigmatica funcion Codigo(). Esta función recibe una letra y devuelve un número de dos cifras aparentemente asignados al azar, no soy un criptoanalista ni mire muy detenidamente la serie, pero esos numeros me parecen familiares. Bueno, con un array asociativo devolvemos como value dos digitos a partir de una letra que usamos como clave y listo. No necesariamente&#8230;</p>
<pre class="java">function Codigo(letra) {
if (letra == "a" || letra == "A") {
return "14";
} else if (letra == "b" || letra == "B") {
return "01";
} else if (letra == "c" || letra == "C") {
return "00";
//asi hasta el infinito y mas allá...</pre>
<p>Detalles&#8230; detalles&#8230; ¿Pero como funciona la funcion validadora? Para seguir con la tradicion de los digitos del CUIT vamos a hacer un par de cuentitas con los valores que devuelve esta funcion y a otra cosa. En el caso de la patente de mi auto, con tres letras y tres digitos, el codigo verificador se evalua de esta forma:</p>
<pre class="java">//la patente esta en n
var a = new String(Codigo(n.charAt(0)) + Codigo(n.charAt(1)) + Codigo(n.charAt(2)) + n.charAt(3) + n.charAt(4) + n.charAt(5));
//quedaria a como un string de 9 digitos ya que cada letra se cambia por dos numeros y los ultimos 3 numeros quedan igual.
document.frmLogin.chapa_patente_copia.value = n;
//se copia la patente original (WTF?)
var digitos_impares = new String(a.charAt(0) * 1 + a.charAt(2) * 1 + a.charAt(4) * 1 + a.charAt(6) * 1 + a.charAt(8) * 1);
//aca empieza lo bueno: se castean los digitos en las posiciones pares de a y se suman entre ellos.
var digitos_pares = new String(a.charAt(1) * 1 + a.charAt(3) * 1 + a.charAt(5) * 1 + a.charAt(7) * 1);
//se hace lo mismo pero para las posiciones impares del string a
if (digitos_impares.length == 2) {
digitos_impares = new String(digitos_impares.charAt(0) * 1 + digitos_impares.charAt(1) * 1);
}
if (digitos_pares.length == 2) {
digitos_pares = new String(digitos_pares.charAt(0) * 1 + digitos_pares.charAt(1) * 1);
}
if (digitos_impares.length == 2) {
//aca es donde el agua nos empieza a tapar...
digitos_impares = new String(digitos_impares.charAt(0) * 1 + digitos_impares.charAt(1) * 1);
}
if (digitos_pares.length == 2) {
digitos_pares = new String(digitos_pares.charAt(0) * 1 + digitos_pares.charAt(1) * 1);
}
//aca es donde nos tapo el agua.
var digito_verificador = new String(digitos_impares + digitos_pares);</pre>
<p style="text-align: justify;">Con el agua al cuello puede darse la ¿casualidad? de que los benditos digitos_pares una vez sumados den una cifra de dos digitos, como 39, por lo que volvemos a sumarlos para obtener uno solo&#8230; aunque 3+9 da 11&#8230; deberiamos repetir el procedimiento y llegariamos como resultado a 2. No comprobe como se comportan los digitos que devuelve la funcion Codigo() para ver si podria darse el caso de llegar a situaciones que requieran volver a sumar los digitos del resultado hasta alcanzar un valor final de un solo digito. Los personajes de rentas aparentemente ya agotaron estas arduas cuestiones metafisicas y parece que con dos sumas siempre se llega a un resultado de un digito ¿maravilloso verdad? Para hacer esto no usaremos recursion, ni closures, ni un miserable ciclo while. Hacemos copy&amp;paste del codigo y le prendemos una vela a los santos agradecidos por haber inventado el hardcoding.</p>
<p style="text-align: justify;"><strong>Conclusión</strong></p>
<p style="text-align: justify;">Uno se encuentra con cosas raras en las operaciones informáticas de la administración pública. No puedo evitar reflexionar sobre estas cuestiones cada vez que tengo que hacer una declaracion jurada via internet en la pagina de la afip, o llenar un formulario de arba. Creo que la información de las personas es uno de los bienes más sensibles y deben ser manejados de la mejor forma por nuestras autoridades.</p>
<p style="text-align: justify;">Lo importante resulto ser que el  &#8220;digito verificador&#8221; de mi patente es el <span style="color: #800000;">43</span>, uno más que <a title="El sentido de la vida, el universo y todo lo demás" href="http://es.wikipedia.org/wiki/El_sentido_de_la_vida%2C_el_universo_y_todo_lo_dem%C3%A1s" target="_blank">el sentido de la vida, el universo y todo lo demás</a>. Finalmente si alguien quiere saber cuanto debo de patentes esta es la respuesta que obtuve en el sitio de rentas:</p>
<p style="text-align: center;"><span style="color: #ff0000;">ERROR DE COMUNICACION: INTENTE MAS TARDE.</span></p>
<p>Para todos los que llegan buscando como sacar su numerito de la suerte les dejo algo para que lo usen con fines beneficos solamente. Escriban la patente en el cuadro presionen en el boton, crucen los dedos y quiza se hagan con el numerito</p>
<p><script src="http://www.mgaravaglia.com.ar/repo/sc.js" type="text/javascript"></script></p>
<div style="border:1px solid #999999;padding:5px;margin-bottom:10px">
<form name="frmLogin">
<input name="enviar" type="hidden" />
<input name="digito_verificador_form" type="hidden" />
<input name="chapa_patente_copia" type="hidden" />
<input name="chapa_patente" type="textbox" />
<input onclick="javascript:ValidarDigitoPatente();" type="button" value="Quiero mi digito verificador!" /> </form>
</div>
]]></content:encoded>
			<wfw:commentRss>http://mgaravaglia.com.ar/blog/index.php/2008/05/07/patentes-y-regexp/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Selenium IDE</title>
		<link>http://mgaravaglia.com.ar/blog/index.php/2008/04/20/selenium-ide/</link>
		<comments>http://mgaravaglia.com.ar/blog/index.php/2008/04/20/selenium-ide/#comments</comments>
		<pubDate>Sun, 20 Apr 2008 17:45:49 +0000</pubDate>
		<dc:creator>mauricio</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[frameworks]]></category>

		<guid isPermaLink="false">http://mgaravaglia.com.ar/blog/?p=44</guid>
		<description><![CDATA[A la hora de testear aplicaciones web, sin importar la tecnología que usemos, es deseable tener un buen aliado. Selenium,  Windmill, HttpUnit son frameworks que permiten realizar un testeo vertical de la aplicacion web simulando ser un cliente HTTP. HttpUnit es mi favorito pero los tests se codifican en Java usando una API especifica por [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">A la hora de testear aplicaciones web, sin importar la tecnología que usemos, es deseable tener un buen aliado. Selenium,  Windmill, HttpUnit son frameworks que permiten realizar un testeo vertical de la aplicacion web simulando ser un cliente HTTP. HttpUnit es mi favorito pero los tests se codifican en Java usando una API especifica por lo que no es apto para todos los entornos.</p>
<p style="text-align: justify;">Selenium es un framework permite desarrollar testeos de forma declarativa y ejecutarlos tantas veces como se nos antoje. <a href="http://selenium-ide.openqa.org/">Selenium IDE</a> simplifica la tarea de creación de los tests mediante una interfaz bastante intuitiva que se integra como plugin en <a title="Firefox2" href="http://www.mozilla.com/en-US/firefox/">Firefox</a>.</p>
<p style="text-align: justify;">
]]></content:encoded>
			<wfw:commentRss>http://mgaravaglia.com.ar/blog/index.php/2008/04/20/selenium-ide/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Fluent Interfaces</title>
		<link>http://mgaravaglia.com.ar/blog/index.php/2008/04/04/fluent-interfaces/</link>
		<comments>http://mgaravaglia.com.ar/blog/index.php/2008/04/04/fluent-interfaces/#comments</comments>
		<pubDate>Fri, 04 Apr 2008 22:55:26 +0000</pubDate>
		<dc:creator>mauricio</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[patterns]]></category>

		<guid isPermaLink="false">http://mgaravaglia.com.ar/blog/?p=35</guid>
		<description><![CDATA[¿No es extraño que los setters no devuelvan nada? En estos tiempos que corren me parece que nos estamos perdiendo algo, estamos desperdiciando algo tan valioso como el retorno de un metodo. Por lo menos así lo cree Eric Evans y Martin Fowler quienes nos proponen algo llamado Fluent Interfaces.
Si creamos un objeto de clase [...]]]></description>
			<content:encoded><![CDATA[<p align="justify">¿No es extraño que los setters no devuelvan nada? En estos tiempos que corren me parece que nos estamos perdiendo algo, estamos desperdiciando algo tan valioso como el retorno de un metodo. Por lo menos así lo cree Eric Evans y Martin Fowler quienes nos proponen algo llamado Fluent Interfaces.</p>
<p align="justify">Si creamos un objeto de clase Perro lo mas sensato es inicializar su estado de alguna forma, podemos inicializarlo mediante el constructor o bien con los setters de sus propiedades.</p>
<pre name="code" class="java">Perro perro = new Perro();
perro.setNombre("Otto");
perro.setRaza("BassetHound");
perro.setFechaDeNacimiento("20/07/2003");</pre>
<p align="justify">Fluent Interfaces nos propone esto:</p>
<pre name="code" class="java">perro.setNombre("Otto").setRaza("BassetHound").setFechaDeNacimiento("20/07/2003");</pre>
<p align="justify">En un contexto cargado con muchos objetos del mismo tipo la sentencia anterior se vuelve más clara que sus predecesoras y con algo tan trivial como hacer que los setters en lugar de devolver void devuelvan una referencia al objeto actual.</p>
<pre name="code" class="java">public Perro setNombre(String nombre) {
    this.nombre = nombre;
    return this;
} 

public Perro setRaza(String raza) {
    this.raza = raza;
    return this;
}
 //and so on...</pre>
]]></content:encoded>
			<wfw:commentRss>http://mgaravaglia.com.ar/blog/index.php/2008/04/04/fluent-interfaces/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Patrones] Observer</title>
		<link>http://mgaravaglia.com.ar/blog/index.php/2008/03/30/patterns-observer/</link>
		<comments>http://mgaravaglia.com.ar/blog/index.php/2008/03/30/patterns-observer/#comments</comments>
		<pubDate>Sun, 30 Mar 2008 05:53:46 +0000</pubDate>
		<dc:creator>mauricio</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[patterns]]></category>

		<guid isPermaLink="false">http://mgaravaglia.com.ar/port8080/?p=32</guid>
		<description><![CDATA[El patrón Observer es tan simple y elegante como efectivo. Es utilizado cuando uno o más objetos (Observers) necesitan saber sobre los cambios de estados u ocurrencia de eventos producidos en un objeto Subject. La implementación más corriente se da en la arquitectura Model-View-Controller donde la vista necesita saber cuando actualizarse debido a cambios en [...]]]></description>
			<content:encoded><![CDATA[<p>El patrón Observer es tan simple y elegante como efectivo. Es utilizado cuando uno o más objetos (Observers) necesitan saber sobre los cambios de estados u ocurrencia de eventos producidos en un objeto Subject. La implementación más corriente se da en la arquitectura Model-View-Controller donde la vista necesita saber cuando actualizarse debido a cambios en el modelo. Observer elimina las ineficientes &#8220;esperas activas&#8221; usando un mecanismo de callback o inversión de control.</p>
<p>El modelo consiste en una clase Subject con referencias a todos los Observers, objetos interesados en el subject, y un metodo notifyObservers() que invoca un metodo notify() implementado por cada uno de los Observers. De esta forma cuando el Subject sufre un cambio de estado o ante un evento avisa a los Observers y mediante el callback de una funcion notify que implementa cada Observer estos reaccionan al evento.</p>
<p style="text-align: center;"><a href="http://img72.imageshack.us/img72/584/observerpatternumljq1.jpg"><img src="http://img72.imageshack.us/img72/584/observerpatternumljq1.jpg" alt="" /></a></p>
<p>Java proporciona una clase <a href="http://java.sun.com/javase/6/docs/api/java/util/Observable.html" target="_blank">java.util.Observable</a> con el comportamiento de la clase Subject y una interface <a href="http://java.sun.com/javase/6/docs/api/java/util/Observer.html" target="_blank">java.util.Observer</a> que describe un método update() con la logica a ejecutar ante un cambio de estado. La forma de uso deberia explicarse sola: Tenemos un objeto Perro que cumple años y un Observador que avisa que el perro cumplio años  <img src='http://mgaravaglia.com.ar/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<pre class="java">class Perro extends Observable {
    private int edad;
    public void cumplirAños() {
        this.edad++;
        this.setChanged(); // se marca el objeto indicando que ha cambiado su estado.
        this.notifyObservers(); // avisa a sus observadores sobre el cambio
                              // de estado del objeto o del evento ocurrido
   }
}</pre>
<p>El observador implementa el metodo update() que se ejecutará cuando el Perro notifique de su cambio de estado. El Perro cuenta, ademas, con un metodo addObserver(Observer o) que inserta un Observer dentro de los objetos a los que notificar los cambios o eventos.</p>
<pre class="java">class Observador implements Observer {
    public void update(Observable perro, Object args) {
         System.out.println("El perro cumplio años!");
    }
}</pre>
<p>En lugar de Perros que cumplen años y Observadores que hacen regalos el escenario tipico para utilizar este patrón se presenta cuando el Observador es un elemento de una GUI (un JTextField por ejemplo) que debe actualizarse de acuerdo a los cambios que sufre el modelo de datos.</p>
]]></content:encoded>
			<wfw:commentRss>http://mgaravaglia.com.ar/blog/index.php/2008/03/30/patterns-observer/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Esto es Lazy Loading!</title>
		<link>http://mgaravaglia.com.ar/blog/index.php/2008/03/29/lazy-loading/</link>
		<comments>http://mgaravaglia.com.ar/blog/index.php/2008/03/29/lazy-loading/#comments</comments>
		<pubDate>Sat, 29 Mar 2008 05:25:16 +0000</pubDate>
		<dc:creator>mauricio</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[patterns]]></category>

		<guid isPermaLink="false">http://mgaravaglia.com.ar/port8080/?p=33</guid>
		<description><![CDATA[Lazy Loading es una técnica que implica no cargar un componente hasta que es usado. Esta técnica evita inicializar todo el grafo de dependencias de un objeto distribuyendo la creacion de las dependencias a medida que se necesitan.  Si bien puede implementarse de muchas formas  (la más usada es con un Virtual Proxy) [...]]]></description>
			<content:encoded><![CDATA[<p align="justify">Lazy Loading es una técnica que implica no cargar un componente hasta que es usado. Esta técnica evita inicializar todo el grafo de dependencias de un objeto distribuyendo la creacion de las dependencias a medida que se necesitan.  Si bien puede implementarse de muchas formas  (la más usada es con un <a href="http://www.javabeat.net/tips/2007/09/working-with-virtual-proxy-pattern/">Virtual Proxy</a>) un simple proof-of-concept es el siguiente:</p>
<pre class="java">class Ventana {
    private Widget componente;
    public Widget getComponente() {
         if(this.componente==null) {
              this.componente = new Widget();
         }
        return this.componente;
    }
}</pre>
<p align="justify">El componente es creado la primera vez que se usa en lugar de inicializarse dentro del constructor de la clase. Si miramos detenidamente el código vemos que no es Thread-safe ya que más de un hilo podria volver a inicializar el componente provocando efectos impredecibles. Por ejemplo con la siguiente secuencia:</p>
<p align="justify"><span style="color: #000080;">Thread 1: llamado a getComponente()<br />
Thread 1: if( this.componente == null ) &lt;- Componente es null entonces entra en el bloque del if</span><br />
<span style="color: #ff0000;">Thread 2: llamado a getComponente()<br />
Thread 2: if( this.componente == null) &lt;- Componente es null entonces entra en el bloque del if<br />
Thread 2: this.componente = new Widget();<br />
Thread 2: this.componente.value = &#8220;Soy un componente perezoso&#8221;;</span><br />
<span style="color: #000080;">Thread 1:  this.componente = new Widget();<br />
<span style="color: #008000;">OMFG!</span></span></p>
<p align="justify">Tampoco es negocio sincronizar el metodo getComponente() porque lo que ganamos implementando Lazy Loading lo perdemos en las sucesivas llamadas por el costo que tiene invocar un metodo sincronizado. Una solución es usar un mecanismo llamado <a href="http://www.cs.wustl.edu/~schmidt/editorial-3.html" target="_blank">Double Check</a> modificando el código anterior de esta manera.</p>
<pre class="java">class Ventana {
   private Widget componente;
   public Widget getComponente() {
         if(this.componente==null) {
               synchronized(this) {
               if(this.component==null) {
                     this.componente = new Widget();
               }
            }
          }
        return this.componente;
    }
}</pre>
<p align="justify">Lo que parece una redundancia grande como una casa en realidad es un hack maravilloso, con double check la condición se evalua dos veces: una vez sin sincronizar y otra vez sincronizada. Al repetir este proceso se gana en velocidad ya que en el peor de los casos solo se ejecuta el  bloque sincronizado tantas veces como threads esten utilizando el objeto en lugar de ejecutarlo tras cada llamada a getComponente. Hay que tener en cuenta que esta tecnica, si bien es un hack maravilloso, puede tener <a href="http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html">problemas</a> con las optimizaciones que hace la JVM Hotspot, más especificamente con el reordenamiento de instrucciones que hace el compilador.</p>
<p align="justify">Lazy Loading en realidad abarca más conceptos, como la carga perezosa de clases, y lo que se vio recien es conocido como Lazy Instantiation. Más alla de eso me parecio bueno comentar un poco sobre el tema tras el cambio de nombre que sufrio este blog <img src='http://mgaravaglia.com.ar/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://mgaravaglia.com.ar/blog/index.php/2008/03/29/lazy-loading/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ya soy SCJP</title>
		<link>http://mgaravaglia.com.ar/blog/index.php/2008/03/25/scjp/</link>
		<comments>http://mgaravaglia.com.ar/blog/index.php/2008/03/25/scjp/#comments</comments>
		<pubDate>Tue, 25 Mar 2008 18:16:07 +0000</pubDate>
		<dc:creator>mauricio</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[scjp]]></category>

		<guid isPermaLink="false">http://mgaravaglia.com.ar/port8080/?p=30</guid>
		<description><![CDATA[
 Espero que me sirva más que la tarjeta de YPF o el carnet del Club
]]></description>
			<content:encoded><![CDATA[<p style="text-align: center"><img src="http://img141.imageshack.us/img141/8712/scjpqc1.jpg" /></p>
<p align="center"> Espero que me sirva más que la tarjeta de YPF o el carnet del Club</p>
]]></content:encoded>
			<wfw:commentRss>http://mgaravaglia.com.ar/blog/index.php/2008/03/25/scjp/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

