<?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>Reprogramador.es &#187; GPL</title>
	<atom:link href="http://reprogramador.es/categorias/informatica/software/gpl/feed" rel="self" type="application/rss+xml" />
	<link>http://reprogramador.es</link>
	<description>A nuestra manera</description>
	<lastBuildDate>Fri, 16 Dec 2011 19:27:46 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Cómo monitorizar estadísticas de los equipos de una red</title>
		<link>http://reprogramador.es/como-monitorizar-estadisticas-de-los-equipos-de-una-red</link>
		<comments>http://reprogramador.es/como-monitorizar-estadisticas-de-los-equipos-de-una-red#comments</comments>
		<pubDate>Sun, 12 Dec 2010 21:01:44 +0000</pubDate>
		<dc:creator>Jesús Diéguez Fernández</dc:creator>
				<category><![CDATA[GPL]]></category>
		<category><![CDATA[Informática]]></category>
		<category><![CDATA[Redes]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://reprogramador.es/?p=503</guid>
		<description><![CDATA[Proveniente de la mitología nórdica, Muninn era uno de los dos cuervos que proveía al Dios Odín con información diaria de lo sucedido en todo el mundo. Sin duda, un nombre excelente para resumir lo que hace este magnífico proyecto. Munin es una aplicación con infraestructura cliente &#8211; servidor que recopila información de los nodos [...]]]></description>
			<content:encoded><![CDATA[<table border="0">
<tbody>
<tr>
<td><img class="aligncenter size-full wp-image-504" style="border: 0pt none; margin: 5px;" title="Munin Logo" src="http://reprogramador.es/wp-content/uploads/2010/12/munin.png" alt="" width="305" height="80" /></td>
<td>
<p>Proveniente de la mitología nórdica, <a title="Huginn y Muninn en la Wikipedia" href="http://es.wikipedia.org/wiki/Hugin_y_Munin" target="_blank">Muninn</a> era uno de los dos cuervos que proveía al Dios Odín con información diaria de lo sucedido en todo el mundo.</p>
<p>Sin duda, un nombre excelente para resumir lo que hace este magnífico proyecto. Munin es una aplicación con infraestructura cliente &#8211; servidor que recopila información de los nodos de una red y genera gráficas con las estadísticas.</p>
<p>Esto nos permite encontrar cuellos de botella en servidores, ver que ordenadores estan haciendo un uso más intensivo de la red, detectar y predecir fallos en el hardware (especialmente en discos duros), etc&#8230;</p>
</td>
</tr>
</tbody>
</table>
<p><span id="more-503"></span>La arquitectura de este programa es bastante simple, por un lado en cada ordenador que queramos monitorizar debemos instalar el paquete <em>munin-node</em> y configurarlo para permitir conexiones desde el servidor central. En el servidor central hay que instalar el paquete<em> munin</em>, tiene que ser configurado indicando qué ordenadores tiene que monitorizar y donde debe generar las gráficas.</p>
<p>Para instalar los paquetes:</p>
<blockquote><p>apt-get install munin munin-node munin-plugins-extra apache2</p>
</blockquote>
<p>Existe un <a title="Munin-node para Windows" href="http://sourceforge.net/projects/munin-nodewin32/" target="_blank">port para Windows del paquete munin-node</a>, pero no ofrece tanta información útil como las versiones para Linux.</p>
<p>Para configurar el paquete munin-node:</p>
<blockquote><p>Editamos el archivo <em>/etc/munin/munin-node.conf</em> añadiendo la IP del servidor central como permitida, en este ejemplo el servidor tendrá la IP 192.168.0.1:</p>
<p>allow ^192\.168\.0\.1$</p>
<p>En este mismo archivo podemos cambiar en que interfaz de red debe escuchar el programa y que puerto utilizar (por defecto <em>4949</em>), no es necesario modificarlos pero sí tenerlo en cuenta si es necesario configurar el firewall.</p>
</blockquote>
<p>Para configurar el paquete munin:</p>
<blockquote><p>Editamos el archivo <em>/etc/munin/munin.conf</em> añadiendo los ordenadores que debe explorar cada 5 minutos:</p>
<p>[pcubuntu]<br />
 address 192.168.0.2<br />
 use_node_name yes</p>
<p>[pcwindows]<br />
 address 192.168.0.3<br />
 use_node_name yes</p>
<p>Y en el archivo <em>/etc/munin/apache2.conf</em> modificaremos la configuración para acceder a los gráficos generados, en principio sólo es recomendable cambiar el primer Alias, aunque también podríais ponerle contraseña HTTP si quereis restringir el acceso.:</p>
<p>Alias /monitor /var/cache/munin/www</p>
</blockquote>
<p>Por defecto el número de gráficos que genera munin es cuantioso, y más si se instalan plugins adicionales o los creais vosotros mismos. No es dificil, permite crear los plugins como un script shell cualquiera (incluído PHP, python ó PERL) lo que nos permite monitorizar cualquier cosa, como por ejemplo un termómetro USB. En este caso no me voy a detener mucho explicando esta funcionalidad. Si quereis investigarlo, los plugins se pueden encontrar en <em>/etc/munin/plugins</em> donde la mayoría son enlaces blandos hacia <em>/usr/share/munin/plugins</em>.</p>
<p>Tras configurar todo y darle algo de tiempo para que genere datos (monitoriza cada 5 minutos, así que habría que esperar una hora aproximadamente para tener algo que analizar), podremos acceder a los gráficos generados bajo la ruta (continuando con la IP del servidor anterior):</p>
<blockquote><p><a href="http://192.168.0.1/monitor" target="_blank">http://192.168.0.1/monitor</a></p>
</blockquote>
<p>Estos gráficos se generan gracias a la librería <a title="Página web oficial de RRDtool" href="http://www.mrtg.org/rrdtool/" target="_blank">RRDtool</a>, que da muy buenos resultados.</p>
<p>Podemos ver una lista de los equipos monitorizados, pinchando en cada uno accederemos a un listado de gráficos detallados. Os pongo aquí como ejemplo algunos datos recogidos en mi servidor y algunos comentarios sobre los mismos:</p>
<table border="0">
<tbody>
<tr>
<td>
<p>Porcentaje de uso de la CPU (tiene dos núcleos por eso el máximo es 200%):</p>
<p style="text-align: center;"><img class="size-full wp-image-505 aligncenter" style="border: 0pt none; margin-top: 5px; margin-bottom: 5px;" title="Uso de CPU semanal" src="http://reprogramador.es/wp-content/uploads/2010/12/cpu-week.png" alt="" width="497" height="364" /></p>
</td>
</tr>
<tr>
<td>
<p>Escalado de la CPU, el procesador no está funcionando siempre al tope de rendimiento, este gráfico muestra la frecuencia media a la que suele funcionar y en qué momentos el servidor tuvo que aumentar la frecuencia para atender una tarea (en mi caso coincide con la rotación de logs de madrugada):</p>
<p style="text-align: center;"><img class="size-full wp-image-506 aligncenter" style="border: 0pt none; margin-top: 5px; margin-bottom: 5px;" title="Escalado del procesador semanal" src="http://reprogramador.es/wp-content/uploads/2010/12/cpuspeed-week.png" alt="" width="497" height="292" /></p>
</td>
</tr>
<tr>
<td>
<p>Uso de memoria semanal:</p>
<p style="text-align: center;"><img class="size-full wp-image-507 aligncenter" style="border: 0pt none; margin-top: 5px; margin-bottom: 5px;" title="Uso de memoria semanal" src="http://reprogramador.es/wp-content/uploads/2010/12/memory-week.png" alt="" width="497" height="424" /></p>
</td>
</tr>
<tr>
<td>
<p>Número de procesos ejecutados a lo largo de la semana (bastante estable la verdad <img src='http://reprogramador.es/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ):</p>
<p style="text-align: center;"><img class="size-full wp-image-508 aligncenter" style="margin-top: 5px; margin-bottom: 5px; border: 0pt none;" title="Procesos semanales" src="http://reprogramador.es/wp-content/uploads/2010/12/processes-week.png" alt="" width="497" height="364" /></p>
</td>
</tr>
<tr>
<td>
<p>Número de conexiones simultáneas que pasan por el servidor, en mi caso actúa como enrutador de toda la red (el router está en modo bridge) y como podeis ver mantener más de 2.500 conexiones simultáneas es demasiado para un router convencional. En otros gráficos posteriores he llegado a ver picos de 4.500 conexiones simultáneas:</p>
<p style="text-align: center;"><img class="size-full wp-image-509 aligncenter" style="border: 0pt none; margin-top: 5px; margin-bottom: 5px;" title="Número de conexiones semanales" src="http://reprogramador.es/wp-content/uploads/2010/12/fw_conntrack-week.png" alt="" width="497" height="352" /></p>
</td>
</tr>
<tr>
<td>
<p>Estadísticas de la interfaz eth2 (la que tiene la IP externa de internet), en positivo la velocidad de subida, en negativo la velocidad de descarga (ahí esos 2 Mbits bien exprimidos xD):</p>
<p style="text-align: center;"><img class="size-full wp-image-510 aligncenter" style="border: 0pt none; margin-top: 5px; margin-bottom: 5px;" title="Interfaz eth2 semanal" src="http://reprogramador.es/wp-content/uploads/2010/12/if_eth2-week.png" alt="" width="497" height="280" /></p>
</td>
</tr>
<tr>
<td>
<p>Estadísticas de espacio ocupado en los puntos de montaje del servidor:</p>
<p style="text-align: center;"><img class="size-full wp-image-511 aligncenter" style="border: 0pt none; margin-top: 5px; margin-bottom: 5px;" title="Estadísticas de uso de los discos duros semanal" src="http://reprogramador.es/wp-content/uploads/2010/12/df-week.png" alt="" width="497" height="364" /></p>
</td>
</tr>
<tr>
<td>
<p>Estadísticas de la latencia de los discos duros (tiempo que han tardado a una petición de lectura o escritura), si aumentan mucho puede ser señal de fallos de hardware:</p>
<p style="text-align: center;"><img class="size-full wp-image-512 aligncenter" style="border: 0pt none; margin-top: 5px; margin-bottom: 5px;" title="Latencia de los discos duros semanal" src="http://reprogramador.es/wp-content/uploads/2010/12/diskstats_latency-week.png" alt="" width="497" height="292" /></p>
</td>
</tr>
</tbody>
</table>
<p>Hay muchos otros gráficos interesantes como el uso de SWAP, estadísticas de Samba, Squid, información S.M.A.R.T. de los discos duros, etc&#8230;</p>
<p>Si utilizamos este programa en un servidor de producción, podremos detectar si en algún momento el número de peticiones HTTP hace que el servidor se quede sin memoria libre y empiece a utilizar la SWAP, además, si alguno de los gráficos da valores de riesgo, munin resalta esos gráficos para que fijemos la atención en ellos. También podemos diagnosticar cuellos de botella en la red si no da abasto el procesador en operaciones de copia por red o con los discos duros, etc&#8230;</p>
<p>En mi caso hacía mucho tiempo que buscaba una aplicación como esta y supe de su existencia gracias a un post de <a title="Post de munin en barrapunto" href="http://softlibre.barrapunto.com/article.pl?sid=10/11/10/2129231&amp;threshold=-1" target="_blank">barrapunto</a>. Espero que este post sirva como referencia para quien busque una aplicación de monitorización bastante completa.</p>
<p>Si alguien tiene algún problema o duda en el proceso de instalación o configuración podeis plantearlo en los comentarios, os ayudaré en lo que pueda.</p>
<p>Un saludo. <img src='http://reprogramador.es/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://reprogramador.es/como-monitorizar-estadisticas-de-los-equipos-de-una-red/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>TOR &#8211; La cebolla enrutadora al rescate</title>
		<link>http://reprogramador.es/tor-la-cebolla-enrutadora-al-rescate</link>
		<comments>http://reprogramador.es/tor-la-cebolla-enrutadora-al-rescate#comments</comments>
		<pubDate>Fri, 04 Dec 2009 12:33:59 +0000</pubDate>
		<dc:creator>Jesús Diéguez Fernández</dc:creator>
				<category><![CDATA[GPL]]></category>
		<category><![CDATA[Informática]]></category>
		<category><![CDATA[Redes]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://reprogramador.es/?p=353</guid>
		<description><![CDATA[¿Es un twitter? ¿Es un vueling? ¡No! ¡Es TOR &#8211; The Onion Router que viene al rescate! Independientemente de lo sucedido en los últimos días con la polémica ley de Economía Sostenible (vía meneame) aunque relacionado aleatoriamente, en estos días que estuve de baja monté en mi casa una red wifi abierta con un foro [...]]]></description>
			<content:encoded><![CDATA[<table border="0">
<tbody>
<tr>
<td><a rel="external" href="http://www.torproject.org/" target="_blank"><img class="aligncenter size-full wp-image-357" style="border: 0pt none; margin: 5px;" title="TOR - The Onion Router" src="http://reprogramador.es/wp-content/uploads/2009/12/tor.png" alt="TOR - The Onion Router" width="102" height="60" /></a></td>
<td>
<p>¿Es un twitter? ¿Es un vueling? ¡No! ¡Es TOR &#8211; The Onion Router que viene al rescate!</p>
<p>Independientemente de lo sucedido en los últimos días con la polémica ley de <a title="Noticias publicadas relacionadas con la ley de Economía Sostenible" rel="nofollow" href="http://meneame.net/search.php?q=economia+sostenible&amp;p=&amp;s=published&amp;h=&amp;o=" target="_blank">Economía Sostenible</a> (vía meneame) aunque relacionado aleatoriamente, en estos días que estuve de baja monté en mi casa una red wifi abierta con un foro interno al que se es redireccionado automáticamente si se intenta navegar por la web.</p>
</td>
</tr>
</tbody>
</table>
<p><span id="more-353"></span>La idea principal del proyecto era montar una red abierta donde quedar para jugar en red, un punto de reunión abierto para cualquiera, ya sea algún amigo que venga a visitarme y querramos echar una partida rápida sin tener que andar configurando nada ni tener que andar tirando cables, como algún vecino cercano o cualquier otro desconocido.</p>
<table border="0">
<tbody>
<tr>
<td><img class="aligncenter size-full wp-image-356" style="border: 0pt none; margin: 5px;" title="OpenArena" src="http://reprogramador.es/wp-content/uploads/2009/12/openarena.png" alt="OpenArena" width="77" height="77" /></td>
<td>
<p>Como servicios de valor añadido, monté un servidor dedicado de <a title="Página web oficial de OpenArena" href="http://openarena.ws/">OpenArena</a> (una versión totalmente libre del famosísimo Quake III y que utiliza su mismo motor gráfico) con el cliente descargable directamente desde el foro, sin necesidad de conexión a Internet. Así por lo menos había ya un juego para jugar en condiciones.</p>
</td>
</tr>
</tbody>
</table>
<p>Posteriormente pensé en cómo ofrecer a cualquier persona Internet sin pillarme los dedos y sin que me suponga un uso abusivo del mismo por parte de cualquier persona, pero a la vez sin restringir lo que se quiera hacer. La mejor solución fue montar un proxy <a title="Cómo instalar Privoxy + TOR en Ubuntu" href="http://www.ubuntu-es.org/node/13996" target="_blank">Privoxy + TOR</a> de manera que la conexión sea anónima y no se pueda trazar su origen.</p>
<p>¿Cómo funciona? a grandes rasgos, Privoxy controla el contenido de las páginas para asegurarse de que no obtienen información sobre el cliente mediante javascript y otras tretas y TOR se encarga de crear rutas encriptadas por donde pasar la conexión. Automáticamente cada 10 minutos cambia la ruta.</p>
<p>Puedes consultar una explicación más extensa en la <a title="Página web oficial del proyecto TOR" href="http://www.torproject.org/overview.html.es">página web oficial de TOR</a>.</p>
<p>La red TOR no destaca por tener una velocidad asombrosa pero es completamente funcional. Esto también fue un aliciente a la hora de montarlo, puesto que no quería que un posible cliente utilizase todo el ancho de banda disponible y tampoco quería liarme montando controles QoS.</p>
<p>A continuación os dejo una captura del foro, si entras en una red abierta y te sale esto al navegar, estás muy cerca de donde vivo. <img src='http://reprogramador.es/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p style="text-align: center;"><a href="http://reprogramador.es/wp-content/uploads/2009/12/Lanparty-Network.png" target="_blank"><img class="aligncenter size-medium wp-image-358" title="Lanparty Network" src="http://reprogramador.es/wp-content/uploads/2009/12/Lanparty-Network-273x300.png" alt="Lanparty Network" width="273" height="300" /></a></p>
<p><span style="font-size: medium;">Lector:<em> Muy bien, bonito relato, pero&#8230; <strong>¿Qué pretendes con todo esto?</strong></em></span></p>
<p><span style="font-size: x-small;"><strong>Warning</strong>: los siguientes párrafos son mi opinión personal, si no la compartes por lo menos respétala (principio de democracia).</span></p>
<p>Sencillo, si más gente copiase de forma altruista esta idea, por lo menos la parte de montar una wifi abierta con un proxy TOR, el acceso a Internet sería muchísimo más accesible y a la vez más seguro y confidencial.</p>
<p>Propuestas absurdas, inconstitucionales y absolutamente lucrativas como la reforma oculta de la LSSI y LPI incluida en el anteproyecto de Ley de Economía Sostenible serían vías muertas que no acotarían el supuesto problema. Sobre estas reformas, está explicado en muchos sitios online, a grandes rasgos han incluído en dicha Ley la creación de un departamento con la potestad para desconectar usuarios de Internet o cerrar/censurar ciertas páginas web según su contenido. Se trata de una censura en toda regla, similar a la existente en la dictadura China.</p>
<p>En este caso en concreto, si la página web se encuentra en España presuntamente ordenarán a la empresa que ofrece el Hosting a que cierre dicha web (hasta el día de hoy sólo el poder Judicial tiene esta potestad, tal como se indica en la constitución española). Si la página web se encuentra fuera de España, ordenarán bloquear el dominio web a los ISPs. Esto podría hacerse mediante un trucaje en el servidor de nombres (lo mismo que hicimos en <em><a title="Cómo suplantar dominios de Internet en tu red local" rel="bookmark" href="http://reprogramador.es/como-suplantar-dominios-de-internet-en-tu-red-local" target="_blank">Cómo suplantar dominios de Internet en tu red local</a></em> pero a gran escala) o bloqueando directamente las conexiones a dichas IPs. Lo primero se solucionaría utilizando los servidores abiertos <a href="http://www.opendns.com/" target="_blank">OpenDNS</a>, lo segundo (además de provocar problemas con otros dominios no relacionados almacenados en el mismo servidor), se puede evitar utilizando TOR.</p>
<p>Es decir, estas reformas atentan directamente contra los derechos fundamentales de los ciudadanos y dichos derechos deben ser defendidos. Si aun así, nos vemos sumidos en una sociedad como la mostrada en la excelente película <a title="V de Vendetta" href="http://es.wikipedia.org/wiki/V_for_Vendetta" target="_blank">V de Vendetta</a> o en la novela <a title="Novela 1.984" href="http://es.wikipedia.org/wiki/1984_(novela)">1.984</a>, nuestros políticos deben tener claro que no se puede detener ni a la cultura ni al conocimiento, que Internet es el medio de comunicación más importante que existe, es la nueva biblioteca de Alejandría y no puede/debe ser manipulada como hacen con los medios de comunicación tradicionales (radio/televisión).</p>
<p>Si alguien intenta poner barreras a la tecnología, la tecnología acabará desbordando dichas barreras.</p>
<p>Desde aquí de la misma forma que apoyo y revindico el uso de tecnologías libres, también quiero mostrar mi total e incondicional apoyo al manifiesto en favor de los derechos en Internet elaborado de forma comunitaria por los usuarios:</p>
<blockquote>
<h3><strong>Manifiesto “En defensa de los derechos fundamentales en internet”</strong></h3>
<p>Ante la inclusión en el Anteproyecto de Ley de Economía sostenible de modificaciones legislativas que afectan al libre ejercicio de las libertades de expresión, información y el derecho de acceso a la cultura a través de Internet, los periodistas, bloggers, usuarios, profesionales y creadores de internet manifestamos nuestra firme oposición al proyecto, y declaramos que…</p>
<p><br class="spacer_" /></p>
<p>1.- Los derechos de autor no pueden situarse por encima de los derechos fundamentales de los ciudadanos, como el derecho a la privacidad, a la seguridad, a la presunción de inocencia, a la tutela judicial efectiva y a la libertad de expresión.</p>
<p><br class="spacer_" /></p>
<p>2.- La suspensión de derechos fundamentales es y debe seguir siendo competencia exclusiva del poder judicial. Ni un cierre sin sentencia. Este anteproyecto, en contra de lo establecido en el artículo 20.5 de la Constitución, pone en manos de un órgano no judicial – un organismo dependiente del ministerio de Cultura -, la potestad de impedir a los ciudadanos españoles el acceso a cualquier página web.</p>
<p><br class="spacer_" /></p>
<p>3.- La nueva legislación creará inseguridad jurídica en todo el sector tecnológico español, perjudicando uno de los pocos campos de desarrollo y futuro de nuestra economía, entorpeciendo la creación de empresas, introduciendo trabas a la libre competencia y ralentizando su proyección internacional.</p>
<p><br class="spacer_" /></p>
<p>4.- La nueva legislación propuesta amenaza a los nuevos creadores y entorpece la creación cultural. Con Internet y los sucesivos avances tecnológicos se ha democratizado extraordinariamente la creación y emisión de contenidos de todo tipo, que ya no provienen prevalentemente de las industrias culturales tradicionales, sino de multitud de fuentes diferentes.</p>
<p><br class="spacer_" /></p>
<p>5.- Los autores, como todos los trabajadores, tienen derecho a vivir de su trabajo con nuevas ideas creativas, modelos de negocio y actividades asociadas a sus creaciones. Intentar sostener con cambios legislativos a una industria obsoleta que no sabe adaptarse a este nuevo entorno no es ni justo ni realista. Si su modelo de negocio se basaba en el control de las copias de las obras y en Internet no es posible sin vulnerar derechos fundamentales, deberían buscar otro modelo.</p>
<p><br class="spacer_" /></p>
<p>6.- Consideramos que las industrias culturales necesitan para sobrevivir alternativas modernas, eficaces, creíbles y asequibles y que se adecuen a los nuevos usos sociales, en lugar de limitaciones tan desproporcionadas como ineficaces para el fin que dicen perseguir.</p>
<p><br class="spacer_" /></p>
<p>7.- Internet debe funcionar de forma libre y sin interferencias políticas auspiciadas por sectores que pretenden perpetuar obsoletos modelos de negocio e imposibilitar que el saber humano siga siendo libre.</p>
<p><br class="spacer_" /></p>
<p>8.- Exigimos que el Gobierno garantice por ley la neutralidad de la Red en España, ante cualquier presión que pueda producirse, como marco para el desarrollo de una economía sostenible y realista de cara al futuro.</p>
<p><br class="spacer_" /></p>
<p>9.- Proponemos una verdadera reforma del derecho de propiedad intelectual orientada a su fin: devolver a la sociedad el conocimiento, promover el dominio público y limitar los abusos de las entidades gestoras.</p>
<p><br class="spacer_" /></p>
<p>10.- En democracia las leyes y sus modificaciones deben aprobarse tras el oportuno debate público y habiendo consultado previamente a todas las partes implicadas. No es de recibo que se realicen cambios legislativos que afectan a derechos fundamentales en una ley no orgánica y que versa sobre otra materia.</p>
<p><br class="spacer_" /></p>
<p>Este manifiesto, elaborado de forma conjunta por varios autores, es de todos y de ninguno. Si quieres sumarte a él, difúndelo por Internet.</p>
</blockquote>
<p>Espero que esta información os sea de provecho. Si te unes a la idea de montar la wifi abierta dejame un comentario por aquí por favor (y si no también, si quieres, claro&#8230;). <img src='http://reprogramador.es/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Un saludo.</p>
]]></content:encoded>
			<wfw:commentRss>http://reprogramador.es/tor-la-cebolla-enrutadora-al-rescate/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Shareware GPL, ¿legal 100% o violación de la licencia?</title>
		<link>http://reprogramador.es/shareware-gpl-legal-100-o-violacion-de-la-licencia</link>
		<comments>http://reprogramador.es/shareware-gpl-legal-100-o-violacion-de-la-licencia#comments</comments>
		<pubDate>Mon, 09 Mar 2009 11:51:25 +0000</pubDate>
		<dc:creator>Jesús Diéguez Fernández</dc:creator>
				<category><![CDATA[GPL]]></category>
		<category><![CDATA[Informática]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://reprogramador.es/?p=29</guid>
		<description><![CDATA[Hechos: Hace un par de semanas me encontré con este caso, necesitaba un programa para convertir un archivo PDF a formato Word y me encontré con una herramienta de la empresa VeryPDF que cumplía perfectamente con mis espectativas (PDF2Word). En la página web reza que la aplicación tiene licencia GPL y me extrañó encontrarme con [...]]]></description>
			<content:encoded><![CDATA[<p class="MsoNormal"><span style="text-decoration: underline;">Hechos:</span></p>
<p class="MsoNormal" style="text-indent: 35.4pt;">Hace un par de semanas me encontré con este caso, necesitaba un programa para convertir un archivo PDF a formato Word y me encontré con una herramienta de la empresa <a href="http://www.verypdf.com/">VeryPDF</a> que cumplía perfectamente con mis espectativas (<a href="http://www.verypdf.com/pdf2word/index.html">PDF2Word</a>).</p>
<p class="MsoNormal">En la página web reza que la aplicación tiene licencia GPL y me extrañó encontrarme con la típica ventana <em>Nag</em> de los programas shareware que te invita a registrarte.</p>
<p class="MsoNormal" style="text-align: center;"><img class="size-medium wp-image-37 aligncenter" title="Nag Screen" src="http://reprogramador.es/wp-content/uploads/2009/03/pdf2word1-300x179.png" alt="pdf2word1" width="300" height="179" /></p>
<p class="MsoNormal" style="text-align: center;"><img class="size-medium wp-image-38 aligncenter" title="pdf2word2" src="http://reprogramador.es/wp-content/uploads/2009/03/pdf2word2-300x267.png" alt="pdf2word2" width="300" height="267" /></p>
<p class="MsoNormal"><span style="text-decoration: underline;"><span id="more-29"></span>Análisis:</span></p>
<p class="MsoNormal" style="text-indent: 35.4pt;">Tras usar la aplicación para la tarea en cuestión, me dio por investigar un poco más antes de desinstalarla.</p>
<p class="MsoNormal" style="text-indent: 35.4pt;">Si vemos la página web de la empresa la aplicación se vende por <em>39,95 US$</em> la licencia individual, no hay problema, GPL no tiene porqué significar gratuito, pero la verdad me resultaba algo chocante que el método de cobro se haga directamente desde el programa teniendo que entregar el código fuente del mismo.</p>
<p class="MsoNormal" style="text-indent: 35.4pt;"><strong><span style="font-size: 8pt; font-family: Verdana; color: red;">Notice:</span></strong><span style="font-size: 8pt; font-family: Verdana;"> <strong>PDF2Word (PDF To Word)</strong> is licensed under the GNU General Public License (GPL). Portions of this software are copyright 1996-2006 Glyph &amp; Cog, LLC. You may obtain the source code for PDF2Word at <a href="http://www.globalpdf.com/pdf2word/pdf2word_src.zip">here</a>.</span></p>
<p class="MsoNormal">Efectivamente, el código fuente de la aplicación está disponible <a href="http://www.globalpdf.com/pdf2word/pdf2word_src.zip">aquí</a>.</p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: gray;">//<span> </span>Description<span> </span>: PDF2HTML/BMP software<br />
 //<span> </span>Author<span> </span>: verypdf.com Inc<br />
 </span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: gray;">//<span> </span>Version<span> </span>: Ver1.2</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: gray;"><br />
 //<span> </span>Platform<span> </span>: Windows95/98/Me/NT/2000/XP</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: gray;"><br />
 //<span> </span>Environment<span> </span>: Visual C++ 6.0<br />
 </span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: gray;">//<span> </span>Date<span> </span>: 2002/04/03<br />
 //<span> </span>This program is shareware; you can redistribute and/or<br />
 //<span> </span>modify it under the terms of the GNU General Public License.<br />
 //<span> </span>See the GNU General Public License for more details.</span></p>
<p class="MsoNormal" style="text-indent: 35.4pt;">Entiendo la postura de la empresa, por un lado se intenta vender un producto para obtener unas ganancias, pero a la vez por moda y para tener de su parte a la comunidad quieren publicarlo bajo licencia GPL; de esta forma se puede jugar a doble baraja.</p>
<p class="MsoNormal" style="text-indent: 35.4pt;">He visto esta maniobra en otras empresas, pero generalmente ofrecen una versión GPL totalmente libre y mantenida por la comunidad, y una versión corporativa que en muchas ocasiones no tiene la misma funcionalidad de la versión GPL, pero sí tiene soporte de la empresa.</p>
<p class="MsoNormal" style="text-indent: 35.4pt;">Este caso algo especial porque el código publicado es antiguo (versión 1.4) mientras que la aplicación descargable va por la 3.0.</p>
<p class="MsoNormal"><span> </span>Usando google, me he encontrado con la página web <a href="http://gpl-violations.org/">gpl-violations.org</a> donde tienen diversos FAQs sobre cómo se debe acatar la licencia GPL, y en <a href="http://gpl-violations.org/faq/sourcecode-faq.html">uno de ellos</a> específico sobre la publicación del código fuente, se indica que, por cada versión binaria publicada, se debe publicar el código fuente correspondiente y mantenerlo disponible durante al menos 3 años.</p>
<p class="MsoNormal"><span> </span></p>
<p class="MsoNormal"><span style="text-decoration: underline;">Conclusión:</span></p>
<p class="MsoNormal" style="text-indent: 35.4pt;">Para que este software sea legal y no viole la GPL la empresa tendría que proporcionar el código fuente de cada versión publicada o bien tener dos versiones, la GPL y la corporativa.</p>
<p class="MsoNormal"><span> </span></p>
<p class="MsoNormal"><span> </span><span> </span>Está claro que la empresa no está dispuesta a publicar el código fuente de la aplicación más reciente, de hecho ya en esta versión 1.4 que está publicada se notan ciertos recortes en el código. Revisando por curiosidad la ventana de registro (Código completo aquí: <a href="http://reprogramador.es/wp-content/uploads/2009/03/myreg.txt">MyReg.cpp</a>), me encontré con lo siguiente:</p>
<pre>
<div class="codesnip-container" >
<div class="c codesnip" style="font-family:monospace;"><span class="kw1">case</span> IDOK<span class="sy0">:</span> <span class="br0">&#123;</span>
 memset<span class="br0">&#40;</span>szPassword<span class="sy0">,</span>0<span class="sy0">,</span>200<span class="br0">&#41;</span><span class="sy0">;</span>
 GetDlgItemText<span class="br0">&#40;</span>hDlg<span class="sy0">,</span>IDC_EDIT_SERIALNO<span class="sy0">,</span>szPassword<span class="sy0">,</span>200<span class="br0">&#41;</span><span class="sy0">;</span>
 <span class="kw1">if</span><span class="br0">&#40;</span>IsCorrect<span class="br0">&#40;</span><span class="br0">&#40;</span>LPBYTE<span class="br0">&#41;</span>szPassword<span class="br0">&#41;</span><span class="br0">&#41;</span> &nbsp;<span class="br0">&#123;</span><span class="co1">//OK</span>
&nbsp; &nbsp; MessageBox<span class="br0">&#40;</span>hDlg<span class="sy0">,</span> REGISTERED<span class="st0">&quot; &quot;</span>SOFTWARE_NAME<span class="st0">&quot;.&quot;</span><span class="sy0">,</span> REGISTERED<span class="sy0">,</span>MB_OK<span class="sy0">|</span>MB_ICONINFORMATION<span class="br0">&#41;</span><span class="sy0">;</span>
 <span class="br0">&#125;</span> &nbsp;<span class="kw1">else</span> &nbsp;<span class="br0">&#123;</span>
&nbsp; &nbsp; MessageBox<span class="br0">&#40;</span>hDlg<span class="sy0">,</span>SERIESERR<span class="sy0">,</span>NULL<span class="sy0">,</span>MB_OK<span class="sy0">|</span>MB_ICONERROR<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; SetFocus<span class="br0">&#40;</span>GetDlgItem<span class="br0">&#40;</span>hDlg<span class="sy0">,</span>IDC_EDIT_SERIALNO<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span><span class="sy0">;</span>
 <span class="br0">&#125;</span>
 RegisterMagicMirror<span class="br0">&#40;</span>hDlg<span class="sy0">,</span>szPassword<span class="br0">&#41;</span><span class="sy0">;</span>
 IsRegistered <span class="sy0">=</span> TRUE<span class="sy0">;</span>
 EndDialog<span class="br0">&#40;</span>hDlg<span class="sy0">,</span>wmId<span class="br0">&#41;</span><span class="sy0">;</span>
 <span class="kw2">break</span><span class="sy0">;</span>
 <span class="br0">&#125;</span></div>
</div>
</pre>
<p class="MsoNormal">Si vemos la función IsCorrect:</p>
<pre>
<div class="codesnip-container" >
<div class="cpp codesnip" style="font-family:monospace;">BOOL IsCorrect<span class="br0">&#40;</span>LPBYTE FileFeature<span class="br0">&#41;</span>
&nbsp;<span class="br0">&#123;</span>
&nbsp; &nbsp; <span class="kw1">return</span> FALSE<span class="sy4">;</span>
&nbsp;<span class="br0">&#125;</span></div>
</div>
</pre>
<p class="MsoNormal" style="text-indent: 35.4pt;">Jamás va a devolver verdadero, por tanto falta todo el código fuente de la comprobación del número de serie. En el resto del fichero se puede ver que hay comprobaciones con el número de serie del disco duro, algunos ficheros en rutas escondidas, pero nada concluyente.</p>
<p class="MsoNormal"><span style="text-decoration: underline;">Ejerciendo nuestros derechos:</span></p>
<p class="MsoNormal"><span> </span><span> </span>Puesto que la aplicación es GPL, vamos a ejercer nuestro derecho a modificar el programa para que no nos pida registrarnos, después de todo es GPL y no nos gusta que limiten el uso de la aplicación. Por un lado empezaremos por modificar el código fuente antiguo y después veremos cómo modificar el binario de la última versión.</p>
<p class="MsoNormal">Versión 1.4:</p>
<p class="MsoNormal"><span> </span></p>
<p class="MsoNormal"><span> </span><span> </span>Revisando el código, en toda la aplicación se usa una variable global para indicar si estamos registrados:</p>
<pre>
<div class="codesnip-container" >
<div class="cpp codesnip" style="font-family:monospace;">BOOL IsRegistered <span class="sy1">=</span> FALSE<span class="sy4">;</span></div>
</div>
</pre>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: blue;"> </span></p>
<p class="MsoNormal"><span> </span>En la creación de la ventana principal del programa encontramos el siguiente código:</p>
<pre>
<div class="codesnip-container" >
<div class="c codesnip" style="font-family:monospace;">IsRegistered <span class="sy0">=</span> TRUE<span class="sy0">;</span>
&nbsp;<span class="kw1">if</span><span class="br0">&#40;</span>CheckSerialNo<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp;<span class="br0">&#123;</span>
&nbsp; &nbsp;IsRegistered <span class="sy0">=</span> FALSE<span class="sy0">;</span>
&nbsp; &nbsp;IsRegistered <span class="sy0">=</span> ShowRegisterDlg<span class="br0">&#40;</span>IsRegistered<span class="sy0">,</span>m_hWnd<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;<span class="br0">&#125;</span></div>
</div>
</pre>
<p class="MsoNormal"><span> </span>Es la inicialización de esta variable, se llama a la función CheckSerialNo() para asegurarse de que todo es correcto:</p>
<pre>
<div class="codesnip-container" >
<div class="c codesnip" style="font-family:monospace;">INT WINAPI CheckSerialNo<span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp;<span class="br0">&#123;</span>
  &nbsp;BYTE&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FileFeature<span class="br0">&#91;</span>1024<span class="br0">&#93;</span><span class="sy0">;</span>
   <span class="kw1">if</span><span class="br0">&#40;</span>ReadFileFeature<span class="br0">&#40;</span><span class="br0">&#40;</span>LPBYTE<span class="br0">&#41;</span><span class="sy0">&amp;</span>amp<span class="sy0">;</span>FileFeature<span class="br0">&#41;</span> <span class="sy0">==</span> FALSE<span class="br0">&#41;</span>  
&nbsp; &nbsp; &nbsp;<span class="kw1">return</span> <span class="nu0">1</span><span class="sy0">;</span>
   <span class="kw1">if</span><span class="br0">&#40;</span>LocalCompare<span class="br0">&#40;</span><span class="br0">&#40;</span>LPBYTE<span class="br0">&#41;</span><span class="sy0">&amp;</span>amp<span class="sy0">;</span>FileFeature<span class="br0">&#41;</span> <span class="sy0">==</span> 0<span class="br0">&#41;</span>
     <span class="kw1">return</span> <span class="nu0">2</span><span class="sy0">;</span>&nbsp; &nbsp; &nbsp; <span class="co1">//Modify the data Kill them</span>
   <span class="kw1">if</span><span class="br0">&#40;</span><span class="sy0">!</span>IsCorrect<span class="br0">&#40;</span><span class="sy0">&amp;</span>amp<span class="sy0">;</span>FileFeature<span class="br0">&#91;</span><span class="nu0">260</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="co1">//Siempre es falso</span>
     <span class="kw1">return</span> <span class="nu0">3</span><span class="sy0">;</span> <span class="co1">//password error</span>
&nbsp;  <span class="kw1">return</span> <span class="nu0">0</span><span class="sy0">;</span>
<span class="br0">&#125;</span></div>
</div>
</pre>
<p class="MsoNormal"><span> </span>Por tanto, si devuelve 0, estamos registrados, así que con dejar esta función como:</p>
<pre>
<div class="codesnip-container" >
<div class="c codesnip" style="font-family:monospace;">INT WINAPI CheckSerialNo<span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp;<span class="br0">&#123;</span>
&nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span><span class="sy0">;</span>
&nbsp;<span class="br0">&#125;</span></div>
</div>
</pre>
<p class="MsoNormal">Compilamos y listo.</p>
<p class="MsoNormal">Versión 3.0:</p>
<p class="MsoNormal"><span> </span>Un buen paso es analizar el ejecutable usando una herramienta como podría ser el <a href="http://www.peid.info/">PEiD</a>, que nos indica que el programa se encuentra empaquetado con <a href="http://upx.sourceforge.net/">UPX</a>. Podríamos descomprimirlo utilizando esta misma herramienta, pero el propio UPX genera un mejor resultado, deja el ejecutable igual que el original.</p>
<p class="MsoNormal"><span> </span>Si intentamos descomprimirlo usando el parámetro –d nos muestra un error porque han modificado la cabecera PE del ejecutable para evitar esto. Os muestro en esta imagen el antes y el después de haber reconstruido dicha cabecera, sólo cambian los nombres de las secciones y la marca de versión que deja el compresor:</p>
<p class="MsoNormal" style="text-align: center;"><a href="http://reprogramador.es/wp-content/uploads/2009/03/pe.png"><img class="aligncenter size-medium wp-image-39" title="Cabecera PE" src="http://reprogramador.es/wp-content/uploads/2009/03/pe-300x188.png" alt="Cabecera PE" width="300" height="188" /></a></p>
<p class="MsoNormal"><span> </span>Una vez descomprimido, aun siendo distinta versión una cosa común en el software es que los programadores reutilizan código. Es probable que de la versión 1.4 a la 3.0 hayan cambiado totalmente el algoritmo para la generación del número de serie, pero seguramente el código para mostrar la ventana de registro y la función para verificar si estamos registrados sean las mismas; sabiendo esto, buscamos el mismo código que antes, empezando por buscar la cadena de texto “Thank you registered”, aterrizamos en el código que gestiona el bucle de mensajes y un poco más abajo vemos la llamada a la ventana de registro, que devuelve el estado de la variable global IsRegistered:</p>
<p class="MsoNormal"><img class="aligncenter size-full wp-image-35" title="Constante Global IsRegistered" src="http://reprogramador.es/wp-content/uploads/2009/03/constante.png" alt="Constante Global IsRegistered" width="569" height="119" /></p>
<p class="MsoNormal"><span> </span>Como podeis ver, esa dirección estática es la variable global. Si buscamos las referencias a esa constante y vamos comparando con el código fuente que tenemos, en una de las referencias, más abajo se hace una llamada a <span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: blue;">EnableMenuItem</span>, que coindice con el código de creación de la ventana principal del programa:</p>
<p class="MsoNormal"><img class="aligncenter size-full wp-image-36" title="Inicialización de la constante" src="http://reprogramador.es/wp-content/uploads/2009/03/inicializacionconstante.png" alt="Inicialización de la constante" width="614" height="181" /></p>
<p class="MsoNormal"><span> </span>Y por fin llegamos a la función <span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: blue;">CheckSerialNo</span> donde hicimos la anterior modificación, si cambiamos el código de la misma forma (pero en ensamblador) tal y como pongo de comentario:</p>
<p class="MsoNormal"><img class="aligncenter size-full wp-image-34" title="Función CheckSerialNo()" src="http://reprogramador.es/wp-content/uploads/2009/03/checkserialno.png" alt="Función CheckSerialNo()" width="413" height="262" /></p>
<p class="MsoNormal"><span> </span>Habremos conseguido la misma funcionalidad con la última versión del programa.</p>
<p class="MsoNormal"><span> </span>Y como colofón para los curiosos, aquí si que existe el código de la función <span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: blue;">IsCorrect</span>, como el listado de código es algo largo no lo muestro aquí, puede encontrarse en la dirección 00405620. Lo que sí muestro es la lógica que sigue y una reconstrucción de la misma en C:</p>
<pre>El número de serie debe tener 20 letras de longitud.
Los dos primeros dígitos tienen que ser numéricos y su suma debe ser 11 decimal.
Los dos últimos dígitos tienen que ser numéricos y su suma debe ser 13 decimal.
El sexto dígito con el decimocuarto deben sumar 9.
La decimotercera letra debe ser una V.
La decimoquinta letra debe ser un 3.
La decimosexta letra debe ser un 1.
El resto de caracteres son relleno, usaremos en este caso letras y números.</pre>
<pre>
<div class="codesnip-container" >
<div class="c codesnip" style="font-family:monospace;"><span class="co2">#define MAKECHAR(A) (char)(0x30 + A)</span>
<span class="co2">#define FIRST_SECOND_RESULT &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 11</span>
<span class="co2">#define SIXTH_RESULT&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 9</span>
<span class="co2">#define LAST_RESULT &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 13</span>
<span class="co2">#define SERIAL_LEN&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0x16</span>

<span class="kw4">int</span> total<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span>
<span class="kw4">int</span> RandomNumber<span class="br0">&#40;</span><span class="kw4">int</span> min<span class="sy0">,</span> <span class="kw4">int</span> max<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;srand<span class="br0">&#40;</span>GetTickCount<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="sy0">++</span>total<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;<span class="kw1">return</span> <span class="br0">&#40;</span>rand<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">%</span> <span class="br0">&#40;</span>max <span class="sy0">-</span> min<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span> min<span class="sy0">;</span>
<span class="br0">&#125;</span>
<span class="kw4">char</span> RandomChar<span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;<span class="kw4">int</span> i<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span>
&nbsp;<span class="kw4">int</span> j<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span>
&nbsp;srand<span class="br0">&#40;</span>GetTickCount<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="sy0">++</span>total<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;i<span class="sy0">=</span><span class="br0">&#40;</span>rand<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">%</span> <span class="br0">&#40;</span>27 <span class="sy0">-</span> 1<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="nu0">1</span><span class="sy0">;</span>
&nbsp;srand<span class="br0">&#40;</span>GetTickCount<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="sy0">++</span>total<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;j<span class="sy0">=</span><span class="br0">&#40;</span>rand<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">%</span> <span class="br0">&#40;</span>3 <span class="sy0">-</span> 1<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="nu0">1</span><span class="sy0">;</span>
&nbsp;<span class="kw1">switch</span><span class="br0">&#40;</span>j<span class="br0">&#41;</span><span class="br0">&#123;</span>
&nbsp;<span class="kw1">case</span> <span class="nu0">1</span><span class="sy0">:</span> <span class="co1">// Numeros</span>
&nbsp;i <span class="sy0">=</span> i <span class="sy0">%</span> <span class="nu0">9</span><span class="sy0">;</span>
&nbsp;j <span class="sy0">=</span> <span class="nu12">0x31</span><span class="sy0">;</span>
&nbsp;<span class="kw2">break</span><span class="sy0">;</span>
&nbsp;<span class="kw1">case</span> <span class="nu0">2</span><span class="sy0">:</span> <span class="co1">// Mayusculas</span>
&nbsp;j <span class="sy0">=</span> <span class="nu12">0x40</span><span class="sy0">;</span>
&nbsp;<span class="kw2">break</span><span class="sy0">;</span>
&nbsp;<span class="br0">&#125;</span>
&nbsp;<span class="kw1">return</span> <span class="br0">&#40;</span><span class="kw4">char</span><span class="br0">&#41;</span><span class="br0">&#40;</span>j <span class="sy0">+</span> i<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;<span class="br0">&#125;</span>
<span class="co2">#define X RandomChar()</span>
<span class="kw4">void</span> calcula<span class="br0">&#40;</span><span class="kw4">char</span> <span class="sy0">*</span>resultado<span class="br0">&#41;</span><span class="br0">&#123;</span>
&nbsp;<span class="kw4">int</span> i<span class="sy0">,</span> j<span class="sy0">,</span> k<span class="sy0">;</span>
&nbsp;total<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span>
&nbsp;i<span class="sy0">=</span>RandomNumber<span class="br0">&#40;</span>2<span class="sy0">,</span>9<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;j<span class="sy0">=</span>RandomNumber<span class="br0">&#40;</span>0<span class="sy0">,</span>9<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;k<span class="sy0">=</span>RandomNumber<span class="br0">&#40;</span>4<span class="sy0">,</span>9<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;sprintf<span class="br0">&#40;</span>resultado<span class="sy0">,</span> <span class="st0">&quot;%c%c%c%c%c%c%c%c%c%c%c%cV%c31%c%c%c%c<span class="es5">\0</span>&quot;</span><span class="sy0">,</span> MAKECHAR<span class="br0">&#40;</span>i<span class="br0">&#41;</span><span class="sy0">,</span> MAKECHAR<span class="br0">&#40;</span>FIRST_SECOND_RESULT <span class="sy0">-</span> i<span class="br0">&#41;</span><span class="sy0">,</span> X<span class="sy0">,</span> X<span class="sy0">,</span> X<span class="sy0">,</span> MAKECHAR<span class="br0">&#40;</span>j<span class="br0">&#41;</span><span class="sy0">,</span> X<span class="sy0">,</span> X<span class="sy0">,</span> X<span class="sy0">,</span> X<span class="sy0">,</span> X<span class="sy0">,</span> X<span class="sy0">,</span> MAKECHAR<span class="br0">&#40;</span>SIXTH_RESULT <span class="sy0">-</span> j<span class="br0">&#41;</span><span class="sy0">,</span> X<span class="sy0">,</span> X<span class="sy0">,</span> MAKECHAR<span class="br0">&#40;</span>k<span class="br0">&#41;</span><span class="sy0">,</span> MAKECHAR<span class="br0">&#40;</span>LAST_RESULT <span class="sy0">-</span> k<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;<span class="br0">&#125;</span>
<span class="co2">#undef X</span></div>
</div>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://reprogramador.es/shareware-gpl-legal-100-o-violacion-de-la-licencia/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

