<?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; Javascript</title>
	<atom:link href="http://mgaravaglia.com.ar/blog/index.php/tag/javascript/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>String.format en Javascript</title>
		<link>http://mgaravaglia.com.ar/blog/index.php/2010/05/31/string-format-en-javascript/</link>
		<comments>http://mgaravaglia.com.ar/blog/index.php/2010/05/31/string-format-en-javascript/#comments</comments>
		<pubDate>Mon, 31 May 2010 14:55:24 +0000</pubDate>
		<dc:creator>mauricio</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[strings]]></category>

		<guid isPermaLink="false">http://mgaravaglia.com.ar/blog/?p=98</guid>
		<description><![CDATA[Dejo a continuacion una funcion bastante util que se comporta como el String.format de Java. En Javascript es comun andar componiendo strings a partir de constantes, variables, literales y otras cosas para generar una salida HTML. Asi que en lugar de escribir:

var v = "&#60;span style='color:"+myColor+"'&#62;"+singleton.myText()+"&#60;/span&#62;&#60;span id='"+entityId+"'&#62;"+Text+"&#60;/span&#62;";

podemos poner:
var v = "&#60;span style='color:{0}'&#62; {1} &#60;/span&#62; &#60;span [...]]]></description>
			<content:encoded><![CDATA[<p>Dejo a continuacion una funcion bastante util que se comporta como el <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html#format%28java.lang.String,%20java.lang.Object...%29">String.format</a> de Java. En Javascript es comun andar componiendo strings a partir de constantes, variables, literales y otras cosas para generar una salida HTML. Asi que en lugar de escribir:</p>
<pre name="code" class="javascript">
var v = "&lt;span style='color:"+myColor+"'&gt;"+singleton.myText()+"&lt;/span&gt;&lt;span id='"+entityId+"'&gt;"+Text+"&lt;/span&gt;";
</pre>
<p>podemos poner:</p>
<pre name="code" class="java">var v = "&lt;span style='color:{0}'&gt; {1} &lt;/span&gt; &lt;span id='{2}'&gt;{3}&lt;/span&gt;".format(myColor,singleton.myText(),entityId,Text);</pre>
<p>más lindo no?</p>
<pre name="code" class="java">
// Replaces {0},{1},{n} with the arguments.
String.prototype.format = function() {
	var i = 0;
	var string = (typeof (this) == "function" &amp;&amp; !(i++)) ? arguments[0] : this;
	while(i &lt; arguments.length) {
		string = string.replaceAll('\\{' + i + '\\}', arguments[i]);
                i++;
        }
	return string;
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://mgaravaglia.com.ar/blog/index.php/2010/05/31/string-format-en-javascript/feed/</wfw:commentRss>
		<slash:comments>1</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>10</slash:comments>
		</item>
	</channel>
</rss>

