<?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>Varrojo@Linux &#187; Programacion</title>
	<atom:link href="http://varrojo.algorithmia.net/category/programacion/feed/" rel="self" type="application/rss+xml" />
	<link>http://varrojo.algorithmia.net</link>
	<description>A master calls it a butterfly, even though a caterpillar calls it death.</description>
	<lastBuildDate>Tue, 07 Sep 2010 15:20:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>C++ StringStreams</title>
		<link>http://varrojo.algorithmia.net/2010/09/07/c-stringstreams/</link>
		<comments>http://varrojo.algorithmia.net/2010/09/07/c-stringstreams/#comments</comments>
		<pubDate>Tue, 07 Sep 2010 15:18:40 +0000</pubDate>
		<dc:creator>Varrojo</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Programacion]]></category>

		<guid isPermaLink="false">http://varrojo.algorithmia.net/?p=968</guid>
		<description><![CDATA[<br/>Fernando Briano, de Picando Código, está con un artículo muy interesante hoy sobre StringBuilders y StringBuffers de Java. El artículo describe el por qué un desarrollador querría hacer uso de éstos en vez de los operadores sobrecargados de String (como &#8220;+&#8221;) para concatenar Strings. La clase string de C++, definida dentro del cabezal &#60;string&#62; y [...]]]></description>
			<content:encoded><![CDATA[<br/><p>Fernando Briano, de <a href="http://picandocodigo.net">Picando Código</a>, está con un artículo muy interesante hoy sobre <a href="http://picandocodigo.net/2010/java-stringbuilder-stringbuffer/">StringBuilders y StringBuffers de Java</a>. El artículo describe el por qué un desarrollador querría hacer uso de éstos en vez de los operadores sobrecargados de String (como &#8220;+&#8221;) para concatenar Strings.</p>
<p>La clase <strong>string</strong> de C++, definida dentro del cabezal &lt;string&gt; y bajo el namespace <strong>std</strong>, también provee un operador sobrecargado de &#8220;+&#8221; para concatenar instancias de strings pero, al igual que en Java, existen circunstancias en las cuales es mejor utilizar un buffer para concatenar, por ejemplo, para evitar crear muchos objetos temporales en el stack (nótese que a diferencia de Java, en C++ podemos crear objetos tanto en el Stack como en el Heap.).</p>
<p>La clase <strong>stringstream</strong>, también del namespace <strong>std</strong> pero definida en el cabezal &lt;sstream&gt; provee una funcionalidad similar al StringBuilder de Java, pero haciendo uso del operador de inserción de flujos de C++ (<strong>&lt;&lt;</strong>). Los stringstreams permiten insertar cualquier tipo de dato dentro del flujo. Todos serán convertidos automáticamente a strings y concatenados.</p>
<p>A continuación un ejemplo:</p>
<pre class="brush:cpp">
#include &lt;iostream&gt;
using std::cout;
using std::endl;

#include &lt;sstream&gt;
using std::stringstream;

int main(int argv, char* argv[])
{
    // Creamos un stringstream y concatenamos varias constantes:
    stringstream ss;
    ss &lt;&lt; "Picando" &lt;&lt; " " &lt;&lt; "Codigo" &lt;&lt; "; btw PI = " &lt;&lt; 3.14159;

    // Imprimimos el string en la salida estándar:
   cout &lt;&lt; ss.str() &lt;&lt; endl;

   return 0;
}
</pre>
<p>A diferencia de Java, los stringstreams también pueden utilizarse para tokenizar strings. En este caso seteamos el string directamente y luego utilizamos el operador de extracción de flujo (<strong>&gt;&gt;</strong>) para obtener los tokens:</p>
<pre class="brush:cpp">
#include &lt;sstream&gt;
using std::stringstream;

int main(int argc, char* argv[])
{
    stringstream ss;
    ss.str("Tokenizame 2 4.0");

    string s;
    int i;
    double d;

    // Extrae, convierte a los tipos apropiados y asigna, todo en una sola línea:
    ss &gt;&gt; s &gt;&gt; i &gt;&gt; d;
    return 0;
}
</pre>
<p>Interesante, ¿no? Gran parte de la flexibilidad de los stringstreams viene de la posibilidad de C++ de sobrecargar operadores, lo cual permite simplificar la lectura de las rutinas que trabajan con entrada salida de flujos, ya sea E/S a la terminal o E/S a un buffer de strings.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fvarrojo.algorithmia.net%2F2010%2F09%2F07%2Fc-stringstreams%2F&amp;linkname=C%2B%2B%20StringStreams"><img src="http://varrojo.algorithmia.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://varrojo.algorithmia.net/2010/09/07/c-stringstreams/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Portando de DOS a Windows</title>
		<link>http://varrojo.algorithmia.net/2010/08/13/portando-de-dos-a-windows/</link>
		<comments>http://varrojo.algorithmia.net/2010/08/13/portando-de-dos-a-windows/#comments</comments>
		<pubDate>Fri, 13 Aug 2010 14:16:03 +0000</pubDate>
		<dc:creator>Varrojo</dc:creator>
				<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Video Juegos]]></category>

		<guid isPermaLink="false">http://varrojo.algorithmia.net/?p=937</guid>
		<description><![CDATA[<br/>Ayer leía en Slashdot sobre la historia del Port de Death Rally, un juego desarrollado por una empresa ya difunta llamada Apogee y del cual los derechos son ahora de la Finlandesa Remedy Edit: Resulta que la Finlandesa Remedy desarrolló el Juego y Apogee fue solamente el Publisher. Extraído del artículo: &#8220;La plataforma original era [...]]]></description>
			<content:encoded><![CDATA[<br/><p>Ayer leía en Slashdot sobre la historia del Port de Death Rally, un juego <del datetime="2010-08-29T23:50:00+00:00">desarrollado por una empresa ya difunta llamada Apogee y del cual los derechos son ahora de la Finlandesa Remedy</del> <strong>Edit:</strong> Resulta que la Finlandesa Remedy desarrolló el Juego y Apogee fue solamente el Publisher.</p>
<p>Extraído del <a href="http://sol.gfxile.net/dr_gdm.html">artículo</a>:</p>
<blockquote><p>&#8220;La plataforma original era DOS, Watcom C, y un extensor de DOS estilo DOS4GW. El extensor básicamente significaba que podías utilizar más de 640k de memoria, y no necesitarías código extraño para datos mayores a 64k.</p>
<p>El juego desplegaba en los modos gráficos VESA 640&#215;480 y MCGA 320&#215;200, todos con paletas de 8 bits; No había color real en ninguna parte. También habían algunos trucos de cambios de paleta cada cuadro con los cuales los emuladores tienen problemas.</p>
<p>El código fuente era mayoritariamente C puro, con un par de docenas de funciones assembly embebidas. Un par de subsistemas se encontraban faltantes, específicamente audio y red, los cuales tendrían que ser reemplazados completamente de todos modos, al igual que un archivo para el cual el código fuente se había perdido y solo un objeto compilado estaba disponible.&#8221;</p></blockquote>
<p>La historia cuenta los detalles del port; En general tiene mucho que ver con los problemas que uno suele encontrarse cuando desea adaptar una aplicación DOS a Windows. Uno de los problemas más comunes es que en DOS, uno podía programar a muy bajo nivel, haciendo a un lado al Sistema Operativo y trabajando directamente sobre el Hardware.</p>
<p>Una solución que me llamó la atención consistió en como resolver el problema de que para dibujar en la pantalla, el programa escribía en memoria de video directamente (en la dirección 0xa000). La solución fue, en vez de rehacer todo este código, crear una array del tamaño apropiado, almacenar un puntero global (llamado g0xa000) y reemplazar las escrituras.</p>
<p>Pueden seguir leyendo los detalles del port en el <a href="http://sol.gfxile.net/dr_gdm.html">artículo original</a> y también pueden descargar el Death Rally gratis para Windows (XP, Vista, 7) desde la <a href="http://www.remedygames.com/games/deathrally">página de Remedy</a>.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fvarrojo.algorithmia.net%2F2010%2F08%2F13%2Fportando-de-dos-a-windows%2F&amp;linkname=Portando%20de%20DOS%20a%20Windows"><img src="http://varrojo.algorithmia.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://varrojo.algorithmia.net/2010/08/13/portando-de-dos-a-windows/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Big-O</title>
		<link>http://varrojo.algorithmia.net/2010/07/19/big-o/</link>
		<comments>http://varrojo.algorithmia.net/2010/07/19/big-o/#comments</comments>
		<pubDate>Tue, 20 Jul 2010 02:00:45 +0000</pubDate>
		<dc:creator>Varrojo</dc:creator>
				<category><![CDATA[Programacion]]></category>

		<guid isPermaLink="false">http://varrojo.algorithmia.net/?p=921</guid>
		<description><![CDATA[<br/>Enconté mediante Reddit un post en Stack Overflow que explica en términos sencillos en qué consiste la notación &#8220;Big-O&#8221;, utilizada para representar la complejidad de un algoritmo. Traduzco solo una parte del post aquí, les recomiendo leer el post completo si es que te encuentras en duda o necesitas repasar en qué consiste esta notación. [...]]]></description>
			<content:encoded><![CDATA[<br/><p>Enconté mediante Reddit un post en Stack Overflow que explica en términos sencillos en qué consiste la notación &#8220;Big-O&#8221;, utilizada para representar la complejidad de un algoritmo.</p>
<p>Traduzco solo una parte del post aquí, les recomiendo leer el post completo si es que te encuentras en duda o necesitas repasar en qué consiste esta notación.</p>
<blockquote><p><strong>La notación Big-O es una representación relativa de la complejidad de un algoritmo.</strong></p>
<p>Hay algunas palabras importantes deliberadamente elejidas en esta oración:</p>
<ul>
<li><strong>relativa</strong>: únicamente puedes comparar manzanas con manzanas. No puedes comparar un algoritmo que hace multiplicación aritmética con uno que ordena una lista de enteros. No obstante, [comparar] dos algoritmos que hacen operaciones aritmeticas (uno multiplicación y otro suma) te dirá algo significativo.</li>
<li><strong>representación</strong>: Big-O (en su forma más simple) reduce la comparación entre algoritmos a una única variable. Esa variable es elegida basandose en observaciones y supuestos. Por ejemplo, [los] algoritmos para ordenar son típicamente comparados en base a operaciones de comparación (comparar dos nodos para determinar su orden relativo). Esto asume que comparar es costoso. ¿Pero qué si comparar es barato e intercambiar costoso? Cambia la comparación; y</li>
<li><strong>complejidad</strong>: si me toma un segundo ordenar 10.000 elementos, ¿cuánto me llevará ordenar un millón? La complejidad, en esta instancia, es una medida relativa de algo más.</li>
</ul>
</blockquote>
<p><a href="http://stackoverflow.com/questions/487258/plain-english-explanation-of-big-o/487278#answer-487278">Continuar leyendo en Stack Overflow&#8230;</a></p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fvarrojo.algorithmia.net%2F2010%2F07%2F19%2Fbig-o%2F&amp;linkname=Big-O"><img src="http://varrojo.algorithmia.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://varrojo.algorithmia.net/2010/07/19/big-o/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Diferencia de Conjuntos con programación funcional de Python</title>
		<link>http://varrojo.algorithmia.net/2010/07/01/diferencia-de-conjunto-en-python/</link>
		<comments>http://varrojo.algorithmia.net/2010/07/01/diferencia-de-conjunto-en-python/#comments</comments>
		<pubDate>Thu, 01 Jul 2010 15:00:30 +0000</pubDate>
		<dc:creator>Varrojo</dc:creator>
				<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://varrojo.algorithmia.net/?p=880</guid>
		<description><![CDATA[<br/>Supongamos que tenemos dos listas a y b de Python y queremos calcular una lista d tal que: d = a &#8211; b #diferencia de conjuntos. Utilizando las construcciones funcionales de Python (en particular List Comprehension), resulta muy sencillo: d = [x for x in a if x not in b] Vean como la construcción [...]]]></description>
			<content:encoded><![CDATA[<br/><p>Supongamos que tenemos dos listas <strong>a </strong>y <strong>b</strong> de Python y queremos calcular una lista <strong>d</strong> tal que:</p>
<p>d = a &#8211; b #diferencia de conjuntos.</p>
<p>Utilizando las construcciones funcionales de Python (en particular List Comprehension), resulta muy sencillo:</p>
<pre class="brush:python">
d = [x for x in a if x not in b]
</pre>
<p>Vean como la construcción del lenguaje prácticamente se lee como la definición formal de diferencia de conjuntos: &#8220;<strong>d</strong> es igual a <em>x</em> para todo <em>x</em> que pertenece a <strong>a </strong>y <em>x</em> no pertenece a <strong>b</strong>&#8220;.</p>
<p>Si comparamos esto con el equivalente imperativo, es fácil ver que estamos expresando mediante el lenguaje lo que <em>queremos</em> que se haga y no <em>cómo</em> hacerlo exactamente.</p>
<p>Esta sutileza nos permite ahorrar mucho código y ser más productivos desarrollando aplicaciones cuando no es crítico el mantener el control sobre cada instrucción exacta a ser ejecutada.</p>
<p>¿Qué otros ejemplos interesantes de manejo de listas sueles utilizar?</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fvarrojo.algorithmia.net%2F2010%2F07%2F01%2Fdiferencia-de-conjunto-en-python%2F&amp;linkname=Diferencia%20de%20Conjuntos%20con%20programaci%C3%B3n%20funcional%20de%20Python"><img src="http://varrojo.algorithmia.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://varrojo.algorithmia.net/2010/07/01/diferencia-de-conjunto-en-python/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Curso de C del MIT, ahora online y gratuito</title>
		<link>http://varrojo.algorithmia.net/2010/06/29/curso-de-c-del-mit-ahora-online-y-gratuito/</link>
		<comments>http://varrojo.algorithmia.net/2010/06/29/curso-de-c-del-mit-ahora-online-y-gratuito/#comments</comments>
		<pubDate>Tue, 29 Jun 2010 20:56:53 +0000</pubDate>
		<dc:creator>Varrojo</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Programacion]]></category>

		<guid isPermaLink="false">http://varrojo.algorithmia.net/?p=878</guid>
		<description><![CDATA[<br/>El MIT ha publicado en Internet las trasparencias de su curso &#8220;Practical Programming in C&#8221;, correspondiente a Enero del 2010. El curso se compone de 14 trasparencias (una por lección), todas disponibles gratuitamente en el siguiente link: http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-087-practical-programming-in-c-january-iap-2010/lecture-notes/ Yo leí hasta la lección 7 y pude apreciar como el material comienza con lo básico pero [...]]]></description>
			<content:encoded><![CDATA[<br/><p>El MIT ha publicado en Internet las trasparencias de su curso &#8220;Practical Programming in C&#8221;, correspondiente a Enero del 2010.</p>
<p>El curso se compone de 14 trasparencias (una por lección), todas disponibles gratuitamente en el siguiente link:</p>
<p><a href="http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-087-practical-programming-in-c-january-iap-2010/lecture-notes/">http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-087-practical-programming-in-c-january-iap-2010/lecture-notes/</a></p>
<p>Yo leí hasta la lección 7 y pude apreciar como el material comienza con lo básico pero rápidamente comienza a cubrir mucho terreno, incluyendo estructuras de datos y algoritmos.</p>
<p>Las últimas lecciones incluyen programación multihilo, concurrencia y comunicación entre procesos sobre Linux.</p>
<p>¡Muy recomendable!</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fvarrojo.algorithmia.net%2F2010%2F06%2F29%2Fcurso-de-c-del-mit-ahora-online-y-gratuito%2F&amp;linkname=Curso%20de%20C%20del%20MIT%2C%20ahora%20online%20y%20gratuito"><img src="http://varrojo.algorithmia.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://varrojo.algorithmia.net/2010/06/29/curso-de-c-del-mit-ahora-online-y-gratuito/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hoja de Helecho en Cython</title>
		<link>http://varrojo.algorithmia.net/2010/06/24/hoja-de-helecho-en-cython/</link>
		<comments>http://varrojo.algorithmia.net/2010/06/24/hoja-de-helecho-en-cython/#comments</comments>
		<pubDate>Thu, 24 Jun 2010 20:31:35 +0000</pubDate>
		<dc:creator>Varrojo</dc:creator>
				<category><![CDATA[Computación Gráfica]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://varrojo.algorithmia.net/?p=851</guid>
		<description><![CDATA[<img src="http://varrojo.algorithmia.net/wp-content/uploads/2010/05/kscreensaver.png" width="64" height="64" alt="" title="Computación Gráfica" /><br/>A modo de prueba de concepto aproveché un ratito libre para implementar uno de los trabajos obligatorios que asignamos a los alumnos en una de mis materias en Facultad. El trabajo consiste en desarrollar un programa que dibuja un conjunto de Fractales mediante un sistema iterativo de funciones. La siguiente imagen muestra el programa corriendo [...]]]></description>
			<content:encoded><![CDATA[<img src="http://varrojo.algorithmia.net/wp-content/uploads/2010/05/kscreensaver.png" width="64" height="64" alt="" title="Computación Gráfica" /><br/><p>A modo de prueba de concepto aproveché un ratito libre para implementar uno de los trabajos obligatorios que asignamos a los alumnos en una de mis materias en Facultad.</p>
<p>El trabajo consiste en desarrollar un programa que dibuja un conjunto de Fractales mediante un sistema iterativo de funciones. La siguiente imagen muestra el programa corriendo para una configuración que corresponde a una Hoja de Helecho:<br />
<center><br />
<div id="attachment_852" class="wp-caption aligncenter" style="width: 308px"><a href="http://varrojo.algorithmia.net/wp-content/uploads/2010/06/helecho.png"><img class="size-medium wp-image-852" title="Hoja de Helecho" src="http://varrojo.algorithmia.net/wp-content/uploads/2010/06/helecho-298x300.png" alt="Hoja de Helecho" width="298" height="300" /></a><p class="wp-caption-text">Hoja de Helecho. Los cálculos del fractal fueron realizados en Cython y el resultado fue dibujado con Pygame. </p></div><br />
</center><br />
La novedad de esta aplicación consistió en que si bien la prototipé en Python, me tomé un momento para portarla a Cython, con el fin de determinar si podía llegar a notar una mejora en la performance. Cython no es más que una variación de Python que permite anotar las variables con tipos de datos C. En vez de generar código interpretado, Cython compila el módulo a C y crea una biblioteca compartida.</p>
<p>La optimización principal para el Fractal consistió en reemplazar el uso de una lista de Python de 10.000 elementos (utilizada para almacenar los puntos calculados) por un <em>array</em> de C. Por menos que esto parezca, el evitar tener que usar la lista de Python mejoró la performance general del cálculo en un 11%, aproximadamente.</p>
<p>Dentro de todo, 11% no está mal, sobre todo si tenemos en cuenta que el único cambio fue la declaración de la lista (y escribir un archivo de <em>setup</em>). El compilador de Cython se encargó del resto.</p>
<p>Creo que por más que se encuentre en sus primeras versiones, Cython ofrece mucho potencial para optimizar aplicaciones Python. Todo lo que uno debe hacer es dedicar algo de tiempo para encontrar las porciones críticas en performance en su código, anotar las variables apropiadas con tipos de datos C, y dejar que Cython se encargue del resto.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fvarrojo.algorithmia.net%2F2010%2F06%2F24%2Fhoja-de-helecho-en-cython%2F&amp;linkname=Hoja%20de%20Helecho%20en%20Cython"><img src="http://varrojo.algorithmia.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://varrojo.algorithmia.net/2010/06/24/hoja-de-helecho-en-cython/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Máquina del Tiempo: Trivial HTTP Daemon</title>
		<link>http://varrojo.algorithmia.net/2010/06/03/maquina-del-tiempo-trivial-http-daemon/</link>
		<comments>http://varrojo.algorithmia.net/2010/06/03/maquina-del-tiempo-trivial-http-daemon/#comments</comments>
		<pubDate>Thu, 03 Jun 2010 04:00:53 +0000</pubDate>
		<dc:creator>Varrojo</dc:creator>
				<category><![CDATA[Máquina del Tiempo]]></category>
		<category><![CDATA[Networking]]></category>
		<category><![CDATA[Programacion]]></category>

		<guid isPermaLink="false">http://varrojo.algorithmia.net/?p=813</guid>
		<description><![CDATA[<br/>Hace ya varios años, por allá, por el 13 de Marzo de 2006, publicaba en uno de mis viejos blogs discontinuados un programa Java que implementaba un servidor Web sencillo. Por aquellos tiempos había estado leyendo sobre cómo funcionaba el protocolo HTTP. HTTP me había parecido que era extremadamente sencillo, sobre todo considerando que es [...]]]></description>
			<content:encoded><![CDATA[<br/><p>Hace ya varios años, por allá, por el 13 de Marzo de 2006, publicaba en uno de mis viejos blogs discontinuados un programa Java que implementaba un servidor Web sencillo.</p>
<p>Por aquellos tiempos había estado leyendo sobre cómo funcionaba el protocolo HTTP. HTTP me había parecido que era extremadamente sencillo, sobre todo considerando que es una de las tecnologías fundamentales de Internet, fue as qué decidí probar si realmente era tan sencillo como parecía haciendo un programa prueba de concepto.</p>
<p>Este artículo es una copia del post realizado en el 2006 en el cual se anunciaba el proyecto, se publicaba un archivo zip conteniendo el programa y se explicaba cómo usarlo.</p>
<p>De momento únicamente tengo el código compilado. Si a alguien le resulta interesante, puedo buscar el fuente y publicarlo aquí. Si no quieren leer todo el artículo, encontrarán la descarga sobre el final del mismo.</p>
<p>Sin más, dejo el resto del post original del 2006 a continuación.</p>
<p><span id="more-813"></span><br />
<strong> Introducción</strong></p>
<p>Trivial HTTP Daemon o thttpd por conveniencia es un servidor de páginas web escrito 100% en Java.</p>
<p>Sus objetivos de diseño son ofrecer un médio para compartir información, el cual sea seguro, fácil de instalar y configurar, así como altamente potable entre distintos sistemas operativos y arquitecturas.</p>
<p>thttpd puede verse como un servidor de páginas &#8220;plug and play&#8221;, se descomprime, se configura y se usa. Su bajo acoplamiento permite compartir archivos de cualquier tipo en cuestión de minutos y ser eliminado rápidamente cuando no es más necesario. Ideal para ser utilizado cuando todo lo demás falla.</p>
<p>Su uso es gratuito pero se encuentra sujeto a los términos contrato de licencia adjuntos en en archivo release  notes.txt</p>
<p><strong>Requerimientos</strong></p>
<p>A pesar de ser diseñado para ser una aplicación al estilo &#8220;plug and play&#8221;, el servidor presenta una serie de requerimientos de configuración para su uso.</p>
<ul>
<li>Java Rutime Environment, versión 1.5.0. El servidor fue escrito y probado utilizando la JDK 1.5.0 update 6.</li>
<li>Configuración de cortafuegos (firewall) si existe uno, para permitir aceptar y responder a conexiones entrantes.</li>
<li>Configuración de la aplicación!!</li>
</ul>
<p><strong> Configuración</strong></p>
<p>Para configurar el servidor basta con editar el archivo thttpd.conf incluido con la aplicación. Puede editarse utilizando tu editor favorito (excepto notepad o word).</p>
<p>El archivo de configuración se encuentra completamente documentado, por lo cual los usuarios encontrarán muy sencilla la tarea de editar los valores para ajustarse a sus necesidades únicas.</p>
<p>Los archivos de configuración pueden moverse de un equipo a otro para agilizar el proceso de puesta en marcha.</p>
<p><strong>Iniciando el Servidor</strong></p>
<p>Para inciar el servidor debemos asegurarnos que el archivo de configuración thttpd.conf se encuentra en el mismo directorio o carpeta que el archivo trivialhttpd.jar. Inicia una consola, ve a esa carpeta y ejecuta el comando</p>
<pre class="brush:bash">java -jar trivialhttpd.jar</pre>
<p>ya esta!! El servidor escucha en el puerto configurado en el archivo de configuración. Para acceder a él utilizamos cualquier navegador e ingresamos la dirección del servidor seguida de :&lt;#puerto&gt;.</p>
<p><strong>Saliendo del Servidor</strong></p>
<p>Para salir, se debe seleccionar la consola que inició el servidor y presionar Control + C. De momento no hay otra forma de terminar el servidor que esta.</p>
<p><strong>Tipos de Archivos Soportados</strong></p>
<p>La versión 1.0 del servidor thttpd solo se soportaban archivos de caracteres, es decir, de extensión .txt, .rtf, .html, etc.</p>
<p>La versión del servidor thttpd 2.0 soporta archivos de cualquier tipo, incluyendo imagenes, sonidos y música, entre otros.</p>
<p><strong>Acceso a Archivos</strong></p>
<p>El servidor necesita que sea especificado lo que se conoce como una raíz de documentos (document root), la cual representa la raíz a partir de la cual se servirán todos los archivos (recursivamente hacia abajo en la jerarquía).</p>
<p>La raíz de documentos es una ruta que se agregar a los pedidos de archivos para permitir su localización en el sistema de archivos del equipo que esta ejecutando la aplicación.</p>
<p>Supón que thttpd esta escuchando en un equipo de nombre &#8220;Archivos&#8221;, en el puerto 3307, el cual contiene un archivo de nombre invitados.txt.</p>
<p>Para acceder a este archivo abrimos un navegador de Internet, como Mozilla Firefox por ejemplo, e ingresamos la dirección http://Archivos:3307/invitados.txt</p>
<p>El servidor &#8220;Archivos&#8221; tomará /invitados.txt y se lo agregará a la raíz de documentos. Luego, pedirá a su sistema operativo dicho archivo y lo mandará a través de la red a quien lo solicitó. (Nota que  de esta manera obtenemos un subsistema de seguridad &#8220;gratis&#8221; por así decirlo. Hablaremos de esto en la siguiente sección.)</p>
<p>En caso de que un archivo no sea encontrado, el servidor enviará un mensaje de 404 &#8211; File Not Found. No se soportan espacios en los nombres de archivo o en los directorios que los contienen.</p>
<p>El servidor también puede accederse mediante su dirección IP.</p>
<p><strong>Seguridad</strong></p>
<p>Hasta la versión actual del servidor thttpd no se ha desarrollado un subsitema propio de seguridad, sino que se utiliza el subsistema del sistema operativo que alberga la aplicación.</p>
<p>Esto funciona de la siguiente manera: como la aplicación debe ejecutar en nombre de un usuario específico (quien inició la aplicación) y como la aplicación debe pedir los archivos al sistema operativo, los archivos que no pueden ser accedidos por el usuario, tampoco pueden ser servidos por el servidor.</p>
<p>A pesar de que este enfoque nos lleva a un esquema de seguridad fuerte en sistemas Unix y Linux, también puede lleva a problemas de seguridad en sistemas Microsoft Windows. La mejor práctica de seguridad es no colocar bajo la raíz de documentos los archivos que no quieres compartir. Consecuentemente, no compartas las raices de los sistemas de archivos (/ en Unix/Linux o C:\ en Microsoft Windows).</p>
<p>Tampoco es recomendable ejecutar el servidor con permisos de administrador.</p>
<p><strong>Autor, Créditos</strong></p>
<p>Trivial HTTP Daemon, thttpd, diseñado y desarrollado por Alejandro Segovia.</p>
<p><strong>Descarga</strong></p>
<p><a href="http://varrojo.algorithmia.net/wp-content/uploads/2010/06/thttpd2.0.zip"><img class="alignnone size-full wp-image-815" title="Descarga Trivial HTTP Daemon (11.1 KB)" src="http://varrojo.algorithmia.net/wp-content/uploads/2010/06/floppy.png" alt="" width="64" height="64" /></a>&gt;&gt; Descarga Trivial HTTP Daemon (11.1 KB)</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fvarrojo.algorithmia.net%2F2010%2F06%2F03%2Fmaquina-del-tiempo-trivial-http-daemon%2F&amp;linkname=M%C3%A1quina%20del%20Tiempo%3A%20Trivial%20HTTP%20Daemon"><img src="http://varrojo.algorithmia.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://varrojo.algorithmia.net/2010/06/03/maquina-del-tiempo-trivial-http-daemon/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Crear Bibliotecas Estáticas con GCC</title>
		<link>http://varrojo.algorithmia.net/2010/05/22/crear-bibliotecas-estaticas-con-gcc/</link>
		<comments>http://varrojo.algorithmia.net/2010/05/22/crear-bibliotecas-estaticas-con-gcc/#comments</comments>
		<pubDate>Sat, 22 May 2010 05:53:11 +0000</pubDate>
		<dc:creator>Varrojo</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Programacion]]></category>

		<guid isPermaLink="false">http://varrojo.algorithmia.net/?p=794</guid>
		<description><![CDATA[<br/>Hoy estuve revisando cómo crear bibliotecas estáticas para programas C y C++, de forma de poder &#8220;empaquetar&#8221; código objeto en forma de una Biblioteca reutilizable. (An English version of this Post can be found here.) Crear una biblioteca estática es muy sencillo y consiste, a grandes razgos, en los siguientes dos pasos: Compilar el código [...]]]></description>
			<content:encoded><![CDATA[<br/><p>Hoy estuve revisando cómo crear bibliotecas estáticas para programas C y C++, de forma de poder &#8220;empaquetar&#8221; código objeto en forma de una Biblioteca reutilizable.</p>
<p style="text-align: center;">(An English version of this Post can be found <a href="http://www.alejandrosegovia.net/2010/05/22/create-static-libraries-using-gcc/">here</a>.)</p>
<p>Crear una biblioteca estática es muy sencillo y consiste, a grandes razgos, en los siguientes dos pasos:</p>
<ol>
<li>Compilar el código fuente en código objeto.</li>
<li>Recopilar todo el código objeto en un archivo que representa la Biblioteca.</li>
</ol>
<p>Supongamos que tenemos un programa C sencillo como el que se presenta a continación:</p>
<pre class="brush:cpp">/** algebra.h **/

#ifndef ALGEBRA_H
#define ALGEBRA_H

typedef struct
{
	float x, y, z;
} Vec3;

void vec3Init(Vec3* v, float x, float y, float z);

float dot(Vec3* a, Vec3* b);

#endif //ALGEBRA_H</pre>
<pre class="brush:cpp">/** algebra.c **/

#include "algebra.h"

void vec3Init(Vec3* v, float x, float y, float z)
{
	v-&gt;x = x;
	v-&gt;y = y;
	v-&gt;z = z;
}

float dot(Vec3* a, Vec3* b)
{
	return a-&gt;x * b-&gt;x + a-&gt;y * b-&gt;y + a-&gt;z * b-&gt;z;
}</pre>
<p>Crearemos una biblioteca estática con los siguientes dos comandos:</p>
<pre class="brush: bash">gcc -static -c algebra.c -o algebra.o
ar -rcs libalgebra.a algebra.o</pre>
<p>Por favor nota que hemos denominados nuestra Biblioteca &#8220;libalgebra.a&#8221;. Esto no es casualidad; El nombre debe comenzar con &#8220;lib&#8221; y terminar con &#8220;.a&#8221; para que pueda ser linkeado con gcc en un programa.</p>
<p>Ahora que se encuentra pronta nuestra Biblioteca, podemos redistribuirla junto con el header algebra.h para que otros programadores puedan hacer uso de ella en sus programas.</p>
<p>Para ilustrar esto desarrollamos un pequeño programa C que incluya el header y sea linkeado contra nuestra Biblioteca:</p>
<pre class="brush:cpp">#include &lt;stdio.h&gt; /* printf */
#include "algebra.h" /* Incluimos nuestro header */

int main()
{
	Vec3 a;
	Vec3 b;
	vec3Init(&amp;a, 1.0f, 2.0f, 3.0f);
	vec3Init(&amp;b, 3.0f, 2.0f, 1.0f);
	printf("&lt;a,b&gt; = %.2f\n", dot(&amp;a,&amp;b));
}</pre>
<p>Nota como hacemos un uso liberal de tipos de datos y funciones que habíamos definido en nuestra Biblioteca. Para que este programa compile, solo necesitamos que el header esté presente; Para linkearlo, debemos utilizar el flag de gcc &#8220;-l&#8221; (L minúscula, sin comillas).</p>
<pre class="brush:bash">gcc main.c -L. -lalgebra
$ ./a.out
&lt;a,b&gt; = 10.00</pre>
<p>Dado el flag &#8220;-lalgebra&#8221;, GCC comenzará a buscar un archivo denominado &#8220;libalgebra.a&#8221; (de aquí la imporancia en el nombre utilizado para la Biblioteca). El flag &#8220;-L&#8221; le indica a GCC donde se encuentra este archivo.</p>
<p>Espero que les sea útil.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fvarrojo.algorithmia.net%2F2010%2F05%2F22%2Fcrear-bibliotecas-estaticas-con-gcc%2F&amp;linkname=Crear%20Bibliotecas%20Est%C3%A1ticas%20con%20GCC"><img src="http://varrojo.algorithmia.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://varrojo.algorithmia.net/2010/05/22/crear-bibliotecas-estaticas-con-gcc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Polimorfismo en C++</title>
		<link>http://varrojo.algorithmia.net/2010/05/07/polmorfismo-en-cpp/</link>
		<comments>http://varrojo.algorithmia.net/2010/05/07/polmorfismo-en-cpp/#comments</comments>
		<pubDate>Fri, 07 May 2010 15:47:53 +0000</pubDate>
		<dc:creator>Varrojo</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Programacion]]></category>

		<guid isPermaLink="false">http://varrojo.algorithmia.net/?p=748</guid>
		<description><![CDATA[<br/>Hoy descubrí un característica interesante sobre como funciona el polimorfismo en C++. Estaba obteniendo un mensaje de error del compilador (del linker, en realidad) que nunca había recibido antes. (An english version of this post can be found here) En mi código disponía de un fragmento similar al que presento a continuación, donde se define [...]]]></description>
			<content:encoded><![CDATA[<br/><p>Hoy descubrí un característica interesante sobre como funciona el polimorfismo en C++. Estaba obteniendo un mensaje de error del compilador (del linker, en realidad) que nunca había recibido antes.</p>
<p>(An english version of this post can be found <a href="http://www.alejandrosegovia.net/2010/05/07/polymorphism-in-cp/">here</a>)</p>
<p>En mi código disponía de un fragmento similar al que presento a continuación, donde se define una clase abstracta &#8220;Base&#8221; y la clase &#8220;Derived&#8221; que hereda de esta mediante herencia pública. En C++ existen tres tipos distintos de herencia: Herencia Pública, Herencia Protegida y Herencia Privada. A los efectos de este artículo, lo que necesitan saber es que la Herencia Pública es similar a la que encontramos en otros lenguajes, como Java, C# u Objective-C.</p>
<pre class="brush:cpp">#include &lt;iostream&gt;
using std::cout;
using std::endl;

class Base
{
	public:
		Base();
		virtual ~Base();
		virtual void printClassName() = 0; // =0 significa "abstract"
};

class Derived : public Base
{
	public:
		Derived();
		virtual ~Derived() { }
		virtual void printClassName();

};

Base::Base()
{
	this-&gt;printClassName();
}

Base::~Base()
{
}

Derived::Derived() : Base()
{
}

Derived::~Derived()
{
}

void Derived::printClassName()
{
	cout &lt;&lt; "\"Derived\"" &lt;&lt; endl;
}

int main()
{
	Derived* d = new Derived();
	delete d;
	return 0;
}
</pre>
<p>Ávidos conocedores de patrones de diseño probablemente hayan notado que este fragmento es una implementación del patrón Factory Method, donde tenemos una invocación a un método virtual, abstracto en la clase padre, que imprime el nombre de la clase que estamos instanciando.</p>
<p>El problema de este fragmento es que cuando invocamos el compilador, obtenemos el siguiente mensaje de error:</p>
<pre class="brush:bash">ale@syaoran factory]$ g++ main.cpp -Wall
Undefined symbols:
  "Base::printClassName()", referenced from:
      Base::Base()  in ccNxv98U.o
      Base::Base()  in ccNxv98U.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
</pre>
<p>Efectivamente, GCC nos advierte que no existe una implementación para el método abstracto &#8220;printClassName&#8221; y aborta!</p>
<p>¿Por qué sucede esto? El problema radica en la forma en que C++ maneja la herencia. Cuando se instancia un objeto cuya clase deriva de otra clase, primero se invoca el constructor de la clase base y luego se invoca el constructor de la clase derivada. Esto implica que el objeto derivado literalmente no existe hasta que se haya terminado de construir el objeto base &#8220;interior&#8221;.</p>
<p>En el caso de C++, esto implica que la tabla virtual (utilizada en tiempo de ejecución para aplicar polimorfismo) para el objeto derivado no es creada hasta que la construcción del objeto base se haya creado. Como nosotros estamos invocando un método abstracto dentro del constructor de la clase base, el GCC asume que se invocará la implementación del método en la clase base. Dado que éste no existe (ya que es abstracto), el linker tira un error.</p>
<p>Peor aún, si el método no fuese abstracto (pero sí virtual), el polimorfismo no funcionaría, invocando la implementación en la clase base y no en la clase derivada.</p>
<p>¿Cómo solucionamos este problema?</p>
<p>La solución, afortunadamente, es sencilla. Simplemente debemos tomar como regla general el siguiente enunciado:</p>
<blockquote><p>&#8220;Nunca invocar métodos virtuales sobre objetos parcialmente construidos&#8221;.</p></blockquote>
<p>Para reparar nuestro programa anterior, lo que haremos entonces, es remover la invocación al método virtual del constructor. Dónde ponerlo es una cuestión que, dependiendo de la aplicación, puede ser en un lugar u otro. Una opción que nos permite no cambiar demasiado el diseño es separar el proceso de construcción de un objeto en dos fases: una donde todos los constructores base se ejecutan y una donde se invoque un método especial init() desde el constructor la clase derivada que termine de inicializar el objeto. Esto nos permitirá trabajar una vez que toda la tabla de métodos virtual se encuentre creada.</p>
<p>Nuestro ejemplo reparado se vería de la siguiente forma:</p>
<pre class="brush:cpp">#include &lt;iostream&gt;
using std::cout;
using std::endl;

class Base
{
	public:
		Base();
		virtual ~Base();
		virtual void init();
		virtual void printClassName() = 0; // =0 significa "abstract"
};

class Derived : public Base
{
	public:
		Derived();
		virtual ~Derived();
		virtual void printClassName();
};

Base::Base()
{
	//Invocación movida a init()
}

Base::~Base()
{
}

void Base::init()
{
	printClassName();
}

Derived::Derived() : Base()
{
}

Derived::~Derived()
{
}

void Derived::printClassName()
{
	cout &lt;&lt; "\"Derived\"" &lt;&lt; endl;
}

int main()
{
	Derived* d = new Derived();
	d->init();
	delete d;
	return 0;
}
</pre>
<p>Esta versión del código compila y linkea sin problemas. Al ejecutarla, felizmente obtenemos los siguientes resultados:</p>
<pre class="brush:bash">[ale@syaoran factory]$ ./a.out
"Derived"
</pre>
<p>Restaría probar como resuelven este problema otros lenguajes de programación orientados a objetos. Lo dejo como ejercicio para el lector <img src='http://varrojo.algorithmia.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fvarrojo.algorithmia.net%2F2010%2F05%2F07%2Fpolmorfismo-en-cpp%2F&amp;linkname=Polimorfismo%20en%20C%2B%2B"><img src="http://varrojo.algorithmia.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://varrojo.algorithmia.net/2010/05/07/polmorfismo-en-cpp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C vuelve al Puesto #1 del Indice Tiobe</title>
		<link>http://varrojo.algorithmia.net/2010/04/12/c-vuelve-al-puesto-1-del-indice-tiobe/</link>
		<comments>http://varrojo.algorithmia.net/2010/04/12/c-vuelve-al-puesto-1-del-indice-tiobe/#comments</comments>
		<pubDate>Mon, 12 Apr 2010 21:44:22 +0000</pubDate>
		<dc:creator>Varrojo</dc:creator>
				<category><![CDATA[Programacion]]></category>

		<guid isPermaLink="false">http://varrojo.algorithmia.net/?p=724</guid>
		<description><![CDATA[<br/>En mes de Abril se publicó una nueva edición del Índice Tiobe, el cual consiste en un listado de popularidad de lenguajes de programación. La característica principal de este año consistió en que, tras 4 años, C volvió al puesto #1, dejando a Java en el segundo lugar. De acuerdo con la comunidad detrás del [...]]]></description>
			<content:encoded><![CDATA[<br/><p>En mes de Abril se publicó una nueva edición del <a href="http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html">Índice Tiobe</a>, el cual consiste en un listado de popularidad de lenguajes de programación.</p>
<p>La característica principal de este año consistió en que, tras 4 años, C volvió al puesto #1, dejando a Java en el segundo lugar.</p>
<p>De acuerdo con la comunidad detrás del índice, ésto se debió no a un aumento en la popularidad de C, sino a un descenso en la popularidad de Java. Este descenso se explica debido a la aparición de otros lenguajes capaz de hacer uso de la JVM, como es el caso de JavaFX.</p>
<p>Por su parte, C++ se mantiene firme en el puesto #3.</p>
<p>A la fecha, el <em>top ten</em> es el presentado a continuación:</p>
<ol>
<li>C</li>
<li>Java</li>
<li>C++</li>
<li>PHP</li>
<li>(Visual) Basic</li>
<li>C#</li>
<li>Python</li>
<li>Perl</li>
<li>Delphi</li>
<li>JavaScript</li>
</ol>
<p>Objective-C, cuyo crecimiento se explica debido a la explosión de popularidad del iPhone, ha logrado subir del puesto #42 al #11 en tan solo un año. Por su parte el lenguaje de programación de sistemas de Google, denominado &#8220;Go&#8221;, ha logrado hacerse con el puesto #15 en menos de un año de existencia.</p>
<p>Del sitio oficial:</p>
<blockquote><p>El Índice Tiobe provee un indicador sobre la popularidad de los lenguajes de programación. El Índice se actualiza una vez al mes. Sus ratings se basan en el número de Ingenieros capacitados en todo el mundo, cursos y Terceros Vendedores.</p></blockquote>
<p>Fuente: <a href="http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html">Tiobe Software</a>.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fvarrojo.algorithmia.net%2F2010%2F04%2F12%2Fc-vuelve-al-puesto-1-del-indice-tiobe%2F&amp;linkname=C%20vuelve%20al%20Puesto%20%231%20del%20Indice%20Tiobe"><img src="http://varrojo.algorithmia.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://varrojo.algorithmia.net/2010/04/12/c-vuelve-al-puesto-1-del-indice-tiobe/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
