<?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>AmarellOcio &#187; Algoritmia y programación</title>
	<atom:link href="http://blog.amarello.com.mx/category/programacion/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.amarello.com.mx</link>
	<description>Tecnologías de información, seguridad, ciencia y entretenimiento</description>
	<lastBuildDate>Mon, 23 Apr 2012 16:00:22 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Sesión SSH duradera</title>
		<link>http://blog.amarello.com.mx/2012/04/23/sesion-ssh-duradera/</link>
		<comments>http://blog.amarello.com.mx/2012/04/23/sesion-ssh-duradera/#comments</comments>
		<pubDate>Mon, 23 Apr 2012 15:58:48 +0000</pubDate>
		<dc:creator>Damián</dc:creator>
				<category><![CDATA[Algoritmia y programación]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://blog.amarello.com.mx/?p=977</guid>
		<description><![CDATA[Las conexiones SSH, así como las HTTP y de otros servicios, tienen por defecto una política de timeout que cierra la conexión si no hay actividad, por seguridad y por eficiencia para liberar los recursos no usados. En muchas ocasiones, como cuando se hacen túneles SSH, es más cómodo mantener una conexión abierta que no [...]]]></description>
			<content:encoded><![CDATA[<p>Las conexiones SSH, así como las HTTP y de otros servicios, tienen por defecto una política de timeout que cierra la conexión si no hay actividad, por seguridad y por eficiencia para liberar los recursos no usados.</p>
<p>En muchas ocasiones, como cuando se hacen túneles SSH, es más cómodo mantener una conexión abierta que no se cierre por timeout. Una manera de hacerlo es mediante las políticas del servidor SSH, pero otra manera más sencilla es hacerlo por cada conexión desde el cliente.</p>
<p>Comúnmente en los clientes SSH en Unix están las opciones TCPKeepAlive y ServerAliveInterval. La primera indica que se quiere mandar un paquete SSL por TCP hacia el servidor para mantener la actividad y la otra indica el intervalo en segundos en el cual se van a mandar los paquetes. Un ejemplo de uso sería el siguiente:</p>
<pre>
<code>ssh -o TCPKeepAlive=yes -o ServerAliveInterval=5 usuario@servidor</code>
</pre>
<p>Así ya podrán mantener sus sesiones de SSH abiertas todo el tiempo que quieran y no olviden cerrarlas cuando las dejen de usar.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.amarello.com.mx/2012/04/23/sesion-ssh-duradera/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Developer Tools incompletas en OS X Lion</title>
		<link>http://blog.amarello.com.mx/2012/03/01/developer-tools-incompletas-en-os-x-lion/</link>
		<comments>http://blog.amarello.com.mx/2012/03/01/developer-tools-incompletas-en-os-x-lion/#comments</comments>
		<pubDate>Thu, 01 Mar 2012 07:40:25 +0000</pubDate>
		<dc:creator>Eduardo</dc:creator>
				<category><![CDATA[Algoritmia y programación]]></category>
		<category><![CDATA[Apple]]></category>

		<guid isPermaLink="false">http://blog.amarello.com.mx/?p=966</guid>
		<description><![CDATA[Después de hace unos meses de usar el OS X Lion y tener previamente instalado XCode 4 desde la App Store, me veo en la necesidad de instalar el comando watch con MacPorts, y cual es mi sorpresa que me muestra un error rarísimo, y un poco más tarde trato de instalar un módulo de [...]]]></description>
			<content:encoded><![CDATA[<p>Después de hace unos meses de usar el OS X Lion y tener previamente instalado XCode 4 desde la App Store, me veo en la necesidad de instalar el comando watch con MacPorts, y cual es mi sorpresa que me muestra un error rarísimo, y un poco más tarde trato de instalar un módulo de Perl y oh sorpresa el comando make no esta instalado, por lo que me doy cuenta de que el XCode que instalas desde la App Store no viene la opción de &#8220;Command Line Tools&#8221; que en versiones pasadas era muy facil instalar, y bueno solo les dejo el tip de que para bajar dichas herramientas necesitan estar registrados como desarrolladores y <a href="https://developer.apple.com/downloads/index.action">bajarlas desde aqui</a> una vez instaladas todo vuelve a la normalidad.</p>
<p>Que puedo decirles no estoy a favor de que Apple se olvide de los Power Users pero en fin&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.amarello.com.mx/2012/03/01/developer-tools-incompletas-en-os-x-lion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tag Cloud en PHP</title>
		<link>http://blog.amarello.com.mx/2010/07/21/tag-cloud-en-php/</link>
		<comments>http://blog.amarello.com.mx/2010/07/21/tag-cloud-en-php/#comments</comments>
		<pubDate>Thu, 22 Jul 2010 03:24:40 +0000</pubDate>
		<dc:creator>Eduardo</dc:creator>
				<category><![CDATA[Algoritmia y programación]]></category>

		<guid isPermaLink="false">http://blog.amarelloartis.com/?p=913</guid>
		<description><![CDATA[Necesitaba hoy de un tag cloud sencillo en php y encontré muchos ejemplos que no se me hicieron muy buenos, así que programé uno. Se los dejo para que lo usen: /** $wordlist en la forma array('palabra1' =&#62; array('numero' =&#62; 5), 'palabra2' =&#62; array('numero' =&#62; 3)) */ function tagCloud($wordlist, $fmax) { //esto sive para que [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.amarelloartis.com/wp-content/uploads/2010/07/TagCloudBasedOnFlickr.png" alt="" title="TagCloudBasedOnFlickr" width="736" height="559" class="aligncenter size-full wp-image-921" /></p>
<p>Necesitaba hoy de un tag cloud sencillo en php y encontré muchos ejemplos que no se me hicieron muy buenos, así que programé uno. Se los dejo para que lo usen:</p>
<p><code></p>
<pre>/**
$wordlist en la forma array('palabra1' =&gt; array('numero' =&gt; 5), 'palabra2' =&gt; array('numero' =&gt; 3))
*/
function tagCloud($wordlist, $fmax) {
	//esto sive para que el tamaño minimo de la letra sea 10px
	if($fmax &lt; 20) {
            $fmax = 10;
 	} else {
	     $fmax -= 10;
        }
        //primera recorrida para obtener el maximo y el minimo
        $tmin = 0;
        $tmax = 0;
        foreach($wordlist as $key =&gt; $value) {
		if($value['numero'] &gt; $tmax || $tmax == 0)
			$tmax = $value['numero'];
		if($value['numero'] &lt; $tmin || $tmin == 0)
                        $tmin = $value['numero'];
         }
         foreach($wordlist as $key =&gt; $value) {
		if($value['numero'] &gt; $tmin) {
                        $si = ceil(($fmax * ($value['numero'] - $tmin) / ($tmax - $tmin)))+10;
                } else {
			$si = 10;
		}
		$wordlist[$key]['size'] = $si;
	}
	return $wordlist;
}</pre>
<p></code></p>
<p>Su uso es bastante sencillo. Tenemos que meter todos los elementos a un array de la siguiente forma:</p>
<pre>$wordlist = array('palabra1' =&gt; array('numero' =&gt; 5), 'palabra2' =&gt; array('numero' =&gt; 3));
//30 es el tamaño máximo de la letra
$wordlist = tagCloud($wordlist, 30);
foreach($wordlist as $key =&gt; $value) {
     echo '&lt;span style="font-size: '.$value['size'].'px;"&gt;'.$key.'&lt;/span&gt; ';
}</pre>
<p>Nótese que en el array podemos meter los valores que queramos y que necesitemos, sólo debe estar presente la llave llamada <strong>numero</strong>.</p>
<p>Me basé en el artículo de wikipedia: <a href="http://en.wikipedia.org/wiki/Tag_cloud">http://en.wikipedia.org/wiki/Tag_cloud</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.amarello.com.mx/2010/07/21/tag-cloud-en-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Autenticación segura sin SSL/TLS</title>
		<link>http://blog.amarello.com.mx/2010/06/12/autenticacion-segura-sin-ssl-tls/</link>
		<comments>http://blog.amarello.com.mx/2010/06/12/autenticacion-segura-sin-ssl-tls/#comments</comments>
		<pubDate>Sat, 12 Jun 2010 23:34:51 +0000</pubDate>
		<dc:creator>Damián</dc:creator>
				<category><![CDATA[Algoritmia y programación]]></category>
		<category><![CDATA[Aplicaciones Web]]></category>
		<category><![CDATA[Redes]]></category>
		<category><![CDATA[Seguridad en Información]]></category>

		<guid isPermaLink="false">http://blog.amarelloartis.com/?p=867</guid>
		<description><![CDATA[Muchas veces no es necesario o es demasiado cifrar toda la comunicación entre el cliente y el servidor, por razones de performance o por el sobrecosto de implementar un esquema de PKI (Public Key Infraestructure) para usar SSL/TLS. Pero siempre hay algo que es necesario proteger por seguridad: las credenciales de autenticación del usuario. Por [...]]]></description>
			<content:encoded><![CDATA[<p>Muchas veces no es necesario o es demasiado cifrar toda la comunicación entre el cliente y el servidor, por razones de performance o por el sobrecosto de implementar un esquema de PKI (Public Key Infraestructure) para usar SSL/TLS. Pero siempre hay algo que es necesario proteger por seguridad: las credenciales de autenticación del usuario. Por lo que en este post explicaré cómo se puede hacer una autenticación sin enviar esa información (no, no es telepatía).</p>
<p><strong>Protocolos de conocimiento cero (ZKP)</strong></p>
<p>Sabemos que sin un esquema de cifrado de llave pública es trivial para un atacante interceptar la información que se envía entre el cliente y el servidor, pero el sistema debe tener alguna manera de autenticar a los usuarios del sistema. Necesitamos enviar algo que si un atacante intercepta no pueda utilizar para autenticarse. Esto se conoce como un <em>protocolo de conocimiento cero</em> (<a href="http://en.wikipedia.org/wiki/Zero-knowledge_proof">Zero-knowledge proof</a>), y en palabras coloquiales significa: &#8220;probar que poseemos cierta información sin revelar esa información&#8221;.</p>
<p>Como comúnmente la única información que queremos &#8220;probar que poseemos pero no queremos revelar&#8221; es la contraseña, voy a explicar el esquema que usa MySQL para implementar su autenticación de usuarios. Los detalles no están explicados de manera formal en la documentación de MySQL pero alguien se tomó el tiempo de leer el código fuente y explicar cómo funciona (<a href="http://blog.vorant.com/2006/03/mysql-41x-authentication-internals.html">MySQL 4.1.x authentication internals</a>).</p>
<p><strong>¿Cómo se almacenan las contraseñas?</strong></p>
<p>Lo primero que hay que tener en cuenta es que, siguiendo los principios básicos de almacenamiento seguro de contraseñas, éstas se almacenan en el sistema sólo como un <em>hash criptográfico</em>. Que tiene la propiedad de ser <strong>prácticamente irreversible</strong> y <strong>prácticamente único</strong>. Por lo que esta es la primera parte del ZKP, ya que sólo quien conozca la contraseña podrá generar el <em>hash criptográfico</em> que le pertenece.</p>
<p>Desde MySQL 4.1 las contraseñas de usuario están almacenadas en la tabla &#8220;mysql.user&#8221; en la columna &#8220;Password&#8221; de la siguiente manera: <img src='http://s.wordpress.com/latex.php?latex=SHA1%28SHA1%28password%29%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='SHA1(SHA1(password))' title='SHA1(SHA1(password))' class='latex' />. Donde <img src='http://s.wordpress.com/latex.php?latex=SHA1&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='SHA1' title='SHA1' class='latex' /> es el <em>hash criptográfico</em> <a href="http://en.wikipedia.org/wiki/SHA-1">SHA-1</a>.</p>
<p><strong>La transmisión</strong></p>
<p>Si cada vez que el cliente se quiera autenticar sólo transmitiera <img src='http://s.wordpress.com/latex.php?latex=SHA1%28SHA1%28password%29%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='SHA1(SHA1(password))' title='SHA1(SHA1(password))' class='latex' />, cumpliría con el principio de no revelar la contraseña, pero un atacante podría capturar y enviar después <img src='http://s.wordpress.com/latex.php?latex=SHA1%28SHA1%28password%29%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='SHA1(SHA1(password))' title='SHA1(SHA1(password))' class='latex' /> para  autenticarse exitosamente aún sin conocer la contraseña. Por lo que necesitamos agregar más cosas al protocolo para que la información que transmite el cliente sólo sea útil para un intento de autenticación.</p>
<p>Este sería el esquema cliente-servidor para la transmisión:</p>
<ol>
<li>Se inicia el intento de autenticación</li>
<li>El servidor genera una cadena aleatoria <img src='http://s.wordpress.com/latex.php?latex=salt&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='salt' title='salt' class='latex' /> y se la transmite al cliente.</li>
<li>El cliente calcula <img src='http://s.wordpress.com/latex.php?latex=S_1%20%3D%20SHA1%28pass%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='S_1 = SHA1(pass)' title='S_1 = SHA1(pass)' class='latex' />, <img src='http://s.wordpress.com/latex.php?latex=S_2%20%3D%20SHA1%28S_1%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='S_2 = SHA1(S_1)' title='S_2 = SHA1(S_1)' class='latex' /> y <img src='http://s.wordpress.com/latex.php?latex=S_3%20%3D%20SHA1%28salt%2BS_2%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='S_3 = SHA1(salt+S_2)' title='S_3 = SHA1(salt+S_2)' class='latex' /> (aqui <img src='http://s.wordpress.com/latex.php?latex=%2B&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='+' title='+' class='latex' /> significa concatenación).</li>
<li>Finalmente el cliente transmite <img src='http://s.wordpress.com/latex.php?latex=M%20%3D%20S_3%20%5Coplus%20S_1&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='M = S_3 \oplus S_1' title='M = S_3 \oplus S_1' class='latex' />. (aquí <img src='http://s.wordpress.com/latex.php?latex=%5Coplus&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\oplus' title='\oplus' class='latex' /> significa bitwise XOR)</li>
</ol>
<p><strong>Autenticación</strong></p>
<p>El servidor sólo conoce <img src='http://s.wordpress.com/latex.php?latex=H%20%3D%20SHA1%28SHA1%28password%29%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='H = SHA1(SHA1(password))' title='H = SHA1(SHA1(password))' class='latex' />, que está almacenado en la tabla de usuarios, y <img src='http://s.wordpress.com/latex.php?latex=salt&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='salt' title='salt' class='latex' />. Para autenticar hace lo siguiente:</p>
<ol>
<li>Calcula  <img src='http://s.wordpress.com/latex.php?latex=S%27_3%20%3D%20SHA1%28salt%2BH%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='S&#039;_3 = SHA1(salt+H)' title='S&#039;_3 = SHA1(salt+H)' class='latex' />.</li>
<li>Calcula  <img src='http://s.wordpress.com/latex.php?latex=S%27_1%20%3D%20M%5Coplus%20S%27_3&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='S&#039;_1 = M\oplus S&#039;_3' title='S&#039;_1 = M\oplus S&#039;_3' class='latex' />.</li>
<li>Calcula <img src='http://s.wordpress.com/latex.php?latex=S%27_2%20%3D%20SHA1%28S%27_1%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='S&#039;_2 = SHA1(S&#039;_1)' title='S&#039;_2 = SHA1(S&#039;_1)' class='latex' />.</li>
<li>Sólo si <img src='http://s.wordpress.com/latex.php?latex=H%3DS%27_2&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='H=S&#039;_2' title='H=S&#039;_2' class='latex' /> la autenticación es exitosa.</li>
</ol>
<p><strong>Observaciones</strong></p>
<p>Nunca se transmite <img src='http://s.wordpress.com/latex.php?latex=S_2&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='S_2' title='S_2' class='latex' /> ni <img src='http://s.wordpress.com/latex.php?latex=S_1&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='S_1' title='S_1' class='latex' />, por lo que la fortaleza está en que este ZKP verifica que el cliente conoce <img src='http://s.wordpress.com/latex.php?latex=SHA1%28password%29%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='SHA1(password))' title='SHA1(password))' class='latex' /> y <img src='http://s.wordpress.com/latex.php?latex=SHA1%28SHA1%28password%29%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='SHA1(SHA1(password))' title='SHA1(SHA1(password))' class='latex' /> pero sin revelar esa información, y que sería casi imposible que un atacante poseyera sin conocer <img src='http://s.wordpress.com/latex.php?latex=password&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='password' title='password' class='latex' />.</p>
<p>También hay que observar que <img src='http://s.wordpress.com/latex.php?latex=salt&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='salt' title='salt' class='latex' /> es una cadena única por cada intento de autenticación, o sea que esa cadena siempre está cambiando.</p>
<p><strong>Implementación</strong></p>
<p>Próximamente trabajaremos en una implementación de este esquema para aplicaciones web usando JavaScript y PHP, que publicaremos bajo licencia LGPL.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.amarello.com.mx/2010/06/12/autenticacion-segura-sin-ssl-tls/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>One-Time Pad el cifrado perfecto</title>
		<link>http://blog.amarello.com.mx/2009/03/25/one-time-pad-el-cifrado-perfecto/</link>
		<comments>http://blog.amarello.com.mx/2009/03/25/one-time-pad-el-cifrado-perfecto/#comments</comments>
		<pubDate>Wed, 25 Mar 2009 08:01:16 +0000</pubDate>
		<dc:creator>Eduardo</dc:creator>
				<category><![CDATA[Algoritmia y programación]]></category>
		<category><![CDATA[Seguridad en Información]]></category>
		<category><![CDATA[bruce schneier]]></category>
		<category><![CDATA[one time pad]]></category>
		<category><![CDATA[seguridad]]></category>

		<guid isPermaLink="false">http://blog.amarelloartis.com/?p=808</guid>
		<description><![CDATA[Hay quienes creen que no existe un método de cifrado perfecto, o un cifrado que te pueda garantizar seguridad absoluta y se equivocan. El método de cifrado de One-Time Pad, que fue inventado en 1917 por el Mayor Joseph Mauborgne y Gilbert Vernam de AT&#038;T. Claude Shannon, 25 años después, se encargó de demostrar con [...]]]></description>
			<content:encoded><![CDATA[<p>Hay quienes creen que no existe un método de cifrado perfecto, o un cifrado que te pueda garantizar seguridad absoluta y se equivocan.</p>
<p>El método de cifrado de One-Time Pad, que fue inventado en 1917 por el Mayor Joseph Mauborgne y Gilbert Vernam de AT&#038;T. Claude Shannon, 25 años después, se encargó de demostrar con la teoría de la información que este cifrado cumple con ser un <em>secreto perfecto</em>, lo que quiere decir que el contenido del mensaje no puede aportar nada de información a un atacante.</p>
<p>Es un método que sin importar el poder computacional que se tenga o si se haya inventado la computadora cuántica o si los extraterrestres de Andrómeda vengan a la tierra con sus métodos computacionales inimaginables, aún asi será seguro. </p>
<p><b>Preliminares</b></p>
<p>Necesitamos una llave de la misma longitud que el mensaje, la cual deberá ser de verdad aleatoria y no pseudo aleatoria. Además esta llave se supone que las dos partes la deben conocer (problema de intercambio de llaves) y cuando una parte cifre el mensaje debe destruir esa llave de alguna forma que no pueda recuperarse y luego enviar el mensaje cifrado, luego la otra parte va a descifrarlo y al terminar de hacerlo debe destruir la llave de nuevo.</p>
<p><strong>Es primordial que no se vuelva a usar la misma llave dos veces pues un criptoanalista podría romper el cifrado sabiendo dos mensajes diferentes que se encriptaron con la misma llave.</strong></p>
<p><b>¿Cómo funciona?</b></p>
<p>Es algo muy simple de entender, teniendo el texto:</p>
<input type="text" name="mensaje" id="mensaje" onkeyup="actualiza();" value="AMARELLOCIO" /></p>
<p>Teniendo la llave:</p>
<input type="text" name="llave" id="llave" onkeyup="actualiza();" value="RFTWKCGFRTH" /></p>
<p>El texto cifrado sería:</p>
<input type="text" name="cifrado" id="cifrado" />
<p><script type="text/javascript" >
var charCodeCero = ("A".charCodeAt(0))-1;
function oneTimePad(mensaje, llave) {
	mensaje = mensaje.toUpperCase();
	llave = llave.toUpperCase();
	var cifrado = "";
    for(var i = 0; i < mensaje.length; i++) {
		cifrado += String.fromCharCode((( mensaje.charCodeAt(i) - charCodeCero + llave.charCodeAt(i) - charCodeCero ) % 26) + charCodeCero);
	}
	return cifrado;
}
function actualiza() {
	document.getElementById("cifrado").value = oneTimePad(document.getElementById("mensaje").value, document.getElementById("llave").value);
}
actualiza();
</script></p>
<p>Porque:<br />
<code><br />
A + R mod 26 = S<br />
M + F  mod 26 = S<br />
A + T mod 26 = U<br />
</code></p>
<p>Suponiendo que A vale 1 y R vale 17: 1+17 = 18 y 18 / 26 nos daría como residuo 18, entonces el 18 corresponde a la letra S.</p>
<p>Es importante ver que no puede romperse incluso si pudieramos calcular todas las posibilidades y buscar mensajes coherentes, pues al decifrarlo podría decir SIVOY como NOVOY entonces es imposible saber cual es el mensaje cifrado sin saber la llave. Según dicen, los Rusos cifraron algunos mensajes con este método y siguen hasta la fecha sin poderse descifrar, y así seguirán para siempre.</p>
<p>El problema con este método y en general con cualquier método de cifrado simétrico es el intercambio de llaves, pues ¿cómo podrías intercambiar la clave del One Time Pad de una manera segura?</p>
<p><strong>Fin</strong></p>
<p>Si quieren profundizar más en el tema podrían leer en la página 15 del libro <a href="http://schneier.com/book-applied.html">Applied Cryptography</a> escrito por Bruce Schneier que explica con un poco más de detalle este algoritmo.</p>
<p>Con este código en javascript podríamos obtenerlo:</p>
<pre><code>
var charCodeCero = ("A".charCodeAt(0))-1;
function oneTimePad(mensaje, llave) {
	mensaje = mensaje.toUpperCase();
	llave = llave.toUpperCase();
	var cifrado = "";
        for(var i = 0; i < mensaje.length; i++) {
		cifrado += String.fromCharCode((( mensaje.charCodeAt(i) - charCodeCero +
                                                 llave.charCodeAt(i) - charCodeCero
                                                 ) % 26) + charCodeCero);
	}
	return cifrado;
}
</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.amarello.com.mx/2009/03/25/one-time-pad-el-cifrado-perfecto/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Desmitificando RSA de 1025 bits</title>
		<link>http://blog.amarello.com.mx/2009/03/13/desmitificando-rsa-de-1025-bits/</link>
		<comments>http://blog.amarello.com.mx/2009/03/13/desmitificando-rsa-de-1025-bits/#comments</comments>
		<pubDate>Fri, 13 Mar 2009 14:54:47 +0000</pubDate>
		<dc:creator>Damián</dc:creator>
				<category><![CDATA[Algoritmia y programación]]></category>
		<category><![CDATA[Matemáticas]]></category>
		<category><![CDATA[Seguridad en Información]]></category>

		<guid isPermaLink="false">http://blog.amarelloartis.com/?p=746</guid>
		<description><![CDATA[Cuando se habla de RSA, se suele especular o fantasear sobre supuesta tecnología ultrasecreta que pudieran tener las agencias de seguridad de los gobiernos de naciones poderosas como Rusia, China o EEUU. Sobre todo se especula que los módulos de 1024 bits podría ya ser factorizables en tiempos razonables. Por lo que muchos, incluyéndome, se [...]]]></description>
			<content:encoded><![CDATA[<p>Cuando se habla de RSA, se suele especular o fantasear sobre supuesta tecnología ultrasecreta que pudieran tener las agencias de seguridad de los gobiernos de naciones poderosas como Rusia, China o EEUU. Sobre todo se especula que los módulos de 1024 bits podría ya ser factorizables en tiempos razonables. Por lo que muchos, incluyéndome, se preguntan ¿entonces de cuántos bits debería generar mis llaves si mis temores fueran ciertos?</p>
<p>El NIST, la agencia encargada de definir los estándares tecnológicos para las agencias federales de EEUU, <a href="http://csrc.nist.gov/publications/nistpubs/800-57/SP800-57-Part1.pdf">establece</a> que la información con vigencia menor a 2010 debe usar al menos 1024 bits, con vigencia menor a 2030 deberá usar al menos 2048 bits y con vigencia mayor a 2030 deberá usar 3072.</p>
<p>Bruce Scheiner por otro lado en 2002 <a href="http://www.schneier.com/crypto-gram-0204.html#3">ratificó</a> una tabla publicada anteriormente por él mismo en donde establece los bits recomendados según seas un individuo, una corporación o el gobierno. Ahí estipula que para 2005 los individuos ya deberían usar llaves de 1280 bits, y el gobierno ya debería estar usando 2048 bits.</p>
<p>Algunos más &#8220;inteligentes&#8221; que los anteriores, dicen que todos exageran, y recomiendan 1025 bits, razonando superfluamente que eso duplica la complejidad de la factorización. Ese razonamieto surge de pensar que el mejor algoritmo de factorización es por &#8220;fuerza bruta&#8221; sobre los posibles factores, probando todos los números entre <img src='http://s.wordpress.com/latex.php?latex=2%5E%7B511%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='2^{511}' title='2^{511}' class='latex' /> y <img src='http://s.wordpress.com/latex.php?latex=2%5E%7B512%7D-1&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='2^{512}-1' title='2^{512}-1' class='latex' /> para factorizar un módulo de 1024 bits, pues sus factores primos son de 512 bits.</p>
<p>La realidad es otra, y desde hace tiempo, desde Fermat de hecho, existen métodos sublineales de factorización de enteros respecto al tamaño del entero y los mismos algoritmos son subexponenciales respecto al número de bits del entero. Por lo que aumentar un bit la llave no es tan drástico como aumentarlo en otros algoritmos como AES, como no es tan drástico multiplicar por dos el tamaño del entero, pues eso no duplicaría el tiempo necesariamente. ¿Pero qué tanto aumenta el tiempo un bit más?</p>
<p><strong>Criba General de Campos Numéricos (GNFS)</strong></p>
<p>GNFS es el mejor algoritmo de factorización de enteros, conocido a la fecha, para enteros de 130 digitos al menos (que son aproximadamente 432 bits). En 2005 el algoritmo se utilizó para romper el récord de factorización RSA para un entero de 640 bits, hazaña que fue llevada acabo por un equipo de investigación alemán. Lo interesante de este algoritmo es su complejidad, y en base a ella voy a realizar algunos cálculos para esclarecer qué tan fuerte es aumentar un bit más a un módulo RSA. </p>
<p>La complejidad del algoritmo está dada por</p>
<img src='http://s.wordpress.com/latex.php?latex=O%5Cleft%28%5Cdisplaystyle%20e%5E%7B%5Cdisplaystyle%20%5Cleft%28c%2Bo%281%29%5Cright%29ln%20%28n%29%5E%7B1%2F3%7Dln%28ln%28n%29%29%5E%7B2%2F3%7D%20%7D%5Cright%29%20&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O\left(\displaystyle e^{\displaystyle \left(c+o(1)\right)ln (n)^{1/3}ln(ln(n))^{2/3} }\right) ' title='O\left(\displaystyle e^{\displaystyle \left(c+o(1)\right)ln (n)^{1/3}ln(ln(n))^{2/3} }\right) ' class='latex' />
<p>donde <img src='http://s.wordpress.com/latex.php?latex=c&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='c' title='c' class='latex' /> es una constante dada por la heurística utilizada en el algoritmo y <img src='http://s.wordpress.com/latex.php?latex=n&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='n' title='n' class='latex' /> es el número a factorizar (no los bits del número). <a href="http://en.wikipedia.org/wiki/Carl_Pomerance">Carl Pomerance</a>, creador del segundo mejor método de factorización, <a href="http://www.ams.org/notices/199612/pomerance.pdf">indica</a> que en este caso <img src='http://s.wordpress.com/latex.php?latex=c%20%3D%20%5Cleft%28%20%7B%5Cfrac%7B64%7D%7B9%7D%7D%5Cright%29%5E%7B1%2F3%7D%20&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='c = \left( {\frac{64}{9}}\right)^{1/3} ' title='c = \left( {\frac{64}{9}}\right)^{1/3} ' class='latex' />. Por otro lado tenemos que <img src='http://s.wordpress.com/latex.php?latex=o%281%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='o(1)' title='o(1)' class='latex' /> es una función asintótica que tiende a cero, por lo que para los cálculos se va a considerar como cero, pues Pomerance así lo toma.</p>
<p>Teniendo eso, lo que se puede hacer ahora es calcular el tiempo del algoritmo para factorizar un número de 1024 bits y comprarlo respecto al tiempo para factorizar uno de 1025 bits. Por lo que vamos a denotar <img src='http://s.wordpress.com/latex.php?latex=T_%7B1024%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='T_{1024}' title='T_{1024}' class='latex' /> al tiempo de 1024 bits y <img src='http://s.wordpress.com/latex.php?latex=T_%7B1025%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='T_{1025}' title='T_{1025}' class='latex' /> al tiempo de 1025 bits. </p>
<p>Sabemos que un número de 1024 bits se aproxima a <img src='http://s.wordpress.com/latex.php?latex=2%5E%7B1024%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='2^{1024}' title='2^{1024}' class='latex' /> y uno de 1025 bits a <img src='http://s.wordpress.com/latex.php?latex=2%5E%7B1025%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='2^{1025}' title='2^{1025}' class='latex' />, por lo que se van a tomar esas aproximaciones para simplificar la exponenciación. Tenemos entonces que</p>
<img src='http://s.wordpress.com/latex.php?latex=%5Cdisplaystyle%5Cdfrac%7B%5Cdisplaystyle%20T_%7B1025%7D%7D%7B%5Cdisplaystyle%20T_%7B1024%7D%7D%20%3D%20%5Cdisplaystyle%5Cdfrac%20%7Bk%20e%5E%7B%5Cdisplaystyle%20c%20%28ln%20%282%5E%7B1025%7D%29%5E%7B1%2F3%7Dln%28ln%282%5E%7B1025%7D%29%29%5E%7B2%2F3%7D%29%20%7D%20%7D%20%7Bk%20e%5E%7B%5Cdisplaystyle%20c%20%28ln%20%282%5E%7B1024%7D%29%5E%7B1%2F3%7Dln%28ln%282%5E%7B1024%7D%29%29%5E%7B2%2F3%7D%29%20%7D%7D%20&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\displaystyle\dfrac{\displaystyle T_{1025}}{\displaystyle T_{1024}} = \displaystyle\dfrac {k e^{\displaystyle c (ln (2^{1025})^{1/3}ln(ln(2^{1025}))^{2/3}) } } {k e^{\displaystyle c (ln (2^{1024})^{1/3}ln(ln(2^{1024}))^{2/3}) }} ' title='\displaystyle\dfrac{\displaystyle T_{1025}}{\displaystyle T_{1024}} = \displaystyle\dfrac {k e^{\displaystyle c (ln (2^{1025})^{1/3}ln(ln(2^{1025}))^{2/3}) } } {k e^{\displaystyle c (ln (2^{1024})^{1/3}ln(ln(2^{1024}))^{2/3}) }} ' class='latex' />
<p>donde <img src='http://s.wordpress.com/latex.php?latex=k&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='k' title='k' class='latex' /> es la constante de la notación asintótica. </p>
<p>Por lo tanto tenemos que </p>
<img src='http://s.wordpress.com/latex.php?latex=%5Cfrac%7BT_%7B1025%7D%7D%7BT_%7B1024%7D%7D%20%3D%201.0259%20&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\frac{T_{1025}}{T_{1024}} = 1.0259 ' title='\frac{T_{1025}}{T_{1024}} = 1.0259 ' class='latex' />
<p>Que es muy poco. Pues si el gobierno de algún país contara con los recursos para romper un módulo de 1024 bits en 24 semanas (6 meses), entonces romper uno de 1025 bits les llevaría casi 25 semanas. Esto en el mejor caso, puesto que la complejidad del algoritmo está dada en notación O, así que el algoritmo podría comportarse aún mejor de lo estimado y ser más rápido.</p>
<p>Si hacemos lo mismo y comparamos un módulo de 1024 respecto a uno de 1280, tenemos que <img src='http://s.wordpress.com/latex.php?latex=%5Cfrac%7BT_%7B1280%7D%7D%7BT_%7B1024%7D%7D%20%3D%20447.43&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\frac{T_{1280}}{T_{1024}} = 447.43' title='\frac{T_{1280}}{T_{1024}} = 447.43' class='latex' />. Que es bastante decente, y suponiendo que se pudiera factorizar el módulo de 1024 en una semana, entonces tardarían 8 años y medio en factorizar el de 1280; lo que le da bastante más confiabilidad a ese módulo que a uno de 1025. Aunque un cálculo más correcto sería considerando una ecuación diferencial porque la capacidad de cálculo no va a permanecer 8 años igual, va a ir aumentando.</p>
<p><strong>Pragmáticamente hablando</strong></p>
<p>Seguramente alguno va a desconfiar de este análisis, y necesitará una prueba más terrenal, sin tanta matemática. En ese caso lo invito a bajar un paquete que tenga implementado el algoritmo y factorice un número de unos 450 bits, que se puede hacer en un tiempo bastante decente (unos minutos) y vaya aumentando de bit en bit, para comparar los tiempos. Implementaciones hay varias y se pueden encontrar en la página de la <a href="http://en.wikipedia.org/wiki/General_number_field_sieve">wikipedia sobre GNFS.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.amarello.com.mx/2009/03/13/desmitificando-rsa-de-1025-bits/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cambiar los colores en la Terminal de Leopard sin instalar ningún extra</title>
		<link>http://blog.amarello.com.mx/2009/01/04/cambiar-los-colores-en-la-terminal-de-leopard-sin-instalar-ningun-extra/</link>
		<comments>http://blog.amarello.com.mx/2009/01/04/cambiar-los-colores-en-la-terminal-de-leopard-sin-instalar-ningun-extra/#comments</comments>
		<pubDate>Sun, 04 Jan 2009 16:39:45 +0000</pubDate>
		<dc:creator>Eduardo</dc:creator>
				<category><![CDATA[Algoritmia y programación]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[color terminal leopard]]></category>
		<category><![CDATA[leopard terminal without extra]]></category>

		<guid isPermaLink="false">http://blog.amarelloartis.com/?p=597</guid>
		<description><![CDATA[Quienes usen mucho la terminal en Leopard se habrán dado cuenta que toda tiene el mismo color, a lo mucho se pueden poner temas pero sigue siendo siempre un solo color para el texto y otro para el background, y en linux, en cambio, tiene diferentes colores para los directorios, archivos ejecutables y demás. La [...]]]></description>
			<content:encoded><![CDATA[<div align="center"><img src="http://blog.amarelloartis.com/wp-content/uploads/2009/01/terminal.jpg" alt="terminal" width="600" height="354" class="alignnone size-full wp-image-600" /></div>
<p>Quienes usen mucho la terminal en Leopard se habrán dado cuenta que toda tiene el mismo color, a lo mucho se pueden poner temas pero sigue siendo siempre un solo color para el texto y otro para el background, y en linux, en cambio, tiene diferentes colores para los directorios, archivos ejecutables y demás.</p>
<p>La solución sin instalar absolutamente ningun programa extra es abrir la Terminal y escribir esto:</p>
<p><code>nano .profile</code></p>
<p>Lo cual nos abrirá un archivo existente si intenta crear uno nuevo quiere decir que algo salió mal, ahora al final del archivo agregamos las líneas:</p>
<p><code>alias ls='/bin/ls -G'<br />
export LSCOLORS=ExGxExGxCxGxDxhbHbacEh</code></p>
<p><strong>Guardamos el archivo:</strong><br />
Presionamos <strong>Ctrl + X</strong>, nos preguntará si queremos guardar y le decimos que si presionando <strong>Y</strong>, luego presionamos enter y listo.</p>
<p>Cerramos la Terminal y al volverla a abrir aparecerán los nuevos colores.</p>
<p>Esos colores estan pensados para verse bien con el tema Homebrew y sin iguales a los default de debian, si quieren hacer sus propias combinaciones:<br />
La primera letra representa el color del texto y la segunda el color de fondo:<br />
<code><br />
a black<br />
b red<br />
c green<br />
d brown<br />
e blue<br />
f magenta<br />
g cyan<br />
h light grey<br />
A bold black, usually shows up as dark grey<br />
B bold red<br />
C bold green<br />
D bold brown, usually shows up as yellow<br />
E bold blue<br />
F bold magenta<br />
G bold cyan<br />
H bold light grey; looks like bright white<br />
x default foreground or background<br />
</code></p>
<p>Y la combinación es la siguiente:<br />
<code><br />
Pair 1 (ex) - directories<br />
Pair 2 (fx) - symbolic links<br />
Pair 3 (cx) - sockets<br />
Pair 4 (dx) - pipes<br />
Pair 5 (bx) - executable files<br />
Pair 6 (eg) - block special<br />
Pair 7 (ed) - character special<br />
Pair 8 (ab) - executable with setuid bit set<br />
Pair 9 (ag) - executable with setgid bit set<br />
Pair 10 (ac) - directory writable to others, with sticky bit<br />
Pair 11 (ad) - directory writable to others, without sticky bit<br />
</code></p>
<p>Pueden ver más información en el <a href="http://discussions.apple.com/message.jspa?messageID=5698369#5698369">foro de discusión de apple en la última respuesta</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.amarello.com.mx/2009/01/04/cambiar-los-colores-en-la-terminal-de-leopard-sin-instalar-ningun-extra/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Modelo Entidad Relación con el menor número de cruces</title>
		<link>http://blog.amarello.com.mx/2009/01/01/modelo-entidad-relacion-menor-numero-cruces/</link>
		<comments>http://blog.amarello.com.mx/2009/01/01/modelo-entidad-relacion-menor-numero-cruces/#comments</comments>
		<pubDate>Fri, 02 Jan 2009 02:40:23 +0000</pubDate>
		<dc:creator>Eduardo</dc:creator>
				<category><![CDATA[Algoritmia y programación]]></category>
		<category><![CDATA[Aplicaciones Web]]></category>
		<category><![CDATA[Bases de Datos]]></category>
		<category><![CDATA[diagrama entidad relacion]]></category>
		<category><![CDATA[diagrama er]]></category>
		<category><![CDATA[dibujado ortogonal]]></category>
		<category><![CDATA[gml]]></category>
		<category><![CDATA[ogdf]]></category>
		<category><![CDATA[software libre]]></category>

		<guid isPermaLink="false">http://blog.amarelloartis.com/?p=588</guid>
		<description><![CDATA[Problema Hace ya varios meses al estar desarrollando un software bastante complejo, que requería una base de datos muy grande, nos enfrentamos al problema de cómo poder visualizar un diagrama entidad-relacion de la forma más legible posible. Intentamos con MySQL Workbench, el cual nos dibujó las tablas con sus relaciones pero desgraciadamente todas juntas y [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Problema</strong></p>
<p>Hace ya varios meses al estar desarrollando un software bastante complejo, que requería una base de datos muy grande, nos enfrentamos al problema de cómo poder visualizar un diagrama entidad-relacion de la forma más legible posible. Intentamos con MySQL Workbench, el cual nos dibujó las tablas con sus relaciones pero desgraciadamente todas juntas y teníamos que acomodarlas a mano; lo cual además de llevar tiempo, es difícil, pues llegar a un modelo que tenga el menor número de cruces y sea fácil de entender es una tarea casi imposible. Así que buscamos en Google un programa que pudiera dibujar de una forma estética nuestra base de datos, y aunque algunos lo prometían ninguno lo hacía.</p>
<p><strong>Historia</strong></p>
<p>Buscamos un algoritmo que se encargara de distribuir gráficas con el menor número de cruces, lo que se conoce como <em>aplanamiento de gráficas</em> y encontramos uno llamado <strong>dibujado ortogonal</strong>, que nos pareció el más estético para dibujar un digrama EER. Encontramos gran cantidad de documentos de investigación que hacían alusión a un algoritmo publicado por Kandinsky, pero en ninguna parte pudimos encontrar el pseudo código o algún documento más detallado de ese algoritmo. Seguimos buscando y encontramos otros programas que servían para acomodar diagramas UML y algunos con el menor número de cruces. Notamos que muchos usaban un formato de archivo llamado <a href="http://www.infosun.fim.uni-passau.de/Graphlet/GML/">GML y encontramos su especificación</a>. GML significa <strong>Graphics Modeling Language</strong> y fue un poco difícil de encontrar porque hay otro formato de archivo con el mismo nombre que siginifica Geographic Modeling Language.</p>
<p>Después de un día de búsqueda encontramos un framework para diferentes tipos de dibujado de gráficas llamado <a href="http://www.ogdf.net/ogdf.php">OGDF</a>, librería escrita en C++ y de código abierto. Para nuestra sorpresa esa librería recibe un archivo GML para procesarlo y devuelve otro de igual formato procesado.</p>
<p><strong>Idea</strong></p>
<p>Al ver que no había un programa que te hiciera todo el proceso completo, desde conectarse a la base de datos, obtener su estructura, procesarla, graficarla con el menor número de cruces y presentarla tuvimos una idea:</p>
<p>¿Por qué no hacer un programa que obtenga la estructura de la base de datos junto con sus relaciones, genere un archivo .GML y lo pase a un programa que use la librería OGDF, luego lea el archivo procesado y dibuje las tablas en la posición adecuada?</p>
<p><strong>Nuestra solución</strong></p>
<p><strong>- Java</strong><br />
Inicialmente lo solucionamos haciendo un programa escrito en Java, que se conectara a la base de datos MySQL, obtuviera su estructura mediante <code>SHOW TABLES</code>, <code>DESCRIBE tabla</code>, y con el código de creación de la tabla obtuviera las llaves foráneas y se encargara de relacionar las tablas y generar un archivo GML válido con la estructura y las relaciones.</p>
<p><strong>- C++</strong><br />
Ahora mirando en OGDF notamos que había un <a href="http://www.ogdf.net/ogdf.php/tech:howto:plzl">How To</a>, lo copiamos, modificamos un poco y compilamos, generando un binario que lee dos parámetros, el archivo fuente y la ruta del archivo GML a donde queremos guardar el procesamiento.</p>
<p><strong>- Conectar Java y C++</strong><br />
Nos dispusimos a conectar los dos programas, llamando al binario de OGDF desde nuestro programa en Java y luego nuevamente leer el GML, <em>parsearlo</em> y relacionar con las tablas que estaban en memoria.</p>
<p>Hasta este punto ya teníamos solucionado todo, ahora solo faltaba dibujarlo.</p>
<p><strong>Dibujarlo</strong><br />
Pensamos en un momento dibujarlo en Java, el problema iba a ser que Java no es exactamente lo más amigable para dibujar, y había otro problema, a lo largo del desarrollo del programa pensamos que sería una buena idea liberarlo bajo la GPL y poner el código a disposición de todos y fue cuando se nos ocurrió una idea: ¿porqué no volver todo este programa una aplicación web y abrirla al público?, pero ¿cómo podríamos solucionarlo?</p>
<p><strong>- PHP y Flash</strong><br />
Pensamos que era fácil simplemente crear un formulario que pidiera el acceso a la base de datos, llamara del lado del servidor a nuestro programa en Java y así podríamos generar un XML que leyera una aplicación en Flash, además por medio de Actionscript lo dibujara y agregara comportamientos como arrastrar que hiciera más facil la interacción del usuario.</p>
<p><img src="http://blog.amarelloartis.com/wp-content/uploads/2008/12/screenshot.jpg" alt="Diagrama Entidad Relación Procesado"  width="400" height="253" align="right" /><strong>- Conectar Java, C++, PHP, Flash</strong><br />
Lo hicimos, y nuestro programa en Java después de haber leido y parseado el GML generó un XML con la estructura y coordenadas, que luego Flash leería mediante Actionscript y dibujaría obteniendo una representación interactiva de la base de datos como se muestra en la imagen.</p>
<p><strong>Código Abierto</strong><br />
Después de algunos ajustes <a href="http://www.amarello.com.mx/downloads/dibujado-ortogonal-mysql/">liberamos el código de Java, C++, Flash, PHP y Actionscript bajo la GPL</a> y siendo nuestro primer programa que liberamos bajo esa licencia nos sentimos muy felices. Para mi fue como un logro que desde hace tiempo quería hacer, pues siempre nos ha ayudado enormemente el código abierto y nunca habíamos regresado el favor.</p>
<p>Ahora tenemos pensado liberar otros algoritmos y scripts que tenemos guardados bajo GPL, y creamos una sección para todo ese Software en <a href="http://www.amarello.com.mx/downloads/">nuestra página</a>, que según tenemos pleaneado irá creciendo poco a poco.</p>
<p>Nos sentimos muy bien de poder colaborar con la Open Software Foundation, e <strong>invitamos a otras compañías que tienen mucho software detenido que lo liberen y aporten algo a la comunidad</strong>.</p>
<p>La versión en línea de nuestro programa se <a href="http://www.amarello.com.mx/downloads/dibujado-ortogonal-mysql/version-online/">encuentra disponible al público</a> y esperemos que lo aprovechen.</p>
<p>Con este software nuevo esperamos que este año que apenas comienza aportemos mucho más a la comunidad del software libre.</p>
<p>¡ Feliz año 2009 !</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.amarello.com.mx/2009/01/01/modelo-entidad-relacion-menor-numero-cruces/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Alucinante escalamiento de imágenes</title>
		<link>http://blog.amarello.com.mx/2007/09/01/alucinante-escalamiento-de-imagenes/</link>
		<comments>http://blog.amarello.com.mx/2007/09/01/alucinante-escalamiento-de-imagenes/#comments</comments>
		<pubDate>Sat, 01 Sep 2007 19:35:53 +0000</pubDate>
		<dc:creator>Damián</dc:creator>
				<category><![CDATA[Algoritmia y programación]]></category>
		<category><![CDATA[Noticias]]></category>

		<guid isPermaLink="false">http://blog.amarelloartis.com/2007/09/01/alucinante-escalamiento-de-imagenes/</guid>
		<description><![CDATA[Si creían que Photoshop ya era la octava maravilla, quizá ahora lo sea aún más pues Adobe ha contratado a un colaborador de una nueva investigación sobre escalamiento de imágenes ALUCINANTE: el Dr. Shai Avidan. El algoritmo fue presentado en la SIGGRAPH 2007 por dos Doctores israelíes en Ciencias de la Computación: Ariel Shamir y [...]]]></description>
			<content:encoded><![CDATA[<p><a href='http://blog.amarelloartis.com/wp-content/uploads/2007/09/sierpinski-powerball.png' title='sierpinski-powerball.png'><img src='http://blog.amarelloartis.com/wp-content/uploads/2007/09/sierpinski-powerball.png' alt='sierpinski-powerball.png' align="left" width="175"/></a>
<p align="justify">Si creían que Photoshop ya era la octava maravilla, quizá ahora lo sea aún más pues Adobe ha contratado a un colaborador de una nueva investigación sobre escalamiento de imágenes ALUCINANTE: el Dr. Shai Avidan.</p>
<p align="justify">El algoritmo fue presentado en la <a href="http://www.siggraph.org/s2007/">SIGGRAPH 2007</a> por dos Doctores israelíes en Ciencias de la Computación: Ariel Shamir y Shai Avidan. </p>
<p align="justify">Lo que logra este algoritmo es el escalamiento de imágenes con la mínima pérdida de calidad en las regiones más relevantes, detectando éstas de manera automática en un mapa y con la posibilidad de definirlas manualmente. Aquí pueden ver un video con una muestra de su trabajo (vale la pena verlo todo):</p>
<p><center><object width="425" height="350"><param name="movie" value="http://www.youtube.com/v/qadw0BRKeMk"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/qadw0BRKeMk" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"></embed></object></center></p>
<p><span id="more-425"></span></p>
<p align="justify">Es impresionante, sobre todo al final, cuando eliminan a una persona de la imagen con una sencillez asombrosa.</p>
<p align="justify">Casi inmediatamente <a href="http://www.techcrunch.com/2007/08/28/adobe-hires-co-inventor-of-image-resizer-technology/">Adobe contrató a Shai Avidan</a>; no es muy difícil conocer las intenciones de la empresa.</p>
<p align="justify">Lo bueno es que su investigación es pública y cualquiera con las suficientes habilidades y conocimientos puede hacer una implementación de su trabajo. Se puede encontrar <a href="http://www.faculty.idc.ac.il/arik/imret.pdf">aquí</a> el documento. Quizá por eso Adobe no perdió tiempo y lo quiere tener integrado en su aplicación puntera lo más pronto posible.</p>
<p>Fuente: <a href="http://www.slashdot.com">Slashdot</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.amarello.com.mx/2007/09/01/alucinante-escalamiento-de-imagenes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flash, actionscript y clases</title>
		<link>http://blog.amarello.com.mx/2007/03/22/flash-actionscript-y-clases/</link>
		<comments>http://blog.amarello.com.mx/2007/03/22/flash-actionscript-y-clases/#comments</comments>
		<pubDate>Fri, 23 Mar 2007 00:05:20 +0000</pubDate>
		<dc:creator>Eduardo</dc:creator>
				<category><![CDATA[Algoritmia y programación]]></category>

		<guid isPermaLink="false">http://blog.amarelloartis.com/2007/03/22/flash-actionscript-y-clases/</guid>
		<description><![CDATA[En flash se usa actionscript para programar acciones el las peliculas, a mi me parece un lenguaje bastante bueno para lo que esta hecho o sea para hacer efectos y cosas gráficas, obviamente no podemos compararlo con Java, pues es totalmente diferente. En este post les voy a enseñar la maravilla de usar clases en [...]]]></description>
			<content:encoded><![CDATA[<p>En flash se usa actionscript para programar acciones el las peliculas, a mi me parece un lenguaje bastante bueno para lo que esta hecho o sea para hacer efectos y cosas gráficas, obviamente no podemos compararlo con Java, pues es totalmente diferente.</p>
<p><strong>En este post les voy a enseñar la maravilla de usar clases en flash, lo mucho que nos ahorran</strong></p>
<p>Actionscript empezó muy parecido a javascript, pero con el tiempo ha ido evolucionando para convertirse en algo más parecido a java, de hecho el Actionscript 3.0 necesita iniciar la máquina virtual de Java para poder correr una pelicula, eso es lo que nos espera lo cual me parece algo muy bueno.<br />
<span id="more-335"></span><br />
Algo interesante que poca gente usa en flash son las clases, y se pierden de lo útil que puedan ser.</p>
<p>En flash hay veces en que queremos que algún movieclip haga algo al principio, por ejemplo haga fadeIn, o sea vaya apareciendo, para esto es fácil hacerlo con clases y es muy tardado hacer uno por uno.</p>
<p>Tenemos que crear un archivo llamado FadeIn.as, para eso tenemos que seleccionar un nuevo documento de actionscript:</p>
<div align="center"><img id="image336" src="http://blog.amarelloartis.com/wp-content/uploads/2007/03/foto21.jpg" alt="Crear un documento de Actionscript" /></div>
<p>En ese documento ponemos el siguiente código</p>
<pre><code>
class FadeIn extends MovieClip {
     private var velocidad:Number = 5;
     /** Constructor **/
     function FadeIn() {
          this._alpha = 0; //el alpha inicia en cero
     }
     /**
     * Esta función hará que cada
     * que pase un frame ejecute el código
     */
     function onEnterFrame() {
          if(this._alpha >= 100) {
              //quitamos la funcion onEnterFrame para que se detenga
              this.onEnterFrame = null;
              //tenemos que asegurarnos que quede en 100,
              //pues hay veces que queda 100.9 u algún otro número
              this._alpha = 100;
          } else {
              //le sumamos la velocidad al alpha
              this._alpha += velocidad;
          }
     }
}
</code></pre>
<p>Ya teniendo este archivo debemos de guardarlo en una carpeta llamada clases y con el nombre FadeIn.as</p>
<p>El siguiente paso es hacer que este disponible para lo que necesitemos y para el flash que necesitemos, asi que nos vamos a preferencias del flash y seleccionamos &#8220;Actionscript&#8221;, hacemos click en el botón &#8220;Actionscript 2.0 settings&#8221; y agregamos la carpeta clases que acabamos de crear, aceptamos y guardamos los cambios, ahora el efecto estará disponible para cualquier archivo en la parte donde este de nuestra computadora.</p>
<p>Después abrimos cualquier documento de flash y creamos un nuevo MovieClip, haciendo click en &#8220;Convert to symbol&#8221; y en el botón de advanced, seleccionamos y llenamos tal y como se muestra en la imagen:</p>
<div align="center"><img id="image334" src="http://blog.amarelloartis.com/wp-content/uploads/2007/03/foto6.jpg" alt="Convert to symbol" /></div>
<p>Aceptamos y listo ese movieclip cuando exportemos ese movieclip hará fadeIn cuando aparezca en la pantalla.</p>
<p>En el siguiente ejemplo se muestra sólamente como es que todos desde un simbolo al crearse hacen fadeIn:</p>
<div align="center">[kml_flashembed movie="http://blog.amarelloartis.com/wp-content/uploads/2007/03/clases.swf" height="400" width="500"/]</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.amarello.com.mx/2007/03/22/flash-actionscript-y-clases/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

