<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Driniteca</title>
	<atom:link href="https://drini.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://drini.wordpress.com</link>
	<description>Apuntaciones sobre matemáticas</description>
	<lastBuildDate>Wed, 19 May 2010 07:17:44 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<site xmlns="com-wordpress:feed-additions:1">364888</site><cloud domain='drini.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>https://s0.wp.com/i/buttonw-com.png</url>
		<title>Driniteca</title>
		<link>https://drini.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="https://drini.wordpress.com/osd.xml" title="Driniteca" />
	<atom:link rel='hub' href='https://drini.wordpress.com/?pushpress=hub'/>
	<item>
		<title>Compiling polymake on archlinux</title>
		<link>https://drini.wordpress.com/2010/05/19/compiling-polymake-on-archlinux/</link>
					<comments>https://drini.wordpress.com/2010/05/19/compiling-polymake-on-archlinux/#respond</comments>
		
		<dc:creator><![CDATA[magister]]></dc:creator>
		<pubDate>Wed, 19 May 2010 07:17:44 +0000</pubDate>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[matemáticas]]></category>
		<category><![CDATA[archlinux]]></category>
		<category><![CDATA[compiling]]></category>
		<category><![CDATA[polymake]]></category>
		<guid isPermaLink="false">http://drini.wordpress.com/?p=91</guid>

					<description><![CDATA[This is a followup on my previous post. This one easier. Install gmp. Unpack the polymake 2.9.8 tarball. Install whatever perl module required to get ./configure going. Before running ./configure, however before trying open support/locate_build_dir and change line 78 from  uname -p to  uname -m Now, go /lib/PTL/include/Bitset.h and edit line 57 that says =__GMP_BITS_PER_MP_LIMB [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>This is a followup on my previous post.</p>
<p>This one easier. Install gmp.</p>
<p>Unpack the polymake 2.9.8 tarball.</p>
<p>Install whatever perl module required to get ./configure going. Before running ./configure, however before trying open <strong>support/locate_build_dir </strong></p>
<p>and change line 78 from  <strong>uname -p </strong>to  <strong>uname -m</strong></p>
<p>Now, go<strong> /lib/PTL/include/Bitset.h</strong> and edit line 57 that says</p>
<p>=__GMP_BITS_PER_MP_LIMB</p>
<p>change it to</p>
<p><strong>=GMP_NUMB_BITS</strong></p>
<p>save, configure and make!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://drini.wordpress.com/2010/05/19/compiling-polymake-on-archlinux/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">91</post-id>
		<media:content url="https://2.gravatar.com/avatar/b76b47eb010853c3e277669847da614212dfffd1075a56a8397b31e64cea6ed4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">drini</media:title>
		</media:content>
	</item>
		<item>
		<title>Compilando polymake en Archlinux</title>
		<link>https://drini.wordpress.com/2009/03/19/compilando-polymake/</link>
					<comments>https://drini.wordpress.com/2009/03/19/compilando-polymake/#respond</comments>
		
		<dc:creator><![CDATA[magister]]></dc:creator>
		<pubDate>Thu, 19 Mar 2009 17:48:38 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">http://drini.wordpress.com/2009/03/19/compilando-polymake/</guid>

					<description><![CDATA[Instalar pre-requisitos: pacman -S gmp perl-xml-libxml  perl-xml-libxslt  perl-xml-writer perl-term-readline Al parecer, perl-term-readline no es suficiente, dando el error: Can't locate object method "new" via package "Term::ReadLine::Gnu" at /root/poly/polymake-2.9.6/apps/common/rules/configure.rules line 26. por lo que se procede a instalar (vía AUR) perl-term-readline-gnu Crear un directorio, descargar y descomprimir polymake # mkdir poly; cd poly # wget http://www.math.tu-berlin.de/polymake/download-alpha/polymake-2.9.6.tar.bz2 [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Instalar pre-requisitos:</p>
<pre>pacman -S gmp perl-xml-libxml  perl-xml-libxslt  perl-xml-writer perl-term-readline</pre>
<p style="padding-left:30px;">Al parecer, perl-term-readline no es suficiente, dando el error:</p>
<pre style="padding-left:30px;">Can't locate object method "new" via package "Term::ReadLine::Gnu" 
at /root/poly/polymake-2.9.6/apps/common/rules/configure.rules line 26.</pre>
<p style="padding-left:30px;">por lo que se procede a instalar (vía AUR) perl-term-readline-gnu</p>
<p>Crear un directorio, descargar y descomprimir polymake</p>
<pre># mkdir poly; cd poly
# wget http://www.math.tu-berlin.de/polymake/download-alpha/polymake-2.9.6.tar.bz2
# tar xvjf polymake-2.9.6.tar.bz2
# cd polymake-2.9.6</pre>
<p>Editar <strong>support/utils.make</strong> y cambiar la línea que contenga   <strong>uname -p </strong> a    <strong>uname -i</strong></p>
<p>Editar <strong>lib/PTL/include/Integer.h</strong> y modificar la línea <strong>#include &lt;limits&gt; </strong>a   <strong>#include &lt;limits.h&gt;</strong> . Esto evitará el error</p>
<pre>/root/poly/polymake-2.9.6/lib/PTL/include/Integer.h:1188: error: ‘INT_MAX’ was not declared in this scope</pre>
]]></content:encoded>
					
					<wfw:commentRss>https://drini.wordpress.com/2009/03/19/compilando-polymake/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">85</post-id>
		<media:content url="https://2.gravatar.com/avatar/b76b47eb010853c3e277669847da614212dfffd1075a56a8397b31e64cea6ed4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">drini</media:title>
		</media:content>
	</item>
		<item>
		<title>Instalando ArchLinux</title>
		<link>https://drini.wordpress.com/2009/02/19/instalando-archlinux/</link>
					<comments>https://drini.wordpress.com/2009/02/19/instalando-archlinux/#respond</comments>
		
		<dc:creator><![CDATA[magister]]></dc:creator>
		<pubDate>Thu, 19 Feb 2009 01:37:08 +0000</pubDate>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[arch]]></category>
		<category><![CDATA[archlinux]]></category>
		<category><![CDATA[pavilion]]></category>
		<category><![CDATA[setup]]></category>
		<guid isPermaLink="false">http://drini.wordpress.com/?p=79</guid>

					<description><![CDATA[Este documento describe la instalación de ArchLinux en una notebook HP Pavilion dv2935la con las especificaciones: Procesador Intel Core 2 Duo T8100 320 Gb de disco duro (particionado asignando 25Gb a linux) 4 Gb de RAM Pre-instalación Obviamente el primer paso es descargar archlinux. En http://www.archlinux.org/download/ podemos descargar la imagen. Seleccionamos un mirror (en este [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Este documento describe la instalación de ArchLinux en una notebook HP Pavilion dv2935la con las especificaciones:</p>
<ul>
<li> Procesador Intel Core 2 Duo T8100</li>
<li> 320 Gb de disco duro (particionado asignando 25Gb a linux)</li>
<li> 4 Gb de RAM</li>
</ul>
<h2>Pre-instalación</h2>
<p>Obviamente el primer paso es descargar archlinux. En <a href="http://www.archlinux.org/download/" target="_blank">http://www.archlinux.org/download/</a> podemos descargar la imagen. Seleccionamos un mirror (en este caso mirror.neotuli.net).</p>
<p>Hay varias opciones:</p>
<ul>
<li><strong>iso/img</strong> Hay dos formatos: iso es para grabar en cd, img es para unidad USB.</li>
<li><strong>core/ftp</strong> La versión FTP descarga las últimas versiones de cada programa instalado desde internet, mientras que la versión core trae incluidas en la imagen los paquetes por lo que no requiere conexion a internet.</li>
</ul>
<p>Sin embargo, AMBAS imágenes producen el resultado después de actualizar los paquetes a sus últimas versiones. Dado que no me interesa bajar una imagen maś pesada para instalar paquetes que luego actualizaré, me decanto por la versión FTP (pero esta opción sólo debe usarse si se dispone de una conexión rápida).</p>
<p>Accedemos al directorio más reciente: 2009.2 y se descarga la imagen elegida. En mi caso:</p>
<p style="padding-left:30px;">archlinux-2009.02-2-ftp-i686.img<br />
2009.02 : versión febrero de 2009<br />
ftp : instalación de versiones más recientes desde internet<br />
i686 : versión de 32 bits (recomendada sobre la de 64bits)<br />
img : instalación desde USB (iso es para CD)</p>
<p style="padding-left:30px;">Total: 157MB</p>
<p>y siguiendo las instrucciones en <a href="http://wiki.archlinux.org/index.php/Install_from_USB_stick" target="_blank">http://wiki.archlinux.org/index.php/Install_from_USB_stick </a>lo copiamos a la unidad USB</p>
<p>En linux:</p>
<pre> dd if=archlinux-2009.02-2-ftp-i686.img of=/dev/sdb</pre>
<p>Una vez terminado el proceso, reiniciamos la computadora desde la unidad de USB.</p>
<h2>Instalación</h2>
<p>Al arrancar escogemos la primera opción: Boot Archlinux Live CD (aunque sea una unidad USB) y al aparecer el diálogo de login, ingresamos como root.</p>
<p>Lo primero es configurar el teclado para español. Ejecutamos km y seleccionamos de la primera lista: <strong>i386/qwerty/es.map.gz, </strong>en la segunda escogemos <strong>default-8×16.psfu.gz</strong>.</p>
<p>Ahora podemos iniciar propiamente el proceso de instalación con el comando</p>
<pre> <strong>/arch/setup <span id="more-79"></span></strong></pre>
<h2>Selección de origen</h2>
<p>Lo primero es indicar de dónde se obtendran de los paquetes: del CD o de internet. Como vamos a usar instalación desde red seleccionamos FTP/HTTP. A cotinuación se nos indica que configuremos la red.</p>
<p>En mi caso, al tener internet inalámbrico, el diálogo no funcionará tal cual (porque está preparado para conexiones de ethernet). Así que presionamos Control-Alt-F2 para abrir una nueva consola virtual, ingresamos como root y ejecutamos</p>
<pre><strong>ifconfig wlan0 upi
iwconfig wlan0 essid drinired key passworddelared
dhcpcd wlan0</strong></pre>
<p>reemplazando, claro, el nombre de la red y el password apropiados. Si la configuración de la red es más compleja, por favor contactar al administrador de red. <img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>Presionamos Control-alt-F1 para regresar a la instalación y accedemos a <strong>Choose mirror</strong> para seleccionar el sitio web que deseamos. Nuevamente selecciono <a href="http://mirror.neotuli.net" rel="nofollow">http://mirror.neotuli.net</a> (no es recomendable usar <a href="http://ftp.archlinux.org" rel="nofollow">http://ftp.archlinux.org</a> porque esa dirección es algo lenta).</p>
<p>Regresamos al menú principal</p>
<h2>Ajuste del reloj</h2>
<p>Seleccionamos local en vez de UTC (para evitar que la hora de Windows se cambie innecesariamente) y seleccionamos el huso horario apropiado:</p>
<pre><strong>2) America
30) Mexico
1) Central time</strong></pre>
<p>Luego ajustamos la fecha actual.</p>
<h2>Preparar el disco duro</h2>
<p>Ahora sí, la hora de ensuciarnos las manos. Hay que particionar el disco duro pero cfdisk no es la forma más sencilla. Esta es la parte maś delicada del proceso porque se indica dónde en el disco se instalará Arch y qué particiones se formatearán. Lo más recomendable es tener ya las particiones listas antes del proceso (ya sea con PartitionMagic en Windows o Gparted en linux), sino tienes particiones, dios te bendiga y mucha suerte, no explicaré cómo hacerlo.</p>
<p>En mi caso, ya tengo particiones preparadas:</p>
<p><strong>/dev/sda2   &#8211;   10GB<br />
/dev/sda5   &#8211;   16GB<br />
/dev/sda7   &#8211;   1 GB<br />
/dev/sda6   &#8211;   1 GB</strong></p>
<p>Usaremos sda2 para la raíz, sda5 para home y sda6 para intercambio de memoria (swap). La partición sda7 no se usará.</p>
<p>En la instalación se escoge la segunda opción 2 Partition HD (manualmente) para ver que todo está en orden. Salimos y entramos a la tercera: 3 Set filesystem mount points es decir, asignar puntos de montaje.</p>
<p>Primero nos pregunta por la partición SWAP. Indicamos /dev/sda7. Luego pregunta por la partición asignada a / (root): /dev/sda2 con sistema de archivos ext3 Finalmente pregunta por puntos de montaje adicionales. Seleccionamos /dev/sda5, asignamos a /home (en vez de /boot como sugerido) escogiendo ext3.</p>
<p>Salimos aceptando a todo, se realizan los cambios y pasamos a la siguiente etapa.</p>
<h2>Selección de paquetes</h2>
<p>Después de un breve diálogo donde indica que ha descargado la lista de paquetes, se nos presenta la posibilidad de configurar la selección.</p>
<p>Asegurándonos de que [*] base esté seleccionado y [ ] base-devel no, nos lleva a la lista base de paquetes.</p>
<p>Si se sabe lo que se está haciendo, se puede retirar alguno de los paquetes activos (por ejemplo, yo no uso conexión vía telefónica, por ello retiro ppp y rp-pppoe. Aquí el criterio de cada quien.</p>
<p>Se puede añadir paquetes que no estén marcados, por ejemplo yo añado wireless-tooos, iwlwifi-3945-ucode.</p>
<h2>Instalación de paquetes</h2>
<p>Entramos a <strong>4 Install packages</strong> y un diálogo nos da la bienvenida, presionamos OK y se inicia la descarga. En mi caso, se descargaron 390 mb durante 20 minutos.</p>
<p>Mientras termina el proceso, puedes presionar Control-Alt-F2 y navegar por la web en modo texto con el comando elinks.</p>
<p>Al terminar, si indica un error porque no todos los paquetes se descargaron, ingresa nuevamente en la opción de instalar, pero esta vez sólo se descargan los paquetes faltantes.</p>
<p>Cuando todo se completa, se instalan los paquetes y el sistema ya está prácticamente instalado.</p>
<h2>Configuración del sistema</h2>
<p>Ahora vamos a configurar los parámetros base. Usando el editor que prefieras (vi <img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> editamos algunos de los archivos que se presentan. Por ahora sólo necesitamos:</p>
<p>En /etc/rc.conf</p>
<pre><strong>LOCALE = "es_ES.utf8"
KEYMAP = "es"
HOSTNAME = "combinatorica"</strong></pre>
<p>El hostname es el “nombre” de la computadora en la red, no tiene que ser igual a éste.</p>
<h2>Instalar el gestor de arranque</h2>
<p>En 6 Install Bootloader seleccionamos la opción GRUB, editamos el archivo deconfiguración y descomentamos las líneas para Windows:</p>
<p># (2) Windows<br />
title Windows<br />
rootnoverify (hd0,0)<br />
makeactive<br />
chainloader +1</p>
<p>Aceptamos e indicamos instalar en /dev/sda. ¡Listo! Hemos terminado la instalación. Reiniciamos ahora sin el llavero y entramos a neustro flamante nuevo sistema</p>
<p>El sistema obtenido es muy básico (menos de 1gb) con las herramientas esenciales y muy ligero (nada innecesario está corriendo). El siguiente paso es personalizarlo e instalar los programas que usaremos.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://drini.wordpress.com/2009/02/19/instalando-archlinux/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">79</post-id>
		<media:content url="https://2.gravatar.com/avatar/b76b47eb010853c3e277669847da614212dfffd1075a56a8397b31e64cea6ed4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">drini</media:title>
		</media:content>
	</item>
		<item>
		<title>1.1 Elección social : Introducción</title>
		<link>https://drini.wordpress.com/2008/10/25/11-eleccion-social-introduccion/</link>
					<comments>https://drini.wordpress.com/2008/10/25/11-eleccion-social-introduccion/#comments</comments>
		
		<dc:creator><![CDATA[magister]]></dc:creator>
		<pubDate>Sat, 25 Oct 2008 23:41:56 +0000</pubDate>
				<category><![CDATA[matemáticas]]></category>
		<category><![CDATA[politica]]></category>
		<category><![CDATA[apuntes]]></category>
		<category><![CDATA[crc]]></category>
		<category><![CDATA[decisión]]></category>
		<category><![CDATA[elecciones]]></category>
		<category><![CDATA[notas]]></category>
		<category><![CDATA[poder]]></category>
		<guid isPermaLink="false">http://drini.wordpress.com/?p=69</guid>

					<description><![CDATA[Serie de notas de estudio basadas en el texto «Mathematics and Politics» Se quiere analizar los procesos por los cuales un colectivo, una comunidad, desea elegir una opción entre un grupo de alternativas. El proceso democrático estándar funciona muy bien cuando sólo hay dos opciones: cada votante selecciona su opción preferida y el ganador de [&#8230;]]]></description>
										<content:encoded><![CDATA[<p style="text-align:right;"><em>Serie de notas de estudio basadas en el texto «Mathematics and Politics»</em></p>
<p>Se quiere analizar los procesos por los cuales un colectivo, una comunidad, desea elegir una opción entre un grupo de alternativas. El proceso democrático estándar funciona muy bien cuando sólo hay dos opciones: cada votante selecciona su opción preferida y el ganador de la votación corresponde a la opción que tiene más apoyo.</p>
<p>Sin embargo, cuando hay más de dos candidatos la situación no es tan clara. Por ejemplo, supongamos que hay tres candidatos <strong>A, B, C</strong>. Hay 6 diferentes formas de ordenar la preferencia de los votantes:</p>
<ul>
<li><strong>A  B  C </strong>: (20)<strong><br />
</strong></li>
<li><strong>A  C  B </strong>: (26)<strong><br />
</strong></li>
<li><strong>B  A  C </strong>: (18)<strong><br />
</strong></li>
<li><strong>B  C  A </strong>: (26)<strong><br />
</strong></li>
<li><strong>C  A  B </strong>: (2)</li>
<li><strong>C  B  A </strong>: (8)<strong><br />
</strong></li>
</ul>
<p>Los números a la izquierda de cada orden indican el número (o porcentaje) de votantes que ordenan a los candidatos en ese orden de preferencia: por ejemplo, hay 26 votantes (o el 26% de los votantes) para los que <strong>A</strong> es el mejor candidato, <strong>C </strong>el segundo y <strong>B </strong>el peor de todos.</p>
<p>Se efectúa la votación, cada votante selecciona su candidato favorito. El resultado de la elección es:</p>
<ul>
<li><strong>A : </strong>20 + 26 = 46 votos a favor.</li>
<li><strong>B : </strong>18 + 26 = 44 votos a favor.</li>
<li><strong>C</strong> <strong>:</strong> 2 + 8 = 10 votos a favor.</li>
</ul>
<p>El <span style="color:#ff6600;">ganador de la elección es <strong>A</strong> </span>con 46 votos a favor. Dado que <strong>A</strong> ganó la elección, debe ser el mejor candidato. ¿no? Veamos&#8230;</p>
<p>¿Cuanta gente piensa que <strong>B </strong>es mejor candidato que <strong>C</strong>?</p>
<ul>
<li>Hay 20 + 18 + 26 =64 votantes que prefieren a <strong>B </strong>sobre <strong>C</strong>.</li>
<li>Hay<strong> </strong>26 + 2 + 8 = 36 votantes que prefieren a <strong>C </strong>sobre <strong>B</strong>.</li>
</ul>
<p>Hasta ahí no hay ninguna sorpresa, <span style="color:#ff6600;">la mayoría de los votantes prefiere a <strong>B</strong> sobre <strong>C</strong>.</span></p>
<p>¿Cuanta gente piensa que <strong>A</strong> es mejor candidato que <strong>B</strong>?</p>
<ul>
<li>Hay 20 + 26 + 2 = 48 votantes que piensan que <strong>A</strong> es mejor que <strong>B</strong>.</li>
<li>Hay 18 + 26 + 8 = 52 votantes que piensan que <strong>B </strong>es mejor que <strong>A</strong>.</li>
</ul>
<p>Entonces&#8230; <span style="color:#ff6600;">la mayoría de los votantes prefieren a <strong>B </strong>sobre <strong>A</strong>.</span></p>
<p>Es decir&#8230; la mayoría de los votantes piensa que <strong>B</strong> es mejor candidato que <strong>A</strong>,  y la mayoría de los candidatos piensa que <strong>B</strong> es mejor candidato que <strong>C</strong>. Sin embargo&#8230;. <span style="color:#ff0000;"><strong>¡B pierde la elección!</strong></span></p>
<p>&#8212;-</p>
<p><strong>Referencia. </strong>Taylor &amp; Pacelli.<strong> </strong><em>Mathematics and Politics: Strategy</em>, <em>Voting, Power and Proof.</em> Springer. 2008.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://drini.wordpress.com/2008/10/25/11-eleccion-social-introduccion/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">69</post-id>
		<media:content url="https://2.gravatar.com/avatar/b76b47eb010853c3e277669847da614212dfffd1075a56a8397b31e64cea6ed4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">drini</media:title>
		</media:content>
	</item>
		<item>
		<title>Soporte para MathML</title>
		<link>https://drini.wordpress.com/2008/07/24/soporte-para-mathml/</link>
					<comments>https://drini.wordpress.com/2008/07/24/soporte-para-mathml/#respond</comments>
		
		<dc:creator><![CDATA[magister]]></dc:creator>
		<pubDate>Thu, 24 Jul 2008 18:35:52 +0000</pubDate>
				<category><![CDATA[matemáticas]]></category>
		<category><![CDATA[ascii]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[math]]></category>
		<category><![CDATA[mathml]]></category>
		<category><![CDATA[mathplayer]]></category>
		<category><![CDATA[wikis]]></category>
		<guid isPermaLink="false">http://drini.wordpress.com/?p=58</guid>

					<description><![CDATA[Tengo una wiki personal en mi unidad USB. Pero el soporte de matemáticas de mediawiki depende de ocaml, imagemagick, texvc, etc. Una alternativa simple es la extensión ASCIIMath4Wiki, que usa MathML para crear las formulas. El problema&#8230; Internet Explorer no soporta MathML y firefox necesita unas fuentes extras para mostrar correctamente ciertas expresiones (como radicales). [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Tengo una wiki personal en mi unidad USB. Pero el soporte de matemáticas de mediawiki depende de ocaml, imagemagick, texvc, etc. Una alternativa simple es la extensión <a href="http://www.mediawiki.org/wiki/Extension:ASCIIMath4Wiki" target="_blank">ASCIIMath4Wiki</a>, que usa <a href="http://www1.chapman.edu/~jipsen/mathml/asciimath.html" target="_blank">MathML</a> para crear las formulas.</p>
<div data-shortcode="caption" id="attachment_59" style="width: 1034px" class="wp-caption aligncenter"><a href="https://drini.wordpress.com/wp-content/uploads/2008/07/mathml1.png"><img aria-describedby="caption-attachment-59" data-attachment-id="59" data-permalink="https://drini.wordpress.com/2008/07/24/soporte-para-mathml/mathml1/" data-orig-file="https://drini.wordpress.com/wp-content/uploads/2008/07/mathml1.png" data-orig-size="1025,559" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="mathml1" data-image-description="" data-image-caption="&lt;p&gt;mathml en firefox&lt;/p&gt;
" data-medium-file="https://drini.wordpress.com/wp-content/uploads/2008/07/mathml1.png?w=300" data-large-file="https://drini.wordpress.com/wp-content/uploads/2008/07/mathml1.png?w=604" class="size-full wp-image-59" src="https://drini.wordpress.com/wp-content/uploads/2008/07/mathml1.png?w=604" alt="mathml en firefox"   srcset="https://drini.wordpress.com/wp-content/uploads/2008/07/mathml1.png?w=1024&amp;h=558 1024w, https://drini.wordpress.com/wp-content/uploads/2008/07/mathml1.png?w=150&amp;h=82 150w, https://drini.wordpress.com/wp-content/uploads/2008/07/mathml1.png?w=300&amp;h=164 300w, https://drini.wordpress.com/wp-content/uploads/2008/07/mathml1.png?w=768&amp;h=419 768w, https://drini.wordpress.com/wp-content/uploads/2008/07/mathml1.png 1025w" sizes="(max-width: 1024px) 100vw, 1024px" /></a><p id="caption-attachment-59" class="wp-caption-text">mathml en firefox</p></div>
<p>El problema&#8230; Internet Explorer no soporta MathML y firefox necesita unas fuentes extras para mostrar correctamente ciertas expresiones (como radicales). La solución viene en dos pasos</p>
<ul>
<li><a href="http://www.mozilla.org/projects/mathml/fonts/" target="_blank">Instalar las fuentes STIX</a>, lo cual resuelve el problema en los navegadores Mozilla (así por ejemplo sqrt(2/x)  ya no se mostrará erróneamente como sqrt(2)/x  al no ser extensible el símbolo de radical)</li>
<li><a href="http://www.dessci.com/en/products/mathplayer/download.htm" target="_blank">Instalar MathPlayer</a>, lo cual permite que Internet Explorer entienda el Doctype apropiado para soporte MathML.</li>
</ul>
<p>El resultado (en Internet Explorer):</p>
<div data-shortcode="caption" id="attachment_61" style="width: 1007px" class="wp-caption aligncenter"><a href="https://drini.wordpress.com/wp-content/uploads/2008/07/mathml2.png"><img aria-describedby="caption-attachment-61" data-attachment-id="61" data-permalink="https://drini.wordpress.com/2008/07/24/soporte-para-mathml/mathml2/" data-orig-file="https://drini.wordpress.com/wp-content/uploads/2008/07/mathml2.png" data-orig-size="997,567" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="mathml2" data-image-description="" data-image-caption="&lt;p&gt;MathML en internet explorer&lt;/p&gt;
" data-medium-file="https://drini.wordpress.com/wp-content/uploads/2008/07/mathml2.png?w=300" data-large-file="https://drini.wordpress.com/wp-content/uploads/2008/07/mathml2.png?w=604" class="size-full wp-image-61" src="https://drini.wordpress.com/wp-content/uploads/2008/07/mathml2.png?w=604" alt="MathML en internet explorer"   srcset="https://drini.wordpress.com/wp-content/uploads/2008/07/mathml2.png 997w, https://drini.wordpress.com/wp-content/uploads/2008/07/mathml2.png?w=150&amp;h=85 150w, https://drini.wordpress.com/wp-content/uploads/2008/07/mathml2.png?w=300&amp;h=171 300w, https://drini.wordpress.com/wp-content/uploads/2008/07/mathml2.png?w=768&amp;h=437 768w" sizes="(max-width: 997px) 100vw, 997px" /></a><p id="caption-attachment-61" class="wp-caption-text">MathML en internet explorer</p></div>
<p>El estándar MathML debería ser más utilizado, pero para ello es necesario que el soporte para ambos se extienda más por lo que ya saben&#8230; a instalar las fuentes stix y el mathplayer.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://drini.wordpress.com/2008/07/24/soporte-para-mathml/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">58</post-id>
		<media:content url="https://2.gravatar.com/avatar/b76b47eb010853c3e277669847da614212dfffd1075a56a8397b31e64cea6ed4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">drini</media:title>
		</media:content>

		<media:content url="https://drini.wordpress.com/wp-content/uploads/2008/07/mathml1.png" medium="image">
			<media:title type="html">mathml en firefox</media:title>
		</media:content>

		<media:content url="https://drini.wordpress.com/wp-content/uploads/2008/07/mathml2.png" medium="image">
			<media:title type="html">MathML en internet explorer</media:title>
		</media:content>
	</item>
		<item>
		<title>Funciones hash</title>
		<link>https://drini.wordpress.com/2008/06/16/funciones-hash/</link>
					<comments>https://drini.wordpress.com/2008/06/16/funciones-hash/#comments</comments>
		
		<dc:creator><![CDATA[magister]]></dc:creator>
		<pubDate>Mon, 16 Jun 2008 03:54:09 +0000</pubDate>
				<category><![CDATA[criptografía]]></category>
		<category><![CDATA[matemáticas]]></category>
		<category><![CDATA[cifrar]]></category>
		<category><![CDATA[digital]]></category>
		<category><![CDATA[hash]]></category>
		<category><![CDATA[identidad]]></category>
		<guid isPermaLink="false">http://drini.wordpress.com/?p=55</guid>

					<description><![CDATA[Corre : Drini: Vamos a jugar un juego, mi estimado Luis. Yo pienso un color (como blanco, rojo, azul, etc. para simplificar, nada de «azul prusiano» o «rojo bermellón»). Tienes una oportunidad de adivinar. Si atinas, te doy 20 euros, si pierdes, me das 10. ¿Vale? : Luis: Ok. (Drini piensa VERDE) : Luis: Pues&#8230; [&#8230;]]]></description>
										<content:encoded><![CDATA[<h2>Corre</h2>
<p style="padding-left:30px;">
<p style="padding-left:30px;"><strong>: Drini:</strong> Vamos a jugar un juego, mi estimado Luis. Yo pienso un color (como blanco, rojo, azul, etc. para simplificar, nada de «azul prusiano» o «rojo bermellón»). Tienes una oportunidad de adivinar. Si atinas, te doy 20 euros, si pierdes, me das 10. ¿Vale?<br />
<strong>: Luis:</strong> Ok.</p>
<p style="padding-left:30px;">(Drini piensa VERDE)</p>
<p style="padding-left:30px;"><strong>: Luis:</strong> Pues&#8230; estás pensando en VERDE.<br />
<strong>: Drini:</strong> No, fallaste, estaba pensando en CAFE<br />
<strong>: Luis:</strong> Bueno, psshh&#8230; toma los 10 euros, pero me parece que has hecho trampa<br />
<strong>: Drini:</strong> ¿trampa yo? ¿cómo te atreves a sugerir eso?</p>
<h2>Lola</h2>
<p style="padding-left:30px;"><strong>: Drini:</strong> Vamos a jugar un juego, Luis. Yo pienso un color (como blanco, rojo, azul, etc. para simplificar, nada de «azul prusiano» o «rojo bermellón»). Tienes una oportunidad de adivinar. Si atinas, te doy 10 euros, si pierdes, me das 5. ¿Vale?<br />
<strong>: Luis:</strong> Hmm&#8230; ¿y quién me garantiza que no mentirás sobre tu elección?<br />
<strong>: Drini:</strong> Bueno, aquí anda Netito, le digo a Netito el color que pienso, tú adivinas y él corrobora mi elección.<br />
<strong>: Luis:</strong> Ok, me parece.<br />
<strong>: Drini:</strong> Ya pensé el color, acércate, Netito, para que te diga mi elección.</p>
<p style="padding-left:30px;">(Netito se acerca)</p>
<p style="padding-left:30px;"><strong>: Drini:</strong> (en secreto) Mira Netito, tú limítate a asentir a lo que yo diga y te ganas 5 euros, ¿ok?<br />
<strong>: Netito:</strong> Ok.</p>
<p style="padding-left:30px;"><strong>: Drini:</strong> Estamos listos, Luis, ya pensé un color. Adivina.<br />
<strong>: Luis:</strong> Estás pensando AZUL.<br />
<strong>: Drini: </strong>No, pensé en ROJO. ¿verdad Netito?<br />
<strong>: Netito:</strong> Sí, pensó ROJO.<br />
<strong>: Luis:</strong> Pshh.. otra vez perdí, toma los 10 euros. Nos vemos luego.<br />
<strong>: Drini:</strong> Bye, Luis.</p>
<p style="padding-left:30px;">(Drini le da 5 euros a Netito)</p>
<h2>Matrix</h2>
<p>Los ejemplos son bastante metafóricos, y en realidad está hablando de Internet, para aquellos a los que no les ha caído el veinte.</p>
<p>En un entorno digital, donde las interacciones no son persona a persona, hay un elemento de incertidumbre siempre presente sobre la fiabilidad de la información. ¿Cómo garantizar que la persona con la que hablamos sea quien afirma ser? <span id="more-55"></span>Podría ser alguien más tomando su lugar (usando su mismo nombre de usuario, robando sus contraseñas, etc.) Por ejemplo, si alguien muestra un correo electrónico o un «log» de una conversación como prueba de algo, ¿cómo saber que no han sido alterados o inventados?</p>
<p>Además, toda la información que transita por Internet, cada mensaje, cada correo, pasa (sin que se note) por docenas de servidores intermediarios (netitos), cada uno de ellos puede alterar la información. Y es que en el ejemplo había muy poco en juego. Pero ¿y si fuera esencial certificar la veracidad de alguna afirmación? Por ejemplo, si estuviera en juego la contraseña a una cuenta bancaria, o si hubiera información confidencial que no deba ser manipulada&#8230;</p>
<p>Un listo podría notar que en los ejemplos bastaba con que yo escribiera en un papel el color pensado, y lo mostrara después de su elección, pero en línea, donde las personas no interactúan cara a cara, eso no es posible. El equivalente digital sería almacenar la información en un sitio (por ejemplo en una pagina web) y luego indicar al jugador que acceda a la página, pero nuevamente los mismos fallos se presentan: yo podría alterar la información antes de que el otro jugador la vea, podría una tercera persona intervenir (a favor mío o del otro jugador). Piensa que podrían no ser 5 euros en juego, sino 500mil. Incluso si yo pusiera la información en una página protegida con contraseña, podría yo cambiarla antes de que el oponente acceda a ella (yo hago trampa), pero también podría la otra persona «adivinar» la clave y leer la respuesta sin que yo me entere (siendo ahora yo la víctima).</p>
<p>El problema de certificar información digital es bastante complejo. Concentrándonos en la situación del juego, lo esencial del problema es:</p>
<ol>
<li>Se tiene que fijar un dato (el color)</li>
<li>Se tiene que mantener secreto un tiempo y revelarse luego de algún evento.</li>
<li>Se tiene que certificar que la información no se haya manipulado en el tiempo intermedio.</li>
</ol>
<p>Una forma de solucionarlo es <em>cifrando</em> el color y entregándolo al inicio del juego. Así nos aseguramos que el recipiente no conozca la información antes de tiempo (por estar cifrada), así como que yo no la pueda cambiar (porque desde el inicio del juego el otro participante ya tiene la respuesta en su poder).</p>
<h2>Corre</h2>
<p style="padding-left:30px;"><strong>: Drini: </strong>Vamos a jugar un juego, Luis. Yo pienso un color (como blanco, rojo, azul, etc. para simplificar, nada de «azul prusiano» o «rojo bermellón»). Tienes una oportunidad de adivinar. Si atinas, te doy 10 euros, si pierdes, me das 5. ¿Vale?<br />
<strong>: Luis:</strong> Hmm&#8230; ¿y quién me garantiza que no mentirás sobre tu elección?<br />
<strong>: Drini:</strong> Bueno, aquí anda Netito, le digo a Netito el color que pienso, tú adivinas y él corrobora mi elección.<br />
<strong>: Luis:</strong> No, yo sé que ustedes son amiguetes y lo más probable es que se pongan de acuerdo para estafarme. A otro perro con ese hueso.<br />
<strong>: Drini:</strong> Tengo otra idea. Yo escojo el color, lo cifro mediante un código y lo escribo en esta pizarra, así te aseguras de que ya no puedo cambiar mi elección. Después de que adivines, te digo cómo descifrar el código y verificas si la respuesta que das coincide o no.<br />
<strong>: Luis:</strong> Bueno, así me parece bien, porque ya no puedes cambiar tu respuesta (está en la pizarra) y yo podré comprobar si acierto o no cuando me reveles el código. ¡Juguemos!<br />
<strong>: Drini:</strong> Perfecto, entonces escribo en la pizarra&#8230; TIRH.<br />
<strong>: Luis:</strong> Me parece que pensaste en GRIS<br />
<strong>: Drini:</strong> No, fallaste de nuevo, el color que pensé es AZUL. Paga tus 10 euros.<br />
<strong>: Luis:</strong> ¡Momento! Revélame el código para que yo pueda asegurarme de realmente perdí.<br />
<strong>: Drini:</strong> Claro, el código de cifrado es:</p>
<pre>A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
T N O S U J Y B X E V H G A P D M C L F R Q W K Z I</pre>
<p style="padding-left:30px;">Cada letra de la fila superior se cambia por la letra de la fila inferior.<br />
<strong>: Luis:</strong> Psshh&#8230; pues sí, perdí <img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f626.png" alt="😦" class="wp-smiley" style="height: 1em; max-height: 1em;" /> toma tus 10 euros.<br />
<strong>: Drini:</strong> Je, je, je&#8230;</p>
<h2>Matrix recargado</h2>
<p>Nuevamente, me he pasado de listo. Antes de continuar, considera el siguiente cifrado:</p>
<pre>A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
Z Y X W V U T S R Q P O N M L K J I H G F E D C B A</pre>
<p>Mucho más natural, ¿no? Y bajo ese esquema.. TIRH = &#8230;.</p>
<p>Ha quedado clara la falla del sistema en el último escenario. No basta con hacer público el mensaje cifrado. También hay que hacer público el método de cifrado antes de la toma de decisiones porque de lo contrario no se está garantizando el tercer punto del problema (el mensaje no debe ser alterado).  La trampa se hace ya no alterando el mensaje, sino la forma de descifrar el mensaje (para obtener la respuesta que se quiera).</p>
<p>Ahora, si al inicio del juego le diera la tabla de código a Luis podría él revertir el cifrado al leer TIRH en la pizarra y darme la respuesta correcta sin necesidad de adivinar, por lo que revelar el método al inicio del juego asegura que se cumple la condición 3 pero ya no la condición 2 (que el mensaje debe ser secreto hasta que yo decida revelarlo). Ser o no ser&#8230;</p>
<p>De nueva cuenta, la historia es metafórica, la situación bien podría corresponder a dos empresas haciendo una transacción de varios millones, pero que la trasferencia electrónica se deba hacer sólo después de haber firmado el contrato, siendo imprescindible que un documento permanezca secreto durante las negociaciones pero al mismo tiempo no sea posible modificarlo. E incluso, aunque no se diera el método de cifrado al inicio del proceso (permitiendo a la empresa Drini Co. hacer trampa al final), sería posible que la Luis contratara un hacker que descubriera la forma de descifrar el documento (permitiendo a Luis Inc. hacer trampa al inicio).</p>
<h2>El Señor de los Anillos</h2>
<p>Malo si haces (revelar el código al inicio), malo si no haces (revelar el código al final). Aparentemente.</p>
<p>La verdadera causa del problema es que los cifrados usados en el ejemplo son reversibles. Es decir, si se conoce el método se puede pasar de un mensaje «en claro» a un mensaje «cifrado» y viceversa.<br />
Una vez fija la tabla, es posible ir y venir entre las dos formas sin ningún esfuerzo, quien posea la tabla poseerá todas las piezas del rompecabezas.</p>
<p>Incluso podríamos imaginar un sistema en donde los métodos de cifrado y descifrado sean distintos, revelaríamos el método de cifrado al inicio y revelamos el de descifrado al final. Aunque en apariencia más robusto que el esquema anterior, en realidad padece de los mismos problemas. Por ejemplo: el oponente podría descubrir por sí mismo el método de descifrado tomando ventaja durante el proceso.</p>
<p>La solución está en (redoble de tambores&#8230;) usar un sistema de cifrado que «no se pueda descifrar». Siendo más precisos, una proceso para cifrar un mensaje que no se pueda revertir, por lo que no sea posible obtener el mensaje original a partir del mensaje en clave (aunque se conozca el proceso de cifrado).</p>
<p>De esta forma, al inicio del proceso los participantes se ponen de acuerdo en el proceso de cifrado, se da el mensaje en clave garantizando la inviolabilidad del mismo, y al no ser posible revertir el proceso se garantiza también el secreto.</p>
<p>En teoría se oye bien, pero ¿cómo obtener tal método? La respuesta es: mediante funciones de hash. Pero antes&#8230;</p>
<h2>Las dos torres</h2>
<p>Antes de explicar cómo obtener un método que no se pueda revertir, primero vamos a ver cómo obtener un método que sea »difícil» de revertir.</p>
<p>Ya en el rollo digital, lo primero que haremos será trabajar con números. Convertimos cada letra a un número como sigue:</p>
<pre>A B C D E F G H I J  K  L  M  N  O  P  Q  R  S  T  U  V  W  X  Y  Z
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26</pre>
<p>Así, por ejemplo, la palabra «WIKI» corresponde a (23 9 11 9).</p>
<p>El método de cifrado es:</p>
<ul>
<li>El número correspondiente a cada letra, se eleva a la quinta potencia, se divide entre 29 y se toma el resto para obtener el valor cifrado</li>
</ul>
<p>Por ejemplo, la letra V (que corresponde al número 22) se transforma en la M porque:</p>
<p>22<sup>5</sup> = 5153632  dividiendo entre 29 se obtiene 177711 y el resto de la división es 13, correspondiendo a la letra M.</p>
<p>Bajo este esquema, PEDRO se convierte, por ejemplo, en SVIOJ. El sistema es relativamente simple (con una calculadora se puede cifrar  un texto manualmente en unos par de minutos) pero es muy invertir el proceso.</p>
<p>Como reto, descifrar el mensaje ALBE (es decir, qué palabra de 4 letras se convierte, mediante el proceso descrito, en ALBE). La siguiente sección proporciona una forma de solución.</p>
<h2>El regreso del rey</h2>
<p>Supongamos que queremos descifrar la letra K (es decir, 11). Tenemos que hallar un número <em>x</em> tal que al elevarlo a la 5, dividir entre 29 y tomar el resto, el resultado sea 11. En otras palabras, resolver la ecuación de congruencia <em>x</em>^5 = 11 (mod 29), el cual ya no es un problema elemental de teoría de números y se conoce como el problema del logaritmo discreto.</p>
<p>Pero realmente no es necesario estudiar aritmética avanzada para descifrar el mensaje. El esquema sigue padeciendo de la misma debilidad: los mensajes con completamente reversibles. En otras palabras, no hay dos letras que se transformen o cifren en una misma. Así, como ya sabemos que la P se convierte en S, cada vez que aparezca una S en el mensaje cifrado sabremos que el original es P.</p>
<p>Como consecuencia, para descifrar el mensaje basta /construir/ la tabla nuevamente y se obtiene un diccionario para realizar la traducción en cualqueir sentido. Disponiendo de métodos electrónicos es cuestión de minutos reconstruir la tabla de cifrado</p>
<pre>A B C D E F G ...
A C K I V D P ...</pre>
<p>así, si recibiéramos el mensaje cifrado KADV, sabríamos que el original es CAFE, sin necesidad de hacer más cálculos.</p>
<p>Hay que aclarar un punto sutil. No estamos «descifrando» en el sentido de invertir el proceso de codificación (porque no calculamos el logaritmo discreto) lo cual es difícil, sino que hicimos trampa reconstruyendo todas las posibilidades de cifrado para obtener un diccionario. Pero.. ¿y si eso no fuera posible? Por cierto, la solución del reto en la sección anterior es AQUI (AQUI se cifra como ALBE).</p>
<h2>Matrix revoluciones</h2>
<p>Una función de hash es una función que es «fácil» de calcular, pero imposible de revertir por no ser «uno a uno».</p>
<p>Supongamos que ahora el método de cifrado consiste en elevar al cubo, dividir entre 19 y tomar el resto.</p>
<p>Cuando hagamos la trampa de reconstruir el diccionario obtendremos:</p>
<pre>A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
A H H G K G A R G L A R L H L K K R S A H H G K G A</pre>
<p>Y nuestro truco habrá sido derrotado, porque si recibimos el mensaje HARL ya no sabremos si corresponde a la palabra BALO o CARO</p>
<p>La novedad es que este nuevo sistema ya no es «uno a uno» (correspondencia exacta entre un código y otro) sino que hay colisiones en el método. Por tanto, es realmente imposible saber a ciencia cierta el mensaje original</p>
<p>Dado que es imposible «descifrar» el mensaje ¿qué utilidad puede tener tal tipo de función? La respuesta es: certificación digital.</p>
<p>Si en el juego de adivinar colores, yo pensara AZUL acordando publicar el hash (cifrado) con el método de elevar al cubo y dividir entre 19, pondría en la pizarra: AAHR</p>
<p>Dado que hay muchas palabras que dan el mismo hash, específicamente, hay 625 diferentes palabras de 4 letras con el hash AAHR, Luis tendría que calcular todas las 625 combinaciones para poder adivinar mi color.</p>
<p>Quizás aquí convenga cambiar un poco el juego para hacer énfasis en los puntos finos de la situación. Si el juego consistiera en adivinar una palabra de 4 letras (no necesariamente un color), y digamos, yo pienso CABO, el hash que haré público será HAHL. Luis tiene que adivinar qué palabra de cuatro letras pensé, habiendo 625 diferentes posibilidades. Para él, saber el hash le es inútil (porque no puede usarlo para recuperar la palabra original dado que hay colisiones). De esta forma, el hash asegura la segunda condición del problema (mantiene el secreto), pero ¿qué hay de la tercera, que yo no pueda falsificar la respuesta?</p>
<p>Imaginemos que Luis por suerte propone CABO, la misma palabra que yo había pensado. Para hacer trampa, tendría yo que encontrar una palabra de 4 letras que tenga el mismo hash y en realidad no es difícil hacerlo: por ejemplo NABO, NANO, CANO, VANO, etc.</p>
<p>Sin embargo, lo que sucede es que la función que di como ejemplo NO es una buena función de hash, es una función muy simple para propósitos ilustrativos. Sin embargo hay funciones de hash que sí satisfacen el tercer criterio (la inviolabilidad del mensaje).</p>
<p>¿Porqué es una mala función de hash? La principal debilidad es que hay demasiadas colisiones, lo que proporciona bastante espacio de maniobra para generar nuevas combinaciones con el mismo hash. Es decir, hay mucha probabilidad de colisión. El enfoque de crear un diccionario para romper el hash no es de mucha utilidad ya que en aplicaciones el diccionario no contendría 26 letras sino que constaría de miles de millones de entradas.</p>
<p>Las funciones de hash usadas en aplicaciones reales son algoritmos muchísimo más complejos que los del ejemplo, imposibles de revertir y prácticamente imposible generar un mensaje falso que tenga el mismo hash que un mensaje dado. Dependiendo del algoritmo y de los parámetros que se usen, se obtienen diferentes grados de seguridad.</p>
<p>Por ejemplo, el hash MD5 se usa comúnmente para verificar que la descarga de un archivo sea correcta (si el hash del archivo descargado no coincide con el hash publicado en el sitio web, es que la descarga se realizó incorrectamente) funciona porque la probabilidad de que el archivo corrupto tenga el mismo hash que el archivo original es casi nula. Pero aunque es seguro para certificar la información en una descarga cualquiera en Internet, no sería apropiado para certificar una transferencia de millones de euros, en cuyo caso se usaría un hash mucho más fuerte (de mayor complejidad y que haga uso de mayor cantidad de recursos computacionales).</p>
<h2>La vida de Brian</h2>
<p>Una aplicación de certificación con hashes es la comprobación digital de identidad.</p>
<p>El problema es éste: yo tengo una cuenta en un sistema (digamos Wikipedia). Si por alguna razón alguien robara mi contraseña, podría suplantar mi «identidad» en el sistema y actuar en mi nombre. Incluso podría cambiar la pregunta que se usa para recuperar la información, cambiar la dirección de correo electrónica asociada a la cuenta. En otras palabras, yo perdería por completo la posibilidad de recuperarla.</p>
<p>Bueno, podría yo acudir a los administradores del sistema quienes podrían reasignarme una nueva contraseña para recuperar la cuenta. Pero el problema surge de nuevo: ¿cómo garantizar que efectivamente soy yo quien está pidiendo la ayuda?</p>
<p>Es decir, otra persona podría intentar hacerse pasar por mi, pidiendo ayuda para que se le reasigne una clave y entonces los administradores del sistema le entregarían las llaves del reino, pensando que me las entregan a mi. No pueden enviar tampoco una contraseña a la dirección de correo, porque podría haber sido alterada.</p>
<p>Siendo un problema de certificación, de nueva cuenta podemos resolverlo usando hashes públicos. Como bien se dice, la prevención es la mejor solución.</p>
<p>En este momento, selecciono una frase cualquiera, por ejemplo:</p>
<pre>Mira siempre el lado bueno de la vida</pre>
<p>y calculo su hash bajo un esquema criptográfico de alta seguridad conocido, por ejemplo, SHA-512. Entonces hago público hoy el hash (por ejemplo, incluyéndolo en mi página de usuario):</p>
<pre>82748725d9aabf69f9aded742f7e7faee94f6b9228b
767434eb4030fd4b8a9869503e90ee09700df8ddde0
929253cc07236d48f956a2de6eb30ab19085d47959</pre>
<p>indicando que es una certificación digital de mi identidad</p>
<p>Transcurre el tiempo y sucede el temido evento de que mi cuenta es robada, mis datos alterados, mi correo electrónico cambiado, etc. Acudo con los administradores del sistema pidiendo ayuda:</p>
<p style="padding-left:30px;"><strong>: Drini: </strong>Buenos días, necesito ayuda para recuperar mi cuenta que ha sido robada. ¿podrían asignarme una nueva contraseña?<br />
<strong> : Devs:</strong> No, porque podrías ser un impostor ¿quién nos garantiza que tú eres el dueño original de la cuenta?<br />
<strong> : Drini:</strong> Ah, porque tengo una certificación digital de mi identidad. El día 17 de julio de 2008 puse en mi página de usuario el hash SHA-512. El impostor no conoce la frase original pero yo sí, la cual es:<br />
«Mira siempre el lado bueno de la vida»<br />
<strong> : Devs:</strong> Ok, espera un par de minutos mientras calculamos el hash de esa frase.<br />
(&#8230;..)<br />
<strong> : Devs:</strong> ¡Coinciden! Eso nos prueba que eres el dueño de la cuenta, ¿a dónde quieres que enviemos la nueva contraseña?</p>
<p>Asunto resuelto. ¿porqué funciona el esquema? Porque aunque otra persona tenga posesión de mi cuenta, no podrá crear una frase que tenga el mismo hash que publiqué, debido a que estoy usando un hash de alta seguridad.</p>
<p>En realidad, el problema de los colores es una metáfora de esta situación. Poner el hash en mi página de usuario, equivale a seleccionar un color y mantenerlo secreto, hasta que llega un momento (el final del juego/la certificación de la identidad) en que revelo la frase original, garantizando que la respuesta es la misma que la seleccionada originalmente.</p>
<p style="padding-left:30px;">Para más información: [[<a href="http://en.wikipedia.org/wiki/Commitment_scheme" target="_blank">en:Commitment_scheme</a>]] pero ojo, que cualquiera puede editar la wikipedia de modo que no se puede confiar en su información.</p>
<p style="padding-left:30px;">Existen herramientas en línea para calcular y verificar hashes: [<a href="http://www.fileformat.info/tool/hash.htm" target="_blank">1</a>] y [<a href="http://www.tools4noobs.com/online_tools/hash/" target="_blank">2</a>]</p>
]]></content:encoded>
					
					<wfw:commentRss>https://drini.wordpress.com/2008/06/16/funciones-hash/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">55</post-id>
		<media:content url="https://2.gravatar.com/avatar/b76b47eb010853c3e277669847da614212dfffd1075a56a8397b31e64cea6ed4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">drini</media:title>
		</media:content>
	</item>
		<item>
		<title>Generando particiones</title>
		<link>https://drini.wordpress.com/2008/05/27/generando-particiones/</link>
					<comments>https://drini.wordpress.com/2008/05/27/generando-particiones/#comments</comments>
		
		<dc:creator><![CDATA[magister]]></dc:creator>
		<pubDate>Tue, 27 May 2008 21:15:11 +0000</pubDate>
				<category><![CDATA[matemáticas]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[algoritmos]]></category>
		<category><![CDATA[combinatoria]]></category>
		<category><![CDATA[generadores]]></category>
		<category><![CDATA[particiones]]></category>
		<guid isPermaLink="false">http://drini.wordpress.com/?p=51</guid>

					<description><![CDATA[&#8230; o cómo aprendí a amar los generadores en Python y dejé de preocuparme. En estos días mi trabajo en el doctorado involucra contar cuántos puntos con coordenadas enteras tienen ciertos «poliedros» en 12 dimensiones. Tales poliedros están determinados por las formas diferentes en que se puede descomponer un número como sumas ordenadas, es decir [&#8230;]]]></description>
										<content:encoded><![CDATA[<p style="text-align:right;"><em>&#8230; o cómo aprendí a amar los generadores en Python y dejé de preocuparme.</em></p>
<p>En estos días mi trabajo en el doctorado involucra contar cuántos puntos con coordenadas enteras tienen ciertos «poliedros» en 12 dimensiones. Tales poliedros están determinados por las formas diferentes en que se puede descomponer un número como sumas ordenadas, es decir particiones. Así, dado que 6=3+1+1+1, entonces [3,1,1,1] es una partición de 6.</p>
<p>Las distintas particiones de n=6 son</p>
<pre>[6] [5, 1] [4, 2] [4, 1, 1] [3, 2, 1] [3, 1, 1, 1]
[2, 2, 2] [2, 2, 1, 1] [2, 1, 1, 1, 1] [1, 1, 1, 1, 1, 1, 1]</pre>
<p>En la aplicación particular que estoy trabajando, únicamente nos importan particiones de longitud 3. Entonces de las anteriores sólo se considerarían</p>
<p>[4, 1, 1]<br />
[3, 2, 1]<br />
[2, 2, 2]</p>
<p>Como siempre es mejor usar la computadora para las tareas mecánicas, me propuse elaborar un programa en Python que genere particiones de un número entero.</p>
<p>El esquema básico es el siguiente:<span id="more-51"></span></p>
<ol>
<li>Recorrer todos los números <em>n</em>, <em>n</em>-1, <em>n</em>-2, .., 3, 2, 1  para ocupar la primera posición</li>
<li>Una vez fija la primera posición <em>k</em>,  el resto se genera «uniendo» esa primera posición con todas las particiones de <em>n-k</em>.</li>
</ol>
<p>Por ejemplo, si <em>n</em>=6,  y <em>k=4</em> entonces todas las particiones que inician con 4 se obtienen de las particiones de 2: [2] y [1,1], dando como resultado [4,2] y [4,1,1], ambas mencionadas arriba.</p>
<p>En particular, una partición es una lista, y el resultado del programa debe ser una lista de listas. Finalmente, aunque en mi aplicación sólo es necesario calcular particiones de longitud 3, me conviene poder calcular particiones de cualquier otra longitud fija.</p>
<p><strong>Bosquejo inicial</strong></p>
<pre><span style="color:#993300;"><span style="color:#333399;"># coding=latin1
def particiones(n):
    if n==1:  </span>                <span style="color:#808000;"> # Esto detiene la recursión, si n=1, la única partición es [1],
                               # por lo que la lista de las particiones es [ [1] ]
</span></span><span><span><span style="color:#993300;"><span style="color:#333399;">    </span></span></span></span><span style="color:#993300;"><span style="color:#333399;">    return [ [1] ]
    elif n&lt;1:
        return [] </span>         <span style="color:#808000;"># Por si acaso atrapar casos "raros". Si n=0, no hay particiones, regresar []
                           # de modo similar para n&lt;0.</span>
<span style="color:#333399;">    listaparticiones=[]</span>        <span style="color:#808000;"># incialmente no tenemos ninguna partición calculada</span><span style="color:#333399;">
    for k in range(n,0,-1):<span style="color:#808000;">      </span></span><span style="color:#808000;"># Aquí recorremos todos los valores k para el primer elemento</span><span style="color:#333399;">
        cola= particiones(n-k)<span style="color:#808000;">     </span></span><span style="color:#808000;"># generamos la lista de particiones de n-l</span><span style="color:#333399;">
        for x in cola:         <span style="color:#808000;">    </span></span><span style="color:#808000;"># y para cada una de ellas...</span><span style="color:#333399;">
</span></span><span><span><span style="color:#993300;"><span style="color:#333399;">    </span></span></span></span><span style="color:#993300;"><span style="color:#333399;">        particion= [k] + x      </span><span style="color:#808000;"># la unimos con el primer elemento</span><span style="color:#333399;">
            listaparticiones.append(particion)  <span style="color:#808000;"> # y la agregamos a la lista
</span>     return listaparticiones       <span style="color:#808000;"># al final devolvemos todas las que hayamos construido</span></span><span style="color:#333399;">

lista=particiones(5)<span style="color:#808000;">        # calcularemos las particiones de n=5...</span>
for p in particiones(5):<span style="color:#808000;">    # y luego las mostraremos</span>
print p</span></span></pre>
<p>Todo listo, corremos y&#8230;</p>
<pre><span style="color:#ff9900;">[4, 1]
[3, 1, 1]
[2, 2, 1]
[2, 1, 1, 1]
[1, 3, 1]
[1, 2, 1, 1]
[1, 1, 2, 1]
[1, 1, 1, 1, 1]</span></pre>
<p>Se ha omitido [5] porque la recursión termina cuando n&lt;0 la lista sobre la que se itera es vacía. Esto se soluciona cambiando</p>
<pre><span style="color:#993300;"><span style="color:#333399;">        elif n&lt;1:
                return [] </span></span></pre>
<p><span style="color:#000000;">por</span></p>
<pre><span style="color:#993300;"><span style="color:#333399;">        elif n&lt;1:
                return [ [] ] </span>         </span></pre>
<p>Sin embargo, algo ha salido mal, porque [1,3,1] no es partición. El problema es que el esquema original no contempla que las «colas» que generan las particiones de <em>n-k </em>no pueden iniciar con un entero mayor que la «cabeza» <em>k</em>.</p>
<p>Otro problema menos evidente y mucho más interesante, es que se están efectuando muchísimas recursiones, en cada paso manteniendo en memoria listas muy grandes de particiones de forma innecesaria (por ejemplo, hay 200 000 particiones de n=50, y al efectuar la recursión fácilmente se usarán varios megabytes de memoria para algo tan sencillo). Además, se hace necesario almacenar la lista de particiones en una variable para poder recorrerla, como en:</p>
<pre><span style="color:#993300;"><span style="color:#333399;">lista=particiones(5)
for p in particiones(5):
      print p</span></span></pre>
<p>La solución a ésto es descartar el enfoque rudimentario de hacer recursiones sobre listas y usar <strong>generadores.</strong></p>
<h2>Generadores en python</h2>
<p>Un generador es una forma conveniente de crear funciones que regresan valores pertenecientes a una lista sin tener que calcular toda la lista de antemano. En el ejemplo anterior, es necesario calcular TODA la lista de particiones</p>
<pre><span style="color:#993300;"><span style="color:#333399;">lista=particiones(5)</span></span></pre>
<p>antes de poder mostrar siquiera la primera. Sería mucho más conveniente que particiones() diera cada una de ellas al necesitarlas, sin necesidad de calcularlas todas de antemano, lo cual se obtiene mediante el uso de generadores.</p>
<p>Otro uso de los generadores es devolver los elementos de una lista <strong>infinita</strong>, y como matemáticos esto es muy útil, sobre todo si se quiere modelar series y sucesiones.</p>
<p>Por ejemplo, queremos generar una lista de las primeras <em>t</em> aproximaciones a la suma 1 + (1/2) + (1/3) + &#8230; + (1/n).  La función sería:</p>
<pre><span style="color:#333399;">def armonica():
     suma=0.0        # inicializamos valores
     n=0.0
     while True:   <strong># ciclo infinito!!
</strong>         n=n+1         # aumentamos la variable
         suma = suma + 1/n    # calculamos la nueva suma
         yield suma           # regresamos el nuevo valor</span></pre>
<p>El uso de <strong>yield</strong> en vez de <strong>return</strong> convierte a la función en un generador, que regresa sus valores de uno en uno en vez de todos al mismo tiempo.</p>
<p>Y el siguiente es un ejemplo de su uso:</p>
<pre><span style="color:#333399;">t=6
z=armonica()
for j in range(t):
     print z.next()</span></pre>
<p><span style="color:#000000;">resultando en </span></p>
<pre><span style="color:#ff9900;"><span style="color:#ff6600;">1.0                <span style="color:#808000;"># 1</span>
1.5                <span style="color:#808000;"># 1 + 1/2</span>
1.83333333333</span></span><span><span><span style="color:#ff9900;"><span style="color:#ff6600;">    <span style="color:#808000;">  # 1 + 1/2 + 1/3</span></span></span></span></span><span style="color:#ff9900;"><span style="color:#ff6600;">
2.08333333333      <span style="color:#808000;"># 1 + 1/2 + 1/3 + 1/4
</span>2.28333333333      </span></span><span><span><span style="color:#ff9900;"><span style="color:#ff6600;"><span style="color:#808000;"># 1 + 1/2 + 1/3 + 1/4 + 1/5</span></span></span></span></span><span style="color:#ff9900;"><span style="color:#ff6600;">
2.45               </span></span><span><span><span style="color:#ff9900;"><span style="color:#ff6600;"><span style="color:#808000;"># 1 + 1/2 + 1/3 + 1/4</span></span></span></span></span><span style="color:#ff9900;"><span style="color:#808000;"> + 1/5 + 1/6</span></span></pre>
<p>Siendo clave la línea</p>
<pre><span><span style="color:#333399;">print z.next()</span></span></pre>
<p>en la que calcula el siguiente término, sin necesidad de recalcular los anteriores y sin necesidad de calcular los siguientes (al no saber cuántos se le pedirán).</p>
<p>Por ejemplo, si queremos generar todas las aproximaciones hasta que excedamos 3 podemos usar:</p>
<pre><span style="color:#333399;">for x in armonica():
     print x
     if x &gt;3: break</span></pre>
<p>Este ejemplo es más ilustrativo, porque no sabemos ni siquiera cuántos elementos se calcularán, simplemente se calcula de uno en uno hasta obtener alguno que exceda 3. La línea <strong>for x in armonica(): </strong>está haciendo uso de que armonica() es un iterador, por lo que se puede recorrer de uno en uno como cuando se recorre range().</p>
<h2>De vuelta al problema</h2>
<p>Necesitamos entonces 2 cambios: usar generadores y establecer un tope (opcional) al elemento inicial, tope que es necesario para evitar obtener resultados del tipo [1, 3, 1, 1].</p>
<pre><span style="color:#333399;"><strong>def particiones(n, tope=None):</strong>     # tope es un parámetro opcional
    if tope==None: tope=n          # si no está presente, la cabeza de la partición puede ser
                                   # tan grande como n mismo
    if n==1:
        yield  [1]          # dado que ya no regresamos una "lista de listas"
    elif n&lt;1:               # sino sólo un elemento, ya no necesitamos los corchetes extra
        yield []
    else:                    # necesario pues a diferencia de return, la función no termina al
                             # al llegar a yield, sino que sólo se pausa
        <strong>for k in range(min(n,tope),0,-1): </strong>  # min(n,tope) impide que las cabezas sean mayores topes<strong>
</strong><strong>            for cola in particiones(n-k,tope=k):  #</strong> y cada cabeza es tope de las subllamadas
                particion= [k] + cola
                yield particion</span>
</pre>
<p>Notemos que ya <strong>no</strong> fue necesario usar variables auxiliares como <em>listaparticiones </em>y <em>colas</em> para almacenar las listas temporales, sino que el uso de generadores (yield) permite acceder a las funciones mismas como si fueran listas.</p>
<p>Usamos la función anterior como:</p>
<pre><span style="color:#333399;">for x in particiones(5):
        print x</span></pre>
<p>Obteniendo:</p>
<p><span style="color:#ff6600;">[5]<br />
[4, 1]<br />
[3, 2]<br />
[3, 1, 1]<br />
[2, 2, 1]<br />
[2, 1, 1, 1]<br />
[1, 1, 1, 1, 1]</span></p>
<p>O como en</p>
<pre><span style="color:#333399;">for x in particiones(6,tope=4):
    print x</span></pre>
<p>que resulta en</p>
<pre><span style="color:#ff6600;">[4, 2]
[4, 1, 1]
[3, 3]
[3, 2, 1]
[3, 1, 1, 1]
[2, 2, 2]
[2, 2, 1, 1]
[2, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 1]</span></pre>
<p>Las cuales son las particiones de 6 sin elementos mayores a 4.</p>
<h2>Toques finales</h2>
<p>Casi estamos listos, sólo falta ahora filtrar de forma opcional aquellas particiones que tengan una longitud dada. Añadiremos un nuevo parámetro auxiliar «partes» que dirá el número de partes en que se divide n:</p>
<pre><span style="color:#333399;">def particiones(n, tope=None, <strong>partes=-1</strong>):
    # sólo usaremos "partes" cuando sea positiva, por eso el valor inicial de -1
    if tope==None: tope=n
    if n==1:
        yield  [1]
    elif n&lt;1:
        yield []
    else:
        for cabeza in range(min(n,tope),0,-1):
            for cola in particiones(n-cabeza,tope=cabeza,partes=partes-1):  # cada subllamada disminuye las partes en 1
                particion= [cabeza] + cola
                <strong>if (partes&lt;0) or ((partes&gt;0) and (len(particion)==partes) ):   </strong># cuando el número de partes no importa
                                                                                # o coincide con el número de partes requerido
                    yield particion                                # devolver la partición</span>
</pre>
<p>Dado que en cada etapa se filtran las particiones para devolver las que tienen el número de partes necesario, en las etapas más profundas de la recursión se regresan menos particiones y por tanto al construir las particiones totales al salir de las recursiones se hacen muchas menos concatenaciones, de modo que el programa corre mucho más rápido que si directamente se generaran todas y a la salida final se filtraran las que tienen el tamaño deseado.</p>
<p>El resultado de invocar a la función con</p>
<pre><span style="color:#333399;">for x in particiones(6, partes=3):
    print x</span></pre>
<p>es:</p>
<pre><span style="color:#ff6600;">[4, 1, 1]
[3, 2, 1]
[2, 2, 2]</span></pre>
<p>Podemos incluso combinar los parámetros. Así, pedimos las particiones de 10 cuya primera entrada no exceda de 6 y que tengan 4 partes:</p>
<pre><span style="color:#333399;">for x in particiones(10, partes=4, tope=6):
    print x</span></pre>
<p>obteniendo:</p>
<pre><span style="color:#ff6600;">[6, 2, 1, 1]
[5, 3, 1, 1]
[5, 2, 2, 1]
[4, 4, 1, 1]
[4, 3, 2, 1]
[4, 2, 2, 2]
[3, 3, 3, 1]
[3, 3, 2, 2]</span></pre>
<p>Y con eso damos por terminado el trabajo que queríamos.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://drini.wordpress.com/2008/05/27/generando-particiones/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">51</post-id>
		<media:content url="https://2.gravatar.com/avatar/b76b47eb010853c3e277669847da614212dfffd1075a56a8397b31e64cea6ed4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">drini</media:title>
		</media:content>
	</item>
		<item>
		<title>Búsqueda inversa Kile + kdvi</title>
		<link>https://drini.wordpress.com/2008/04/25/busqueda-inversa-kile-kdvi/</link>
					<comments>https://drini.wordpress.com/2008/04/25/busqueda-inversa-kile-kdvi/#respond</comments>
		
		<dc:creator><![CDATA[magister]]></dc:creator>
		<pubDate>Fri, 25 Apr 2008 02:35:27 +0000</pubDate>
				<category><![CDATA[latex]]></category>
		<category><![CDATA[dvi]]></category>
		<category><![CDATA[inverse search]]></category>
		<category><![CDATA[kde]]></category>
		<category><![CDATA[kdvi]]></category>
		<category><![CDATA[kile]]></category>
		<category><![CDATA[tex]]></category>
		<guid isPermaLink="false">http://drini.wordpress.com/?p=48</guid>

					<description><![CDATA[Fixing longstanding bug with Kile+kdvi inverse search]]></description>
										<content:encoded><![CDATA[<p>Desde hace tiempo, he notado que la búsqueda inversa de Kile+Kdvi. no funciona correctamente. La búsqueda inversa es un sistema en el cual, haciendo click con el botón medio del ratón en el archivo dvi, te lleva a la línea en el archivo fuente que corresponde a esa posición.</p>
<p>Para activar la búsqueda inversa, hay que agregar</p>
<p style="padding-left:30px;"><strong>\usepackage[active]{srcltx}</strong></p>
<p>en el preámbulo del documento tex. El kdvi activa sin problema la búsqueda inversa, y funciona muy bien con Kate como editor, el problema es que si se escoge Kile en las opciones de kdvi como editor, la búsqueda inversa siempre te lleva a la primera línea, lo cual realmente es inútil.</p>
<p>El problema se debe a una línea de comando incompleta usada por Kile para compilar el documento. La solución es ir a al menú de opciones, y en la configuración de Kile seleccionar en el árbol <strong>Tools|Build</strong> y posteriormente localizar <strong>LaTeX</strong> en el listado de comandos en la mitad de la pantalla. En la derecha aparecerá comando «latex», y las opciones son</p>
<p style="padding-left:30px;"><strong>-interaction=nonstopmode &#8216;%source&#8217;</strong></p>
<p>Ahí se cambia la línea de las opciones a</p>
<p style="text-align:left;padding-left:30px;"><strong>-interaction=nonstopmode<span style="color:#ff0000;"> -src </span>&#8216;%source&#8217;</strong></p>
<p style="text-align:left;">con lo cual, al compilar los documentos, la búsqueda inversa funcionará tal y como debe.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://drini.wordpress.com/2008/04/25/busqueda-inversa-kile-kdvi/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">48</post-id>
		<media:content url="https://2.gravatar.com/avatar/b76b47eb010853c3e277669847da614212dfffd1075a56a8397b31e64cea6ed4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">drini</media:title>
		</media:content>
	</item>
		<item>
		<title>Veropedia</title>
		<link>https://drini.wordpress.com/2007/12/05/veropedia/</link>
					<comments>https://drini.wordpress.com/2007/12/05/veropedia/#respond</comments>
		
		<dc:creator><![CDATA[magister]]></dc:creator>
		<pubDate>Wed, 05 Dec 2007 20:37:19 +0000</pubDate>
				<category><![CDATA[eswiki]]></category>
		<category><![CDATA[veropedia]]></category>
		<category><![CDATA[wikipedia]]></category>
		<category><![CDATA[GFDL]]></category>
		<category><![CDATA[libre]]></category>
		<category><![CDATA[mirror]]></category>
		<guid isPermaLink="false">http://drini.wordpress.com/2007/12/05/veropedia/</guid>

					<description><![CDATA[&#8230; y porqué te debería interesar &#8230; Pasas mucho tiempo mejorando y puliendo un artículo de Wikipedia. Lo has dejado bonito. Quizás no es para destacado, pero sí lo wikificaste, lo extendiste, lo neutralizaste, le añadiste referencias. Pero en el futuro los guerreros de ediciones pueden arruinarlo. Puede llegar uno de los que buscan empujar [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>&#8230; y porqué te debería interesar &#8230;</p>
<p style="margin-left:120px;"><font size="1">Pasas mucho tiempo mejorando y puliendo un artículo de Wikipedia. Lo has dejado bonito. Quizás no es para destacado, pero sí lo wikificaste, lo extendiste, lo neutralizaste, le añadiste referencias. Pero en el futuro los guerreros de ediciones pueden arruinarlo. Puede llegar uno de los que buscan empujar su punto de vista y arruinar la neutralidad&#8230; uno nunca sabe.</font></p>
<h2><span style="font-weight:bold;">¿Qué es Veropedia?</span></h2>
<p>Veropedia (<a href="http://veropedia.com" target="_blank">http://veropedia.com</a>) es un proyecto que busca almacenar copias «estables» de los artículos de Wikipedia. Artículos de calidad, con referencias, neutrales, de modo que se presente siempre una copia buena de los artículos, sin guerras de edición, sin vandalismo.<br />
Los veropedistas mejoramos artículos de Wikipedia, localizamos los artículos buenos ya existentes y los subimos a Veropedia, tales proceso se llama «veroificar» un artículo. Una vez en veropedia, los enlaces interwiki tienen 2 colores: verde y azul. Cuando el destino de un enlace ya se encuentra en Veropedia, el enlace se muestra en verde. Cuando el enlace es azul, significa que el destino aún no ha sido veroificado y por tanto el enlace te regresa a Wikipedia (donde puedes leer y mejorar el artículo).</p>
<h2>¿Y porqué debe importarme Veropedia?</h2>
<p>Qué bueno que preguntas, y éso es lo que quisiera platicarte en el resto de este ensayo.</p>
<p><span id="more-37"></span></p>
<p>Bueno, existen ya muchos clones de Wikipedia en la red. Por ejemplo, una búsqueda rápida muestra que [[es:Archivo binario]] está copiado en:</p>
<ul>
<li><font size="-1"><span class="a">wapedia.mobi/es/Archivo_binario</span></font></li>
<li><font size="-1"><span class="a"><a href="http://www.enciclonario.com/enciclopedia/Archivo_binario" rel="nofollow">http://www.enciclonario.com/enciclopedia/Archivo_binario</a></span></font></li>
<li><font size="-1"><span class="a">es.wikisrc.org/wiki/Archivo_binario</span></font></li>
<li><font size="-1"><span class="a"><a href="http://www.babylon.com/definition/archivo_binario/Spanish" rel="nofollow">http://www.babylon.com/definition/archivo_binario/Spanish</a></span></font></li>
<li><font size="-1"><span class="a"><a href="http://www.boonic.com/enciclopedia/69062.php" rel="nofollow">http://www.boonic.com/enciclopedia/69062.php</a></span></font></li>
<li><font size="-1"><span class="a"><a href="http://www.territorioscuola.com/wiki/es.wikipedia.php?title=Archivo_binario" rel="nofollow">http://www.territorioscuola.com/wiki/es.wikipedia.php?title=Archivo_binario</a></span></font></li>
<li><font size="-1"><span class="a"><a href="http://www.dimelo.com/GS/SeeTheme.aspx?String=Archivo+binario" rel="nofollow">http://www.dimelo.com/GS/SeeTheme.aspx?String=Archivo+binario</a></span></font></li>
<li><font size="-1"><span class="a">astrored.org/enciclopedia/wiki/Archivo_binario</span></font></li>
<li><font size="-1"><span class="a"><a href="http://www.songtranslator.net/wiki/wiki.php?title=Archivo_binario" rel="nofollow">http://www.songtranslator.net/wiki/wiki.php?title=Archivo_binario</a></span></font></li>
<li><font size="-1"><span class="a"><a href="http://www.wiki-pedia.pl/es/wiki/Archivo_binario.html" rel="nofollow">http://www.wiki-pedia.pl/es/wiki/Archivo_binario.html</a></span></font></li>
<li><font size="-1"><span class="a"><a href="http://www.cetratec.org/mediawiki/index.php?title=Archivo_binario" rel="nofollow">http://www.cetratec.org/mediawiki/index.php?title=Archivo_binario</a></span></font></li>
<li><font size="-1"><span class="a"><a href="http://www.encyklopediapolska.pl/es/wiki/Archivo_binario.html" rel="nofollow">http://www.encyklopediapolska.pl/es/wiki/Archivo_binario.html</a></span></font></li>
<li><font size="-1"><span class="a"><a href="http://www.oec.eu/archivo_binario_es.html" rel="nofollow">http://www.oec.eu/archivo_binario_es.html</a></span></font></li>
<li><font size="-1"><span class="a"><a href="http://www.wiki-net.pl/es/wiki/Archivo_binario.html" rel="nofollow">http://www.wiki-net.pl/es/wiki/Archivo_binario.html</a></span></font></li>
<li><font size="-1"><span class="a">es.wikimobs.com/index.php?title=archivo_binario</span></font></li>
<li><font size="-1"><span class="a">etcétera&#8230;.</span></font></li>
</ul>
<p>Todos esos sitios copian el contenido de Wikipedia y lo presentan en su sitio. Incluso algunos ni siquiera mencionan que fue tomado de Wikipedia (como cetratec). Bah. Parásitos. ¿Necesitamos <span style="font-style:italic;">otro más</span>? ¿porqué Veropedia es diferente?</p>
<p>En cada uno de los casos listados, <span style="font-style:italic;">se toma el trabajo y no se aporta nada de vuelta</span>. Sí, el contenido de Wikipedia es libre para reusarse (incluso para fines comerciales, por eso se permiten los sitios anteriores). Pero ninguno de ellos le proporciona un beneficio directo a Wikipedia.<span style="font-style:italic;"></span> Veropedia es diferente porque <span style="font-weight:bold;">Veropedia fomenta la mejora de los artículos en Wikipedia.</span></p>
<h2>¿Cómo ayuda Veropedia a Wikipedia?</h2>
<p>Veropedia no busca ser simplemente un clon de Wikipedia. <span style="font-weight:bold;"></span>Dado que el objetivo de Veropedia es coleccionar artículos buenos, los Veropedistas están constantemente mejorando artículos de Wikipedia para alcanzar los estándares buscados y poderlos añadir a Veropedia. No es posible editar artículos en Veropedia para mejorarlos, <span style="font-style:italic;">necesariamente deben mejorarse en Wikipedia antes de poder añadirlos a Veropedia</span>. De esta forma, Veropedia no es sólo una copia pasiva como las muchas existentes. Veropedia es una copia activa, fomentando que los veropedistas (que, de hecho, son wikipedistas veteranos). Mejorar Wikipedia es mejorar Wikipedia. Mejorar Wikipedia es mejorar Veropedia.</p>
<p>Así, Veropedia no es una copia mantenida por una empresa que sólo busca copiar el contenido de Wikipedia y obtener ganancias con la copia: <span style="font-weight:bold;">Veropedia está formada por wikipedistas veteranos</span>. A la cabeza del proyecto está Danny (Danny Wool) quien hasta el año pasado trabajaba para la Fundación Wikimedia. Los aspectos técnicos los llevan varios wikipedistas de la wiki inglesa (de donde surgió la idea), quienes participan en la Veropedia en inglés.</p>
<p>El compromiso que tiene Veropedia con los ideales de Wikipedia, se hace patente incluso en su portada, donde es prominente un enlace invitando a donar para apoyar a Wikipedia. ¿Cuántos clones hacen lo mismo?</p>
<h2>Pero.. Veropedia se beneficia gratuitamente del trabajo de los Wikipedistas ¿no?</h2>
<p>A diferencia de todos los sitios listados anteriormente, que sólo buscan un provecho comercial, Veropedia tiene por objetivo crear una copia estable de artículos buenos. Todos los sitios en los enlaces del inicio,</p>
<ul>        <font size="-1"></p>
<li>copian a Wikipedia</li>
<li>ponen publicidad</li>
<li>se benefician de Wikipedia</li>
<li>no aportan nada a Wikipedia</li>
<li>no fomentan el espíritu libre</li>
<li>incluso, algunos incluso tratan de ocultar el origen del contenido para aparentar que ellos mismos lo han escrito.</li>
<p></font></ul>
<p>Veropedia:</p>
<ul>        <font size="-1"></p>
<li>usa el contenido de Wikipedia</li>
<li>tiene mínima o nula publicidad</li>
<li>se beneficia de Wikipedia</li>
<li>fomenta la mejora de artículos de Wikipedia</li>
<li>fomenta el espíritu libre al atribuir claramente el origen del contenido así como la licencia</li>
<li>fomenta la llegada de editores a Wikipedia</li>
<p></font></ul>
<h2>Estoy en contra del uso de mi esfuerzo para fines comerciales.</h2>
<p>Papi, la licencia GFDL explícitamente lo permite, es parte de que el contenido sea <span style="font-style:italic;">libre</span>. Ahora, puede usarse de forma parasitaria como los otros clones de Wikipedia, o puede usarse de forma responsable y beneficiosa para todos. Criticar a Veropedia haciéndose de la vista gorda en los clones, es simplemente criticar por criticar.</p>
<p>Además, si tanto te repugna, te irrita, te enoja, la posibilidad de uso comercial de tu trabajo.. ¡no colabores en Wikipedia! Mejor créate una wiki donde todo tenga derechos reservados y se te tenga que pedir autorización para reusar tu contenido. Recuerda que el contenido libre tiene 3 permisos <span style="font-style:italic;">irrevocables</span>:</p>
<ul>        <font size="-1"></p>
<li>Permiso de copia</li>
<li>Permiso de modificación</li>
<li>Permiso de reuso para cualquier fin (sí, hasta para usos comerciales)</li>
<p></font></ul>
<p>Recuerda también que hay <a href="http://wikia.com" target="_blank"><em>ahem, otros sitios</em></a> (con ánimo de lucro y con el beneplácito de San Jimbo) que toman contenido de Wikipedia.</p>
<h2>Bueno, me interesa Veropedia. ¿Cómo ayudo?</h2>
<p style="text-align:center;"><span style="font-weight:bold;">Lo más importante que puedes hacer para ayudar a Veropedia,<br />
es mejorar los artículos de Wikipedia.</span></p>
<p style="text-align:left;">Sé que sueno muy repetitivo. Pero ése es el punto más importante. Es un círculo virtuoso de beneficio mutuo. El siguiente paso es obtener una cuenta en Veropedia. Entra a <a href="irc://irc.freenode.net/veropedia" target="_blank">#veropedia</a> en freenode, y pregúntale a Danny o a Eagle que te ayuden a sacar una cuenta. Platica con la gente del canal. Verás que todos son wikipedistas de abolengo, todos comprometidos con los principios de Wikipedia. La Veropedia en español (al momento de escribir ésto), aún no está abierta, pero sí está contemplado abrirla. Sólo estamos a la espera de que unos cuantos wikipedistas (digamos, cinco) muestren interés por participar, se comprometan a mejorar artículos de Wikipedia para subirlos al sistema, soliciten su cuenta, y entonces iniciará Veropedia en español.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://drini.wordpress.com/2007/12/05/veropedia/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">37</post-id>
		<media:content url="https://2.gravatar.com/avatar/b76b47eb010853c3e277669847da614212dfffd1075a56a8397b31e64cea6ed4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">drini</media:title>
		</media:content>
	</item>
		<item>
		<title>Es rtnemlaee itnatirre</title>
		<link>https://drini.wordpress.com/2007/10/20/es-rtnemlaee-itnatirre/</link>
					<comments>https://drini.wordpress.com/2007/10/20/es-rtnemlaee-itnatirre/#comments</comments>
		
		<dc:creator><![CDATA[magister]]></dc:creator>
		<pubDate>Sat, 20 Oct 2007 14:22:24 +0000</pubDate>
				<category><![CDATA[ciencia]]></category>
		<category><![CDATA[matemáticas]]></category>
		<category><![CDATA[memes]]></category>
		<category><![CDATA[permutaciones]]></category>
		<category><![CDATA[religion]]></category>
		<guid isPermaLink="false">http://drini.wordpress.com/2007/10/20/es-rtnemlaee-itnatirre/</guid>

					<description><![CDATA[Sucede muchas veces que la gente escucha algo que le llama la atención y lo repite constantemente. Y lo repite sin detenerse a pensar si en realidad es cierto.Hablo de una noticia vieja (la he visto hace ya más de un año, pero hoy mismo día me la he topado dos veces), que cuando la [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Sucede muchas veces que la gente escucha algo que le llama la atención y lo repite constantemente. Y lo repite sin detenerse a pensar si en realidad es cierto.Hablo de una noticia vieja (la he visto hace ya más de un año, pero hoy mismo día me la he topado dos veces), que cuando la ví, me llamó mucho la atención. Y básicamente dice algo así.</p>
<p><span style="font-style:italic;">Cietra unversdiad ineglsa dsecubrio que si al escrbiir las palaabrs, la pirmera y la ulitma lertas etsán en su lgaur , no improta el oerdn de las dmeas, uno peude leer «calramnete»&#8230;</span></p>
<p>Cierta universidad inglesa descurió que si al escribir las palabras, la primera y la última letras están en su lugar no importa el orden de las demás, uno puede leer «claramente» las palabras sin necesidad de mucho esfuerzo, ya que el cerebro procesa por «palabras» en lugar de letra por letra.</p>
<p>Nunca he escuchado que digan cuál es la universidad, ni nadie que me lo cuenta en realidad ha leído tal artículo. Sin embargo, con una demostración similar a la anterior, todo mundo queda convencido.</p>
<p>¿Será? Pues&#8230; ¡NO!<br />
La afirmación es incorrecta y tiene su trampa. Cabe aclarar que ninguna de las personas que me mencionan tal hecho lo hace de mala fe, ya que viene acompañada de «eivdnceia». Así que ellos no están conscientes de la pequeña trampa que a ellos mismos les han jugado.</p>
<p>La afirmación es esta:<br />
<span style="font-style:italic;">Basta que la primera y la última letra estén en posición, sin importar el orden de las demás, para que podamos reconocer «en segiuda» la palarba.<br />
</span>Bueno, si quiero probar que la afrimacóin es falsa, dbereía de dejar de dar eejmpols de que sí funciona.</p>
<p>Y sin más preámbulos&#8230;. regresar al título. ¡¡No es tan sencillo de leer!! A pesar de que la primera y la última letra están en su lugar. La pequeña trampa es que en todos los ejemplos que se han dado de muestra, las letras dseordneadas, en realidad no estaban <span style="font-style:italic;font-weight:bold;">tan</span> desordenadas.</p>
<p>La afirmación sólo es cierta si el grado de desorden de la palabra es pequeño. Uno puede preguntarse cómo es que uno puede medir qué tan desordenada está una palabra, y la respuesta viene en el curso básico de teoría de grupos, ya que una palabra desordenada es, a final de cuentas, una permutación de sus letras. Y toda permutación se puede expresar como producto de transposiciones, y se le puede asignar un número mínimo de inversiones, etc&#8230;<br />
(si a alguien le interesa, que me envíe un correo solicitando más detalles).</p>
<p>Así que el desorden de las letras «de enmedio» sí importa. <strong>Claro que dí muchos ejemplos que sí funcionan, y hasta ahora sólo he dado uno que no, bien podría ser la excepción</strong>. Por lo que aquí van otros ejemplos:<br />
<strong></strong></p>
<ul>
<li><strong><span class="pn-normal" style="font-family:Century Gothic,Century Gothic MT,Calibri,Helvetica,sans-serif,Arial;">¿Cmoo eacilpxr un mrgalio en un mdnuo ddnoe tdoo tneie enoicacilpxn?</span></strong></li>
<li><strong><span class="pn-normal" style="font-family:Century Gothic,Century Gothic MT,Calibri,Helvetica,sans-serif,Arial;">Doreitucsin ptnemasorgilee puqroe Aromy sainetsoa que mar y amar no se paidon uazilitr para una rmia</span></strong></li>
<li><strong><span class="pn-normal" style="font-family:Century Gothic,Century Gothic MT,Calibri,Helvetica,sans-serif,Arial;">Y así vomas atnalede, betos que ramen crtnoa la ctneirroe, itnemetnasecne asodartsarrs hicaa el pdasao</span></strong></li>
<li><strong><span class="pn-normal" style="font-family:Century Gothic,Century Gothic MT,Calibri,Helvetica,sans-serif,Arial;">Los aonmuls doreidicen caibmar la fhcea de la eugertna</span></strong></li>
<li><strong><span class="pn-normal" style="font-family:Century Gothic,Century Gothic MT,Calibri,Helvetica,sans-serif,Arial;">Asetige aetns de usrase</span></strong></li>
<li><strong><span class="pn-normal" style="font-family:Century Gothic,Century Gothic MT,Calibri,Helvetica,sans-serif,Arial;">El ptneicae dtrepseó htneirbmao</span></strong></li>
<li><strong><span class="pn-normal" style="font-family:Century Gothic,Century Gothic MT,Calibri,Helvetica,sans-serif,Arial;">La eidepolcicna lerbie<br />
</span></strong></li>
<li><strong><span class="pn-normal" style="font-family:Century Gothic,Century Gothic MT,Calibri,Helvetica,sans-serif,Arial;">Nsetoe que en cada lenia, la rlgea se clpmue</span></strong></li>
</ul>
<p><strong>Sí, en cada ejemplo la regla se cumple, </strong>la primera y la última letra están en posición, mientras que todas las demás están revueltas. Pero en mis ejemplos, los desórdenes no son pequeños (una o dos letras incorrectas), sino que he maximizado el número de inversiones (es decir, el mayor desórden posible) con las letras de enmedio, <strong>pero el resultado ya no se puede leer tan fácil como si estuvieran escritas correctamente, como decía la afirmación. </strong></p>
<p>Claro que todos los ejemplos fueron construidos con un método, (que no es difícil de descifrar), y que conociendo el método se pueden leer los ejemplos con relativa facilidad, pero lo importante es que no se pueden leer casi igual de rápido que si estuvieran correctamente.</p>
<p>También hay que tomar en cuenta que en el inglés (el lenguaje original del estudio), la mayoría de las palabras son de una o dos sílabas, mientras que en español, frecuentemente aparecen palabras de 2, 3 o 4 sílabas. Y claro, si hay menos letras, el desorden posible es menor (aunque también hay contraejemplos a la afirmación en inglés, pero esa es otra historia).</p>
<p>Así, la afirmación correcta es:</p>
<p align="center"><span style="font-weight:bold;">Si en una palabra, la primera y la última letra se dejan en su posición, y las demás letras se cambian <span style="font-style:italic;">ligeramente</span> de su posición, es posible entender la palabra sin mucho esfuerzo.</span></p>
<p>Eso ya no es tan impresionante ¿verdad? Y suena un poco tonto armar tanto alboroto por algo que es un tanto evidente. <img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>Como postdata (con un pequeño guiño a <a href="hict.blogspot.com" target="_blank">hein?</a>) ¿sabías que la palabra <em>crédulo</em> no está en el diccionario?:<br />
<iframe class="youtube-player" width="604" height="340" src="https://www.youtube.com/embed/OruQy-X32O0?version=3&#038;rel=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;fs=1&#038;hl=es&#038;autohide=2&#038;wmode=transparent" allowfullscreen="true" style="border:0;" sandbox="allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox"></iframe></p>
]]></content:encoded>
					
					<wfw:commentRss>https://drini.wordpress.com/2007/10/20/es-rtnemlaee-itnatirre/feed/</wfw:commentRss>
			<slash:comments>10</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">30</post-id>
		<media:content url="https://2.gravatar.com/avatar/b76b47eb010853c3e277669847da614212dfffd1075a56a8397b31e64cea6ed4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">drini</media:title>
		</media:content>
	</item>
	</channel>
</rss>
